1 // $Id: AliAnalysisTaskEmcal.cxx 56756 2012-05-30 05:03:02Z loizides $
3 // Emcal base analysis task.
7 #include "AliAnalysisTaskEmcal.h"
10 #include <TClonesArray.h>
15 #include "AliAODEvent.h"
16 #include "AliAnalysisManager.h"
17 #include "AliCentrality.h"
18 #include "AliEMCALGeometry.h"
19 #include "AliESDEvent.h"
20 #include "AliEmcalParticle.h"
21 #include "AliEventplane.h"
22 #include "AliInputEventHandler.h"
24 #include "AliMCParticle.h"
25 #include "AliVCluster.h"
26 #include "AliVEventHandler.h"
27 #include "AliVParticle.h"
29 ClassImp(AliAnalysisTaskEmcal)
31 //________________________________________________________________________
32 AliAnalysisTaskEmcal::AliAnalysisTaskEmcal() :
33 AliAnalysisTaskSE("AliAnalysisTaskEmcal"),
36 fGeneralHistograms(kFALSE),
45 fOffTrigger(AliVEvent::kAny),
70 // Default constructor.
77 //________________________________________________________________________
78 AliAnalysisTaskEmcal::AliAnalysisTaskEmcal(const char *name, Bool_t histo) :
79 AliAnalysisTaskSE(name),
82 fGeneralHistograms(kFALSE),
91 fOffTrigger(AliVEvent::kAny),
102 fClusTimeCutLow(-10),
116 // Standard constructor.
123 DefineOutput(1, TList::Class());
127 //________________________________________________________________________
128 AliAnalysisTaskEmcal::~AliAnalysisTaskEmcal()
133 //________________________________________________________________________
134 void AliAnalysisTaskEmcal::UserCreateOutputObjects()
136 // Create user output.
141 fOutput = new TList();
144 if (!fGeneralHistograms)
147 fHistCentrality = new TH1F("fHistCentrality","Event centrality distribution", 200, 0, 100);
148 fHistCentrality->GetXaxis()->SetTitle("Centrality (%)");
149 fHistCentrality->GetYaxis()->SetTitle("counts");
150 fOutput->Add(fHistCentrality);
152 fHistZVertex = new TH1F("fHistZVertex","Z vertex position", 60, -30, 30);
153 fHistZVertex->GetXaxis()->SetTitle("z");
154 fHistZVertex->GetYaxis()->SetTitle("counts");
155 fOutput->Add(fHistZVertex);
157 PostData(1, fOutput);
160 //________________________________________________________________________
161 Bool_t AliAnalysisTaskEmcal::FillGeneralHistograms()
163 fHistCentrality->Fill(fCent);
164 fHistZVertex->Fill(fVertex[2]);
169 //________________________________________________________________________
170 void AliAnalysisTaskEmcal::UserExec(Option_t *)
172 // Main loop, called for each event.
180 if (!RetrieveEventObjects())
183 if (!IsEventSelected())
186 if (fGeneralHistograms && fCreateHisto) {
187 if (!FillGeneralHistograms())
195 if (!FillHistograms())
199 if (fCreateHisto && fOutput) {
200 // information for this iteration of the UserExec in the container
201 PostData(1, fOutput);
205 //________________________________________________________________________
206 Bool_t AliAnalysisTaskEmcal::AcceptCluster(AliVCluster *clus, Bool_t acceptMC) const
208 // Return true if cluster is accepted.
213 if (!clus->IsEMCAL())
216 if (!acceptMC && clus->Chi2() == 100)
219 if (clus->GetTOF() > fClusTimeCutUp || clus->GetTOF() < fClusTimeCutLow)
222 TLorentzVector nPart;
223 clus->GetMomentum(nPart, const_cast<Double_t*>(fVertex));
225 if (nPart.Et() < fClusPtCut)
231 //________________________________________________________________________
232 Bool_t AliAnalysisTaskEmcal::AcceptTrack(AliVTrack *track, Bool_t acceptMC) const
234 // Return true if track is accepted.
239 if (!acceptMC && track->GetLabel() == 100)
242 if (track->Pt() < fTrackPtCut)
245 if (track->Eta() < fTrackMinEta || track->Eta() > fTrackMaxEta ||
246 track->Phi() < fTrackMinPhi || track->Phi() > fTrackMaxPhi)
252 //________________________________________________________________________
253 Bool_t AliAnalysisTaskEmcal::AcceptEmcalPart(AliEmcalParticle *part, Bool_t acceptMC) const
255 // Return true if EMCal particle is accepted.
260 if (part->IsTrack()) {
261 if (part->Pt() < fTrackPtCut)
264 if (part->Eta() < fTrackMinEta || part->Eta() > fTrackMaxEta ||
265 part->Phi() < fTrackMinPhi || part->Phi() > fTrackMaxPhi)
269 if (part->IsCluster()) {
270 if (!part->IsEMCAL())
273 if (part->Pt() < fClusPtCut)
277 if (!acceptMC && part->IsMC())
283 //________________________________________________________________________
284 void AliAnalysisTaskEmcal::ExecOnce()
286 // Init the analysis.
289 AliError(Form("%s: Could not retrieve event! Returning!", GetName()));
293 fGeom = AliEMCALGeometry::GetInstance();
295 AliWarning(Form("%s: Can not create geometry", GetName()));
297 if (!fCaloName.IsNull() && !fCaloClusters) {
298 fCaloClusters = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fCaloName));
299 if (!fCaloClusters) {
300 AliError(Form("%s: Could not retrieve clusters %s!", GetName(), fCaloName.Data()));
303 TClass *cl = fCaloClusters->GetClass();
304 if (!cl->GetBaseClass("AliVCluster") && !cl->GetBaseClass("AliEmcalParticle")) {
305 AliError(Form("%s: Collection %s does not contain AliVCluster nor AliEmcalParticle objects!", GetName(), fCaloName.Data()));
312 if (!fTracksName.IsNull() && !fTracks) {
313 fTracks = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fTracksName));
315 AliError(Form("%s: Could not retrieve tracks %s!", GetName(), fTracksName.Data()));
318 TClass *cl = fTracks->GetClass();
319 if (!cl->GetBaseClass("AliVParticle") && !cl->GetBaseClass("AliEmcalParticle")) {
320 AliError(Form("%s: Collection %s does not contain AliVParticle nor AliEmcalParticle objects!", GetName(), fTracksName.Data()));
327 fInitialized = kTRUE;
330 //_____________________________________________________
331 AliAnalysisTaskEmcal::BeamType AliAnalysisTaskEmcal::GetBeamType()
333 // Get beam type : pp-AA-pA
334 // ESDs have it directly, AODs get it from hardcoded run number ranges
336 if (fForceBeamType != kNA)
337 return fForceBeamType;
339 AliESDEvent *esd = dynamic_cast<AliESDEvent*>(InputEvent());
341 const AliESDRun *run = esd->GetESDRun();
342 TString beamType = run->GetBeamType();
343 if (beamType == "p-p")
345 else if (beamType == "A-A")
347 else if (beamType == "p-A")
352 Int_t runNumber = InputEvent()->GetRunNumber();
353 if ((runNumber >= 136851 && runNumber <= 139517) || // LHC10h
354 (runNumber >= 166529 && runNumber <= 170593)) // LHC11h
363 //________________________________________________________________________
364 Bool_t AliAnalysisTaskEmcal::IsEventSelected()
366 // Check if event is selected
368 if (fOffTrigger != AliVEvent::kAny) {
370 const AliESDEvent *eev = dynamic_cast<const AliESDEvent*>(InputEvent());
372 res = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected();
374 const AliAODEvent *aev = dynamic_cast<const AliAODEvent*>(InputEvent());
376 res = aev->GetHeader()->GetOfflineTrigger();
379 if ((res & fOffTrigger) == 0)
383 if (!fTrigClass.IsNull()) {
385 const AliESDEvent *eev = dynamic_cast<const AliESDEvent*>(InputEvent());
387 fired = eev->GetFiredTriggerClasses();
389 const AliAODEvent *aev = dynamic_cast<const AliAODEvent*>(InputEvent());
391 fired = aev->GetFiredTriggerClasses();
394 if (!fired.Contains("-B-"))
396 TObjArray *arr = fTrigClass.Tokenize("|");
400 for (Int_t i=0;i<arr->GetEntriesFast();++i) {
401 TObject *obj = arr->At(i);
404 if (fired.Contains(obj->GetName())) {
414 if ((fMinCent != -999) && (fMaxCent != -999)) {
421 if ((fMinVz != -999) && (fMaxVz != -999)) {
422 if (fNVertCont == 0 )
424 Double_t vz = fVertex[2];
434 //________________________________________________________________________
435 TClonesArray *AliAnalysisTaskEmcal::GetArrayFromEvent(const char *name, const char *clname)
437 // Get array from event.
439 TClonesArray *arr = 0;
441 if (!sname.IsNull()) {
442 arr = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(sname));
444 AliWarning(Form("%s: Could not retrieve array with name %s!", GetName(), name));
454 TString objname(arr->GetClass()->GetName());
456 if (!cls.InheritsFrom(clname)) {
457 AliWarning(Form("%s: Objects of type %s in %s are not inherited from %s!",
458 GetName(), cls.GetName(), name, clname));
464 //________________________________________________________________________
465 Bool_t AliAnalysisTaskEmcal::RetrieveEventObjects()
467 // Retrieve objects from event.
474 const AliVVertex *vert = InputEvent()->GetPrimaryVertex();
476 vert->GetXYZ(fVertex);
477 fNVertCont = vert->GetNContributors();
480 fBeamType = GetBeamType();
482 if (fBeamType == kAA) {
483 AliCentrality *aliCent = InputEvent()->GetCentrality();
485 fCent = aliCent->GetCentralityPercentile("V0M");
486 if (fCent >= 0 && fCent < 10) fCentBin = 0;
487 else if (fCent >= 10 && fCent < 30) fCentBin = 1;
488 else if (fCent >= 30 && fCent < 50) fCentBin = 2;
489 else if (fCent >= 50 && fCent <= 100) fCentBin = 3;
491 AliWarning(Form("%s: Negative centrality: %f. Assuming 99", GetName(), fCent));
495 AliWarning(Form("%s: Could not retrieve centrality information! Assuming 99", GetName()));
498 AliEventplane *aliEP = InputEvent()->GetEventplane();
500 fEPV0 = aliEP->GetEventplane("V0" ,InputEvent());
501 fEPV0A = aliEP->GetEventplane("V0A",InputEvent());
502 fEPV0C = aliEP->GetEventplane("V0C",InputEvent());
504 AliWarning(Form("%s: Could not retrieve event plane information!", GetName()));