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>
14 #include "AliAODEvent.h"
15 #include "AliAnalysisManager.h"
16 #include "AliCentrality.h"
17 #include "AliEMCALGeometry.h"
18 #include "AliESDEvent.h"
19 #include "AliEmcalJet.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"),
43 fOffTrigger(AliVEvent::kAny),
67 // Default constructor.
74 //________________________________________________________________________
75 AliAnalysisTaskEmcal::AliAnalysisTaskEmcal(const char *name, Bool_t histo) :
76 AliAnalysisTaskSE(name),
86 fOffTrigger(AliVEvent::kAny),
110 // Standard constructor.
117 DefineOutput(1, TList::Class());
121 //________________________________________________________________________
122 AliAnalysisTaskEmcal::~AliAnalysisTaskEmcal()
127 //________________________________________________________________________
128 void AliAnalysisTaskEmcal::UserExec(Option_t *)
130 // Main loop, called for each event.
138 if (!RetrieveEventObjects())
141 if (!IsEventSelected())
147 if (!FillHistograms())
150 if (fCreateHisto && fOutput) {
151 // information for this iteration of the UserExec in the container
152 PostData(1, fOutput);
156 //________________________________________________________________________
157 Bool_t AliAnalysisTaskEmcal::AcceptCluster(AliVCluster *clus, Bool_t acceptMC) const
159 // Return true if cluster is accepted.
164 if (!clus->IsEMCAL())
167 if (!acceptMC && clus->Chi2() == 100)
170 if (clus->GetTOF() > fClusTimeCutUp || clus->GetTOF() < fClusTimeCutLow)
173 TLorentzVector nPart;
174 clus->GetMomentum(nPart, const_cast<Double_t*>(fVertex));
176 if (nPart.Et() < fClusPtCut)
182 //________________________________________________________________________
183 Bool_t AliAnalysisTaskEmcal::AcceptEmcalPart(AliEmcalParticle *part, Bool_t acceptMC) const
185 // Return true if EMCal particle is accepted.
190 if (fAnaType == kEMCAL && !part->IsEMCAL())
193 if ((part->IsTrack() && part->Pt() < fTrackPtCut) || (part->IsCluster() && part->Pt() < fClusPtCut))
196 if (!acceptMC && part->IsMC())
202 //________________________________________________________________________
203 Bool_t AliAnalysisTaskEmcal::AcceptTrack(AliVTrack *track, Bool_t acceptMC) const
205 // Return true if track is accepted.
210 if (!acceptMC && track->GetLabel() == 100)
213 if (track->Pt() < fTrackPtCut)
216 if (track->Eta() < fMinTrackEta || track->Eta() > fMaxTrackEta ||
217 track->Phi() < fMinTrackPhi || track->Phi() > fMaxTrackPhi)
223 //________________________________________________________________________
224 void AliAnalysisTaskEmcal::ExecOnce()
226 // Init the analysis.
229 AliError(Form("%s: Could not retrieve event! Returning!", GetName()));
233 if (!fCaloName.IsNull() && (fAnaType == kEMCAL || fAnaType == kEMCALOnly) && !fCaloClusters) {
234 fCaloClusters = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fCaloName));
235 if (!fCaloClusters) {
236 AliError(Form("%s: Could not retrieve clusters %s!", GetName(), fCaloName.Data()));
239 TClass *cl = fCaloClusters->GetClass();
240 if (!cl->GetBaseClass("AliVCluster") && !cl->GetBaseClass("AliEmcalParticle")) {
241 AliError(Form("%s: Collection %s does not contain AliVCluster nor AliEmcalParticle objects!", GetName(), fCaloName.Data()));
248 if (!fTracksName.IsNull() && fAnaType != kEMCALOnly && !fTracks) {
249 fTracks = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fTracksName));
251 AliError(Form("%s: Could not retrieve tracks %s!", GetName(), fTracksName.Data()));
254 TClass *cl = fTracks->GetClass();
255 if (!cl->GetBaseClass("AliVParticle") && !cl->GetBaseClass("AliEmcalParticle")) {
256 AliError(Form("%s: Collection %s does not contain AliVParticle nor AliEmcalParticle objects!", GetName(), fTracksName.Data()));
265 //_____________________________________________________
266 AliAnalysisTaskEmcal::BeamType AliAnalysisTaskEmcal::GetBeamType()
268 // Get beam type : pp-AA-pA
269 // ESDs have it directly, AODs get it from hardcoded run number ranges
271 AliESDEvent *esd = dynamic_cast<AliESDEvent*>(InputEvent());
273 const AliESDRun *run = esd->GetESDRun();
274 TString beamType = run->GetBeamType();
275 if (beamType == "p-p")
277 else if (beamType == "A-A")
279 else if (beamType == "p-A")
284 Int_t runNumber = InputEvent()->GetRunNumber();
285 if ((runNumber >= 136851 && runNumber <= 139517) || // LHC10h
286 (runNumber >= 166529 && runNumber <= 170593)) // LHC11h
295 //________________________________________________________________________
296 Bool_t AliAnalysisTaskEmcal::IsEventSelected()
298 // Check if event is selected
300 if (fOffTrigger != AliVEvent::kAny) {
302 const AliESDEvent *eev = dynamic_cast<const AliESDEvent*>(InputEvent());
304 res = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected();
306 const AliAODEvent *aev = dynamic_cast<const AliAODEvent*>(InputEvent());
308 res = aev->GetHeader()->GetOfflineTrigger();
311 if ((res & fOffTrigger) == 0)
315 if (!fTrigClass.IsNull()) {
317 const AliESDEvent *eev = dynamic_cast<const AliESDEvent*>(InputEvent());
319 fired = eev->GetFiredTriggerClasses();
321 const AliAODEvent *aev = dynamic_cast<const AliAODEvent*>(InputEvent());
323 fired = aev->GetFiredTriggerClasses();
326 if (!fired.Contains("-B-"))
328 TObjArray *arr = fTrigClass.Tokenize("|");
332 for (Int_t i=0;i<arr->GetEntriesFast();++i) {
333 TObject *obj = arr->At(i);
336 if (fired.Contains(obj->GetName())) {
346 if ((fMinCent != -999) && (fMaxCent != -999)) {
353 if ((fMinVz != -999) && (fMaxVz != -999)) {
354 if (fNVertCont == 0 )
356 Double_t vz = fVertex[2];
366 //________________________________________________________________________
367 TClonesArray *AliAnalysisTaskEmcal::GetArrayFromEvent(const char *name, const char *clname)
369 // Get array from event.
371 TClonesArray *arr = 0;
373 if (!sname.IsNull()) {
374 arr = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(sname));
376 AliWarning(Form("%s: Could not retrieve array with name %s!", GetName(), name));
386 TString objname(arr->GetClass()->GetName());
388 if (!cls.InheritsFrom(clname)) {
389 AliWarning(Form("%s: Objects of type %s in %s are not inherited from %s!",
390 GetName(), cls.GetName(), name, clname));
396 //________________________________________________________________________
397 Bool_t AliAnalysisTaskEmcal::RetrieveEventObjects()
399 // Retrieve objects from event.
406 const AliVVertex *vert = InputEvent()->GetPrimaryVertex();
408 vert->GetXYZ(fVertex);
409 fNVertCont = vert->GetNContributors();
412 fBeamType = GetBeamType();
414 if (fBeamType == kAA) {
415 AliCentrality *aliCent = InputEvent()->GetCentrality();
417 fCent = aliCent->GetCentralityPercentile("V0M");
418 if (fCent >= 0 && fCent < 10) fCentBin = 0;
419 else if (fCent >= 10 && fCent < 30) fCentBin = 1;
420 else if (fCent >= 30 && fCent < 50) fCentBin = 2;
421 else if (fCent >= 50 && fCent <= 100) fCentBin = 3;
423 AliWarning(Form("%s: Negative centrality: %f. Assuming 99", GetName(), fCent));
427 AliWarning(Form("%s: Could not retrieve centrality information! Assuming 99", GetName()));
430 AliEventplane *aliEP = InputEvent()->GetEventplane();
432 fEPV0 = aliEP->GetEventplane("V0" ,InputEvent());
433 fEPV0A = aliEP->GetEventplane("V0A",InputEvent());
434 fEPV0C = aliEP->GetEventplane("V0C",InputEvent());
436 AliWarning(Form("%s: Could not retrieve event plane information!", GetName()));