]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWG2/FLOW/AliFlowCommon/AliFlowAnalysisWithMixedHarmonics.cxx
allow for rebinning phi weights
[u/mrichter/AliRoot.git] / PWG2 / FLOW / AliFlowCommon / AliFlowAnalysisWithMixedHarmonics.cxx
CommitLineData
489d5531 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. *
d66d46f7 14**************************************************************************/
15
489d5531 16/* $Id$ */
17
d66d46f7 18/**********************************************************
19 * In this class azimuthal correlators in mixed harmonics *
20 * are implemented in terms of Q-vectors. This approach *
21 * doesn't require evaluation of nested loops. This class *
22 * can be used to: *
23 * *
24 * a) Extract subdominant harmonics (like v1 and v4); *
5c078806 25 * b) Study flow of two-particle resonances; *
26 * c) Study strong parity violation. *
d66d46f7 27 * *
28 * Author: Ante Bilandzic (abilandzic@gmail.com) *
489d5531 29 *********************************************************/
30
31#define AliFlowAnalysisWithMixedHarmonics_cxx
32
33#include "Riostream.h"
34#include "AliFlowCommonConstants.h"
35#include "AliFlowCommonHist.h"
36#include "AliFlowCommonHistResults.h"
37
38#include "TMath.h"
39#include "TFile.h"
40#include "TList.h"
d66d46f7 41#include "TProfile.h"
489d5531 42#include "TProfile2D.h"
43
44#include "AliFlowEventSimple.h"
45#include "AliFlowTrackSimple.h"
46#include "AliFlowAnalysisWithMixedHarmonics.h"
47
48class TH1;
49class TList;
50ClassImp(AliFlowAnalysisWithMixedHarmonics)
51
d66d46f7 52//================================================================================================================
53
489d5531 54AliFlowAnalysisWithMixedHarmonics::AliFlowAnalysisWithMixedHarmonics():
d66d46f7 55fHistList(NULL),
489d5531 56fHistListName(NULL),
d66d46f7 57fAnalysisLabel(NULL),
58fAnalysisSettings(NULL),
5c078806 59fCorrelatorInteger(1),
d66d46f7 60fNoOfMultipicityBins(10),
61fMultipicityBinWidth(2),
62fMinMultiplicity(1),
489d5531 63fCorrectForDetectorEffects(kTRUE),
5c078806 64fPrintOnTheScreen(kTRUE),
d66d46f7 65fCommonHists(NULL),
489d5531 66fnBinsPhi(0),
67fPhiMin(0),
68fPhiMax(0),
69fPhiBinWidth(0),
70fnBinsPt(0),
71fPtMin(0),
72fPtMax(0),
73fPtBinWidth(0),
74fnBinsEta(0),
75fEtaMin(0),
76fEtaMax(0),
d66d46f7 77fEtaBinWidth(0),
489d5531 78fWeightsList(NULL),
79fUsePhiWeights(kFALSE),
80fUsePtWeights(kFALSE),
81fUseEtaWeights(kFALSE),
82fUseParticleWeights(NULL),
83fPhiWeights(NULL),
84fPtWeights(NULL),
d66d46f7 85fEtaWeights(NULL),
489d5531 86fReQnk(NULL),
87fImQnk(NULL),
d66d46f7 88fSpk(NULL),
ecac11c2 89fProfileList(NULL),
d66d46f7 90f3pCorrelatorPro(NULL),
91fNonIsotropicTermsPro(NULL),
92f3pCorrelatorVsMPro(NULL),
93fNonIsotropicTermsVsMPro(NULL),
94fResultsList(NULL),
95f3pCorrelatorHist(NULL),
96fDetectorBiasHist(NULL),
e558a733 97f3pCorrelatorVsMHist(NULL),
5c078806 98fDetectorBiasVsMHist(NULL)
489d5531 99{
100 // Constructor.
5c078806 101
102 // Base list to hold all output objects:
d66d46f7 103 fHistList = new TList();
489d5531 104 fHistListName = new TString("cobjMH");
105 fHistList->SetName(fHistListName->Data());
d66d46f7 106 fHistList->SetOwner(kTRUE);
107
489d5531 108 // List to hold histograms with phi, pt and eta weights:
d66d46f7 109 fWeightsList = new TList();
110
ecac11c2 111 // List to hold all all-event profiles:
112 fProfileList = new TList();
113
489d5531 114 // List to hold objects with final results:
d66d46f7 115 fResultsList = new TList();
5c078806 116
117 // Initialize all arrays:
118 this->InitializeArrays();
489d5531 119
120} // AliFlowAnalysisWithMixedHarmonics::AliFlowAnalysisWithMixedHarmonics()
121
122//================================================================================================================
123
124AliFlowAnalysisWithMixedHarmonics::~AliFlowAnalysisWithMixedHarmonics()
125{
126 // Destructor.
127
128 delete fHistList;
129
130} // end of AliFlowAnalysisWithMixedHarmonics::~AliFlowAnalysisWithMixedHarmonics()
131
132//================================================================================================================
133
134void AliFlowAnalysisWithMixedHarmonics::Init()
d66d46f7 135{
136 // Initialize and book all objects.
137
138 // a) Cross check if the user settings make sense before starting;
139 // b) Access all common constants;
489d5531 140 // c) Book and nest all lists in the base list fHistList;
d66d46f7 141 // d) Book common control histograms;
142 // e) Book all event-by-event quantities;
143 // f) Book all all-event quantities;
5c078806 144 // g) Book and fill histograms to hold phi, pt and eta weights;
145
489d5531 146 //save old value and prevent histograms from being added to directory
147 //to avoid name clashes in case multiple analaysis objects are used
148 //in an analysis
149 Bool_t oldHistAddStatus = TH1::AddDirectoryStatus();
150 TH1::AddDirectory(kFALSE);
151
5c078806 152 TH1::SetDefaultSumw2();
153
489d5531 154 this->CrossCheckSettings();
d66d46f7 155 this->AccessConstants();
156 this->BookAndNestAllLists();
489d5531 157 this->BookProfileHoldingSettings();
d66d46f7 158 this->BookCommonHistograms();
159 this->BookAllEventByEventQuantities();
160 this->BookAllAllEventQuantities();
489d5531 161 this->BookAndFillWeightsHistograms();
162
163 TH1::AddDirectory(oldHistAddStatus);
5c078806 164
489d5531 165} // end of void AliFlowAnalysisWithMixedHarmonics::Init()
166
167//================================================================================================================
168
169void AliFlowAnalysisWithMixedHarmonics::Make(AliFlowEventSimple* anEvent)
170{
171 // Running over data only in this method.
d66d46f7 172
5c078806 173 // a) Check all pointers used in this method;
174 // b) Define local variables;
175 // c) Fill common control histograms;
176 // d) Loop over data and calculate e-b-e quantities Q_{n,k} and S_{p,k};
177 // e) Calculate 3-p azimuthal correlator and non-isotropic terms in terms of Q_{n,k} and S_{p,k};
178 // f) Calculate differential 3-p azimuthal correlator cos(2phi1-psi2-psi3) in terms of Q_{2n} and p_{n}:
179 // g) Reset all event-by-event quantities.
d66d46f7 180
5c078806 181 // a) Check all pointers used in this method:
d66d46f7 182 this->CheckPointersUsedInMake();
183
5c078806 184 // b) Define local variables:
489d5531 185 Double_t dPhi = 0.; // azimuthal angle in the laboratory frame
186 Double_t dPt = 0.; // transverse momentum
187 Double_t dEta = 0.; // pseudorapidity
188 Double_t wPhi = 1.; // phi weight
189 Double_t wPt = 1.; // pt weight
d66d46f7 190 Double_t wEta = 1.; // eta weight
191 AliFlowTrackSimple *aftsTrack = NULL; // simple track
192
5c078806 193 // c) Fill common control histograms:
d66d46f7 194 fCommonHists->FillControlHistograms(anEvent);
195
5c078806 196 // d) Loop over data and calculate e-b-e quantities:
489d5531 197 Int_t nPrim = anEvent->NumberOfTracks(); // nPrim = total number of primary tracks, i.e. nPrim = nRP + nPOI + rest, where:
198 // nRP = # of particles used to determine the reaction plane ("Reference Particles");
199 // nPOI = # of particles of interest for a detailed flow analysis ("Particles of Interest");
200 // rest = # of particles which are not niether RPs nor POIs.
d66d46f7 201 // Start loop over data:
489d5531 202 for(Int_t i=0;i<nPrim;i++)
203 {
204 aftsTrack=anEvent->GetTrack(i);
205 if(aftsTrack)
206 {
207 if(!(aftsTrack->InRPSelection() || aftsTrack->InPOISelection())) continue; // consider only tracks which are either RPs or POIs
208 Int_t n = fCorrelatorInteger; // integer n in the correlator cos[n(2phi1-phi2-phi3)]
209 if(aftsTrack->InRPSelection()) // checking RP condition:
210 {
211 dPhi = aftsTrack->Phi();
212 dPt = aftsTrack->Pt();
213 dEta = aftsTrack->Eta();
214 if(fUsePhiWeights && fPhiWeights && fnBinsPhi) // determine phi-weight for this particle:
215 {
216 wPhi = fPhiWeights->GetBinContent(1+(Int_t)(TMath::Floor(dPhi*fnBinsPhi/TMath::TwoPi())));
217 }
218 if(fUsePtWeights && fPtWeights && fnBinsPt) // determine pt-weight for this particle:
219 {
220 wPt = fPtWeights->GetBinContent(1+(Int_t)(TMath::Floor((dPt-fPtMin)/fPtBinWidth)));
221 }
222 if(fUseEtaWeights && fEtaWeights && fEtaBinWidth) // determine eta-weight for this particle:
223 {
224 wEta = fEtaWeights->GetBinContent(1+(Int_t)(TMath::Floor((dEta-fEtaMin)/fEtaBinWidth)));
225 }
226 // Calculate Re[Q_{m*n,k}] and Im[Q_{m*n,k}], (m = 1,2 and k = 0,1,2,3) for this event:
227 for(Int_t m=0;m<2;m++)
228 {
229 for(Int_t k=0;k<4;k++) // to be improved (what is maximum k that I need?)
230 {
231 (*fReQnk)(m,k)+=pow(wPhi*wPt*wEta,k)*TMath::Cos((m+1)*n*dPhi);
232 (*fImQnk)(m,k)+=pow(wPhi*wPt*wEta,k)*TMath::Sin((m+1)*n*dPhi);
233 }
234 }
235 // Calculate partially S_{p,k} for this event (final calculation of S_{p,k} follows after the loop over data bellow):
236 for(Int_t p=0;p<4;p++) // to be improved (what is maximum p that I need?)
237 {
238 for(Int_t k=0;k<4;k++) // to be improved (what is maximum k that I need?)
239 {
240 (*fSpk)(p,k)+=pow(wPhi*wPt*wEta,k);
241 }
242 }
5c078806 243 } // end of if(aftsTrack->InRPSelection())
244 // POIs:
245 if(aftsTrack->InPOISelection()) // 1st POI
246 {
247 Double_t dPsi1 = aftsTrack->Phi();
248 Double_t dPt1 = aftsTrack->Pt();
249 for(Int_t j=i+1;j<nPrim;j++)
250 {
251 aftsTrack=anEvent->GetTrack(j);
252 if(aftsTrack->InPOISelection()) // 2nd POI
253 {
254 Double_t dPsi2 = aftsTrack->Phi();
255 Double_t dPt2 = aftsTrack->Pt();
256 // Fill:
257 fRePEBE[0]->Fill((dPt1+dPt2)/2.,TMath::Cos(n*(dPsi1+dPsi2)),1.);
258 fImPEBE[0]->Fill((dPt1+dPt2)/2.,TMath::Sin(n*(dPsi1+dPsi2)),1.);
259 fRePEBE[1]->Fill(TMath::Abs(dPt1-dPt2),TMath::Cos(n*(dPsi1+dPsi2)),1.);
260 fImPEBE[1]->Fill(TMath::Abs(dPt1-dPt2),TMath::Sin(n*(dPsi1+dPsi2)),1.);
261 }
262 }
263 }
489d5531 264 } else // to if(aftsTrack)
265 {
266 cout<<endl;
267 cout<<" WARNING (MH): No particle! (i.e. aftsTrack is a NULL pointer in AFAWMH::Make().)"<<endl;
268 cout<<endl;
269 }
270 } // end of for(Int_t i=0;i<nPrim;i++)
271
272 // Calculate the final expressions for S_{p,k}:
273 for(Int_t p=0;p<4;p++) // to be improved (what is maximum p that I need?)
274 {
275 for(Int_t k=0;k<4;k++) // to be improved (what is maximum that I need?)
276 {
277 (*fSpk)(p,k)=pow((*fSpk)(p,k),p+1);
278 }
d66d46f7 279 }
280
5c078806 281 // e) Calculate 3-p azimuthal correlator in terms of Q_{n,k} and S_{p,k}:
d66d46f7 282 if(anEvent->GetEventNSelTracksRP() >= 3)
283 {
284 this->Calculate3pCorrelator();
285 }
286 if(anEvent->GetEventNSelTracksRP() >= 0) // to be improved (is this correct if statement?)
287 {
288 this->CalculateNonIsotropicTerms();
289 }
290
5c078806 291 // f) Calculate differential 3-p azimuthal correlator cos(2phi1-psi2-psi3) in terms of Q_{2n} and p_{n}:
292 this->CalculateDifferential3pCorrelator(); // to be improved - add relevant if statements for the min No of RPs and POIs
293
294 // g) Reset all event-by-event quantities:
d66d46f7 295 this->ResetEventByEventQuantities();
5c078806 296
489d5531 297} // end of AliFlowAnalysisWithMixedHarmonics::Make(AliFlowEventSimple* anEvent)
5c078806 298
489d5531 299//================================================================================================================
300
301void AliFlowAnalysisWithMixedHarmonics::Finish()
302{
d66d46f7 303 // Calculate the final results.
304
305 // a) Check all pointers used in this method;
306 // b) Access settings for analysis with mixed harmonics;
5c078806 307 // c) Correct for detector effects;
308 // d) Print on the screen the final results.
d66d46f7 309
310 this->CheckPointersUsedInFinish();
311 this->AccessSettings();
e558a733 312 if(fCorrectForDetectorEffects)
313 {
314 this->CorrectForDetectorEffects();
315 this->CorrectForDetectorEffectsVsM();
316 }
5c078806 317 if(fPrintOnTheScreen) this->PrintOnTheScreen();
489d5531 318
319} // end of AliFlowAnalysisWithMixedHarmonics::Finish()
320
321//================================================================================================================
322
323void AliFlowAnalysisWithMixedHarmonics::GetOutputHistograms(TList *outputListHistos)
324{
d66d46f7 325 // Get pointers to all objects saved in the output file.
326
ecac11c2 327 // a) Get pointers for common control histograms.
489d5531 328 if(outputListHistos)
329 {
d66d46f7 330 this->SetHistList(outputListHistos);
331 if(!fHistList)
332 {
333 cout<<endl;
334 cout<<" WARNING (MH): fHistList is NULL in AFAWMH::GOH() !!!!"<<endl;
335 cout<<endl;
336 exit(0);
337 }
ecac11c2 338 this->GetPointersForBaseHistograms();
d66d46f7 339 this->GetPointersForCommonHistograms();
ecac11c2 340 this->GetPointersForAllEventProfiles();
489d5531 341 this->GetPointersForResultsHistograms();
d66d46f7 342 } else
343 {
344 cout<<endl;
345 cout<<" WARNING (MH): outputListHistos is NULL in AFAWMH::GOH() !!!!"<<endl;
346 cout<<endl;
347 exit(0);
348 }
489d5531 349
350} // end of void AliFlowAnalysisWithMixedHarmonics::GetOutputHistograms(TList *outputListHistos)
351
d66d46f7 352//================================================================================================================
353
ecac11c2 354void AliFlowAnalysisWithMixedHarmonics::GetPointersForBaseHistograms()
355{
356 // Get pointers to base histograms.
357
358 TString analysisSettingsName = "fAnalysisSettings";
359 TProfile *analysisSettings = dynamic_cast<TProfile*>(fHistList->FindObject(analysisSettingsName.Data()));
360 if(analysisSettings)
361 {
362 this->SetAnalysisSettings(analysisSettings);
363 } else
364 {
365 cout<<endl;
366 cout<<" WARNING (MH): analysisSettings is NULL in AFAWMH::GPFBH() !!!!"<<endl;
367 cout<<endl;
368 exit(0);
369 }
370
371} // end of void AliFlowAnalysisWithMixedHarmonics::GetPointersForBaseHistograms()
372
373//================================================================================================================
374
489d5531 375void AliFlowAnalysisWithMixedHarmonics::GetPointersForCommonHistograms()
376{
377 // Get pointers to common control histograms.
378
379 TString commonHistsName = "AliFlowCommonHistMH";
380 AliFlowCommonHist *commonHist = dynamic_cast<AliFlowCommonHist*>(fHistList->FindObject(commonHistsName.Data()));
d66d46f7 381 if(commonHist)
382 {
383 this->SetCommonHists(commonHist);
384 } else
385 {
386 cout<<endl;
387 cout<<" WARNING (MH): commonHist is NULL in AFAWMH::GPFCH() !!!!"<<endl;
388 cout<<endl;
389 exit(0);
390 }
391
392} // end of void AliFlowAnalysisWithMixedHarmonics::GetPointersForCommonHistograms()
393
394//================================================================================================================
395
ecac11c2 396void AliFlowAnalysisWithMixedHarmonics::GetPointersForAllEventProfiles()
397{
5c078806 398 // Get pointers to profiles holding final results.
ecac11c2 399
400 TList *profileList = NULL;
401 profileList = dynamic_cast<TList*>(fHistList->FindObject("Profiles"));
402 if(!profileList)
403 {
404 cout<<"WARNING: profileList is NULL in AFAWMH::GPFAEP() !!!!"<<endl;
405 exit(0);
406 }
407
408 TString s3pCorrelatorProName = "f3pCorrelatorPro";
5c078806 409 TProfile *p3pCorrelatorPro = dynamic_cast<TProfile*>(profileList->FindObject(s3pCorrelatorProName.Data()));
410 if(p3pCorrelatorPro)
ecac11c2 411 {
5c078806 412 this->Set3pCorrelatorPro(p3pCorrelatorPro);
ecac11c2 413 }
414 TString s3pCorrelatorVsMProName = "f3pCorrelatorVsMPro";
5c078806 415 TProfile *p3pCorrelatorVsMPro = dynamic_cast<TProfile*>(profileList->FindObject(s3pCorrelatorVsMProName.Data()));
416 if(p3pCorrelatorVsMPro)
ecac11c2 417 {
5c078806 418 this->Set3pCorrelatorVsMPro(p3pCorrelatorVsMPro);
ecac11c2 419 }
420 TString nonIsotropicTermsProName = "fNonIsotropicTermsPro";
421 TProfile *nonIsotropicTermsPro = dynamic_cast<TProfile*>(profileList->FindObject(nonIsotropicTermsProName.Data()));
422 if(nonIsotropicTermsPro)
423 {
424 this->SetNonIsotropicTermsPro(nonIsotropicTermsPro);
425 }
426 TString nonIsotropicTermsVsMProName = "fNonIsotropicTermsVsMPro";
427 TProfile2D *nonIsotropicTermsVsMPro = dynamic_cast<TProfile2D*>(profileList->FindObject(nonIsotropicTermsVsMProName.Data()));
428 if(nonIsotropicTermsVsMPro)
429 {
430 this->SetNonIsotropicTermsVsMPro(nonIsotropicTermsVsMPro);
5c078806 431 }
432 TString psdFlag[2] = {"PtSum","PtDiff"};
433 for(Int_t sd=0;sd<2;sd++)
434 {
435 TProfile *p3pCorrelatorVsPtSumDiffPro = dynamic_cast<TProfile*>(profileList->FindObject(Form("f3pCorrelatorVs%sPro",psdFlag[sd].Data())));
436 if(p3pCorrelatorVsPtSumDiffPro)
437 {
438 this->Set3pCorrelatorVsPtSumDiffPro(p3pCorrelatorVsPtSumDiffPro,sd);
439 }
440 }
441
ecac11c2 442} // end of void AliFlowAnalysisWithMixedHarmonics::GetPointersForAllEventProfiles()
443
444//================================================================================================================
445
489d5531 446void AliFlowAnalysisWithMixedHarmonics::GetPointersForResultsHistograms()
447{
448 // Get pointers to histograms holding final results.
449
450 TList *resultsList = NULL;
451 resultsList = dynamic_cast<TList*>(fHistList->FindObject("Results"));
452 if(!resultsList)
453 {
454 cout<<"WARNING: resultsList is NULL in AFAWMH::GPFRH() !!!!"<<endl;
455 exit(0);
d66d46f7 456 }
489d5531 457 TString s3pCorrelatorHistName = "f3pCorrelatorHist";
458 TH1D *h3pCorrelatorHist = dynamic_cast<TH1D*>(resultsList->FindObject(s3pCorrelatorHistName.Data()));
459 if(h3pCorrelatorHist)
460 {
461 this->Set3pCorrelatorHist(h3pCorrelatorHist);
d66d46f7 462 }
e558a733 463 TString s3pCorrelatorVsMHistName = "f3pCorrelatorVsMHist";
464 TH1D *h3pCorrelatorVsMHist = dynamic_cast<TH1D*>(resultsList->FindObject(s3pCorrelatorVsMHistName.Data()));
465 if(h3pCorrelatorVsMHist)
466 {
467 this->Set3pCorrelatorVsMHist(h3pCorrelatorVsMHist);
468 }
489d5531 469 TString detectorBiasHistName = "fDetectorBiasHist";
470 TH1D *detectorBiasHist = dynamic_cast<TH1D*>(resultsList->FindObject(detectorBiasHistName.Data()));
471 if(detectorBiasHist)
472 {
473 this->SetDetectorBiasHist(detectorBiasHist);
d66d46f7 474 }
ecac11c2 475 TString detectorBiasVsMHistName = "fDetectorBiasVsMHist";
476 TH1D *detectorBiasVsMHist = dynamic_cast<TH1D*>(resultsList->FindObject(detectorBiasVsMHistName.Data()));
477 if(detectorBiasVsMHist)
478 {
479 this->SetDetectorBiasVsMHist(detectorBiasVsMHist);
480 }
ecac11c2 481
d66d46f7 482} // end of void AliFlowAnalysisWithMixedHarmonics::GetPointersForResultsHistograms()
489d5531 483
d66d46f7 484//================================================================================================================
485
489d5531 486void AliFlowAnalysisWithMixedHarmonics::WriteHistograms(TString outputFileName)
487{
488 // Store the final results in output .root file.
489 TFile *output = new TFile(outputFileName.Data(),"RECREATE");
490 fHistList->Write(fHistList->GetName(),TObject::kSingleKey);
491 delete output;
492}
493
494//================================================================================================================
d66d46f7 495
496void AliFlowAnalysisWithMixedHarmonics::WriteHistograms(TDirectoryFile *outputFileName)
497{
498 // Store the final results in output .root file.
499 fHistList->SetName("cobjMH");
500 fHistList->SetOwner(kTRUE);
501 outputFileName->Add(fHistList);
502 outputFileName->Write(outputFileName->GetName(),TObject::kSingleKey);
503}
504
505//================================================================================================================
506
5c078806 507void AliFlowAnalysisWithMixedHarmonics::InitializeArrays()
508{
509 // Initialize arrays.
510
511 for(Int_t sd=0;sd<2;sd++)
512 {
513 fRePEBE[sd] = NULL;
514 fImPEBE[sd] = NULL;
515 f3pCorrelatorVsPtSumDiffPro[sd] = NULL;
516 }
517
518} // end of AliFlowAnalysisWithMixedHarmonics::InitializeArrays()
519
520//================================================================================================================
521
489d5531 522void AliFlowAnalysisWithMixedHarmonics::BookAndNestAllLists()
d66d46f7 523{
524 // Book and nest all list in base list fHistList.
525
526 // Weights:
489d5531 527 fWeightsList->SetName("Weights");
528 fWeightsList->SetOwner(kTRUE);
d66d46f7 529 fHistList->Add(fWeightsList);
ecac11c2 530 // Profiles:
531 fProfileList->SetName("Profiles");
532 fProfileList->SetOwner(kTRUE);
533 fHistList->Add(fProfileList);
d66d46f7 534 // Results:
489d5531 535 fResultsList->SetName("Results");
536 fResultsList->SetOwner(kTRUE);
d66d46f7 537 fHistList->Add(fResultsList);
538
539} // end of void AliFlowAnalysisWithMixedHarmonics::BookAndNestAllLists()
540
541//================================================================================================================
542
489d5531 543void AliFlowAnalysisWithMixedHarmonics::BookProfileHoldingSettings()
d66d46f7 544{
545 // Book profile to hold all analysis settings.
546
489d5531 547 TString analysisSettingsName = "fAnalysisSettings";
5c078806 548 fAnalysisSettings = new TProfile(analysisSettingsName.Data(),"Settings for analysis with mixed harmonics",6,0,6);
549 fAnalysisSettings->GetXaxis()->SetLabelSize(0.025);
d66d46f7 550 fAnalysisSettings->GetXaxis()->SetBinLabel(1,"Integer n in cos(n(2#phi_{1}-#phi_{2}-#phi_{3}))");
489d5531 551 fAnalysisSettings->Fill(0.5,fCorrelatorInteger);
d66d46f7 552 fAnalysisSettings->GetXaxis()->SetBinLabel(2,"Corrected for detector effects?");
553 fAnalysisSettings->Fill(1.5,(Int_t)fCorrectForDetectorEffects);
554 fAnalysisSettings->GetXaxis()->SetBinLabel(3,"# of multiplicity bins");
555 fAnalysisSettings->Fill(2.5,fNoOfMultipicityBins);
556 fAnalysisSettings->GetXaxis()->SetBinLabel(4,"Width of multiplicity bins");
557 fAnalysisSettings->Fill(3.5,fMultipicityBinWidth);
558 fAnalysisSettings->GetXaxis()->SetBinLabel(5,"Minimal multiplicity");
559 fAnalysisSettings->Fill(4.5,fMinMultiplicity);
5c078806 560 fAnalysisSettings->GetXaxis()->SetBinLabel(6,"Print on the screen?");
561 fAnalysisSettings->Fill(5.5,(Int_t)fPrintOnTheScreen);
d66d46f7 562 fHistList->Add(fAnalysisSettings);
563
564} // end of void AliFlowAnalysisWithMixedHarmonics::BookProfileHoldingSettings()
489d5531 565
d66d46f7 566//================================================================================================================
567
489d5531 568void AliFlowAnalysisWithMixedHarmonics::BookCommonHistograms()
569{
d66d46f7 570 // Book common control histograms and common histograms for final results.
489d5531 571
572 TString commonHistsName = "AliFlowCommonHistMH";
573 fCommonHists = new AliFlowCommonHist(commonHistsName.Data());
574 fHistList->Add(fCommonHists);
575
576} // end of void AliFlowAnalysisWithMixedHarmonics::BookCommonHistograms()
d66d46f7 577
578//================================================================================================================
579
489d5531 580void AliFlowAnalysisWithMixedHarmonics::BookAllEventByEventQuantities()
581{
d66d46f7 582 // Book all event-by-event quantitites.
583
584 // Q_{n,k} and S{p,k}:
489d5531 585 fReQnk = new TMatrixD(2,4); // to be improved(bound on k)
586 fImQnk = new TMatrixD(2,4); // to be improved(bound on k)
d66d46f7 587 fSpk = new TMatrixD(4,4); // to be improved(bound on p and k)
5c078806 588
589 // p_n vs [(p1+p2)/2,|p1-p2|]
590 TString psdFlag[2] = {"PtSum","PtDiff"};
591 for(Int_t sd=0;sd<2;sd++)
592 {
593 // to be improved: hardwired ,fnBinsPt,0.,fPtMax):
594 fRePEBE[sd] = new TProfile(Form("fRePEBE%s",psdFlag[sd].Data()),"",fnBinsPt,0.,fPtMax);
595 fImPEBE[sd] = new TProfile(Form("fImPEBE%s",psdFlag[sd].Data()),"",fnBinsPt,0.,fPtMax);
596 }
597
489d5531 598} // end fo void AliFlowAnalysisWithMixedHarmonics::BookAllEventByEventQuantities()
5c078806 599
d66d46f7 600//================================================================================================================
601
602void AliFlowAnalysisWithMixedHarmonics::BookAllAllEventQuantities()
603{
604 // Book all all-event quantitites.
605
606 // a) Book quantites without multiplicity binning;
5c078806 607 // b) Book quantites with multiplicity binning;
608 // c) Book quantities with binning in (p1+p2)/2, |p1-p2|, (eta1+eta2)/2 or |eta1-eta2|.
609
d66d46f7 610 // a) Book quantites without multiplicity binning:
5c078806 611 // 3-p correlator <<cos[n(2phi1-phi2-phi3)]>> for all events:
489d5531 612 TString s3pCorrelatorProName = "f3pCorrelatorPro";
5c078806 613 f3pCorrelatorPro = new TProfile(s3pCorrelatorProName.Data(),"",1,0,1);
614 f3pCorrelatorPro->GetXaxis()->SetLabelOffset(0.01);
615 f3pCorrelatorPro->GetXaxis()->SetLabelSize(0.05);
616 if(fCorrelatorInteger == 1)
617 {
618 f3pCorrelatorPro->GetXaxis()->SetBinLabel(1,"cos(2#phi_{1}-#phi_{2}-#phi_{3})");
619 } else
620 {
621 f3pCorrelatorPro->GetXaxis()->SetBinLabel(1,Form("cos[%d(2#phi_{1}-#phi_{2}-#phi_{3})]",fCorrelatorInteger));
622 }
ecac11c2 623 fProfileList->Add(f3pCorrelatorPro);
5c078806 624 // Non-isotropic terms in the decomposition of <cos[n(2phi1-phi2-phi3)]:
489d5531 625 TString nonIsotropicTermsProName = "fNonIsotropicTermsPro";
5c078806 626 fNonIsotropicTermsPro = new TProfile(nonIsotropicTermsProName.Data(),"",10,0,10);
627 if(fCorrelatorInteger == 1)
628 {
629 fNonIsotropicTermsPro->SetTitle("Non-isotropic terms in decomposition of cos(2#phi_{1}-#phi_{2}-#phi_{3})");
630 fNonIsotropicTermsPro->GetXaxis()->SetBinLabel(1,"cos(#phi_{1})");
631 fNonIsotropicTermsPro->GetXaxis()->SetBinLabel(2,"sin(#phi_{1})");
632 fNonIsotropicTermsPro->GetXaxis()->SetBinLabel(3,"cos(2#phi_{1})");
633 fNonIsotropicTermsPro->GetXaxis()->SetBinLabel(4,"sin(2#phi_{1})");
634 fNonIsotropicTermsPro->GetXaxis()->SetBinLabel(5,"cos(#phi_{1}+#phi_{2})");
635 fNonIsotropicTermsPro->GetXaxis()->SetBinLabel(6,"sin(#phi_{1}+#phi_{2})");
636 fNonIsotropicTermsPro->GetXaxis()->SetBinLabel(7,"cos(2#phi_{1}-#phi_{2})");
637 fNonIsotropicTermsPro->GetXaxis()->SetBinLabel(8,"sin(2#phi_{1}-#phi_{2})");
638 fNonIsotropicTermsPro->GetXaxis()->SetBinLabel(9,"cos(#phi_{1}-#phi_{2}-#phi_{3})");
639 fNonIsotropicTermsPro->GetXaxis()->SetBinLabel(10,"sin(#phi_{1}-#phi_{2}-#phi_{3})");
640 } else
641 {
642 fNonIsotropicTermsPro->SetTitle(Form("Non-isotropic terms in decomposition of cos[%d(2#phi_{1}-#phi_{2}-#phi_{3})]",fCorrelatorInteger));
643 fNonIsotropicTermsPro->GetXaxis()->SetBinLabel(1,Form("cos(%d#phi_{1})",fCorrelatorInteger));
644 fNonIsotropicTermsPro->GetXaxis()->SetBinLabel(2,Form("sin(%d#phi_{1})",fCorrelatorInteger));
645 fNonIsotropicTermsPro->GetXaxis()->SetBinLabel(3,Form("cos(%d#phi_{1})",2*fCorrelatorInteger));
646 fNonIsotropicTermsPro->GetXaxis()->SetBinLabel(4,Form("sin(%d#phi_{1})",2*fCorrelatorInteger));
647 fNonIsotropicTermsPro->GetXaxis()->SetBinLabel(5,Form("cos(%d(#phi_{1}+#phi_{2}))",fCorrelatorInteger));
648 fNonIsotropicTermsPro->GetXaxis()->SetBinLabel(6,Form("sin(%d(#phi_{1}+#phi_{2}))",fCorrelatorInteger));
649 fNonIsotropicTermsPro->GetXaxis()->SetBinLabel(7,Form("cos(%d(2#phi_{1}-#phi_{2}))",fCorrelatorInteger));
650 fNonIsotropicTermsPro->GetXaxis()->SetBinLabel(8,Form("sin(%d(2#phi_{1}-#phi_{2}))",fCorrelatorInteger));
651 fNonIsotropicTermsPro->GetXaxis()->SetBinLabel(9,Form("cos(%d(#phi_{1}-#phi_{2}-#phi_{3}))",fCorrelatorInteger));
652 fNonIsotropicTermsPro->GetXaxis()->SetBinLabel(10,Form("sin(%d(#phi_{1}-#phi_{2}-#phi_{3}))",fCorrelatorInteger));
653 }
ecac11c2 654 fProfileList->Add(fNonIsotropicTermsPro);
5c078806 655 // 3-p correlator <<cos[n(2phi1-phi2-phi3)]>> corrected for detector effects:
656 TString s3pCorrelatorHistName = "f3pCorrelatorHist";
657 f3pCorrelatorHist = new TH1D(s3pCorrelatorHistName.Data(),"",1,0,1);
658 f3pCorrelatorHist->GetXaxis()->SetLabelOffset(0.01);
659 f3pCorrelatorHist->GetXaxis()->SetLabelSize(0.05);
660 if(fCorrelatorInteger == 1)
661 {
662 f3pCorrelatorHist->GetXaxis()->SetBinLabel(1,"cos(2#phi_{1}-#phi_{2}-#phi_{3})");
663 } else
664 {
665 f3pCorrelatorHist->GetXaxis()->SetBinLabel(1,Form("cos[%d(2#phi_{1}-#phi_{2}-#phi_{3})]",fCorrelatorInteger));
666 }
667 fResultsList->Add(f3pCorrelatorHist);
668 // Quantified bias comming from detector inefficiencies to 3-p correlator <<cos[n(2phi1-phi2-phi3)]>>:
489d5531 669 TString detectorBiasHistName = "fDetectorBiasHist";
d66d46f7 670 fDetectorBiasHist = new TH1D(detectorBiasHistName.Data(),"Bias coming from detector inefficiences",1,0,1);
5c078806 671 fDetectorBiasHist->GetXaxis()->SetBinLabel(1,"#frac{corrected}{measured}");
d66d46f7 672 fResultsList->Add(fDetectorBiasHist);
673
674 // b) Book quantites with multiplicity binning.
5c078806 675 // 3-p correlator <<cos[n(2phi1-phi2-phi3)]>> versus multiplicity:
489d5531 676 TString s3pCorrelatorVsMProName = "f3pCorrelatorVsMPro";
5c078806 677 f3pCorrelatorVsMPro = new TProfile(s3pCorrelatorVsMProName.Data(),"",fNoOfMultipicityBins+2,0,fNoOfMultipicityBins+2);
678 if(fCorrelatorInteger == 1)
d66d46f7 679 {
5c078806 680 f3pCorrelatorVsMPro->SetTitle("cos(2#phi_{1}-#phi_{2}-#phi_{3}) #font[72]{vs} M");
681 } else
682 {
683 f3pCorrelatorVsMPro->SetTitle(Form("cos[%d(2#phi_{1}-#phi_{2}-#phi_{3})] #font[72]{vs} M",fCorrelatorInteger));
684 }
685 f3pCorrelatorVsMPro->GetXaxis()->SetBinLabel(1,Form("M < %d",(Int_t)fMinMultiplicity));
686 for(Int_t b=2;b<=fNoOfMultipicityBins+1;b++)
d66d46f7 687 {
5c078806 688 f3pCorrelatorVsMPro->GetXaxis()->SetBinLabel(b,Form("%d #leq M < %d",(Int_t)(fMinMultiplicity+(b-2)*fMultipicityBinWidth),(Int_t)(fMinMultiplicity+(b-1)*fMultipicityBinWidth)));
d66d46f7 689 }
5c078806 690 f3pCorrelatorVsMPro->GetXaxis()->SetBinLabel(fNoOfMultipicityBins+2,Form(" M #geq %d",(Int_t)(fMinMultiplicity+fNoOfMultipicityBins*fMultipicityBinWidth)));
e558a733 691 fProfileList->Add(f3pCorrelatorVsMPro);
692 // 3-p correlator <<cos[n(2phi1-phi2-phi3)]>> versus multiplicity corrected for detector effects:
693 TString s3pCorrelatorVsMHistName = "f3pCorrelatorVsMHist";
694 f3pCorrelatorVsMHist = new TH1D(s3pCorrelatorVsMHistName.Data(),"",fNoOfMultipicityBins+2,0,fNoOfMultipicityBins+2);
695 if(fCorrelatorInteger == 1)
696 {
697 f3pCorrelatorVsMHist->SetTitle("cos(2#phi_{1}-#phi_{2}-#phi_{3}) #font[72]{vs} M");
698 } else
699 {
700 f3pCorrelatorVsMHist->SetTitle(Form("cos[%d(2#phi_{1}-#phi_{2}-#phi_{3})] #font[72]{vs} M",fCorrelatorInteger));
701 }
702 f3pCorrelatorVsMHist->GetXaxis()->SetBinLabel(1,Form("M < %d",(Int_t)fMinMultiplicity));
703 for(Int_t b=2;b<=fNoOfMultipicityBins+1;b++)
704 {
705 f3pCorrelatorVsMHist->GetXaxis()->SetBinLabel(b,Form("%d #leq M < %d",(Int_t)(fMinMultiplicity+(b-2)*fMultipicityBinWidth),(Int_t)(fMinMultiplicity+(b-1)*fMultipicityBinWidth)));
706 }
707 f3pCorrelatorVsMHist->GetXaxis()->SetBinLabel(fNoOfMultipicityBins+2,Form(" M #geq %d",(Int_t)(fMinMultiplicity+fNoOfMultipicityBins*fMultipicityBinWidth)));
708 fResultsList->Add(f3pCorrelatorVsMHist);
5c078806 709 // Non-isotropic terms in the decomposition of <cos[n(2phi1-phi2-phi3)] vs multiplicity:
489d5531 710 TString nonIsotropicTermsVsMProName = "fNonIsotropicTermsVsMPro";
5c078806 711 fNonIsotropicTermsVsMPro = new TProfile2D(nonIsotropicTermsVsMProName.Data(),"Non-isotropic terms in the decomposition of cos[n(2phi1-phi2-phi3)] #font[72]{vs} M",10,0,10,fNoOfMultipicityBins+2,0,fNoOfMultipicityBins+2);
712 if(fCorrelatorInteger == 1)
d66d46f7 713 {
5c078806 714 fNonIsotropicTermsVsMPro->SetTitle("Non-isotropic terms in decomposition of cos(2#phi_{1}-#phi_{2}-#phi_{3}) #font[72]{vs} M");
715 fNonIsotropicTermsVsMPro->GetXaxis()->SetBinLabel(1,"cos(#phi_{1})");
716 fNonIsotropicTermsVsMPro->GetXaxis()->SetBinLabel(2,"sin(#phi_{1})");
717 fNonIsotropicTermsVsMPro->GetXaxis()->SetBinLabel(3,"cos(2#phi_{1})");
718 fNonIsotropicTermsVsMPro->GetXaxis()->SetBinLabel(4,"sin(2#phi_{1})");
719 fNonIsotropicTermsVsMPro->GetXaxis()->SetBinLabel(5,"cos(#phi_{1}+#phi_{2})");
720 fNonIsotropicTermsVsMPro->GetXaxis()->SetBinLabel(6,"sin(#phi_{1}+#phi_{2})");
721 fNonIsotropicTermsVsMPro->GetXaxis()->SetBinLabel(7,"cos(2#phi_{1}-#phi_{2})");
722 fNonIsotropicTermsVsMPro->GetXaxis()->SetBinLabel(8,"sin(2#phi_{1}-#phi_{2})");
723 fNonIsotropicTermsVsMPro->GetXaxis()->SetBinLabel(9,"cos(#phi_{1}-#phi_{2}-#phi_{3})");
724 fNonIsotropicTermsVsMPro->GetXaxis()->SetBinLabel(10,"sin(#phi_{1}-#phi_{2}-#phi_{3})");
725 } else
726 {
727 fNonIsotropicTermsVsMPro->SetTitle(Form("Non-isotropic terms in decomposition of cos[%d(2#phi_{1}-#phi_{2}-#phi_{3})]",fCorrelatorInteger));
728 fNonIsotropicTermsVsMPro->GetXaxis()->SetBinLabel(1,Form("cos(%d#phi_{1})",fCorrelatorInteger));
729 fNonIsotropicTermsVsMPro->GetXaxis()->SetBinLabel(2,Form("sin(%d#phi_{1})",fCorrelatorInteger));
730 fNonIsotropicTermsVsMPro->GetXaxis()->SetBinLabel(3,Form("cos(%d#phi_{1})",2*fCorrelatorInteger));
731 fNonIsotropicTermsVsMPro->GetXaxis()->SetBinLabel(4,Form("sin(%d#phi_{1})",2*fCorrelatorInteger));
732 fNonIsotropicTermsVsMPro->GetXaxis()->SetBinLabel(5,Form("cos(%d(#phi_{1}+#phi_{2}))",fCorrelatorInteger));
733 fNonIsotropicTermsVsMPro->GetXaxis()->SetBinLabel(6,Form("sin(%d(#phi_{1}+#phi_{2}))",fCorrelatorInteger));
734 fNonIsotropicTermsVsMPro->GetXaxis()->SetBinLabel(7,Form("cos(%d(2#phi_{1}-#phi_{2}))",fCorrelatorInteger));
735 fNonIsotropicTermsVsMPro->GetXaxis()->SetBinLabel(8,Form("sin(%d(2#phi_{1}-#phi_{2}))",fCorrelatorInteger));
736 fNonIsotropicTermsVsMPro->GetXaxis()->SetBinLabel(9,Form("cos(%d(#phi_{1}-#phi_{2}-#phi_{3}))",fCorrelatorInteger));
737 fNonIsotropicTermsVsMPro->GetXaxis()->SetBinLabel(10,Form("sin(%d(#phi_{1}-#phi_{2}-#phi_{3}))",fCorrelatorInteger));
738 }
739 fNonIsotropicTermsVsMPro->GetYaxis()->SetBinLabel(1,Form("M < %d",(Int_t)fMinMultiplicity));
740 for(Int_t b=2;b<=fNoOfMultipicityBins+1;b++)
d66d46f7 741 {
e558a733 742 fNonIsotropicTermsVsMPro->GetYaxis()->SetBinLabel(b,Form("%d #leq M < %d",(Int_t)(fMinMultiplicity+(b-2)*fMultipicityBinWidth),(Int_t)(fMinMultiplicity+(b-1)*fMultipicityBinWidth)));
d66d46f7 743 }
5c078806 744 fNonIsotropicTermsVsMPro->GetYaxis()->SetBinLabel(fNoOfMultipicityBins+2,Form(" M #geq %d",(Int_t)(fMinMultiplicity+fNoOfMultipicityBins*fMultipicityBinWidth)));
745 fProfileList->Add(fNonIsotropicTermsVsMPro);
e558a733 746 // Quantified bias comming from detector inefficiencies to 3-p correlator <<cos[n(2phi1-phi2-phi3)]>> vs multiplicity
489d5531 747 TString detectorBiasVsMHistName = "fDetectorBiasVsMHist";
e558a733 748 fDetectorBiasVsMHist = new TH1D(detectorBiasVsMHistName.Data(),"",fNoOfMultipicityBins+2,0,fNoOfMultipicityBins+2);
749 if(fCorrelatorInteger == 1)
750 {
751 fDetectorBiasVsMHist->SetTitle("#frac{corrected}{measured} cos(2#phi_{1}-#phi_{2}-#phi_{3}) #font[72]{vs} M"); // to be improved (title)
752 } else
753 {
754 fDetectorBiasVsMHist->SetTitle(Form("#frac{corrected}{measured} cos[%d(2#phi_{1}-#phi_{2}-#phi_{3})] #font[72]{vs} M",fCorrelatorInteger)); // to be improved (title)
755 }
756 fDetectorBiasVsMHist->GetXaxis()->SetBinLabel(1,Form("M < %d",(Int_t)fMinMultiplicity));
757 for(Int_t b=2;b<=fNoOfMultipicityBins+1;b++)
d66d46f7 758 {
e558a733 759 fDetectorBiasVsMHist->GetXaxis()->SetBinLabel(b,Form("%d #leq M < %d",(Int_t)(fMinMultiplicity+(b-2)*fMultipicityBinWidth),(Int_t)(fMinMultiplicity+(b-1)*fMultipicityBinWidth)));
d66d46f7 760 }
e558a733 761 fDetectorBiasVsMHist->GetXaxis()->SetBinLabel(fNoOfMultipicityBins+2,Form(" M #geq %d",(Int_t)(fMinMultiplicity+fNoOfMultipicityBins*fMultipicityBinWidth)));
762 fResultsList->Add(fDetectorBiasVsMHist);
d66d46f7 763
5c078806 764 // c) Book quantities with binning in (p1+p2)/2, |p1-p2|, (eta1+eta2)/2 or |eta1-eta2|:
765 TString psdFlag[2] = {"PtSum","PtDiff"};
766 TString psdTitleFlag[2] = {"(p_{t,1}+p_{t,2})/2","#left|p_{t,1}-p_{t,2}#right|"};
767 //TString s3pCorrelatorVsPtSumDiffProName = "f3pCorrelatorVsPtSumDiffPro";
768 for(Int_t sd=0;sd<2;sd++)
769 {
770 // to be improved: hardwired ,fnBinsPt,0.,fPtMax):
771 f3pCorrelatorVsPtSumDiffPro[sd] = new TProfile(Form("f3pCorrelatorVs%sPro",psdFlag[sd].Data()),"",fnBinsPt,0.,fPtMax);
772 //f3pCorrelatorVsPtSumDiffPro[sd]->SetLabelSize(0.05);
773 //f3pCorrelatorVsPtSumDiffPro[sd]->SetMarkerStyle(25);
774 f3pCorrelatorVsPtSumDiffPro[sd]->GetXaxis()->SetTitle(psdTitleFlag[sd].Data());
775 fProfileList->Add(f3pCorrelatorVsPtSumDiffPro[sd]);
776 }
777
d66d46f7 778} // end of void AliFlowAnalysisWithMixedHarmonics::BookAllAllEventQuantities()
489d5531 779
d66d46f7 780//================================================================================================================
781
489d5531 782void AliFlowAnalysisWithMixedHarmonics::AccessConstants()
783{
784 // Access needed common constants from AliFlowCommonConstants.
785
786 fnBinsPhi = AliFlowCommonConstants::GetMaster()->GetNbinsPhi();
787 fPhiMin = AliFlowCommonConstants::GetMaster()->GetPhiMin();
788 fPhiMax = AliFlowCommonConstants::GetMaster()->GetPhiMax();
789 if(fnBinsPhi) fPhiBinWidth = (fPhiMax-fPhiMin)/fnBinsPhi;
790 fnBinsPt = AliFlowCommonConstants::GetMaster()->GetNbinsPt();
791 fPtMin = AliFlowCommonConstants::GetMaster()->GetPtMin();
792 fPtMax = AliFlowCommonConstants::GetMaster()->GetPtMax();
793 if(fnBinsPt) fPtBinWidth = (fPtMax-fPtMin)/fnBinsPt;
794 fnBinsEta = AliFlowCommonConstants::GetMaster()->GetNbinsEta();
795 fEtaMin = AliFlowCommonConstants::GetMaster()->GetEtaMin();
796 fEtaMax = AliFlowCommonConstants::GetMaster()->GetEtaMax();
797 if(fnBinsEta) fEtaBinWidth = (fEtaMax-fEtaMin)/fnBinsEta;
798
d66d46f7 799} // end of void AliFlowAnalysisWithMixedHarmonics::AccessConstants()
800
489d5531 801//================================================================================================================
802
803void AliFlowAnalysisWithMixedHarmonics::CrossCheckSettings()
804{
805 // Cross-check if the user settings make sense.
806
807} // end of void AliFlowAnalysisWithMixedHarmonics::CrossCheckSettings()
808
809//================================================================================================================
810
811void AliFlowAnalysisWithMixedHarmonics::BookAndFillWeightsHistograms()
812{
813 // Book and fill (by accessing file "weights.root") histograms which hold phi, pt and eta weights.
814
815 if(!fWeightsList)
816 {
817 cout<<"WARNING: fWeightsList is NULL in AFAWMH::BAFWH() !!!!"<<endl;
818 exit(0);
819 }
820 // Profile to hold flags for weights:
821 TString fUseParticleWeightsName = "fUseParticleWeightsMH";
822 fUseParticleWeights = new TProfile(fUseParticleWeightsName.Data(),"0 = particle weight not used, 1 = particle weight used ",3,0,3);
823 fUseParticleWeights->SetLabelSize(0.06);
824 (fUseParticleWeights->GetXaxis())->SetBinLabel(1,"w_{#phi}");
825 (fUseParticleWeights->GetXaxis())->SetBinLabel(2,"w_{p_{T}}");
826 (fUseParticleWeights->GetXaxis())->SetBinLabel(3,"w_{#eta}");
827 fUseParticleWeights->Fill(0.5,(Int_t)fUsePhiWeights);
828 fUseParticleWeights->Fill(1.5,(Int_t)fUsePtWeights);
829 fUseParticleWeights->Fill(2.5,(Int_t)fUseEtaWeights);
830 fWeightsList->Add(fUseParticleWeights);
831 // Phi-weights:
832 if(fUsePhiWeights)
833 {
834 if(fWeightsList->FindObject("phi_weights"))
835 {
836 fPhiWeights = dynamic_cast<TH1F*>(fWeightsList->FindObject("phi_weights"));
837 if(TMath::Abs(fPhiWeights->GetBinWidth(1)-fPhiBinWidth)>pow(10.,-6.))
838 {
d66d46f7 839 cout<<endl;
489d5531 840 cout<<"WARNING (MH): Inconsistent binning in histograms for phi-weights throughout the code."<<endl;
d66d46f7 841 cout<<endl;
489d5531 842 exit(0);
843 }
844 } else
845 {
846 cout<<"WARNING (MH): fWeightsList->FindObject(\"phi_weights\") is NULL in AFAWMH::BAFWH() !!!!"<<endl;
847 exit(0);
848 }
849 } // end of if(fUsePhiWeights)
850 // Pt-weights:
851 if(fUsePtWeights)
852 {
853 if(fWeightsList->FindObject("pt_weights"))
854 {
855 fPtWeights = dynamic_cast<TH1D*>(fWeightsList->FindObject("pt_weights"));
856 if(TMath::Abs(fPtWeights->GetBinWidth(1)-fPtBinWidth)>pow(10.,-6.))
857 {
d66d46f7 858 cout<<endl;
489d5531 859 cout<<"WARNING (MH): Inconsistent binning in histograms for pt-weights throughout the code."<<endl;
d66d46f7 860 cout<<endl;
489d5531 861 exit(0);
862 }
863 } else
864 {
865 cout<<"WARNING (MH): fWeightsList->FindObject(\"pt_weights\") is NULL in AFAWMH::BAFWH() !!!!"<<endl;
866 exit(0);
867 }
868 } // end of if(fUsePtWeights)
869 // Eta-weights:
870 if(fUseEtaWeights)
871 {
872 if(fWeightsList->FindObject("eta_weights"))
873 {
874 fEtaWeights = dynamic_cast<TH1D*>(fWeightsList->FindObject("eta_weights"));
875 if(TMath::Abs(fEtaWeights->GetBinWidth(1)-fEtaBinWidth)>pow(10.,-6.))
876 {
d66d46f7 877 cout<<endl;
489d5531 878 cout<<"WARNING (MH): Inconsistent binning in histograms for eta-weights throughout the code."<<endl;
d66d46f7 879 cout<<endl;
489d5531 880 exit(0);
881 }
882 } else
883 {
884 cout<<"WARNING: fUseEtaWeights && fWeightsList->FindObject(\"eta_weights\") is NULL in AFAWMH::BAFWH() !!!!"<<endl;
885 exit(0);
886 }
887 } // end of if(fUseEtaWeights)
888
d66d46f7 889} // end of AliFlowAnalysisWithMixedHarmonics::BookAndFillWeightsHistograms()
890
891//================================================================================================================
489d5531 892
893void AliFlowAnalysisWithMixedHarmonics::CheckPointersUsedInMake()
894{
895 // Check pointers used in method Make().
d66d46f7 896
e558a733 897 if(!fReQnk || !fImQnk || !fSpk )
d66d46f7 898 {
899 cout<<endl;
e558a733 900 cout<<" WARNING (MH::Make()): (!fReQnk || !fImQnk || !fSpk) is NULL !!!!"<<endl;
d66d46f7 901 cout<<endl;
902 exit(0);
903 }
904 if(!f3pCorrelatorPro)
905 {
906 cout<<endl;
5c078806 907 cout<<" WARNING (MH::Make()): (!f3pCorrelatorPro) is NULL !!!!"<<endl;
d66d46f7 908 cout<<endl;
909 exit(0);
5c078806 910 }
911 if(!fNonIsotropicTermsPro)
912 {
913 cout<<endl;
914 cout<<" WARNING (MH::Make()): !fNonIsotropicTermsPro is NULL !!!!"<<endl;
915 cout<<endl;
916 exit(0);
917 }
918 if(!f3pCorrelatorVsMPro)
919 {
920 cout<<endl;
921 cout<<" WARNING (MH::Make()): !f3pCorrelatorVsMPro is NULL !!!!"<<endl;
922 cout<<endl;
923 exit(0);
924 }
925 if(!fNonIsotropicTermsVsMPro)
926 {
927 cout<<endl;
928 cout<<" WARNING (MH::Make()): !fNonIsotropicTermsVsMPro is NULL !!!!"<<endl;
929 cout<<endl;
930 exit(0);
931 }
932 for(Int_t sd=0;sd<2;sd++)
933 {
934 if(!(f3pCorrelatorVsPtSumDiffPro[sd]))
935 {
936 cout<<endl;
937 cout<<" WARNING (MH::Make()): !"<<Form("f3pCorrelatorVsPtSumDiffPro[%d]",sd)<<" is NULL !!!!"<<endl;
938 cout<<endl;
939 exit(0);
940 }
d66d46f7 941 }
489d5531 942
d66d46f7 943} // end of AliFlowAnalysisWithMixedHarmonics::CheckPointersUsedInMake()
944
945//================================================================================================================
489d5531 946
947void AliFlowAnalysisWithMixedHarmonics::CheckPointersUsedInFinish()
948{
d66d46f7 949 // Check pointers used in method Finish().
ecac11c2 950
951 if(!fAnalysisSettings)
952 {
953 cout<<endl;
5c078806 954 cout<<" WARNING (MH::Finish()): !fAnalysisSettings is NULL !!!!"<<endl;
ecac11c2 955 cout<<endl;
956 exit(0);
957 }
958 if(!f3pCorrelatorPro)
959 {
960 cout<<endl;
5c078806 961 cout<<" WARNING (MH::Finish()): !f3pCorrelatorPro is NULL !!!!"<<endl;
ecac11c2 962 cout<<endl;
963 exit(0);
964 }
965 if(!fNonIsotropicTermsPro)
966 {
967 cout<<endl;
5c078806 968 cout<<" WARNING (MH::Finish()): !fNonIsotropicTermsPro is NULL !!!!"<<endl;
ecac11c2 969 cout<<endl;
970 exit(0);
971 }
972 if(!f3pCorrelatorVsMPro)
973 {
974 cout<<endl;
5c078806 975 cout<<" WARNING (MH::Finish()): !f3pCorrelatorVsMPro is NULL !!!!"<<endl;
ecac11c2 976 cout<<endl;
977 exit(0);
978 }
e558a733 979 if(!f3pCorrelatorVsMHist)
980 {
981 cout<<endl;
982 cout<<" WARNING (MH::Finish()): !f3pCorrelatorVsMHist is NULL !!!!"<<endl;
983 cout<<endl;
984 exit(0);
985 }
ecac11c2 986 if(!fNonIsotropicTermsVsMPro)
987 {
988 cout<<endl;
5c078806 989 cout<<" WARNING (MH::Finish()): !fNonIsotropicTermsVsMPro is NULL !!!!"<<endl;
ecac11c2 990 cout<<endl;
991 exit(0);
992 }
993 if(!f3pCorrelatorHist)
994 {
995 cout<<endl;
5c078806 996 cout<<" WARNING (MH::Finish()): !f3pCorrelatorHist is NULL !!!!"<<endl;
ecac11c2 997 cout<<endl;
998 exit(0);
5c078806 999 }
ecac11c2 1000 if(!fDetectorBiasHist)
1001 {
1002 cout<<endl;
5c078806 1003 cout<<" WARNING (MH::Finish()): !fDetectorBiasHist is NULL !!!!"<<endl;
ecac11c2 1004 cout<<endl;
1005 exit(0);
1006 }
5c078806 1007 /* to be improved - enabled eventually
ecac11c2 1008 if(!fDetectorBiasVsMHist)
1009 {
1010 cout<<endl;
5c078806 1011 cout<<" WARNING (MH::Finish()): !fDetectorBiasVsMHist is NULL !!!!"<<endl;
ecac11c2 1012 cout<<endl;
1013 exit(0);
5c078806 1014 }
1015 */
1016 for(Int_t sd=0;sd<2;sd++)
1017 {
1018 if(!(f3pCorrelatorVsPtSumDiffPro[sd]))
1019 {
1020 cout<<endl;
1021 cout<<" WARNING (MH::Finish()): !"<<Form("f3pCorrelatorVsPtSumDiffPro[%d]",sd)<<" is NULL !!!!"<<endl;
1022 cout<<endl;
1023 exit(0);
1024 }
1025 }
ecac11c2 1026
489d5531 1027} // end of AliFlowAnalysisWithMixedHarmonics::CheckPointersUsedInFinish()
d66d46f7 1028
1029//================================================================================================================
489d5531 1030
5c078806 1031void AliFlowAnalysisWithMixedHarmonics::PrintOnTheScreen()
1032{
1033 // Print the final results on the screen.
1034
1035 cout<<endl;
1036 cout<<"*******************************************************"<<endl;
1037 cout<<"*******************************************************"<<endl;
1038 cout<<" Mixed Harmonics "<<endl;
1039 cout<<endl;
1040 if(fCorrelatorInteger!=1)
1041 {
1042 cout<<" cos["<<fCorrelatorInteger<<"(2phi1-phi2-phi3)] = "<<f3pCorrelatorHist->GetBinContent(1)<<
1043 " +/- "<<f3pCorrelatorHist->GetBinError(1)<<endl;
1044 } else
1045 {
1046 cout<<" cos(2phi1-phi2-phi3) = "<<f3pCorrelatorHist->GetBinContent(1)<<" +/- "<<f3pCorrelatorHist->GetBinError(1)<<endl;
1047 }
1048 cout<<" Detector Bias = "<<fDetectorBiasHist->GetBinContent(1)<<endl;
1049 cout<<endl;
1050 cout<<"*******************************************************"<<endl;
1051 cout<<"*******************************************************"<<endl;
1052
1053} // end of void AliFlowAnalysisWithMixedHarmonics::PrintOnTheScreen()
1054
1055//================================================================================================================
1056
489d5531 1057void AliFlowAnalysisWithMixedHarmonics::AccessSettings()
1058{
d66d46f7 1059 // Access the settings for analysis with mixed harmonics.
1060
1061 fCorrelatorInteger = (Int_t)fAnalysisSettings->GetBinContent(1);
1062 fCorrectForDetectorEffects = (Bool_t)fAnalysisSettings->GetBinContent(2);
1063 fNoOfMultipicityBins = (Int_t)fAnalysisSettings->GetBinContent(3);
1064 fMultipicityBinWidth = (Double_t)fAnalysisSettings->GetBinContent(4);
1065 fMinMultiplicity = (Double_t)fAnalysisSettings->GetBinContent(5);
5c078806 1066 fPrintOnTheScreen = (Bool_t)fAnalysisSettings->GetBinContent(6);
489d5531 1067
d66d46f7 1068} // end of AliFlowAnalysisWithMixedHarmonics::AccessSettings()
1069
1070//================================================================================================================
489d5531 1071
1072void AliFlowAnalysisWithMixedHarmonics::CorrectForDetectorEffects()
1073{
d66d46f7 1074 // Correct measured 3-p correlator cos[n(2phi1-phi2-phi3)] for detector effects.
5c078806 1075
d66d46f7 1076 Double_t measured3pCorrelator = f3pCorrelatorPro->GetBinContent(1); // biased by detector effects
1077 Double_t corrected3pCorrelator = 0.; // corrected for detector effects
1078 Double_t nonIsotropicTerms[10] = {0.}; // there are 10 distinct non-isotropic terms
1079 for(Int_t nit=0;nit<10;nit++)
1080 {
1081 nonIsotropicTerms[nit] = fNonIsotropicTermsPro->GetBinContent(nit+1);
1082 }
1083 // Calculate corrected 3-p correlator:
1084 corrected3pCorrelator = measured3pCorrelator
1085 - nonIsotropicTerms[2]*nonIsotropicTerms[4]
1086 - nonIsotropicTerms[3]*nonIsotropicTerms[5]
1087 - 2.*nonIsotropicTerms[0]*nonIsotropicTerms[6]
1088 - 2.*nonIsotropicTerms[1]*nonIsotropicTerms[7]
1089 + 2.*nonIsotropicTerms[2]*(pow(nonIsotropicTerms[0],2.)-pow(nonIsotropicTerms[1],2.))
5c078806 1090 + 4.*nonIsotropicTerms[3]*nonIsotropicTerms[0]*nonIsotropicTerms[1];
1091 // Store corrected correlator:
1092 f3pCorrelatorHist->SetBinContent(1,corrected3pCorrelator);
1093 f3pCorrelatorHist->SetBinError(1,f3pCorrelatorPro->GetBinError(1)); // to be improved (propagate error for non-isotropic terms)
1094 // Quantify bias from detector inefficiences to 3-p correlator. Remark: Bias is quantified as a
1095 // ratio between corrected and measured 3-p correlator:
1096 // bias = corrected/measured
1097 // This bias is stored in histogram fDetectorBias.
1098 Double_t bias = 0.;
1099 if(measured3pCorrelator)
1100 {
1101 bias = corrected3pCorrelator/measured3pCorrelator;
1102 fDetectorBiasHist->SetBinContent(1,bias);
e558a733 1103 }
489d5531 1104
d66d46f7 1105} // end of AliFlowAnalysisWithMixedHarmonics::CorrectForDetectorEffects()
1106
1107//================================================================================================================
489d5531 1108
e558a733 1109void AliFlowAnalysisWithMixedHarmonics::CorrectForDetectorEffectsVsM()
1110{
1111 // Correct measured 3-p correlator cos[n(2phi1-phi2-phi3)] vs M for detector effects.
1112
1113 for(Int_t b=1;b<=fNoOfMultipicityBins+2;b++)
1114 {
1115 Double_t measured3pCorrelator = f3pCorrelatorVsMPro->GetBinContent(b); // biased by detector effects
1116 Double_t corrected3pCorrelator = 0.; // corrected for detector effects
1117 Double_t nonIsotropicTerms[10] = {0.}; // there are 10 distinct non-isotropic terms
1118 for(Int_t nit=0;nit<10;nit++)
1119 {
1120 nonIsotropicTerms[nit] = fNonIsotropicTermsVsMPro->GetBinContent(fNonIsotropicTermsVsMPro->GetBin(nit+1,b));
1121 }
1122 // Calculate corrected 3-p correlator:
1123 corrected3pCorrelator = measured3pCorrelator
1124 - nonIsotropicTerms[2]*nonIsotropicTerms[4]
1125 - nonIsotropicTerms[3]*nonIsotropicTerms[5]
1126 - 2.*nonIsotropicTerms[0]*nonIsotropicTerms[6]
1127 - 2.*nonIsotropicTerms[1]*nonIsotropicTerms[7]
1128 + 2.*nonIsotropicTerms[2]*(pow(nonIsotropicTerms[0],2.)-pow(nonIsotropicTerms[1],2.))
1129 + 4.*nonIsotropicTerms[3]*nonIsotropicTerms[0]*nonIsotropicTerms[1];
1130 // Store corrected correlator:
1131 f3pCorrelatorVsMHist->SetBinContent(b,corrected3pCorrelator);
1132 f3pCorrelatorVsMHist->SetBinError(b,f3pCorrelatorVsMPro->GetBinError(b)); // to be improved (propagate error for non-isotropic terms)
1133 // Quantify bias from detector inefficiences to 3-p correlator. Remark: Bias is quantified as a
1134 // ratio between corrected and measured 3-p correlator:
1135 // bias = corrected/measured
1136 // This bias is stored in histogram fDetectorBias.
1137 Double_t bias = 0.;
1138 if(measured3pCorrelator)
1139 {
1140 bias = corrected3pCorrelator/measured3pCorrelator;
1141 fDetectorBiasVsMHist->SetBinContent(b,bias);
1142 }
1143 } // end of for(Int_t b=1;b<=fNoOfMultipicityBins;b++)
1144
1145} // end of AliFlowAnalysisWithMixedHarmonics::CorrectForDetectorEffectsVsM()
1146
1147//================================================================================================================
1148
489d5531 1149void AliFlowAnalysisWithMixedHarmonics::ResetEventByEventQuantities()
1150{
1151 // Reset all event by event quantities.
1152
1153 fReQnk->Zero();
1154 fImQnk->Zero();
d66d46f7 1155 fSpk->Zero();
e558a733 1156
5c078806 1157 for(Int_t sd=0;sd<2;sd++)
1158 {
1159 fRePEBE[sd]->Reset();
1160 fImPEBE[sd]->Reset();
1161 }
1162
d66d46f7 1163} // end of void AliFlowAnalysisWithMixedHarmonics::ResetEventByEventQuantities()
1164
1165//================================================================================================================
1166
489d5531 1167void AliFlowAnalysisWithMixedHarmonics::Calculate3pCorrelator()
1168{
1169 // Calculate 3-p azimuthal correlator cos[n(2phi1-phi2-phi3)] in terms of Q_{n,k} and S_{p,k}.
d66d46f7 1170
1171 // a) Calculate 3-p correlator without using particle weights;
1172 // b) Calculate 3-p correlator with using particle weights.
1173
489d5531 1174 // a) Calculate 3-p correlator without using particle weights:
d66d46f7 1175 if(!(fUsePhiWeights || fUsePtWeights || fUseEtaWeights))
1176 {
489d5531 1177 // Multiplicity (number of RPs):
1178 Double_t dMult = (*fSpk)(0,0);
1179 // Real and imaginary parts of non-weighted Q-vectors (Q_{n,0}) evaluated in harmonics n and 2n:
1180 Double_t dReQ1n = (*fReQnk)(0,0);
1181 Double_t dReQ2n = (*fReQnk)(1,0);
1182 Double_t dImQ1n = (*fImQnk)(0,0);
d66d46f7 1183 Double_t dImQ2n = (*fImQnk)(1,0);
489d5531 1184 // 3-particle azimuthal correlator <cos(n*(2.*phi1-phi2-phi3))>:
d66d46f7 1185 Double_t three2n1n1n = (pow(dReQ1n,2.)*dReQ2n + 2.*dReQ1n*dImQ1n*dImQ2n - pow(dImQ1n,2.)*dReQ2n
489d5531 1186 - 2.*(pow(dReQ1n,2.)+pow(dImQ1n,2.))
1187 - (pow(dReQ2n,2.)+pow(dImQ2n,2.))+2.*dMult)
d66d46f7 1188 / (dMult*(dMult-1.)*(dMult-2.));
e558a733 1189 // Fill all-events profile:
d66d46f7 1190 f3pCorrelatorPro->Fill(0.5,three2n1n1n,dMult*(dMult-1.)*(dMult-2.));
5c078806 1191
1192 // 3-particle azimuthal correlator <cos(n*(2.*phi1-phi2-phi3))> vs multiplicity:
1193 if(dMult<fMinMultiplicity)
1194 {
1195 f3pCorrelatorVsMPro->Fill(0.5,three2n1n1n,dMult*(dMult-1.)*(dMult-2.));
1196 } else if(dMult>=fMinMultiplicity+fNoOfMultipicityBins*fMultipicityBinWidth)
1197 {
1198 f3pCorrelatorVsMPro->Fill(0.5+fNoOfMultipicityBins+1,three2n1n1n,dMult*(dMult-1.)*(dMult-2.));
1199 } else
1200 {
1201 f3pCorrelatorVsMPro->Fill(1.5+(Int_t)((dMult-fMinMultiplicity)/fMultipicityBinWidth),three2n1n1n,dMult*(dMult-1.)*(dMult-2.));
1202 }
1203
d66d46f7 1204 } // end of if(!(fUsePhiWeights || fUsePtWeights || fUseEtaWeights))
1205
489d5531 1206 // b) Calculate 3-p correlator without using particle weights:
d66d46f7 1207 if(fUsePhiWeights || fUsePtWeights || fUseEtaWeights)
1208 {
1209
1210 } // end of if(fUsePhiWeights || fUsePtWeights || fUseEtaWeights)
1211
1212} // end of void AliFlowAnalysisWithMixedHarmonics::Calculate3pCorrelator()
1213
1214//================================================================================================================
1215
1216void AliFlowAnalysisWithMixedHarmonics::CalculateNonIsotropicTerms()
1217{
5c078806 1218 // Calculate non-isotropic terms which appear in the decomposition of 3-p correlator <cos[n(2phi1-phi2-phi3)]>.
d66d46f7 1219
5c078806 1220 // For detector with uniform acceptance all these terms vanish. These non-isotropic terms are stored in fNonIsotropicTermsPro.
1221 // Binning of fNonIsotropicTermsPro is organized as follows:
489d5531 1222 // 1st bin: <<cos(n*phi1)>>
d66d46f7 1223 // 2nd bin: <<sin(n*phi1)>>
489d5531 1224 // 3rd bin: <<cos(2n*phi1)>>
d66d46f7 1225 // 4th bin: <<sin(2n*phi1)>>
489d5531 1226 // 5th bin: <<cos(n*(phi1+phi2)>>
d66d46f7 1227 // 6th bin: <<sin(n*(phi1+phi2)>>
489d5531 1228 // 7th bin: <<cos(n*(2phi1-phi2)>>
d66d46f7 1229 // 8th bin: <<sin(n*(2phi1-phi2)>>
489d5531 1230 // 9th bin: <<cos(n*(phi1-phi2-phi3)>>
d66d46f7 1231 // 10th bin: <<sin(n*(phi1-phi2-phi3)>>
1232
5c078806 1233 // a) Calculate using particle weights;
1234 // b) Calculate without using particle weights.
1235
d66d46f7 1236 // a) Calculate using particle weights:
1237 if(!(fUsePhiWeights || fUsePtWeights || fUseEtaWeights))
1238 {
489d5531 1239 // Multiplicity (number of RPs):
1240 Double_t dMult = (*fSpk)(0,0);
1241 // Real and imaginary parts of non-weighted Q-vectors (Q_{n,0}) evaluated in harmonics n and 2n:
1242 Double_t dReQ1n = (*fReQnk)(0,0);
1243 Double_t dReQ2n = (*fReQnk)(1,0);
1244 Double_t dImQ1n = (*fImQnk)(0,0);
d66d46f7 1245 Double_t dImQ2n = (*fImQnk)(1,0);
489d5531 1246 // 1-particle terms:
d66d46f7 1247 Double_t cosP1n = 0.; // <cos(n*(phi1))>
1248 Double_t sinP1n = 0.; // <sin(n*(phi1))>
1249 Double_t cosP2n = 0.; // <cos(2n*(phi1))>
489d5531 1250 Double_t sinP2n = 0.; // <sin(2n*(phi1))>
1251 if(dMult>0)
1252 {
d66d46f7 1253 cosP1n = dReQ1n/dMult;
1254 sinP1n = dImQ1n/dMult;
1255 cosP2n = dReQ2n/dMult;
1256 sinP2n = dImQ2n/dMult;
489d5531 1257 // All-events avarages:
d66d46f7 1258 fNonIsotropicTermsPro->Fill(0.5,cosP1n,dMult); // <<cos(n*(phi1))>>
1259 fNonIsotropicTermsPro->Fill(1.5,sinP1n,dMult); // <<sin(n*(phi1))>>
1260 fNonIsotropicTermsPro->Fill(2.5,cosP2n,dMult); // <<cos(2n*(phi1))>>
489d5531 1261 fNonIsotropicTermsPro->Fill(3.5,sinP2n,dMult); // <<sin(2n*(phi1))>>
e558a733 1262 // All-events avarages vs M:
1263 if(dMult<fMinMultiplicity)
1264 {
1265 fNonIsotropicTermsVsMPro->Fill(0.5,0.5,cosP1n,dMult); // <<cos(n*(phi1))>>
1266 fNonIsotropicTermsVsMPro->Fill(1.5,0.5,sinP1n,dMult); // <<sin(n*(phi1))>>
1267 fNonIsotropicTermsVsMPro->Fill(2.5,0.5,cosP2n,dMult); // <<cos(2n*(phi1))>>
1268 fNonIsotropicTermsVsMPro->Fill(3.5,0.5,sinP2n,dMult); // <<sin(2n*(phi1))>>
1269 } else if(dMult>=fMinMultiplicity+fNoOfMultipicityBins*fMultipicityBinWidth)
1270 {
1271 fNonIsotropicTermsVsMPro->Fill(0.5,0.5+fNoOfMultipicityBins+1,cosP1n,dMult); // <<cos(n*(phi1))>>
1272 fNonIsotropicTermsVsMPro->Fill(1.5,0.5+fNoOfMultipicityBins+1,sinP1n,dMult); // <<sin(n*(phi1))>>
1273 fNonIsotropicTermsVsMPro->Fill(2.5,0.5+fNoOfMultipicityBins+1,cosP2n,dMult); // <<cos(2n*(phi1))>>
1274 fNonIsotropicTermsVsMPro->Fill(3.5,0.5+fNoOfMultipicityBins+1,sinP2n,dMult); // <<sin(2n*(phi1))>>
1275 } else
1276 {
1277 fNonIsotropicTermsVsMPro->Fill(0.5,1.5+(Int_t)((dMult-fMinMultiplicity)/fMultipicityBinWidth),cosP1n,dMult); // <<cos(n*(phi1))>>
1278 fNonIsotropicTermsVsMPro->Fill(1.5,1.5+(Int_t)((dMult-fMinMultiplicity)/fMultipicityBinWidth),sinP1n,dMult); // <<sin(n*(phi1))>>
1279 fNonIsotropicTermsVsMPro->Fill(2.5,1.5+(Int_t)((dMult-fMinMultiplicity)/fMultipicityBinWidth),cosP2n,dMult); // <<cos(2n*(phi1))>>
1280 fNonIsotropicTermsVsMPro->Fill(3.5,1.5+(Int_t)((dMult-fMinMultiplicity)/fMultipicityBinWidth),sinP2n,dMult); // <<sin(2n*(phi1))>>
1281 }
1282 } // end of if(dMult>0)
489d5531 1283 // 2-particle terms:
d66d46f7 1284 Double_t cosP1nP1n = 0.; // <cos(n*(phi1+phi2))>
1285 Double_t sinP1nP1n = 0.; // <sin(n*(phi1+phi2))>
1286 Double_t cosP2nM1n = 0.; // <cos(n*(2phi1-phi2))>
489d5531 1287 Double_t sinP2nM1n = 0.; // <sin(n*(2phi1-phi2))>
1288 if(dMult>1)
1289 {
d66d46f7 1290 cosP1nP1n = (pow(dReQ1n,2)-pow(dImQ1n,2)-dReQ2n)/(dMult*(dMult-1));
489d5531 1291 sinP1nP1n = (2.*dReQ1n*dImQ1n-dImQ2n)/(dMult*(dMult-1));
d66d46f7 1292 cosP2nM1n = (dReQ2n*dReQ1n+dImQ2n*dImQ1n-dReQ1n)/(dMult*(dMult-1));
489d5531 1293 sinP2nM1n = (dImQ2n*dReQ1n-dReQ2n*dImQ1n-dImQ1n)/(dMult*(dMult-1));
489d5531 1294 // All-events avarages:
d66d46f7 1295 fNonIsotropicTermsPro->Fill(4.5,cosP1nP1n,dMult*(dMult-1.)); // <<cos(n*(phi1+phi2))>>
489d5531 1296 fNonIsotropicTermsPro->Fill(5.5,sinP1nP1n,dMult*(dMult-1.)); // <<sin(n*(phi1+phi2))>>
d66d46f7 1297 fNonIsotropicTermsPro->Fill(6.5,cosP2nM1n,dMult*(dMult-1.)); // <<cos(n*(2phi1-phi2))>>
489d5531 1298 fNonIsotropicTermsPro->Fill(7.5,sinP2nM1n,dMult*(dMult-1.)); // <<sin(n*(2phi1-phi2))>>
e558a733 1299 // All-events avarages vs M:
1300 if(dMult<fMinMultiplicity)
1301 {
1302 fNonIsotropicTermsVsMPro->Fill(4.5,0.5,cosP1nP1n,dMult*(dMult-1.)); // <<cos(n*(phi1+phi2))>>
1303 fNonIsotropicTermsVsMPro->Fill(5.5,0.5,sinP1nP1n,dMult*(dMult-1.)); // <<sin(n*(phi1+phi2))>>
1304 fNonIsotropicTermsVsMPro->Fill(6.5,0.5,cosP2nM1n,dMult*(dMult-1.)); // <<cos(n*(2phi1-phi2))>>
1305 fNonIsotropicTermsVsMPro->Fill(7.5,0.5,sinP2nM1n,dMult*(dMult-1.)); // <<sin(n*(2phi1-phi2))>>
1306 } else if(dMult>=fMinMultiplicity+fNoOfMultipicityBins*fMultipicityBinWidth)
1307 {
1308 fNonIsotropicTermsVsMPro->Fill(4.5,0.5+fNoOfMultipicityBins+1,cosP1nP1n,dMult*(dMult-1.)); // <<cos(n*(phi1+phi2))>>
1309 fNonIsotropicTermsVsMPro->Fill(5.5,0.5+fNoOfMultipicityBins+1,sinP1nP1n,dMult*(dMult-1.)); // <<sin(n*(phi1+phi2))>>
1310 fNonIsotropicTermsVsMPro->Fill(6.5,0.5+fNoOfMultipicityBins+1,cosP2nM1n,dMult*(dMult-1.)); // <<cos(n*(2phi1-phi2))>>
1311 fNonIsotropicTermsVsMPro->Fill(7.5,0.5+fNoOfMultipicityBins+1,sinP2nM1n,dMult*(dMult-1.)); // <<sin(n*(2phi1-phi2))>>
1312 } else
1313 {
1314 fNonIsotropicTermsVsMPro->Fill(4.5,1.5+(Int_t)((dMult-fMinMultiplicity)/fMultipicityBinWidth),cosP1nP1n,dMult*(dMult-1.)); // <<cos(n*(phi1+phi2))>>
1315 fNonIsotropicTermsVsMPro->Fill(5.5,1.5+(Int_t)((dMult-fMinMultiplicity)/fMultipicityBinWidth),sinP1nP1n,dMult*(dMult-1.)); // <<sin(n*(phi1+phi2))>>
1316 fNonIsotropicTermsVsMPro->Fill(6.5,1.5+(Int_t)((dMult-fMinMultiplicity)/fMultipicityBinWidth),cosP2nM1n,dMult*(dMult-1.)); // <<cos(n*(2phi1-phi2))>>
1317 fNonIsotropicTermsVsMPro->Fill(7.5,1.5+(Int_t)((dMult-fMinMultiplicity)/fMultipicityBinWidth),sinP2nM1n,dMult*(dMult-1.)); // <<sin(n*(2phi1-phi2))>>
1318 }
1319 } // end of if(dMult>1)
489d5531 1320 // 3-particle:
1321 Double_t cosP1nM1nM1n = 0.; // <cos(n*(phi1-phi2-phi3))>
1322 Double_t sinP1nM1nM1n = 0.; // <sin(n*(phi1-phi2-phi3))>
1323 if(dMult>2)
1324 {
1325 cosP1nM1nM1n = (dReQ1n*(pow(dReQ1n,2)+pow(dImQ1n,2))-dReQ1n*dReQ2n-dImQ1n*dImQ2n-2.*(dMult-1)*dReQ1n)
d66d46f7 1326 / (dMult*(dMult-1)*(dMult-2));
489d5531 1327 sinP1nM1nM1n = (-dImQ1n*(pow(dReQ1n,2)+pow(dImQ1n,2))+dReQ1n*dImQ2n-dImQ1n*dReQ2n+2.*(dMult-1)*dImQ1n)
1328 / (dMult*(dMult-1)*(dMult-2));
489d5531 1329 // All-events avarages:
d66d46f7 1330 fNonIsotropicTermsPro->Fill(8.5,cosP1nM1nM1n,dMult*(dMult-1.)*(dMult-2.)); // <<cos(n*(phi1-phi2-phi3))>>
e558a733 1331 fNonIsotropicTermsPro->Fill(9.5,sinP1nM1nM1n,dMult*(dMult-1.)*(dMult-2.)); // <<sin(n*(phi1-phi2-phi3))>>
1332 // All-events avarages vs M:
1333 if(dMult<fMinMultiplicity)
1334 {
1335 fNonIsotropicTermsVsMPro->Fill(8.5,0.5,cosP1nM1nM1n,dMult*(dMult-1.)*(dMult-2.)); // <<cos(n*(phi1-phi2-phi3))>>
1336 fNonIsotropicTermsVsMPro->Fill(9.5,0.5,sinP1nM1nM1n,dMult*(dMult-1.)*(dMult-2.)); // <<sin(n*(phi1-phi2-phi3))>>
1337 } else if(dMult>=fMinMultiplicity+fNoOfMultipicityBins*fMultipicityBinWidth)
1338 {
1339 fNonIsotropicTermsVsMPro->Fill(8.5,0.5+fNoOfMultipicityBins+1,cosP1nM1nM1n,dMult*(dMult-1.)*(dMult-2.)); // <<cos(n*(phi1-phi2-phi3))>>
1340 fNonIsotropicTermsVsMPro->Fill(9.5,0.5+fNoOfMultipicityBins+1,sinP1nM1nM1n,dMult*(dMult-1.)*(dMult-2.)); // <<sin(n*(phi1-phi2-phi3))>>
1341 } else
1342 {
1343 fNonIsotropicTermsVsMPro->Fill(8.5,1.5+(Int_t)((dMult-fMinMultiplicity)/fMultipicityBinWidth),
1344 cosP1nM1nM1n,dMult*(dMult-1.)*(dMult-2.)); // <<cos(n*(phi1-phi2-phi3))>>
1345 fNonIsotropicTermsVsMPro->Fill(9.5,1.5+(Int_t)((dMult-fMinMultiplicity)/fMultipicityBinWidth),
1346 sinP1nM1nM1n,dMult*(dMult-1.)*(dMult-2.)); // <<sin(n*(phi1-phi2-phi3))>>
1347 }
1348 } // end of if(dMult>2)
d66d46f7 1349 } // end of if(!(fUsePhiWeights || fUsePtWeights || fUseEtaWeights))
1350
489d5531 1351 // b) Calculate without using particle weights:
d66d46f7 1352 if(fUsePhiWeights || fUsePtWeights || fUseEtaWeights)
1353 {
1354
1355 } // end of if(fUsePhiWeights || fUsePtWeights || fUseEtaWeights)
1356
1357} // end of void AliFlowAnalysisWithMixedHarmonics::CalculateNonIsotropicTerms()
1358
5c078806 1359//================================================================================================================
1360
1361void AliFlowAnalysisWithMixedHarmonics::CalculateDifferential3pCorrelator()
1362{
1363 // Calculate differential 3-p azimuthal correlator cos[n(2phi1-psi2-psi3)] in terms of Q_{2n} and p_{n}.
1364
1365 // a) Calculate differential 3-p correlator without using particle weights;
1366 // b) Calculate differential 3-p correlator with using particle weights.
1367
1368 // a) Calculate differential 3-p correlator without using particle weights:
1369 if(!(fUsePhiWeights || fUsePtWeights || fUseEtaWeights))
1370 {
1371 // Multiplicity (number of RPs):
1372 Double_t dMult = (*fSpk)(0,0);
1373 // Real and imaginary parts of non-weighted Q-vectors (Q_{n,0}) evaluated in harmonic 2n:
1374 Double_t dReQ2n = (*fReQnk)(1,0);
1375 Double_t dImQ2n = (*fImQnk)(1,0);
1376 for(Int_t sd=0;sd<2;sd++) // [(p1+p2)/2,|p1-p2|]
1377 {
1378 // looping over all bins and calculating reduced correlations:
1379 for(Int_t b=1;b<=fnBinsPt;b++)
1380 {
1381 // real and imaginary parts of p_{n}:
1382 Double_t p1nRe = fRePEBE[sd]->GetBinContent(b)*fRePEBE[sd]->GetBinEntries(b);
1383 Double_t p1nIm = fImPEBE[sd]->GetBinContent(b)*fImPEBE[sd]->GetBinEntries(b);
1384 // number of pairs of POIs in particular (p1+p2)/2 or |p1-p2| bin:
1385 Double_t mp = fRePEBE[sd]->GetBinEntries(b);
1386 Double_t cosP2nphi1M1npsi2M1npsi2 = 0; // cos[n(2phi1-psi2-psi3)]
1387 if(mp*dMult>0.)
1388 {
1389 cosP2nphi1M1npsi2M1npsi2 = (p1nRe*dReQ2n+p1nIm*dImQ2n)/(mp*dMult);
1390 }
1391 f3pCorrelatorVsPtSumDiffPro[sd]->Fill(fPtMin+(b-1)*fPtBinWidth,cosP2nphi1M1npsi2M1npsi2,mp*dMult);
1392 } // end of for(Int_t b=1;b<=fnBinsPt;b++)
1393 } // end of for(Int_t sd=0;sd<2;sd++)
1394 } // end of if(!(fUsePhiWeights || fUsePtWeights || fUseEtaWeights))
1395
1396 // b) Calculate differential 3-p correlator by using particle weights:
1397 if(fUsePhiWeights || fUsePtWeights || fUseEtaWeights)
1398 {
1399
1400 } // end of if(fUsePhiWeights || fUsePtWeights || fUseEtaWeights)
1401
1402} // end of void AliFlowAnalysisWithMixedHarmonics::CalculateDifferential3pCorrelator()
1403
1404//================================================================================================================
1405