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),
98 fMainTriggerPatch(0x0),
101 fHistTrialsAfterSel(0),
102 fHistEventsAfterSel(0),
110 fHistEventRejection(0)
112 // Default constructor.
118 fParticleCollArray.SetOwner(kTRUE);
119 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),
175 fParticleCollArray(),
177 fMainTriggerPatch(0x0),
180 fHistTrialsAfterSel(0),
181 fHistEventsAfterSel(0),
189 fHistEventRejection(0)
191 // Standard constructor.
197 fParticleCollArray.SetOwner(kTRUE);
198 fClusterCollArray.SetOwner(kTRUE);
201 DefineOutput(1, TList::Class());
205 //________________________________________________________________________
206 AliAnalysisTaskEmcal::~AliAnalysisTaskEmcal()
211 //________________________________________________________________________
212 void AliAnalysisTaskEmcal::SetClusPtCut(Double_t cut, Int_t c)
214 AliClusterContainer *cont = GetClusterContainer(c);
215 if (cont) cont->SetClusPtCut(cut);
216 else AliError(Form("%s in SetClusPtCut(...): container %d not found",GetName(),c));
219 //________________________________________________________________________
220 void AliAnalysisTaskEmcal::SetClusTimeCut(Double_t min, Double_t max, Int_t c)
222 AliClusterContainer *cont = GetClusterContainer(c);
223 if (cont) cont->SetClusTimeCut(min,max);
224 else AliError(Form("%s in SetClusTimeCut(...): container %d not found",GetName(),c));
227 //________________________________________________________________________
228 void AliAnalysisTaskEmcal::SetTrackPtCut(Double_t cut, Int_t c)
230 AliParticleContainer *cont = GetParticleContainer(c);
231 if (cont) cont->SetParticlePtCut(cut);
232 else AliError(Form("%s in SetTrackPtCut(...): container %d not found",GetName(),c));
237 //________________________________________________________________________
238 void AliAnalysisTaskEmcal::SetTrackEtaLimits(Double_t min, Double_t max, Int_t c)
240 AliParticleContainer *cont = GetParticleContainer(c);
241 if (cont) cont->SetParticleEtaLimits(min,max);
242 else AliError(Form("%s in SetTrackPtCut(...): container %d not found",GetName(),c));
245 //________________________________________________________________________
246 void AliAnalysisTaskEmcal::SetTrackPhiLimits(Double_t min, Double_t max, Int_t c)
248 AliParticleContainer *cont = GetParticleContainer(c);
249 if (cont) cont->SetParticlePhiLimits(min,max);
250 else AliError(Form("%s in SetTrackPhiLimits(...): container %d not found",GetName(),c));
253 //________________________________________________________________________
254 void AliAnalysisTaskEmcal::UserCreateOutputObjects()
256 // Create user output.
261 fOutput = new TList();
264 if (fForceBeamType == kpp)
267 if (!fGeneralHistograms)
271 fHistTrialsAfterSel = new TH1F("fHistTrialsAfterSel", "fHistTrialsAfterSel", 11, 0, 11);
272 fHistTrialsAfterSel->GetXaxis()->SetTitle("p_{T} hard bin");
273 fHistTrialsAfterSel->GetYaxis()->SetTitle("trials");
274 fOutput->Add(fHistTrialsAfterSel);
276 fHistEventsAfterSel = new TH1F("fHistEventsAfterSel", "fHistEventsAfterSel", 11, 0, 11);
277 fHistEventsAfterSel->GetXaxis()->SetTitle("p_{T} hard bin");
278 fHistEventsAfterSel->GetYaxis()->SetTitle("total events");
279 fOutput->Add(fHistEventsAfterSel);
281 fHistTrials = new TH1F("fHistTrials", "fHistTrials", 11, 0, 11);
282 fHistTrials->GetXaxis()->SetTitle("p_{T} hard bin");
283 fHistTrials->GetYaxis()->SetTitle("trials");
284 fOutput->Add(fHistTrials);
286 fHistXsection = new TProfile("fHistXsection", "fHistXsection", 11, 0, 11);
287 fHistXsection->GetXaxis()->SetTitle("p_{T} hard bin");
288 fHistXsection->GetYaxis()->SetTitle("xsection");
289 fOutput->Add(fHistXsection);
291 fHistEvents = new TH1F("fHistEvents", "fHistEvents", 11, 0, 11);
292 fHistEvents->GetXaxis()->SetTitle("p_{T} hard bin");
293 fHistEvents->GetYaxis()->SetTitle("total events");
294 fOutput->Add(fHistEvents);
296 const Int_t ptHardLo[11] = { 0, 5,11,21,36,57, 84,117,152,191,234};
297 const Int_t ptHardHi[11] = { 5,11,21,36,57,84,117,152,191,234,1000000};
299 for (Int_t i = 1; i < 12; i++) {
300 fHistTrialsAfterSel->GetXaxis()->SetBinLabel(i, Form("%d-%d",ptHardLo[i-1],ptHardHi[i-1]));
301 fHistEventsAfterSel->GetXaxis()->SetBinLabel(i, Form("%d-%d",ptHardLo[i-1],ptHardHi[i-1]));
303 fHistTrials->GetXaxis()->SetBinLabel(i, Form("%d-%d",ptHardLo[i-1],ptHardHi[i-1]));
304 fHistXsection->GetXaxis()->SetBinLabel(i, Form("%d-%d",ptHardLo[i-1],ptHardHi[i-1]));
305 fHistEvents->GetXaxis()->SetBinLabel(i, Form("%d-%d",ptHardLo[i-1],ptHardHi[i-1]));
308 fHistPtHard = new TH1F("fHistPtHard", "fHistPtHard", fNbins*2, fMinBinPt, fMaxBinPt*4);
309 fHistPtHard->GetXaxis()->SetTitle("p_{T,hard} (GeV/c)");
310 fHistPtHard->GetYaxis()->SetTitle("counts");
311 fOutput->Add(fHistPtHard);
314 fHistCentrality = new TH1F("fHistCentrality","Event centrality distribution", 200, 0, 100);
315 fHistCentrality->GetXaxis()->SetTitle("Centrality (%)");
316 fHistCentrality->GetYaxis()->SetTitle("counts");
317 fOutput->Add(fHistCentrality);
319 fHistZVertex = new TH1F("fHistZVertex","Z vertex position", 60, -30, 30);
320 fHistZVertex->GetXaxis()->SetTitle("z");
321 fHistZVertex->GetYaxis()->SetTitle("counts");
322 fOutput->Add(fHistZVertex);
324 fHistEventPlane = new TH1F("fHistEventPlane","Event plane", 120, -TMath::Pi(), TMath::Pi());
325 fHistEventPlane->GetXaxis()->SetTitle("event plane");
326 fHistEventPlane->GetYaxis()->SetTitle("counts");
327 fOutput->Add(fHistEventPlane);
329 fHistEventRejection = new TH1I("fHistEventRejection","Reasons to reject event",20,0,20);
330 fHistEventRejection->Fill("PhysSel",0);
331 fHistEventRejection->Fill("trigger",0);
332 fHistEventRejection->Fill("trigTypeSel",0);
333 fHistEventRejection->Fill("Cent",0);
334 fHistEventRejection->Fill("vertex contr.",0);
335 fHistEventRejection->Fill("Vz",0);
336 fHistEventRejection->Fill("trackInEmcal",0);
337 fHistEventRejection->Fill("minNTrack",0);
338 fHistEventRejection->Fill("VtxSel2013pA",0);
339 fHistEventRejection->Fill("PileUp",0);
340 fHistEventRejection->Fill("EvtPlane",0);
341 fHistEventRejection->Fill("SelPtHardBin",0);
342 fHistEventRejection->GetYaxis()->SetTitle("counts");
343 fOutput->Add(fHistEventRejection);
345 PostData(1, fOutput);
348 //________________________________________________________________________
349 Bool_t AliAnalysisTaskEmcal::FillGeneralHistograms()
352 fHistEventsAfterSel->SetBinContent(fPtHardBin + 1, fHistEventsAfterSel->GetBinContent(fPtHardBin + 1) + 1);
353 fHistTrialsAfterSel->SetBinContent(fPtHardBin + 1, fHistTrialsAfterSel->GetBinContent(fPtHardBin + 1) + fNTrials);
354 fHistPtHard->Fill(fPtHard);
357 fHistCentrality->Fill(fCent);
358 fHistZVertex->Fill(fVertex[2]);
359 fHistEventPlane->Fill(fEPV0);
364 //________________________________________________________________________
365 void AliAnalysisTaskEmcal::UserExec(Option_t *)
367 // Main loop, called for each event.
369 fMainTriggerPatch = NULL;
377 if (!RetrieveEventObjects())
380 if (!IsEventSelected())
383 if (fGeneralHistograms && fCreateHisto) {
384 if (!FillGeneralHistograms())
392 if (!FillHistograms())
396 if (fCreateHisto && fOutput) {
397 // information for this iteration of the UserExec in the container
398 PostData(1, fOutput);
402 //________________________________________________________________________
403 Bool_t AliAnalysisTaskEmcal::AcceptCluster(AliVCluster *clus, Int_t c) const
405 // Return true if cluster is accepted.
410 AliClusterContainer *cont = GetClusterContainer(c);
412 AliError(Form("%s:Container %d not found",GetName(),c));
416 return cont->AcceptCluster(clus);
420 //________________________________________________________________________
421 Bool_t AliAnalysisTaskEmcal::AcceptTrack(AliVParticle *track, Int_t c) const
423 // Return true if track is accepted.
428 AliParticleContainer *cont = GetParticleContainer(c);
430 AliError(Form("%s:Container %d not found",GetName(),c));
434 return cont->AcceptParticle(track);
437 //________________________________________________________________________
438 Bool_t AliAnalysisTaskEmcal::PythiaInfoFromFile(const char* currFile, Float_t &fXsec, Float_t &fTrials, Int_t &pthard)
441 // Get the cross section and the trails either from pyxsec.root or from pysec_hists.root
442 // Get the pt hard bin from the file path
443 // This is to called in Notify and should provide the path to the AOD/ESD file
444 // (Partially copied from AliAnalysisHelperJetTasks)
446 TString file(currFile);
450 if(file.Contains(".zip#")){
451 Ssiz_t pos1 = file.Index("root_archive",12,0,TString::kExact);
452 Ssiz_t pos = file.Index("#",1,pos1,TString::kExact);
453 Ssiz_t pos2 = file.Index(".root",5,TString::kExact);
454 file.Replace(pos+1,pos2-pos1,"");
457 // not an archive take the basename....
458 file.ReplaceAll(gSystem->BaseName(file.Data()),"");
460 AliDebug(1,Form("File name: %s",file.Data()));
462 // Get the pt hard bin
463 TString strPthard(file);
465 strPthard.Remove(strPthard.Last('/'));
466 strPthard.Remove(strPthard.Last('/'));
467 if (strPthard.Contains("AOD")) strPthard.Remove(strPthard.Last('/'));
468 strPthard.Remove(0,strPthard.Last('/')+1);
469 if (strPthard.IsDec())
470 pthard = strPthard.Atoi();
472 AliWarning(Form("Could not extract file number from path %s", strPthard.Data()));
474 // 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
475 TFile *fxsec = TFile::Open(Form("%s%s",file.Data(),"pyxsec.root"));
478 // next trial fetch the histgram file
479 fxsec = TFile::Open(Form("%s%s",file.Data(),"pyxsec_hists.root"));
481 // not a severe condition but inciate that we have no information
485 // find the tlist we want to be independtent of the name so use the Tkey
486 TKey* key = (TKey*)fxsec->GetListOfKeys()->At(0);
491 TList *list = dynamic_cast<TList*>(key->ReadObj());
496 fXsec = ((TProfile*)list->FindObject("h1Xsec"))->GetBinContent(1);
497 fTrials = ((TH1F*)list->FindObject("h1Trials"))->GetBinContent(1);
500 } // no tree pyxsec.root
502 TTree *xtree = (TTree*)fxsec->Get("Xsection");
508 Double_t xsection = 0;
509 xtree->SetBranchAddress("xsection",&xsection);
510 xtree->SetBranchAddress("ntrials",&ntrials);
519 //________________________________________________________________________
520 Bool_t AliAnalysisTaskEmcal::UserNotify()
522 if (!fIsPythia || !fGeneralHistograms || !fCreateHisto)
525 TTree *tree = AliAnalysisManager::GetAnalysisManager()->GetTree();
527 AliError(Form("%s - UserNotify: No current tree!",GetName()));
531 Float_t xsection = 0;
535 TFile *curfile = tree->GetCurrentFile();
537 AliError(Form("%s - UserNotify: No current file!",GetName()));
541 TChain *chain = dynamic_cast<TChain*>(tree);
543 tree = chain->GetTree();
545 Int_t nevents = tree->GetEntriesFast();
547 PythiaInfoFromFile(curfile->GetName(), xsection, trials, pthard);
549 fHistTrials->Fill(pthard, trials);
550 fHistXsection->Fill(pthard, xsection);
551 fHistEvents->Fill(pthard, nevents);
556 //________________________________________________________________________
557 void AliAnalysisTaskEmcal::ExecOnce()
559 // Init the analysis.
562 AliError(Form("%s: Could not retrieve event! Returning!", GetName()));
566 fGeom = AliEMCALGeometry::GetInstance();
568 AliError(Form("%s: Can not create geometry", GetName()));
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;
578 //Load all requested track branches - each container knows name already
579 for(Int_t i =0; i<fParticleCollArray.GetEntriesFast(); i++) {
580 AliParticleContainer *cont = static_cast<AliParticleContainer*>(fParticleCollArray.At(i));
581 cont->SetArray(InputEvent());
584 if (fParticleCollArray.GetEntriesFast()>0) {
585 fTracks = GetParticleArray(0);
587 AliError(Form("%s: Could not retrieve first track branch!", GetName()));
592 //Load all requested cluster branches - each container knows name already
593 for(Int_t i =0; i<fClusterCollArray.GetEntriesFast(); i++) {
594 AliClusterContainer *cont = static_cast<AliClusterContainer*>(fClusterCollArray.At(i));
595 cont->SetArray(InputEvent());
598 if(fClusterCollArray.GetEntriesFast()>0) {
599 fCaloClusters = GetClusterArray(0);
601 AliError(Form("%s: Could not retrieve first cluster branch!", GetName()));
606 if (!fCaloCellsName.IsNull() && !fCaloCells) {
607 fCaloCells = dynamic_cast<AliVCaloCells*>(InputEvent()->FindListObject(fCaloCellsName));
609 AliError(Form("%s: Could not retrieve cells %s!", GetName(), fCaloCellsName.Data()));
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()));
622 if (!fCaloTriggerPatchInfoName.IsNull() && !fTriggerPatchInfo) {
623 fTriggerPatchInfo = GetArrayFromEvent(fCaloTriggerPatchInfoName.Data(),"AliEmcalTriggerPatchInfo");
624 if (!fTriggerPatchInfo) {
625 AliError(Form("%s: Could not retrieve calo trigger patch info %s!", GetName(), fCaloTriggerPatchInfoName.Data()));
631 fInitialized = kTRUE;
634 //_____________________________________________________
635 AliAnalysisTaskEmcal::BeamType AliAnalysisTaskEmcal::GetBeamType()
637 // Get beam type : pp-AA-pA
638 // ESDs have it directly, AODs get it from hardcoded run number ranges
640 if (fForceBeamType != kNA)
641 return fForceBeamType;
643 AliESDEvent *esd = dynamic_cast<AliESDEvent*>(InputEvent());
645 const AliESDRun *run = esd->GetESDRun();
646 TString beamType = run->GetBeamType();
647 if (beamType == "p-p")
649 else if (beamType == "A-A")
651 else if (beamType == "p-A")
656 Int_t runNumber = InputEvent()->GetRunNumber();
657 if ((runNumber >= 136851 && runNumber <= 139517) || // LHC10h
658 (runNumber >= 166529 && runNumber <= 170593)) // LHC11h
662 else if ((runNumber>=188365 && runNumber <= 188366) || // LHC12g
663 (runNumber >= 195344 && runNumber <= 196608)) // LHC13b-f
672 //_____________________________________________________
673 AliAnalysisTaskEmcal::TriggerType AliAnalysisTaskEmcal::GetTriggerType()
675 // Get trigger type: kND, kJ1, kJ2
677 if(!fTriggerPatchInfo)
680 //number of patches in event
681 Int_t nPatch = fTriggerPatchInfo->GetEntries();
683 //loop over patches to define trigger type of event
686 AliEmcalTriggerPatchInfo *patch;
687 for(Int_t iPatch = 0; iPatch < nPatch; iPatch++ ){
688 patch = (AliEmcalTriggerPatchInfo*)fTriggerPatchInfo->At( iPatch );
689 if(patch->IsJetHigh()) nJ1++;
690 if(patch->IsJetLow()) nJ2++;
702 //________________________________________________________________________
703 Bool_t AliAnalysisTaskEmcal::IsEventSelected()
705 // Check if event is selected
707 if (fOffTrigger != AliVEvent::kAny) {
709 const AliESDEvent *eev = dynamic_cast<const AliESDEvent*>(InputEvent());
711 res = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected();
713 const AliAODEvent *aev = dynamic_cast<const AliAODEvent*>(InputEvent());
715 res = aev->GetHeader()->GetOfflineTrigger();
718 if ((res & fOffTrigger) == 0) {
719 if (fGeneralHistograms)
720 fHistEventRejection->Fill("PhysSel",1);
725 if (!fTrigClass.IsNull()) {
727 const AliESDEvent *eev = dynamic_cast<const AliESDEvent*>(InputEvent());
729 fired = eev->GetFiredTriggerClasses();
731 const AliAODEvent *aev = dynamic_cast<const AliAODEvent*>(InputEvent());
733 fired = aev->GetFiredTriggerClasses();
736 if (!fired.Contains("-B-")) {
737 if (fGeneralHistograms)
738 fHistEventRejection->Fill("trigger",1);
741 TObjArray *arr = fTrigClass.Tokenize("|");
743 if (fGeneralHistograms)
744 fHistEventRejection->Fill("trigger",1);
748 for (Int_t i=0;i<arr->GetEntriesFast();++i) {
749 TObject *obj = arr->At(i);
752 if (fired.Contains(obj->GetName())) {
759 if (fGeneralHistograms)
760 fHistEventRejection->Fill("trigger",1);
765 if (fTriggerTypeSel != kND) {
766 if(fTriggerType != fTriggerTypeSel) {
767 if (fGeneralHistograms)
768 fHistEventRejection->Fill("trigTypeSel",1);
774 if ((fMinCent != -999) && (fMaxCent != -999)) {
775 if (fCent<fMinCent || fCent>fMaxCent) {
776 if (fGeneralHistograms)
777 fHistEventRejection->Fill("Cent",1);
782 if ((fMinVz != -999) && (fMaxVz != -999)) {
783 if (fNVertCont == 0 ) {
784 if (fGeneralHistograms)
785 fHistEventRejection->Fill("vertex contr.",1);
788 Double_t vz = fVertex[2];
789 if (vz<fMinVz || vz>fMaxVz) {
790 if (fGeneralHistograms)
791 fHistEventRejection->Fill("Vz",1);
796 if (fMinPtTrackInEmcal > 0 && fGeom) {
797 Bool_t trackInEmcalOk = kFALSE;
798 Int_t ntracks = GetNParticles(0);
799 for (Int_t i = 0; i < ntracks; i++) {
800 AliVParticle *track = GetAcceptParticleFromArray(i,0);
804 Double_t phiMin = fGeom->GetArm1PhiMin() * TMath::DegToRad();
805 Double_t phiMax = fGeom->GetArm1PhiMax() * TMath::DegToRad();
806 Int_t runNumber = InputEvent()->GetRunNumber();
807 if(runNumber>=177295 && runNumber<=197470) { //small SM masked in 2012 and 2013
809 phiMax = TMath::Pi();
812 if (track->Eta() < fGeom->GetArm1EtaMin() || track->Eta() > fGeom->GetArm1EtaMax() || track->Phi() < phiMin || track->Phi() > phiMax)
814 if (track->Pt() > fMinPtTrackInEmcal) {
815 trackInEmcalOk = kTRUE;
819 if (!trackInEmcalOk) {
820 if (fGeneralHistograms)
821 fHistEventRejection->Fill("trackInEmcal",1);
826 if (fMinNTrack > 0) {
827 Int_t nTracksAcc = 0;
828 Int_t ntracks = GetNParticles(0);
829 for (Int_t i = 0; i < ntracks; i++) {
830 AliVParticle *track = GetAcceptParticleFromArray(i,0);
833 if (track->Pt() > fTrackPtCut) {
835 if(nTracksAcc>=fMinNTrack)
839 if (nTracksAcc<fMinNTrack) {
840 if (fGeneralHistograms)
841 fHistEventRejection->Fill("minNTrack",1);
846 if(fUseAliAnaUtils) {
847 if(!fAliAnalysisUtils)
848 fAliAnalysisUtils = new AliAnalysisUtils();
849 fAliAnalysisUtils->SetMinVtxContr(2);
850 fAliAnalysisUtils->SetMaxVtxZ(10.);
852 if(!fAliAnalysisUtils->IsVertexSelected2013pA(InputEvent())) {
853 if (fGeneralHistograms)
854 fHistEventRejection->Fill("VtxSel2013pA",1);
858 if(fAliAnalysisUtils->IsPileUpEvent(InputEvent())) {
859 fHistEventRejection->Fill("PileUp",1);
864 if (!(fEPV0 > fMinEventPlane && fEPV0 <= fMaxEventPlane) &&
865 !(fEPV0 + TMath::Pi() > fMinEventPlane && fEPV0 + TMath::Pi() <= fMaxEventPlane) &&
866 !(fEPV0 - TMath::Pi() > fMinEventPlane && fEPV0 - TMath::Pi() <= fMaxEventPlane))
868 if (fGeneralHistograms)
869 fHistEventRejection->Fill("EvtPlane",1);
873 if (fSelectPtHardBin != -999 && fSelectPtHardBin != fPtHardBin) {
874 if (fGeneralHistograms)
875 fHistEventRejection->Fill("SelPtHardBin",1);
882 //________________________________________________________________________
883 TClonesArray *AliAnalysisTaskEmcal::GetArrayFromEvent(const char *name, const char *clname)
885 // Get array from event.
887 TClonesArray *arr = 0;
889 if (!sname.IsNull()) {
890 arr = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(sname));
892 AliWarning(Form("%s: Could not retrieve array with name %s!", GetName(), name));
902 TString objname(arr->GetClass()->GetName());
904 if (!cls.InheritsFrom(clname)) {
905 AliWarning(Form("%s: Objects of type %s in %s are not inherited from %s!",
906 GetName(), cls.GetName(), name, clname));
912 //________________________________________________________________________
913 Bool_t AliAnalysisTaskEmcal::RetrieveEventObjects()
915 // Retrieve objects from event.
922 const AliVVertex *vert = InputEvent()->GetPrimaryVertex();
924 vert->GetXYZ(fVertex);
925 fNVertCont = vert->GetNContributors();
928 fBeamType = GetBeamType();
930 if (fBeamType == kAA || fBeamType == kpA ) {
931 AliCentrality *aliCent = InputEvent()->GetCentrality();
933 fCent = aliCent->GetCentralityPercentile(fCentEst.Data());
935 if (fCent >= 0 && fCent < 10) fCentBin = 0;
936 else if (fCent >= 10 && fCent < 30) fCentBin = 1;
937 else if (fCent >= 30 && fCent < 50) fCentBin = 2;
938 else if (fCent >= 50 && fCent <= 100) fCentBin = 3;
940 AliWarning(Form("%s: Negative centrality: %f. Assuming 99", GetName(), fCent));
941 fCentBin = fNcentBins-1;
945 Double_t centWidth = (fMaxCent-fMinCent)/(Double_t)fNcentBins;
946 fCentBin = TMath::FloorNint(fCent/centWidth);
947 if(fCentBin>=fNcentBins) {
948 AliWarning(Form("%s: fCentBin too large: cent = %f fCentBin = %d. Assuming 99", GetName(),fCent,fCentBin));
949 fCentBin = fNcentBins-1;
953 AliWarning(Form("%s: Could not retrieve centrality information! Assuming 99", GetName()));
956 AliEventplane *aliEP = InputEvent()->GetEventplane();
958 fEPV0 = aliEP->GetEventplane("V0" ,InputEvent());
959 fEPV0A = aliEP->GetEventplane("V0A",InputEvent());
960 fEPV0C = aliEP->GetEventplane("V0C",InputEvent());
962 AliWarning(Form("%s: Could not retrieve event plane information!", GetName()));
972 fPythiaHeader = dynamic_cast<AliGenPythiaEventHeader*>(MCEvent()->GenEventHeader());
973 if (!fPythiaHeader) {
975 AliAODMCHeader* aodMCH = dynamic_cast<AliAODMCHeader*>(InputEvent()->FindListObject(AliAODMCHeader::StdBranchName()));
978 for(UInt_t i = 0;i<aodMCH->GetNCocktailHeaders();i++) {
979 fPythiaHeader = dynamic_cast<AliGenPythiaEventHeader*>(aodMCH->GetCocktailHeader(i));
980 if (fPythiaHeader) break;
987 fPtHard = fPythiaHeader->GetPtHard();
989 const Int_t ptHardLo[11] = { 0, 5,11,21,36,57, 84,117,152,191,234};
990 const Int_t ptHardHi[11] = { 5,11,21,36,57,84,117,152,191,234,1000000};
991 for (fPtHardBin = 0; fPtHardBin < 11; fPtHardBin++) {
992 if (fPtHard >= ptHardLo[fPtHardBin] && fPtHard < ptHardHi[fPtHardBin])
996 fNTrials = fPythiaHeader->Trials();
1000 fTriggerType = GetTriggerType();
1005 //________________________________________________________________________
1006 AliParticleContainer* AliAnalysisTaskEmcal::AddParticleContainer(const char *n) {
1008 // Add particle container
1009 // will be called in AddTask macro
1011 TString tmp = TString(n);
1012 if(tmp.IsNull()) return 0;
1014 AliParticleContainer *cont = 0x0;
1015 cont = new AliParticleContainer();
1016 cont->SetArrayName(n);
1017 TString contName = cont->GetArrayName();
1019 fParticleCollArray.Add(cont);
1024 //________________________________________________________________________
1025 AliClusterContainer* AliAnalysisTaskEmcal::AddClusterContainer(const char *n) {
1027 // Add cluster container
1028 // will be called in AddTask macro
1030 TString tmp = TString(n);
1031 if(tmp.IsNull()) return 0;
1033 AliClusterContainer *cont = 0x0;
1034 cont = new AliClusterContainer();
1035 cont->SetArrayName(n);
1037 fClusterCollArray.Add(cont);
1042 //________________________________________________________________________
1043 AliParticleContainer* AliAnalysisTaskEmcal::GetParticleContainer(Int_t i) const {
1044 // Get i^th particle container
1046 if(i<0 || i>fParticleCollArray.GetEntriesFast()) return 0;
1047 AliParticleContainer *cont = static_cast<AliParticleContainer*>(fParticleCollArray.At(i));
1051 //________________________________________________________________________
1052 AliClusterContainer* AliAnalysisTaskEmcal::GetClusterContainer(Int_t i) const {
1053 // Get i^th cluster container
1055 if(i<0 || i>fClusterCollArray.GetEntriesFast()) return 0;
1056 AliClusterContainer *cont = static_cast<AliClusterContainer*>(fClusterCollArray.At(i));
1060 //________________________________________________________________________
1061 AliParticleContainer* AliAnalysisTaskEmcal::GetParticleContainer(const char *name) const {
1062 // Get particle container with name
1064 AliParticleContainer *cont = static_cast<AliParticleContainer*>(fParticleCollArray.FindObject(name));
1068 //________________________________________________________________________
1069 AliClusterContainer* AliAnalysisTaskEmcal::GetClusterContainer(const char *name) const {
1070 // Get cluster container with name
1072 AliClusterContainer *cont = static_cast<AliClusterContainer*>(fClusterCollArray.FindObject(name));
1076 //________________________________________________________________________
1077 TClonesArray* AliAnalysisTaskEmcal::GetParticleArray(Int_t i) const {
1078 // Get i^th TClonesArray with AliVParticle
1080 AliParticleContainer *cont = GetParticleContainer(i);
1082 AliError(Form("%s: Particle container %d not found",GetName(),i));
1085 TString contName = cont->GetArrayName();
1086 return cont->GetArray();
1089 //________________________________________________________________________
1090 TClonesArray* AliAnalysisTaskEmcal::GetClusterArray(Int_t i) const {
1091 // Get i^th TClonesArray with AliVCluster
1093 AliClusterContainer *cont = GetClusterContainer(i);
1095 AliError(Form("%s:Cluster container %d not found",GetName(),i));
1098 return cont->GetArray();
1101 //________________________________________________________________________
1102 AliVParticle* AliAnalysisTaskEmcal::GetAcceptParticleFromArray(Int_t p, Int_t c) const {
1103 // Get particle p if accepted from container c
1104 // If particle not accepted return 0
1106 AliParticleContainer *cont = GetParticleContainer(c);
1108 AliError(Form("%s: Particle container %d not found",GetName(),c));
1111 AliVParticle *vp = cont->GetAcceptParticle(p);
1116 //________________________________________________________________________
1117 AliVCluster* AliAnalysisTaskEmcal::GetAcceptClusterFromArray(Int_t cl, Int_t c) const {
1118 // Get particle p if accepted from container c
1119 // If particle not accepted return 0
1121 AliClusterContainer *cont = GetClusterContainer(c);
1123 AliError(Form("%s: Cluster container %d not found",GetName(),c));
1126 AliVCluster *vc = cont->GetAcceptCluster(cl);
1131 //________________________________________________________________________
1132 Int_t AliAnalysisTaskEmcal::GetNParticles(Int_t i) const {
1133 // Get number of entries in particle array i
1135 AliParticleContainer *cont = GetParticleContainer(i);
1137 AliError(Form("%s: Particle container %d not found",GetName(),i));
1140 return cont->GetNEntries();
1143 //________________________________________________________________________
1144 Int_t AliAnalysisTaskEmcal::GetNClusters(Int_t i) const {
1145 // Get number of entries in cluster array i
1147 AliClusterContainer *cont = GetClusterContainer(i);
1149 AliError(Form("%s: Cluster container %d not found",GetName(),i));
1152 return cont->GetNEntries();
1155 //________________________________________________________________________
1156 AliEmcalTriggerPatchInfo* AliAnalysisTaskEmcal::GetMainTriggerPatch() {
1157 //get main trigger match; if not known yet, look for it and cache
1159 if(fMainTriggerPatch)
1160 return fMainTriggerPatch;
1162 if(!fTriggerPatchInfo) {
1163 AliError(Form("%s: fTriggerPatchInfo not available",GetName()));
1167 //number of patches in event
1168 Int_t nPatch = fTriggerPatchInfo->GetEntries();
1170 //extract main trigger patch
1171 AliEmcalTriggerPatchInfo *patch;
1172 for(Int_t iPatch = 0; iPatch < nPatch; iPatch++ ){
1174 patch = (AliEmcalTriggerPatchInfo*)fTriggerPatchInfo->At( iPatch );
1175 if( patch->IsMainTrigger() ) {
1176 fMainTriggerPatch = patch;
1181 return fMainTriggerPatch;