1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: ALICE Offline. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
16 //=========================================================================//
17 // AliEbyE Analysis for Particle Ratio Fluctuation //
18 // Deepika Rathee | Satyajit Jena //
19 // drathee@cern.ch | sjena@cern.ch //
20 // Date: Wed Jul 9 18:38:30 CEST 2014 //
21 // New approch to find particle ratio to reduce memory //
23 //=========================================================================//
32 #include "TStopwatch.h"
34 #include "THashList.h"
36 #include "AliAnalysisTask.h"
37 #include "AliAnalysisManager.h"
38 #include "AliTracker.h"
39 #include "AliESDEvent.h"
40 #include "AliESDInputHandler.h"
41 #include "AliESDpid.h"
43 #include "AliMCEvent.h"
44 #include "AliMCEventHandler.h"
45 #include "AliESDtrackCuts.h"
46 #include "AliKineTrackCuts.h"
47 #include "AliMCParticle.h"
48 #include "AliESDVZERO.h"
49 #include "AliEbyEPidRatioTask.h"
50 #include "AliGenEventHeader.h"
51 #include "AliCentrality.h"
52 #include "AliAODEvent.h"
53 #include "AliAODInputHandler.h"
56 ClassImp(AliEbyEPidRatioTask)
57 //________________________________________________________________________
58 AliEbyEPidRatioTask::AliEbyEPidRatioTask(const char *name) :
59 AliAnalysisTaskSE(name),
75 fESDTrackCutsBase(NULL),
77 fESDTrackCutsBkg(NULL),
78 fESDTrackCutsEff(NULL),
101 fAODtrackCutBit(1024) {
103 AliLog::SetClassDebugLevel("AliEbyEPidRatioTask",10);
107 fPtRangeEff[0] = 0.2;
108 fPtRangeEff[1] = 1.6;
110 DefineOutput(1, TList::Class());
111 DefineOutput(2, TList::Class());
112 DefineOutput(3, TList::Class());
113 DefineOutput(4, TList::Class());
114 DefineOutput(5, TList::Class());
117 //________________________________________________________________________
118 AliEbyEPidRatioTask::~AliEbyEPidRatioTask() {
121 if (fESDTrackCutsBase) delete fESDTrackCutsBase;
122 if (fESDTrackCuts) delete fESDTrackCuts;
123 if (fESDTrackCutsBkg) delete fESDTrackCutsBkg;
124 if (fESDTrackCutsEff) delete fESDTrackCutsEff;
126 if (fEffCont) delete fEffCont;
127 if (fDCA) delete fDCA;
128 if (fDist) delete fDist;
130 if (fHelper) delete fHelper;
135 //________________________________________________________________________
136 void AliEbyEPidRatioTask::UserCreateOutputObjects() {
137 Bool_t oldStatus = TH1::AddDirectoryStatus();
138 TH1::AddDirectory(kFALSE);
140 fOutList = new TList;
141 fOutList->SetName(GetName()) ;
142 fOutList->SetOwner(kTRUE);
144 fOutListEff = new TList;
145 fOutListEff->SetName(Form("%s_eff",GetName()));
146 fOutListEff->SetOwner(kTRUE) ;
148 fOutListCont = new TList;
149 fOutListCont->SetName(Form("%s_cont",GetName()));
150 fOutListCont->SetOwner(kTRUE) ;
152 fOutListDCA = new TList;
153 fOutListDCA->SetName(Form("%s_dca",GetName()));
154 fOutListDCA->SetOwner(kTRUE) ;
156 fOutListQA = new TList;
157 fOutListQA->SetName(Form("%s_qa",GetName()));
158 fOutListQA->SetOwner(kTRUE) ;
162 fOutList->Add(new TList);
163 TList *list = static_cast<TList*>(fOutList->Last());
164 list->SetName(Form("fStat"));
165 list->SetOwner(kTRUE);
167 list->Add(fHelper->GetHEventStat0());
168 list->Add(fHelper->GetHEventStat1());
169 list->Add(fHelper->GetHTriggerStat());
170 list->Add(fHelper->GetHCentralityPercentile());
171 list->Add(fHelper->GetHCentralityPercentileAll());
176 if ((fIsAOD||fIsMC) && fModeEffCreation == 1) {
177 fOutListEff->Add(fEffCont->GetHnEffMc());
178 fOutListEff->Add(fEffCont->GetHnEffRec());
180 fOutListCont->Add(fEffCont->GetHnContMc());
181 fOutListCont->Add(fEffCont->GetHnContRec());
184 if (fModeDCACreation == 1)
185 fOutListDCA->Add(fDCA->GetHnDCA());
187 if (fModeQACreation == 1) {
188 fOutListQA->Add(fQA->GetHnQAPid());
189 fOutListQA->Add(fQA->GetHnQADca());
192 TH1::AddDirectory(oldStatus);
194 PostData(1,fOutList);
195 PostData(2,fOutListEff);
196 PostData(3,fOutListCont);
197 PostData(4,fOutListDCA);
198 PostData(5,fOutListQA);
203 //________________________________________________________________________
204 void AliEbyEPidRatioTask::UserExec(Option_t *) {
206 if (SetupEvent() < 0) {
207 PostData(1,fOutList);
208 PostData(2,fOutListEff);
209 PostData(3,fOutListCont);
210 PostData(4,fOutListDCA);
211 PostData(5,fOutListQA);
216 if ((fIsMC||fIsAOD) && fModeEffCreation == 1)
219 if (fModeDCACreation == 1)
222 if (fModeDistCreation == 1)
225 if (fModeQACreation == 1)
228 PostData(1,fOutList);
229 PostData(2,fOutListEff);
230 PostData(3,fOutListCont);
231 PostData(4,fOutListDCA);
232 PostData(5,fOutListQA);
237 //________________________________________________________________________
238 void AliEbyEPidRatioTask::Terminate(Option_t *){
242 Int_t AliEbyEPidRatioTask::Initialize() {
245 // ------------------------------------------------------------------
247 // ------------------------------------------------------------------
248 TString sModeName("");
250 // -- Create ESD track cuts
251 // --------------------------
252 fESDTrackCutsBase = new AliESDtrackCuts;
254 if (fESDTrackCutMode == 0) {
255 fESDTrackCutsBase->SetMinNCrossedRowsTPC(70); // TPC
256 fESDTrackCutsBase->SetMinRatioCrossedRowsOverFindableClustersTPC(0.8); // TPC
258 else if (fESDTrackCutMode == 1) {
259 fESDTrackCutsBase->SetMinNClustersTPC(70); // TPC 2010
262 fESDTrackCutsBase->SetMaxChi2PerClusterTPC(4); // TPC 2010
263 fESDTrackCutsBase->SetAcceptKinkDaughters(kFALSE); // TPC 2010
264 fESDTrackCutsBase->SetRequireTPCRefit(kTRUE); // TPC 2010
266 if (fESDTrackCutMode == 0) {
267 fESDTrackCutsBase->SetClusterRequirementITS(AliESDtrackCuts::kSPD,AliESDtrackCuts::kOff); // ITS
268 fESDTrackCutsBase->SetClusterRequirementITS(AliESDtrackCuts::kSDD,AliESDtrackCuts::kOff); // ITS
269 fESDTrackCutsBase->SetClusterRequirementITS(AliESDtrackCuts::kSSD,AliESDtrackCuts::kOff); // ITS
271 else if (fESDTrackCutMode == 1) {
272 fESDTrackCutsBase->SetClusterRequirementITS(AliESDtrackCuts::kSPD,AliESDtrackCuts::kAny); // ITS 2010
273 // fESDTrackCutsBase->SetMinNClustersITS(4);
276 fESDTrackCutsBase->SetRequireITSRefit(kTRUE); // ITS 2010
277 fESDTrackCutsBase->SetMaxChi2PerClusterITS(36); // ITS 2010
279 fESDTrackCutsBase->SetDCAToVertex2D(kFALSE); // VertexConstrained 2010
280 fESDTrackCutsBase->SetRequireSigmaToVertex(kFALSE); // VertexConstrained 2010
281 fESDTrackCutsBase->SetMaxDCAToVertexZ(2); // VertexConstrained 2010
283 fESDTrackCutsBase->SetEtaRange(-1.*fEtaMax, fEtaMax); // Acceptance
284 fESDTrackCutsBase->SetPtRange(fPtRange[0],fPtRange[1]); // Acceptance
286 // -- Mode : standard cuts
287 if (fESDTrackCutMode == 0)
289 // -- Mode : for comparison to LF
290 else if (fESDTrackCutMode == 1)
296 fESDTrackCutsBase->SetName(Form("NetParticleCuts2010_%s",sModeName.Data()));
298 // -- Create ESD track cuts -> Base + DCA
299 // ------------------------------
300 fESDTrackCuts = static_cast<AliESDtrackCuts*>(fESDTrackCutsBase->Clone());
301 fESDTrackCuts->SetName(Form("NetParticleCuts2010_%s",sModeName.Data()));
302 if (fESDTrackCutMode == 0)
303 fESDTrackCuts->SetMaxDCAToVertexXYPtDep("0.0182+0.0350/pt^1.01"); // 2010 VertexConstrained -> 7*(0.0026+0.0050/pt^1.01)
304 // fESDTrackCuts->SetMaxDCAToVertexXY(0.3);
305 else if (fESDTrackCutMode == 1)
306 fESDTrackCuts->SetMaxDCAToVertexXYPtDep("0.0182+0.0350/pt^1.01"); // 2010 VertexConstrained -> 7*(0.0026+0.0050/pt^1.01)
308 // fESDTrackCuts->SetMaxChi2TPCConstrainedGlobal(36); // golden cut off
310 // -- Create ESD BKG track cuts -> Base + Acceptance(Eff)
311 // ------------------------------
312 fESDTrackCutsBkg = static_cast<AliESDtrackCuts*>(fESDTrackCutsBase->Clone());
313 fESDTrackCutsBkg->SetName(Form("NetParticleCuts2010_%s_Bkg",sModeName.Data()));
314 fESDTrackCutsBkg->SetPtRange(fPtRangeEff[0],fPtRangeEff[1]); // Acceptance
315 fESDTrackCutsBkg->SetEtaRange(-1.*fEtaMaxEff, fEtaMaxEff); // Acceptance
317 // -- Create ESD Eff track cuts -> Base + DCA + Acceptance(Eff)
318 // ------------------------------
319 fESDTrackCutsEff = static_cast<AliESDtrackCuts*>(fESDTrackCuts->Clone());
320 fESDTrackCutsEff->SetName(Form("NetParticleCuts2010_%s_Eff",sModeName.Data()));
321 fESDTrackCutsEff->SetPtRange(fPtRangeEff[0],fPtRangeEff[1]); // Acceptance
322 fESDTrackCutsEff->SetEtaRange(-1.*fEtaMaxEff, fEtaMaxEff); // Acceptance
324 // ------------------------------------------------------------------
325 // -- Initialize Helper
326 // ------------------------------------------------------------------
329 if (fHelper->Initialize(fESDTrackCutsEff, fIsMC,fIsRatio,fIsPtBin, fAODtrackCutBit, fModeDistCreation))
332 // fHelper->SetIsRatio(fIsRatio);
333 // fHelper->SetIsPtBin(fIsPtBin);
335 // ------------------------------------------------------------------
336 // -- Create / Initialize Efficiency/Contamination
337 // ------------------------------------------------------------------
338 if ((fIsMC||fIsAOD) && fModeEffCreation == 1) {
339 fEffCont = new AliEbyEPidRatioEffCont;
340 fEffCont->Initialize(fHelper, fESDTrackCuts);
343 // ------------------------------------------------------------------
344 // -- Create / Initialize DCA Determination
345 // ------------------------------------------------------------------
346 if (fModeDCACreation == 1) {
347 fDCA = new AliEbyEPidRatioDCA;
348 fDCA->SetESDTrackCutsBkg(fESDTrackCutsBkg);
349 fDCA->Initialize(fHelper, fESDTrackCuts);
352 // ------------------------------------------------------------------
353 // -- Create / Initialize Phy Determination
354 // ------------------------------------------------------------------
355 if (fModeDistCreation == 1) {
356 fDist = new AliEbyEPidRatioPhy;
357 fDist->SetOutList(fOutList);
358 fDist->Initialize(fHelper, fESDTrackCuts);
361 // ------------------------------------------------------------------
362 // -- Create / Initialize QA Determination
363 // ------------------------------------------------------------------
364 if (fModeQACreation == 1) {
365 fQA = new AliEbyEPidRatioQA();
366 fQA->Initialize(fHelper, fESDTrackCuts);
369 // ------------------------------------------------------------------
371 // ------------------------------------------------------------------
377 //________________________________________________________________________
378 Int_t AliEbyEPidRatioTask::SetupEvent() {
383 // ------------------------------------------------------------------
384 if (!fIsAOD && SetupESDEvent() < 0) {
385 AliError("Setup ESD Event failed");
390 // ------------------------------------------------------------------
391 if (fIsAOD && SetupAODEvent() < 0) {
392 AliError("Setup AOD Event failed");
397 // ------------------------------------------------------------------
398 if (fIsMC && SetupMCEvent() < 0) {
399 AliError("Setup MC Event failed");
403 // -- Setup Event for Helper / EffCont / DCA / Dist / QA classes
404 // ------------------------------------------------------------------
405 fHelper->SetupEvent(fESDHandler, fAODHandler, fMCEvent);
408 if (fModeEffCreation && (fIsMC || fIsAOD) )
409 fEffCont->SetupEvent();
411 if (fModeDCACreation == 1)
414 if (fModeDistCreation == 1)
417 if (fModeQACreation == 1)
421 // -- Evaluate Event cuts
422 // ------------------------------------------------------------------
423 return fHelper->IsEventRejected() ? -2 : 0;
426 //________________________________________________________________________
427 Int_t AliEbyEPidRatioTask::SetupESDEvent() {
428 // -- Setup ESD Event
429 // > return 0 for success
430 // > return -1 for failed setup
435 fESDHandler= dynamic_cast<AliESDInputHandler*>
436 (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
438 AliError("Could not get ESD input handler");
442 fESD = fESDHandler->GetEvent();
444 AliError("Could not get ESD event");
448 // -- Check PID response
449 // ------------------------------------------------------------------
450 if (!fESDHandler->GetPIDResponse()) {
451 AliError("Could not get PID response");
456 // ------------------------------------------------------------------
457 if (!fESD->GetPrimaryVertexTracks()) {
458 AliError("Could not get vertex from tracks");
462 // -- Check Centrality
463 // ------------------------------------------------------------------
464 if (!fESD->GetCentrality()) {
465 AliError("Could not get centrality");
472 //________________________________________________________________________
473 Int_t AliEbyEPidRatioTask::SetupAODEvent() {
474 // -- Setup AOD Event
475 // > return 0 for success
476 // > return -1 for failed setup
478 fAODHandler= dynamic_cast<AliAODInputHandler*>
479 (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
481 AliError("Could not get AOD input handler");
485 fAOD = fAODHandler->GetEvent();
487 AliError("Could not get AOD event");
491 // -- Check PID response
492 // ------------------------------------------------------------------
493 if (!fAODHandler->GetPIDResponse()) {
494 AliError("Could not get PID response");
499 // ------------------------------------------------------------------
500 if (!fAOD->GetPrimaryVertex()) {
501 AliError("Could not get primary vertex");
505 // -- Check Centrality
506 // ------------------------------------------------------------------
507 if (!fAOD->GetHeader()->GetCentralityP()) {
508 AliError("Could not get centrality");
515 //________________________________________________________________________
516 Int_t AliEbyEPidRatioTask::SetupMCEvent() {
517 AliMCEventHandler *mcH = dynamic_cast<AliMCEventHandler*>
518 (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
521 AliError("MC event handler not available");
525 fMCEvent = mcH->MCEvent();
527 AliError("MC event not available");
532 // ------------------------------------------------------------------
533 AliHeader* header = fMCEvent->Header();
535 AliError("MC header not available");
540 // ------------------------------------------------------------------
541 fMCStack = fMCEvent->Stack();
543 AliError("MC stack not available");
547 // -- Check GenHeader
548 // ------------------------------------------------------------------
549 if (!header->GenEventHeader()) {
550 AliError("Could not retrieve genHeader from header");
554 // -- Check primary vertex
555 // ------------------------------------------------------------------
556 if (!fMCEvent->GetPrimaryVertex()){
557 AliError("Could not get MC vertex");
564 //________________________________________________________________________
565 void AliEbyEPidRatioTask::ResetEvent() {
568 // -- Reset ESD Event
571 // -- Reset AOD Event
578 // -- Reset Dist Creation
579 if (fModeDistCreation == 1)