]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWG2/FLOW/AliFlowCommon/AliFlowAnalysisWithMCEventPlane.cxx
make macros compatible with centrality train
[u/mrichter/AliRoot.git] / PWG2 / FLOW / AliFlowCommon / AliFlowAnalysisWithMCEventPlane.cxx
CommitLineData
f1d945a1 1/*************************************************************************
2* Copyright(c) 1998-2008, ALICE Experiment at CERN, All rights reserved. *
3* *
4* Author: The ALICE Off-line Project. *
5* Contributors are mentioned in the code where appropriate. *
6* *
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**************************************************************************/
fbdb53fa 15// AliFlowAnalysisWithMCEventPlane:
16// Description: Maker to analyze Flow from the generated MC reaction plane.
17// This class is used to get the real value of the flow
18// to compare the other methods to when analysing simulated events
19// author: N. van der Kolk (kolk@nikhef.nl)
f1d945a1 20
21#define AliFlowAnalysisWithMCEventPlane_cxx
22
fbdb53fa 23#include "Riostream.h"
24#include "TFile.h"
25#include "TProfile.h"
26#include "TProfile2D.h"
28ca24ad 27#include "TList.h"
fbdb53fa 28#include "TH1F.h"
29#include "TMath.h"
929098e4 30#include "TVector2.h"
f1d945a1 31
fbdb53fa 32#include "AliFlowCommonConstants.h"
f1d945a1 33#include "AliFlowEventSimple.h"
34#include "AliFlowTrackSimple.h"
35#include "AliFlowCommonHist.h"
36#include "AliFlowCommonHistResults.h"
37#include "AliFlowAnalysisWithMCEventPlane.h"
929098e4 38#include "AliFlowVector.h"
f1d945a1 39
40class AliFlowVector;
41
f1d945a1 42ClassImp(AliFlowAnalysisWithMCEventPlane)
43
44 //-----------------------------------------------------------------------
45
46 AliFlowAnalysisWithMCEventPlane::AliFlowAnalysisWithMCEventPlane():
0092f3c2 47 fQsum(NULL),
f1d945a1 48 fQ2sum(0),
49 fEventNumber(0),
f1d945a1 50 fDebug(kFALSE),
28ca24ad 51 fHistList(NULL),
8232a5ec 52 fCommonHists(NULL),
53 fCommonHistsRes(NULL),
45cdbef2 54 fHistRP(NULL),
3963f25c 55 fHistProIntFlow(NULL),
10a70cd5 56 fHistProIntFlowVsM(NULL),
9cc9e6cc 57 fHistProDiffFlowPtEtaRP(NULL),
45cdbef2 58 fHistProDiffFlowPtRP(NULL),
59 fHistProDiffFlowEtaRP(NULL),
9cc9e6cc 60 fHistProDiffFlowPtEtaPOI(NULL),
45cdbef2 61 fHistProDiffFlowPtPOI(NULL),
4f678629 62 fHistProDiffFlowEtaPOI(NULL),
afa4af05 63 fHistSpreadOfFlow(NULL),
b3a29c75 64 fHarmonic(2),
4740c6b8 65 fMixedHarmonicsList(NULL),
dfb33a36 66 fEvaluateMixedHarmonics(kFALSE),
4740c6b8 67 fMixedHarmonicsSettings(NULL),
68 fnBinsMult(10000),
69 fMinMult(0.),
70 fMaxMult(10000.),
71 fNinCorrelator(2),
72 fMinCorrelator(2),
b3a29c75 73 fXinPairAngle(0.5)
f1d945a1 74{
75
76 // Constructor.
28ca24ad 77 fHistList = new TList();
78
0092f3c2 79 fQsum = new TVector2; // flow vector sum
b3a29c75 80
4740c6b8 81 fMixedHarmonicsList = new TList();
82 this->InitalizeArraysForMixedHarmonics();
f1d945a1 83
4740c6b8 84}
f1d945a1 85
4740c6b8 86//-----------------------------------------------------------------------
f1d945a1 87
4740c6b8 88AliFlowAnalysisWithMCEventPlane::~AliFlowAnalysisWithMCEventPlane()
89{
90 //destructor
91 delete fHistList;
92 delete fQsum;
93}
f1d945a1 94
7ebf0358 95//-----------------------------------------------------------------------
96
97void AliFlowAnalysisWithMCEventPlane::WriteHistograms(TString* outputFileName)
98{
99 //store the final results in output .root file
100 TFile *output = new TFile(outputFileName->Data(),"RECREATE");
0fe80f88 101 //output->WriteObject(fHistList, "cobjMCEP","SingleKey");
102 fHistList->SetName("cobjMCEP");
9455e15e 103 fHistList->SetOwner(kTRUE);
0fe80f88 104 fHistList->Write(fHistList->GetName(), TObject::kSingleKey);
7ebf0358 105 delete output;
106}
f1d945a1 107
108//-----------------------------------------------------------------------
b0fda271 109
110void AliFlowAnalysisWithMCEventPlane::WriteHistograms(TString outputFileName)
111{
112 //store the final results in output .root file
113 TFile *output = new TFile(outputFileName.Data(),"RECREATE");
0fe80f88 114 //output->WriteObject(fHistList, "cobjMCEP","SingleKey");
115 fHistList->SetName("cobjMCEP");
9455e15e 116 fHistList->SetOwner(kTRUE);
0fe80f88 117 fHistList->Write(fHistList->GetName(), TObject::kSingleKey);
b0fda271 118 delete output;
119}
120
ad87ae62 121//-----------------------------------------------------------------------
122
123void AliFlowAnalysisWithMCEventPlane::WriteHistograms(TDirectoryFile *outputFileName)
124{
125 //store the final results in output .root file
126 fHistList->SetName("cobjMCEP");
127 fHistList->SetOwner(kTRUE);
128 outputFileName->Add(fHistList);
129 outputFileName->Write(outputFileName->GetName(), TObject::kSingleKey);
130}
131
b0fda271 132//-----------------------------------------------------------------------
f1d945a1 133void AliFlowAnalysisWithMCEventPlane::Init() {
134
135 //Define all histograms
136 cout<<"---Analysis with the real MC Event Plane---"<<endl;
137
489d5531 138 //save old value and prevent histograms from being added to directory
139 //to avoid name clashes in case multiple analaysis objects are used
140 //in an analysis
141 Bool_t oldHistAddStatus = TH1::AddDirectoryStatus();
142 TH1::AddDirectory(kFALSE);
143
bee2efdc 144 Int_t iNbinsPt = AliFlowCommonConstants::GetMaster()->GetNbinsPt();
145 Double_t dPtMin = AliFlowCommonConstants::GetMaster()->GetPtMin();
146 Double_t dPtMax = AliFlowCommonConstants::GetMaster()->GetPtMax();
45cdbef2 147
bee2efdc 148 Int_t iNbinsEta = AliFlowCommonConstants::GetMaster()->GetNbinsEta();
149 Double_t dEtaMin = AliFlowCommonConstants::GetMaster()->GetEtaMin();
150 Double_t dEtaMax = AliFlowCommonConstants::GetMaster()->GetEtaMax();
f1d945a1 151
9d062fe3 152 fCommonHists = new AliFlowCommonHist("AliFlowCommonHistMCEP");
153 fHistList->Add(fCommonHists);
154 fCommonHistsRes = new AliFlowCommonHistResults("AliFlowCommonHistResultsMCEP");
155 fHistList->Add(fCommonHistsRes);
156
afa4af05 157 // store harmonic in common control histogram:
158 (fCommonHists->GetHarmonic())->Fill(0.5,fHarmonic);
159
9d062fe3 160 fHistRP = new TH1F("Flow_RP_MCEP","Flow_RP_MCEP",100,0.,3.14);
f1d945a1 161 fHistRP->SetXTitle("Reaction Plane Angle");
162 fHistRP->SetYTitle("Counts");
28ca24ad 163 fHistList->Add(fHistRP);
45cdbef2 164
b7cb54d5 165 fHistProIntFlow = new TProfile("FlowPro_V_MCEP","FlowPro_V_MCEP",1,0.,1.);
3963f25c 166 fHistProIntFlow->SetLabelSize(0.06);
10a70cd5 167 (fHistProIntFlow->GetXaxis())->SetBinLabel(1,"v_{n}{MCEP}");
3963f25c 168 fHistProIntFlow->SetYTitle("");
169 fHistList->Add(fHistProIntFlow);
9cc9e6cc 170
10a70cd5 171 fHistProIntFlowVsM = new TProfile("FlowPro_VsM_MCEP","FlowPro_VsM_MCEP",10000,0.,10000.); // to be improved - hardwired 10000
172 //fHistProIntFlowVsM->SetLabelSize(0.06);
173 (fHistProIntFlowVsM->GetXaxis())->SetTitle("M");
174 fHistProIntFlowVsM->SetYTitle("");
175 fHistList->Add(fHistProIntFlowVsM);
176
9cc9e6cc 177 fHistProDiffFlowPtEtaRP = new TProfile2D("FlowPro_VPtEtaRP_MCEP","FlowPro_VPtEtaRP_MCEP",iNbinsPt,dPtMin,dPtMax,iNbinsEta,dEtaMin,dEtaMax);
178 fHistProDiffFlowPtEtaRP->SetXTitle("P_{t}");
179 fHistProDiffFlowPtEtaRP->SetYTitle("#eta");
180 fHistList->Add(fHistProDiffFlowPtEtaRP);
45cdbef2 181
b7cb54d5 182 fHistProDiffFlowPtRP = new TProfile("FlowPro_VPtRP_MCEP","FlowPro_VPtRP_MCEP",iNbinsPt,dPtMin,dPtMax);
45cdbef2 183 fHistProDiffFlowPtRP->SetXTitle("P_{t}");
184 fHistProDiffFlowPtRP->SetYTitle("");
185 fHistList->Add(fHistProDiffFlowPtRP);
186
b7cb54d5 187 fHistProDiffFlowEtaRP = new TProfile("FlowPro_VetaRP_MCEP","FlowPro_VetaRP_MCEP",iNbinsEta,dEtaMin,dEtaMax);
45cdbef2 188 fHistProDiffFlowEtaRP->SetXTitle("#eta");
189 fHistProDiffFlowEtaRP->SetYTitle("");
190 fHistList->Add(fHistProDiffFlowEtaRP);
191
9cc9e6cc 192 fHistProDiffFlowPtEtaPOI = new TProfile2D("FlowPro_VPtEtaPOI_MCEP","FlowPro_VPtEtaPOI_MCEP",iNbinsPt,dPtMin,dPtMax,iNbinsEta,dEtaMin,dEtaMax);
193 fHistProDiffFlowPtEtaPOI->SetXTitle("P_{t}");
194 fHistProDiffFlowPtEtaPOI->SetYTitle("#eta");
195 fHistList->Add(fHistProDiffFlowPtEtaPOI);
196
b7cb54d5 197 fHistProDiffFlowPtPOI = new TProfile("FlowPro_VPtPOI_MCEP","FlowPro_VPtPOI_MCEP",iNbinsPt,dPtMin,dPtMax);
45cdbef2 198 fHistProDiffFlowPtPOI->SetXTitle("P_{t}");
199 fHistProDiffFlowPtPOI->SetYTitle("");
200 fHistList->Add(fHistProDiffFlowPtPOI);
201
b7cb54d5 202 fHistProDiffFlowEtaPOI = new TProfile("FlowPro_VetaPOI_MCEP","FlowPro_VetaPOI_MCEP",iNbinsEta,dEtaMin,dEtaMax);
45cdbef2 203 fHistProDiffFlowEtaPOI->SetXTitle("#eta");
204 fHistProDiffFlowEtaPOI->SetYTitle("");
4f678629 205 fHistList->Add(fHistProDiffFlowEtaPOI);
206
e4059f65 207 fHistSpreadOfFlow = new TH1D("fHistSpreadOfFlow","fHistSpreadOfFlow",1000,-1,1);
4f678629 208 fHistSpreadOfFlow->SetXTitle("v_{2}");
209 fHistSpreadOfFlow->SetYTitle("counts");
210 fHistList->Add(fHistSpreadOfFlow);
f1d945a1 211
212 fEventNumber = 0; //set number of events to zero
b3a29c75 213
4740c6b8 214 if(fEvaluateMixedHarmonics) this->BookObjectsForMixedHarmonics();
afa4af05 215
489d5531 216 TH1::AddDirectory(oldHistAddStatus);
f1d945a1 217}
218
219//-----------------------------------------------------------------------
220
d7671632 221void AliFlowAnalysisWithMCEventPlane::Make(AliFlowEventSimple* anEvent) {
f1d945a1 222
223 //Calculate v2 from the MC reaction plane
8232a5ec 224 if (anEvent) {
d7671632 225
226 // get the MC reaction plane angle
227 Double_t aRP = anEvent->GetMCReactionPlaneAngle();
f1d945a1 228 //fill control histograms
8232a5ec 229 fCommonHists->FillControlHistograms(anEvent);
f1d945a1 230
231 //get the Q vector from the FlowEvent
afa4af05 232 AliFlowVector vQ = anEvent->GetQ(fHarmonic);
00731146 233 //cout<<"vQ.Mod() = " << vQ.Mod() << endl;
f1d945a1 234 //for chi calculation:
00731146 235 *fQsum += vQ;
f1d945a1 236 //cout<<"fQsum.Mod() = "<<fQsum.Mod()<<endl;
00731146 237 fQ2sum += vQ.Mod2();
9d062fe3 238 //cout<<"fQ2sum = "<<fQ2sum<<endl;
f1d945a1 239
00731146 240 fHistRP->Fill(aRP);
45cdbef2 241
242 Double_t dPhi = 0.;
afa4af05 243 Double_t dv = 0.;
45cdbef2 244 Double_t dPt = 0.;
245 Double_t dEta = 0.;
4f678629 246 //Double_t dPi = TMath::Pi();
247
248 // profile to calculate flow e-b-y:
249 TProfile *flowEBE = new TProfile("flowEBE","flowEBE",1,0,1);
250
f1d945a1 251 //calculate flow
252 //loop over the tracks of the event
00731146 253 Int_t iNumberOfTracks = anEvent->NumberOfTracks();
10a70cd5 254 Int_t iNumberOfRPs = anEvent->GetEventNSelTracksRP();
00731146 255 for (Int_t i=0;i<iNumberOfTracks;i++)
f1d945a1 256 {
00731146 257 AliFlowTrackSimple* pTrack = anEvent->GetTrack(i) ;
258 if (pTrack){
b7cb54d5 259 if (pTrack->InRPSelection()){
45cdbef2 260 dPhi = pTrack->Phi();
afa4af05 261 dv = TMath::Cos(fHarmonic*(dPhi-aRP));
4f678629 262 dPt = pTrack->Pt();
263 dEta = pTrack->Eta();
10a70cd5 264 //reference flow:
afa4af05 265 fHistProIntFlow->Fill(0.,dv);
10a70cd5 266 //reference flow versus multiplicity:
267 fHistProIntFlowVsM->Fill(iNumberOfRPs+0.5,dv);
268 //reference flow e-b-e:
afa4af05 269 flowEBE->Fill(0.,dv);
9cc9e6cc 270 //differential flow (Pt, Eta, RP):
afa4af05 271 fHistProDiffFlowPtEtaRP->Fill(dPt,dEta,dv,1.);
45cdbef2 272 //differential flow (Pt, RP):
afa4af05 273 fHistProDiffFlowPtRP->Fill(dPt,dv,1.);
45cdbef2 274 //differential flow (Eta, RP):
afa4af05 275 fHistProDiffFlowEtaRP->Fill(dEta,dv,1.);
45cdbef2 276 }
b7cb54d5 277 if (pTrack->InPOISelection()) {
45cdbef2 278 dPhi = pTrack->Phi();
00731146 279 //if (dPhi<0.) dPhi+=2*TMath::Pi();
f1d945a1 280 //calculate flow v2:
afa4af05 281 dv = TMath::Cos(fHarmonic*(dPhi-aRP));
b7cb54d5 282 dPt = pTrack->Pt();
45cdbef2 283 dEta = pTrack->Eta();
9cc9e6cc 284 //differential flow (Pt, Eta, POI):
afa4af05 285 fHistProDiffFlowPtEtaPOI->Fill(dPt,dEta,dv,1.);
45cdbef2 286 //differential flow (Pt, POI):
afa4af05 287 fHistProDiffFlowPtPOI->Fill(dPt,dv,1.);
45cdbef2 288 //differential flow (Eta, POI):
afa4af05 289 fHistProDiffFlowEtaPOI->Fill(dEta,dv,1.);
45cdbef2 290 }
f1d945a1 291 }//track selected
292 }//loop over tracks
293
294 fEventNumber++;
deebd72f 295 // cout<<"@@@@@ "<<fEventNumber<<" events processed"<<endl;
4f678629 296
297 // store flow value for this event:
e4059f65 298 fHistSpreadOfFlow->Fill(flowEBE->GetBinContent(1),flowEBE->GetBinEntries(1));
4f678629 299 delete flowEBE;
b3a29c75 300
4740c6b8 301 if(fEvaluateMixedHarmonics) EvaluateMixedHarmonics(anEvent);
b3a29c75 302 }
205ff969 303}
304 //--------------------------------------------------------------------
305
306void AliFlowAnalysisWithMCEventPlane::GetOutputHistograms(TList *outputListHistos) {
307 // get the pointers to all output histograms before calling Finish()
308 if (outputListHistos) {
309 //Get the common histograms from the output list
310 AliFlowCommonHist *pCommonHists = dynamic_cast<AliFlowCommonHist*>
311 (outputListHistos->FindObject("AliFlowCommonHistMCEP"));
312 AliFlowCommonHistResults *pCommonHistResults =
313 dynamic_cast<AliFlowCommonHistResults*>
314 (outputListHistos->FindObject("AliFlowCommonHistResultsMCEP"));
315
316 TProfile *pHistProIntFlow = dynamic_cast<TProfile*>
317 (outputListHistos->FindObject("FlowPro_V_MCEP"));
318
319 TProfile2D *pHistProDiffFlowPtEtaRP = dynamic_cast<TProfile2D*>
320 (outputListHistos->FindObject("FlowPro_VPtEtaRP_MCEP"));
321
322 TProfile *pHistProDiffFlowPtRP = dynamic_cast<TProfile*>
323 (outputListHistos->FindObject("FlowPro_VPtRP_MCEP"));
324
325 TProfile *pHistProDiffFlowEtaRP = dynamic_cast<TProfile*>
326 (outputListHistos->FindObject("FlowPro_VetaRP_MCEP"));
327
328 TProfile2D *pHistProDiffFlowPtEtaPOI = dynamic_cast<TProfile2D*>
329 (outputListHistos->FindObject("FlowPro_VPtEtaPOI_MCEP"));
330
331 TProfile *pHistProDiffFlowPtPOI = dynamic_cast<TProfile*>
332 (outputListHistos->FindObject("FlowPro_VPtPOI_MCEP"));
333
334 TProfile *pHistProDiffFlowEtaPOI = dynamic_cast<TProfile*>
335 (outputListHistos->FindObject("FlowPro_VetaPOI_MCEP"));
336
337 if (pCommonHists && pCommonHistResults && pHistProIntFlow &&
338 pHistProDiffFlowPtRP && pHistProDiffFlowEtaRP &&
339 pHistProDiffFlowPtPOI && pHistProDiffFlowEtaPOI) {
340 this->SetCommonHists(pCommonHists);
341 this->SetCommonHistsRes(pCommonHistResults);
342 this->SetHistProIntFlow(pHistProIntFlow);
343 this->SetHistProDiffFlowPtEtaRP(pHistProDiffFlowPtEtaRP);
344 this->SetHistProDiffFlowPtRP(pHistProDiffFlowPtRP);
345 this->SetHistProDiffFlowEtaRP(pHistProDiffFlowEtaRP);
346 this->SetHistProDiffFlowPtEtaPOI(pHistProDiffFlowPtEtaPOI);
347 this->SetHistProDiffFlowPtPOI(pHistProDiffFlowPtPOI);
348 this->SetHistProDiffFlowEtaPOI(pHistProDiffFlowEtaPOI);
349 } else {
350 cout<<"WARNING: Histograms needed to run Finish() are not accessible!"<<endl; }
351
352 //fListHistos->Print();
4740c6b8 353
354 TList *pMixedHarmonicsList = dynamic_cast<TList*>
355 (outputListHistos->FindObject("Mixed Harmonics"));
356 if(pMixedHarmonicsList) {this->GetOutputHistoramsForMixedHarmonics(pMixedHarmonicsList);}
357
205ff969 358 } else { cout << "histogram list pointer is empty" << endl;}
359
f1d945a1 360}
361
4740c6b8 362//--------------------------------------------------------------------
363
364void AliFlowAnalysisWithMCEventPlane::GetOutputHistoramsForMixedHarmonics(TList *mixedHarmonicsList)
365{
366 // Get pointers to all objects relevant for mixed harmonics study.
367
368 if(mixedHarmonicsList)
369 {
370 // ...
371 } else
372 {
373 cout<<endl;
374 cout<<"WARNING (MCEP): mixedHarmonicsList in NULL in MCEP::GetOutputHistoramsForMixedHarmonics() !!!! "<<endl;
375 cout<<endl;
376 }
377
378} // end of void AliFlowAnalysisWithMCEventPlane::GetOutputHistoramsForMixedHarmonics(TList *mixedHarmonicsList)
379
380//--------------------------------------------------------------------
381
f1d945a1 382void AliFlowAnalysisWithMCEventPlane::Finish() {
383
384 //*************make histograms etc.
385 if (fDebug) cout<<"AliFlowAnalysisWithMCEventPlane::Terminate()"<<endl;
9d062fe3 386
bee2efdc 387 Int_t iNbinsPt = AliFlowCommonConstants::GetMaster()->GetNbinsPt();
388 Int_t iNbinsEta = AliFlowCommonConstants::GetMaster()->GetNbinsEta();
afa4af05 389
390 // access harmonic:
489d5531 391 if(fCommonHists && fCommonHists->GetHarmonic())
afa4af05 392 {
393 fHarmonic = (Int_t)(fCommonHists->GetHarmonic())->GetBinContent(1); // to be improved (moved somewhere else?)
394 }
45cdbef2 395
10a70cd5 396 //reference flow :
3963f25c 397 Double_t dV = fHistProIntFlow->GetBinContent(1);
398 Double_t dErrV = fHistProIntFlow->GetBinError(1); // to be improved (treatment of errors for non-Gaussian distribution needed!)
10a70cd5 399 //fill reference flow:
3963f25c 400 fCommonHistsRes->FillIntegratedFlow(dV,dErrV);
afa4af05 401 cout<<"dV"<<fHarmonic<<"{MC} is "<<dV<<" +- "<<dErrV<<endl;
65af4339 402
3963f25c 403 //RP:
b7cb54d5 404 TH1F* fHistPtRP = fCommonHists->GetHistPtRP();
3963f25c 405 Double_t dYieldPtRP = 0.;
406 Double_t dVRP = 0.;
407 Double_t dErrVRP = 0.;
408 Double_t dSumRP = 0.;
409 //differential flow (RP, Pt):
45cdbef2 410 Double_t dvPtRP = 0.;
411 Double_t dErrvPtRP = 0.;
afa4af05 412 for(Int_t b=1;b<=iNbinsPt;b++)
45cdbef2 413 {
3963f25c 414 dvPtRP = fHistProDiffFlowPtRP->GetBinContent(b);
415 dErrvPtRP = fHistProDiffFlowPtRP->GetBinError(b);//to be improved (treatment of errors for non-Gaussian distribution needed!)
416 fCommonHistsRes->FillDifferentialFlowPtRP(b, dvPtRP, dErrvPtRP);
417 if(fHistPtRP){
418 //integrated flow (RP)
419 dYieldPtRP = fHistPtRP->GetBinContent(b);
420 dVRP += dvPtRP*dYieldPtRP;
421 dSumRP += dYieldPtRP;
422 //error on integrated flow
423 dErrVRP += dYieldPtRP*dYieldPtRP*dErrvPtRP*dErrvPtRP;
424 }
45cdbef2 425 }
67e575b6 426
427 if (!(TMath::AreEqualAbs(dSumRP, 0.0, 1e-10)) ) {
3963f25c 428 dVRP /= dSumRP; //because pt distribution should be normalised
429 dErrVRP /= (dSumRP*dSumRP);
430 dErrVRP = TMath::Sqrt(dErrVRP);
431 }
432 // fill integrated flow (RP):
433 fCommonHistsRes->FillIntegratedFlowRP(dVRP,dErrVRP);
afa4af05 434 cout<<"dV"<<fHarmonic<<"{MC} (RP) is "<<dVRP<<" +- "<<dErrVRP<<endl;
65af4339 435
3963f25c 436 //differential flow (RP, Eta):
45cdbef2 437 Double_t dvEtaRP = 0.;
438 Double_t dErrvEtaRP = 0.;
afa4af05 439 for(Int_t b=1;b<=iNbinsEta;b++)
45cdbef2 440 {
3963f25c 441 dvEtaRP = fHistProDiffFlowEtaRP->GetBinContent(b);
442 dErrvEtaRP = fHistProDiffFlowEtaRP->GetBinError(b);//to be improved (treatment of errors for non-Gaussian distribution needed!)
443 fCommonHistsRes->FillDifferentialFlowEtaRP(b, dvEtaRP, dErrvEtaRP);
45cdbef2 444 }
445
446 //POI:
b7cb54d5 447 TH1F* fHistPtPOI = fCommonHists->GetHistPtPOI();
3963f25c 448 Double_t dYieldPtPOI = 0.;
449 Double_t dVPOI = 0.;
450 Double_t dErrVPOI = 0.;
451 Double_t dSumPOI = 0.;
afa4af05 452 Double_t dvproPtPOI = 0.;
3963f25c 453 Double_t dErrdifcombPtPOI = 0.;
afa4af05 454 Double_t dvproEtaPOI = 0.;
3963f25c 455 Double_t dErrdifcombEtaPOI = 0.;
45cdbef2 456 //Pt:
b7cb54d5 457 if(fHistProDiffFlowPtPOI) {
afa4af05 458 for(Int_t b=1;b<=iNbinsPt;b++){
459 dvproPtPOI = fHistProDiffFlowPtPOI->GetBinContent(b);
3963f25c 460 dErrdifcombPtPOI = fHistProDiffFlowPtPOI->GetBinError(b);//to be improved (treatment of errors for non-Gaussian distribution needed!)
f1d945a1 461 //fill TH1D
afa4af05 462 fCommonHistsRes->FillDifferentialFlowPtPOI(b, dvproPtPOI, dErrdifcombPtPOI);
3963f25c 463 if (fHistPtPOI){
65af4339 464 //integrated flow (POI)
3963f25c 465 dYieldPtPOI = fHistPtPOI->GetBinContent(b);
afa4af05 466 dVPOI += dvproPtPOI*dYieldPtPOI;
3963f25c 467 dSumPOI += dYieldPtPOI;
f1d945a1 468 //error on integrated flow
3963f25c 469 dErrVPOI += dYieldPtPOI*dYieldPtPOI*dErrdifcombPtPOI*dErrdifcombPtPOI;
f1d945a1 470 }
65af4339 471 }//end of for(Int_t b=0;b<iNbinsPt;b++)
45cdbef2 472 } else { cout<<"fHistProFlow is NULL"<<endl; }
67e575b6 473
474 if (!(TMath::AreEqualAbs(dSumPOI, 0.0, 1e-10)) ) {
3963f25c 475 dVPOI /= dSumPOI; //because pt distribution should be normalised
476 dErrVPOI /= (dSumPOI*dSumPOI);
477 dErrVPOI = TMath::Sqrt(dErrVPOI);
65af4339 478 }
afa4af05 479 cout<<"dV"<<fHarmonic<<"{MC} (POI) is "<<dVPOI<<" +- "<<dErrVPOI<<endl;
3963f25c 480
481 fCommonHistsRes->FillIntegratedFlowPOI(dVPOI,dErrVPOI);
45cdbef2 482
45cdbef2 483 //Eta:
484 if(fHistProDiffFlowEtaPOI)
485 {
afa4af05 486 for(Int_t b=1;b<=iNbinsEta;b++)
45cdbef2 487 {
afa4af05 488 dvproEtaPOI = fHistProDiffFlowEtaPOI->GetBinContent(b);
3963f25c 489 dErrdifcombEtaPOI = fHistProDiffFlowEtaPOI->GetBinError(b);//to be improved (treatment of errors for non-Gaussian distribution needed!)
45cdbef2 490 //fill common hist results:
afa4af05 491 fCommonHistsRes->FillDifferentialFlowEtaPOI(b, dvproEtaPOI, dErrdifcombEtaPOI);
45cdbef2 492 }
65af4339 493 }
3963f25c 494
495 cout<<endl;
b7cb54d5 496 //cout<<".....finished"<<endl;
9d062fe3 497}
f1d945a1 498
4740c6b8 499//-----------------------------------------------------------------------
500
501void AliFlowAnalysisWithMCEventPlane::InitalizeArraysForMixedHarmonics()
b3a29c75 502{
4740c6b8 503 // Iinitialize all arrays for mixed harmonics.
504
505 for(Int_t cs=0;cs<2;cs++) // cos/sin
506 {
507 fPairCorrelator[cs] = NULL;
508 fPairCorrelatorVsM[cs] = NULL;
509 for(Int_t sd=0;sd<2;sd++) // pt sum/difference
510 {
511 fPairCorrelatorVsPtSumDiff[cs][sd] = NULL;
512 }
513 }
514
515} // end of void InitalizeArraysForMixedHarmonics()
516
517//-----------------------------------------------------------------------
518
519void AliFlowAnalysisWithMCEventPlane::BookObjectsForMixedHarmonics()
520{
521 // Book all objects needed for mixed harmonics.
b3a29c75 522
4740c6b8 523 // List holding all objects relevant for mixed harmonics:
524 fMixedHarmonicsList->SetName("Mixed Harmonics");
525 fMixedHarmonicsList->SetOwner(kTRUE);
526 fHistList->Add(fMixedHarmonicsList);
f1d945a1 527
4740c6b8 528 // Profile holding settings relevant for mixed harmonics:
529 TString mixedHarmonicsSettingsName = "fMixedHarmonicsSettings";
530 fMixedHarmonicsSettings = new TProfile(mixedHarmonicsSettingsName.Data(),"Settings for Mixed Harmonics",4,0,4);
531 //fMixedHarmonicsSettings->GetXaxis()->SetLabelSize(0.025);
532 fMixedHarmonicsSettings->GetXaxis()->SetBinLabel(1,"fEvaluateMixedHarmonics");
533 fMixedHarmonicsSettings->Fill(0.5,(Int_t)fEvaluateMixedHarmonics);
534 fMixedHarmonicsSettings->GetXaxis()->SetBinLabel(2,"fNinCorrelator");
535 fMixedHarmonicsSettings->Fill(1.5,(Int_t)fNinCorrelator);
536 fMixedHarmonicsSettings->GetXaxis()->SetBinLabel(3,"fMinCorrelator");
537 fMixedHarmonicsSettings->Fill(2.5,(Int_t)fMinCorrelator);
538 fMixedHarmonicsSettings->GetXaxis()->SetBinLabel(4,"x in #phi_{pair}"); // phi_{pair} = x*phi1+(1-x)*phi2
539 fMixedHarmonicsSettings->Fill(3.5,fXinPairAngle);
540 fMixedHarmonicsList->Add(fMixedHarmonicsSettings);
9d062fe3 541
4740c6b8 542 // Profiles used to calculate <cos[m*phi_{pair}-n*RP]> and <sin[m*phi_{pair}-n*RP]>, where phi_{pair} = x*phi1+(1-x)*phi2:
b3a29c75 543 TString cosSinFlag[2] = {"Cos","Sin"};
4740c6b8 544 TString cosSinTitleFlag[2] = {"cos[m#phi_{pair}-n#psi_{RP}]","sin[m#phi_{pair}-n#psi_{RP}]"};
545 if(fNinCorrelator == 2 && fMinCorrelator == 2 && TMath::Abs(fXinPairAngle-0.5)<1.e-44) // default values
546 {
547 cosSinTitleFlag[0] = "cos[#phi_{1}+#phi_{2}-2#psi_{RP})]";
548 cosSinTitleFlag[1] = "sin[#phi_{1}+#phi_{2}-2#psi_{RP})]";
549 }
550 TString psdFlag[2] = {"Sum","Diff"};
551 TString psdTitleFlag[2] = {"(p_{t,1}+p_{t,2})/2","#left|p_{t,1}-p_{t,2}#right|"};
b3a29c75 552 TString pairCorrelatorName = "fPairCorrelator";
4740c6b8 553 TString pairCorrelatorVsMName = "fPairCorrelatorVsM";
554 TString pairCorrelatorVsPtSumDiffName = "fPairCorrelatorVsPt";
555 Int_t iNbinsPt = AliFlowCommonConstants::GetMaster()->GetNbinsPt();
556 Double_t dPtMin = AliFlowCommonConstants::GetMaster()->GetPtMin();
557 Double_t dPtMax = AliFlowCommonConstants::GetMaster()->GetPtMax();
b3a29c75 558 for(Int_t cs=0;cs<2;cs++)
559 {
4740c6b8 560 fPairCorrelator[cs] = new TProfile(Form("%s, %s",pairCorrelatorName.Data(),cosSinFlag[cs].Data()),cosSinTitleFlag[cs].Data(),1,0.,1.);
b3a29c75 561 fPairCorrelator[cs]->GetXaxis()->SetBinLabel(1,cosSinTitleFlag[cs].Data());
4740c6b8 562 fMixedHarmonicsList->Add(fPairCorrelator[cs]);
563
564 fPairCorrelatorVsM[cs] = new TProfile(Form("%s, %s",pairCorrelatorVsMName.Data(),cosSinFlag[cs].Data()),cosSinTitleFlag[cs].Data(),fnBinsMult,fMinMult,fMaxMult);
565 fPairCorrelatorVsM[cs]->GetXaxis()->SetTitle("# of RPs");
566 fMixedHarmonicsList->Add(fPairCorrelatorVsM[cs]);
567
568 for(Int_t sd=0;sd<2;sd++)
569 {
570 fPairCorrelatorVsPtSumDiff[cs][sd] = new TProfile(Form("%s%s, %s",pairCorrelatorVsPtSumDiffName.Data(),psdFlag[sd].Data(),cosSinFlag[cs].Data()),cosSinTitleFlag[cs].Data(),iNbinsPt,dPtMin,dPtMax);
571 fPairCorrelatorVsPtSumDiff[cs][sd]->GetXaxis()->SetTitle(psdTitleFlag[sd].Data());
572 fMixedHarmonicsList->Add(fPairCorrelatorVsPtSumDiff[cs][sd]);
573 } // end of for(Int_t sd=0;sd<2;sd++)
574 } // end of for(Int_t cs=0;cs<2;cs++)
b3a29c75 575
4740c6b8 576} // end of void AliFlowAnalysisWithMCEventPlane::BookObjectsForMixedHarmonics()
b3a29c75 577
4740c6b8 578//-----------------------------------------------------------------------
579
580void AliFlowAnalysisWithMCEventPlane::EvaluateMixedHarmonics(AliFlowEventSimple* anEvent)
b3a29c75 581{
4740c6b8 582 // Evaluate correlators relevant for the mixed harmonics.
b3a29c75 583
584 // Get the MC reaction plane angle:
4740c6b8 585 Double_t dReactionPlane = anEvent->GetMCReactionPlaneAngle();
b3a29c75 586 // Get the number of tracks:
587 Int_t iNumberOfTracks = anEvent->NumberOfTracks();
4740c6b8 588 Int_t nRP = anEvent->GetEventNSelTracksRP(); // number of Reference Particles
b3a29c75 589 AliFlowTrackSimple *pTrack = NULL;
590 Double_t dPhi1 = 0.;
591 Double_t dPhi2 = 0.;
4740c6b8 592 Double_t dPt1 = 0.;
593 Double_t dPt2 = 0.;
594 Double_t n = fNinCorrelator; // shortcut
595 Double_t m = fMinCorrelator; // shortcut
b3a29c75 596 Double_t x = fXinPairAngle; // shortcut
b3a29c75 597 for(Int_t i=0;i<iNumberOfTracks;i++)
598 {
599 pTrack = anEvent->GetTrack(i);
600 if(pTrack && pTrack->InRPSelection())
601 {
602 dPhi1 = pTrack->Phi();
4740c6b8 603 dPt1 = pTrack->Pt();
b3a29c75 604 }
605 for(Int_t j=0;j<iNumberOfTracks;j++)
606 {
607 if(j==i) continue;
608 pTrack = anEvent->GetTrack(j);
4740c6b8 609 if(pTrack && pTrack->InPOISelection())
b3a29c75 610 {
611 dPhi2 = pTrack->Phi();
4740c6b8 612 dPt2 = pTrack->Pt();
b3a29c75 613 }
614 Double_t dPhiPair = x*dPhi1+(1.-x)*dPhi2;
4740c6b8 615 Double_t dPtSum = 0.5*(dPt1+dPt2);
616 Double_t dPtDiff = TMath::Abs(dPt1-dPt2);
617 fPairCorrelator[0]->Fill(0.5,TMath::Cos(m*dPhiPair-n*dReactionPlane),1.);
618 fPairCorrelator[1]->Fill(0.5,TMath::Sin(m*dPhiPair-n*dReactionPlane),1.);
619 fPairCorrelatorVsM[0]->Fill(nRP+0.5,TMath::Cos(m*dPhiPair-n*dReactionPlane),1.);
620 fPairCorrelatorVsM[1]->Fill(nRP+0.5,TMath::Sin(m*dPhiPair-n*dReactionPlane),1.);
621 fPairCorrelatorVsPtSumDiff[0][0]->Fill(dPtSum,TMath::Cos(m*dPhiPair-n*dReactionPlane),1.);
622 fPairCorrelatorVsPtSumDiff[1][0]->Fill(dPtSum,TMath::Sin(m*dPhiPair-n*dReactionPlane),1.);
623 fPairCorrelatorVsPtSumDiff[0][1]->Fill(dPtDiff,TMath::Cos(m*dPhiPair-n*dReactionPlane),1.);
624 fPairCorrelatorVsPtSumDiff[1][1]->Fill(dPtDiff,TMath::Sin(m*dPhiPair-n*dReactionPlane),1.);
b3a29c75 625 } // end of for(Int_t j=i+1;j<iNumberOfTracks;j++)
626 } // end of for(Int_t i=0;i<iNumberOfTracks;i++)
627
4740c6b8 628} // end of void AliFlowAnalysisWithMCEventPlane::EvaluateMixedHarmonics()
629
b3a29c75 630
631