1 /**************************************************************************
2 * Copyright(c) 1998-2008, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
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 // Class AliEPSelectionTask
18 // Class to determine event plane
19 // author: Alberica Toia, Johanna Gramling
20 //*****************************************************
22 #include "AliEPSelectionTask.h"
30 #include <TObjString.h>
34 #include <TDirectory.h>
40 #include "AliAnalysisManager.h"
41 #include "AliVEvent.h"
43 #include "AliESDEvent.h"
44 #include "AliMCEvent.h"
45 #include "AliESDtrack.h"
46 #include "AliESDtrackCuts.h"
47 #include "AliESDHeader.h"
48 #include "AliESDInputHandler.h"
49 #include "AliAODHandler.h"
50 #include "AliAODEvent.h"
51 #include "AliHeader.h"
52 #include "AliGenHijingEventHeader.h"
53 #include "AliAnalysisTaskSE.h"
54 #include "AliPhysicsSelectionTask.h"
55 #include "AliPhysicsSelection.h"
56 #include "AliBackgroundSelection.h"
57 #include "AliESDUtils.h"
59 #include "AliEventplane.h"
61 ClassImp(AliEPSelectionTask)
63 //________________________________________________________________________
64 AliEPSelectionTask::AliEPSelectionTask():
67 fAnalysisInput("ESD"),
70 fUsePhiWeight(kFALSE),
72 fSaveTrackContribution(kFALSE),
93 // Default constructor
94 AliInfo("Event Plane Selection enabled.");
97 //________________________________________________________________________
98 AliEPSelectionTask::AliEPSelectionTask(const char *name):
99 AliAnalysisTaskSE(name),
101 fAnalysisInput("ESD"),
104 fUsePhiWeight(kFALSE),
105 fUsePtWeight(kFALSE),
106 fSaveTrackContribution(kFALSE),
127 // Default constructor
128 AliInfo("Event Plane Selection enabled.");
129 DefineOutput(1, TList::Class());
132 //________________________________________________________________________
133 AliEPSelectionTask::~AliEPSelectionTask()
136 if (fOutputList && !AliAnalysisManager::GetAnalysisManager()->IsProofMode()){
141 delete fESDtrackCuts;
158 //________________________________________________________________________
159 void AliEPSelectionTask::UserCreateOutputObjects()
161 // Create the output containers
162 if (fDebug>1) printf("AliEPSelectionTask::UserCreateOutputObjects() \n");
163 AliLog::SetClassDebugLevel("AliEPSelectionTask", AliLog::kInfo);
165 fOutputList = new TList();
166 fOutputList->SetOwner();
167 fHOutEventplaneQ = new TH1F("fHOutEventplaneQ","fHOutEventplaneQ; Event Plane Q",100,0,TMath::Pi());
168 fHOutPhi = new TH1F("fHOutPhi","fHOutPhi; Phi Distribution",100,0,TMath::TwoPi());
169 fHOutPhiCorr = new TH1F("fHOutPhiCorr","fHOutPhiCorr; Corrected Phi Distribution",100,0,TMath::TwoPi());
170 fHOutsub1sub2 = new TH2F("fHOutsub1sub2","fHOutsub1sub2; EP1; EP2",100,0,TMath::Pi(),100,0,TMath::Pi());
171 fHOutNTEPRes = new TH2F("fHOutNTEPRes","fHOutNTEPRes; Number of Tracks; Event Plane Resolution",100,0,5000,100,-TMath::Pi(),TMath::Pi());
172 fHOutPTPsi = new TH2F("fHOutPTPsi","fHOutPTPsi; PT; Phi-EP",100,0,20,100,0,TMath::Pi());
173 fHOutDiff = new TH2F("fHOutDiff","fHOutDiff; EP; MCEP",100,0,TMath::Pi(),100,0,TMath::Pi());
174 fHOutleadPTPsi = new TH2F("fHOutleadPTPsi","fHOutleadPTPsi; leadPT; EP",100,0,TMath::Pi(),100,0,TMath::Pi());
176 fOutputList->Add(fHOutEventplaneQ);
177 fOutputList->Add(fHOutPhi);
178 fOutputList->Add(fHOutPhiCorr);
179 fOutputList->Add(fHOutsub1sub2);
180 fOutputList->Add(fHOutNTEPRes);
181 fOutputList->Add(fHOutPTPsi);
182 fOutputList->Add(fHOutleadPTPsi);
183 fOutputList->Add(fHOutDiff);
185 PostData(1, fOutputList);
188 //________________________________________________________________________
189 void AliEPSelectionTask::UserExec(Option_t */*option*/)
191 // Execute analysis for current event:
192 if (fDebug>1) printf(" **** AliEPSelectionTask::UserExec() \n");
194 AliEventplane* esdEP = 0;
197 Double_t fRP = 0.; // the monte carlo reaction plane angle
199 if (fAnalysisInput.CompareTo("ESD")==0){
201 AliVEvent* event = InputEvent();
202 AliESDEvent* esd = dynamic_cast<AliESDEvent*>(event);
205 AliMCEvent* mcEvent = MCEvent();
206 if (mcEvent && mcEvent->GenEventHeader()) {
207 AliGenHijingEventHeader* headerH = dynamic_cast<AliGenHijingEventHeader*>(mcEvent->GenEventHeader());
208 if (headerH) fRP = headerH->ReactionPlaneAngle();
212 esdEP = esd->GetEventplane();
213 if (fSaveTrackContribution) {
214 esdEP->GetQContributionXArray()->Set(esd->GetNumberOfTracks());
215 esdEP->GetQContributionYArray()->Set(esd->GetNumberOfTracks());
218 if (fStatus.CompareTo("GLOBAL")==0) ftracklist = fESDtrackCuts->GetAcceptedTracks(esd,kFALSE);
219 if (fStatus.CompareTo("TPC")==0) ftracklist = fESDtrackCuts->GetAcceptedTracks(esd,kTRUE);
220 const int NT = ftracklist->GetEntries();
223 fQVector = new TVector2(GetQ(esdEP,ftracklist));
224 fEventplaneQ = fQVector->Phi()/2;
225 GetQsub(QQ1, QQ2, ftracklist);
226 fQsub1 = new TVector2(QQ1);
227 fQsub2 = new TVector2(QQ2);
228 fQsubRes = (fQsub1->Phi()/2 - fQsub2->Phi()/2);
229 esdEP->SetQVector(fQVector);
230 esdEP->SetEventplaneQ(fEventplaneQ);
231 esdEP->SetQsub(fQsub1,fQsub2);
232 esdEP->SetQsubRes(fQsubRes);
234 fHOutEventplaneQ->Fill(fEventplaneQ);
235 fHOutsub1sub2->Fill(fQsub1->Phi()/2,fQsub2->Phi()/2);
236 fHOutNTEPRes->Fill(NT,fQsubRes);
238 if (fUseMCRP) fHOutDiff->Fill(fEventplaneQ, fRP);
240 for (int iter = 0; iter<NT;iter++){
241 AliESDtrack* track = dynamic_cast<AliESDtrack*> (ftracklist->At(iter));
243 float delta = track->Phi()-fEventplaneQ;
244 while (delta < 0) delta += TMath::Pi();
245 while (delta > TMath::Pi()) delta -= TMath::Pi();
246 fHOutPTPsi->Fill(track->Pt(),delta);
247 fHOutPhi->Fill(track->Phi());
248 fHOutPhiCorr->Fill(track->Phi(),GetPhiWeight(track));
252 AliESDtrack* trmax = esd->GetTrack(0);
253 for (int iter = 1; iter<NT;iter++){
254 AliESDtrack* track = dynamic_cast<AliESDtrack*> (ftracklist->At(iter));
255 if (track && (track->Pt() > trmax->Pt())) trmax = track;
257 fHOutleadPTPsi->Fill(trmax->Phi(),fEventplaneQ);
263 else if (fAnalysisInput.CompareTo("AOD")==0){
264 //AliAODEvent *aod = dynamic_cast<AliAODEvent*> (InputEvent());
266 printf(" AOD analysis not yet implemented!!!\n\n");
270 printf(" Analysis Input not known!\n\n ");
273 PostData(1, fOutputList);
276 //________________________________________________________________________
277 void AliEPSelectionTask::Terminate(Option_t */*option*/)
279 // Terminate analysis
282 //__________________________________________________________________________
283 TVector2 AliEPSelectionTask::GetQ(AliEventplane* EP, TObjArray* tracklist)
290 int NT = tracklist->GetEntries();
292 for (int i=0; i<NT; i++){
294 track = dynamic_cast<AliESDtrack*> (tracklist->At(i));
296 weight = GetWeight(track);
297 if (fSaveTrackContribution){
298 EP->GetQContributionXArray()->AddAt(weight*cos(2*track->Phi()),track->GetID());
299 EP->GetQContributionYArray()->AddAt(weight*sin(2*track->Phi()),track->GetID());
301 mQx += (weight*cos(2*track->Phi()));
302 mQy += (weight*sin(2*track->Phi()));
309 //________________________________________________________________________
310 void AliEPSelectionTask::GetQsub(TVector2 &Q1, TVector2 &Q2, TObjArray* tracklist)
313 float mQx1=0, mQy1=0, mQx2=0, mQy2=0;
319 int NT = tracklist->GetEntries();
320 int trackcounter1=0, trackcounter2=0;
322 for (Int_t i = 0; i < NT; i++) {
324 track = dynamic_cast<AliESDtrack*> (tracklist->At(i));
325 if (!track) continue;
326 weight = GetWeight(track);
328 // This loop splits the track set into 2 random subsets
329 if( trackcounter1 < int(NT/2.) && trackcounter2 < int(NT/2.)){
330 float random = RN.Rndm();
332 mQx1 += (weight*cos(2*track->Phi()));
333 mQy1 += (weight*sin(2*track->Phi()));
337 mQx2 += (weight*cos(2*track->Phi()));
338 mQy2 += (weight*sin(2*track->Phi()));
342 else if( trackcounter1 >= int(NT/2.)){
343 mQx2 += (weight*cos(2*track->Phi()));
344 mQy2 += (weight*sin(2*track->Phi()));
348 mQx1 += (weight*cos(2*track->Phi()));
349 mQy1 += (weight*sin(2*track->Phi()));
353 mQ[0].Set(mQx1,mQy1);
354 mQ[1].Set(mQx2,mQy2);
359 //________________________________________________________________________
360 void AliEPSelectionTask::SetESDtrackCuts(TString status){
363 if (fStatus.CompareTo("GLOBAL")==0) fESDtrackCuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2010(kTRUE);
364 if (fStatus.CompareTo("TPC")==0) fESDtrackCuts = AliESDtrackCuts::GetStandardTPCOnlyTrackCuts();
365 fESDtrackCuts->SetPtRange(0.15,20);
366 fESDtrackCuts->SetEtaRange(-0.8,0.8);
369 //__________________________________________________________________________
370 void AliEPSelectionTask::SetPhiDistribution(char* infilename, char* listname)
373 TObject* list = f.Get(listname);
374 fPhiDist = (TH1F*)list->FindObject("fHOutPhi");
376 cout << "Phi Distribution not found!!!" << endl;
386 for (int i=1; i<fPhiDist->GetNbinsX(); i++){
387 if (!((fPhiDist->GetBinContent(i))>0)) {
392 cout << "empty bins - rebinning!" << endl;
400 AliError("After Maximum of rebinning still empty Phi-bins!!!");
405 //________________________________________________________________________
406 Double_t AliEPSelectionTask::GetWeight(AliESDtrack* track)
411 if (track->Pt()<2) ptweight=track->Pt();
414 return ptweight*GetPhiWeight(track);
417 //________________________________________________________________________
418 Double_t AliEPSelectionTask::GetPhiWeight(AliESDtrack* track)
420 Double_t phiweight=1;
422 if (fUsePhiWeight && fPhiDist && track) {
423 Double_t nParticles = fPhiDist->Integral();
424 Double_t nPhibins = fPhiDist->GetNbinsX();
426 Double_t Phi = track->Phi();
428 while (Phi<0) Phi += TMath::TwoPi();
429 while (Phi>TMath::TwoPi()) Phi -= TMath::TwoPi();
431 Double_t PhiDistValue = fPhiDist->GetBinContent(1+TMath::FloorNint((track->Phi())*nPhibins/TMath::TwoPi()));
433 if (PhiDistValue > 0) phiweight = nParticles/nPhibins/PhiDistValue;