1 /*************************************************************************
2 * Copyright(c) 1998-2008, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
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 *
24 * a) Extract subdominant harmonics (like v1 and v4); *
25 * b) Study flow of two-particle resonances; *
26 * c) Study strong parity violation. *
28 * Author: Ante Bilandzic (abilandzic@gmail.com) *
29 *********************************************************/
31 #define AliFlowAnalysisWithMixedHarmonics_cxx
33 #include "Riostream.h"
34 #include "AliFlowCommonConstants.h"
35 #include "AliFlowCommonHist.h"
36 #include "AliFlowCommonHistResults.h"
42 #include "TProfile2D.h"
44 #include "AliFlowEventSimple.h"
45 #include "AliFlowTrackSimple.h"
46 #include "AliFlowAnalysisWithMixedHarmonics.h"
50 ClassImp(AliFlowAnalysisWithMixedHarmonics)
52 //================================================================================================================
53 AliFlowAnalysisWithMixedHarmonics::AliFlowAnalysisWithMixedHarmonics():
58 fAnalysisSettings(NULL),
59 fNoOfMultipicityBins(100),
60 fMultipicityBinWidth(1),
62 fOppositeChargesPOI(kFALSE),
63 fEvaluateDifferential3pCorrelator(kFALSE),
64 fCorrectForDetectorEffects(kFALSE),
65 fPrintOnTheScreen(kTRUE),
66 fCalculateVsM(kFALSE),
67 fShowBinLabelsVsM(kFALSE),
82 fUsePhiWeights(kFALSE),
83 fUsePtWeights(kFALSE),
84 fUseEtaWeights(kFALSE),
85 fUseParticleWeights(NULL),
93 f3pCorrelatorPro(NULL),
94 fNonIsotropicTermsPro(NULL),
95 f3pCorrelatorVsMPro(NULL),
96 f3pPOICorrelatorVsM(NULL),
97 fNonIsotropicTermsVsMPro(NULL),
98 f2pCorrelatorCosPsiDiff(NULL),
99 f2pCorrelatorCosPsiSum(NULL),
100 f2pCorrelatorSinPsiDiff(NULL),
101 f2pCorrelatorSinPsiSum(NULL),
103 f3pCorrelatorHist(NULL),
104 fDetectorBiasHist(NULL),
105 f3pCorrelatorVsMHist(NULL),
106 fDetectorBiasVsMHist(NULL)
110 // Base list to hold all output objects:
111 fHistList = new TList();
112 fHistListName = new TString("cobjMH");
113 fHistList->SetName(fHistListName->Data());
114 fHistList->SetOwner(kTRUE);
116 // List to hold histograms with phi, pt and eta weights:
117 fWeightsList = new TList();
119 // List to hold all all-event profiles:
120 fProfileList = new TList();
122 // List to hold objects with final results:
123 fResultsList = new TList();
125 // Initialize all arrays:
126 this->InitializeArrays();
128 } // AliFlowAnalysisWithMixedHarmonics::AliFlowAnalysisWithMixedHarmonics()
130 //================================================================================================================
132 AliFlowAnalysisWithMixedHarmonics::~AliFlowAnalysisWithMixedHarmonics()
138 } // end of AliFlowAnalysisWithMixedHarmonics::~AliFlowAnalysisWithMixedHarmonics()
140 //================================================================================================================
142 void AliFlowAnalysisWithMixedHarmonics::Init()
144 // Initialize and book all objects.
146 // a) Cross check if the user settings make sense before starting;
147 // b) Access all common constants;
148 // c) Book and nest all lists in the base list fHistList;
149 // d) Book common control histograms;
150 // e) Book all event-by-event quantities;
151 // f) Book all all-event quantities;
152 // g) Book and fill histograms to hold phi, pt and eta weights;
153 // h) Store harmonic n used in cos[n*(phi1+phi2-2phi3)] and cos[n*(psi1+psi2-2phi3)].
155 //save old value and prevent histograms from being added to directory
156 //to avoid name clashes in case multiple analaysis objects are used
158 Bool_t oldHistAddStatus = TH1::AddDirectoryStatus();
159 TH1::AddDirectory(kFALSE);
161 TH1::SetDefaultSumw2();
163 this->CrossCheckSettings();
164 this->AccessConstants();
165 this->BookAndNestAllLists();
166 this->BookProfileHoldingSettings();
167 this->BookCommonHistograms();
168 this->BookAllEventByEventQuantities();
169 this->BookAllAllEventQuantities();
170 this->BookAndFillWeightsHistograms();
171 this->StoreHarmonic();
173 TH1::AddDirectory(oldHistAddStatus);
175 } // end of void AliFlowAnalysisWithMixedHarmonics::Init()
177 //================================================================================================================
179 void AliFlowAnalysisWithMixedHarmonics::Make(AliFlowEventSimple* anEvent)
181 // Running over data only in this method.
183 // a) Check all pointers used in this method;
184 // b) Define local variables;
185 // c) Fill common control histograms;
186 // d) Loop over data and calculate e-b-e quantities Q_{n,k} and S_{p,k};
187 // e) Calculate 3-p azimuthal correlator cos[n(phi1+phi2-2*phi3)] and non-isotropic terms in terms of Q_{n,k} and S_{p,k};
188 // f) Calculate differential 3-p azimuthal correlator cos[n(psi1+psi2-2*phi3)] in terms of Q_{2n} and p_{n}:
189 // g) Reset all event-by-event quantities.
191 // a) Check all pointers used in this method:
192 this->CheckPointersUsedInMake();
194 // b) Define local variables:
195 Double_t dPhi = 0.; // azimuthal angle in the laboratory frame
196 Double_t dPt = 0.; // transverse momentum
197 Double_t dEta = 0.; // pseudorapidity
198 Double_t wPhi = 1.; // phi weight
199 Double_t wPt = 1.; // pt weight
200 Double_t wEta = 1.; // eta weight
201 AliFlowTrackSimple *aftsTrack = NULL; // simple track
203 // c) Fill common control histograms:
204 fCommonHists->FillControlHistograms(anEvent);
206 // d) Loop over data and calculate e-b-e quantities:
207 Int_t nPrim = anEvent->NumberOfTracks(); // nPrim = total number of primary tracks, i.e. nPrim = nRP + nPOI
208 // nRP = # of particles used to determine the reaction plane ("Reference Particles");
209 // nPOI = # of particles of interest for a detailed flow analysis ("Particles of Interest");
211 Int_t nRefMult = anEvent->GetReferenceMultiplicity();
213 // Start loop over data:
214 for(Int_t i=0;i<nPrim;i++)
216 aftsTrack=anEvent->GetTrack(i);
219 if(!(aftsTrack->InRPSelection() || aftsTrack->InPOISelection())) continue; // consider only tracks which are either RPs or POIs
221 if(aftsTrack->InRPSelection()) // checking RP condition:
223 dPhi = aftsTrack->Phi();
224 dPt = aftsTrack->Pt();
225 dEta = aftsTrack->Eta();
226 if(fUsePhiWeights && fPhiWeights && fnBinsPhi) // determine phi-weight for this particle:
228 wPhi = fPhiWeights->GetBinContent(1+(Int_t)(TMath::Floor(dPhi*fnBinsPhi/TMath::TwoPi())));
230 if(fUsePtWeights && fPtWeights && fnBinsPt) // determine pt-weight for this particle:
232 wPt = fPtWeights->GetBinContent(1+(Int_t)(TMath::Floor((dPt-fPtMin)/fPtBinWidth)));
234 if(fUseEtaWeights && fEtaWeights && fEtaBinWidth) // determine eta-weight for this particle:
236 wEta = fEtaWeights->GetBinContent(1+(Int_t)(TMath::Floor((dEta-fEtaMin)/fEtaBinWidth)));
238 // Calculate Re[Q_{m,k}] and Im[Q_{m,k}], (m <= n and k = 0,1,2,3) for this event:
239 for(Int_t m=0;m<2;m++) // needs only Q-vectors in harmonincs n and 2n
241 for(Int_t k=0;k<4;k++) // to be improved (what is the maximum k that I need?)
243 (*fReQnk)(m,k)+=pow(wPhi*wPt*wEta,k)*TMath::Cos((m+1)*n*dPhi);
244 (*fImQnk)(m,k)+=pow(wPhi*wPt*wEta,k)*TMath::Sin((m+1)*n*dPhi);
247 // Calculate partially S_{p,k} for this event (final calculation of S_{p,k} follows after the loop over data bellow):
248 for(Int_t p=0;p<4;p++) // to be improved (what is maximum p that I need?)
250 for(Int_t k=0;k<4;k++) // to be improved (what is maximum k that I need?)
252 (*fSpk)(p,k)+=pow(wPhi*wPt*wEta,k);
255 } // end of if(aftsTrack->InRPSelection())
257 if(fEvaluateDifferential3pCorrelator)
259 if(aftsTrack->InPOISelection()) // 1st POI
261 Double_t dPsi1 = aftsTrack->Phi();
262 Double_t dPt1 = aftsTrack->Pt();
263 Double_t dEta1 = aftsTrack->Eta();
264 Int_t iCharge1 = aftsTrack->Charge();
265 Bool_t b1stPOIisAlsoRP = kFALSE;
266 if(aftsTrack->InRPSelection()){b1stPOIisAlsoRP = kTRUE;}
267 for(Int_t j=0;j<nPrim;j++)
270 aftsTrack=anEvent->GetTrack(j);
271 if(aftsTrack->InPOISelection()) // 2nd POI
273 Double_t dPsi2 = aftsTrack->Phi();
274 Double_t dPt2 = aftsTrack->Pt();
275 Double_t dEta2 = aftsTrack->Eta();
276 Int_t iCharge2 = aftsTrack->Charge();
277 if(fOppositeChargesPOI && iCharge1 == iCharge2){continue;}
278 Bool_t b2ndPOIisAlsoRP = kFALSE;
279 if(aftsTrack->InRPSelection()){b2ndPOIisAlsoRP = kTRUE;}
282 fRePEBE[0]->Fill((dPt1+dPt2)/2.,TMath::Cos(n*(dPsi1+dPsi2)),1.);
283 fImPEBE[0]->Fill((dPt1+dPt2)/2.,TMath::Sin(n*(dPsi1+dPsi2)),1.);
284 fRePEBE[1]->Fill(TMath::Abs(dPt1-dPt2),TMath::Cos(n*(dPsi1+dPsi2)),1.);
285 fImPEBE[1]->Fill(TMath::Abs(dPt1-dPt2),TMath::Sin(n*(dPsi1+dPsi2)),1.);
288 fReEtaEBE[0]->Fill((dEta1+dEta2)/2.,TMath::Cos(n*(dPsi1+dPsi2)),1.);
289 fImEtaEBE[0]->Fill((dEta1+dEta2)/2.,TMath::Sin(n*(dPsi1+dPsi2)),1.);
290 fReEtaEBE[1]->Fill(TMath::Abs(dEta1-dEta2),TMath::Cos(n*(dPsi1+dPsi2)),1.);
291 fImEtaEBE[1]->Fill(TMath::Abs(dEta1-dEta2),TMath::Sin(n*(dPsi1+dPsi2)),1.);
293 //2particle correlator <cos(n*(psi1 - ps12))>
294 f2pCorrelatorCosPsiDiff->Fill(TMath::Abs(dPt1-dPt2),TMath::Cos(n*(dPsi1-dPsi2)));
295 f2pCorrelatorCosPsiSum->Fill(TMath::Abs(dPt1-dPt2),TMath::Cos(n*(dPsi1+dPsi2)));
296 f2pCorrelatorSinPsiDiff->Fill(TMath::Abs(dPt1-dPt2),TMath::Sin(n*(dPsi1-dPsi2)));
297 f2pCorrelatorSinPsiSum->Fill(TMath::Abs(dPt1-dPt2),TMath::Sin(n*(dPsi1+dPsi2)));
301 fOverlapEBE[0][0]->Fill((dPt1+dPt2)/2.,TMath::Cos(n*(dPsi1-dPsi2)),1.);
302 fOverlapEBE[0][1]->Fill(TMath::Abs(dPt1-dPt2),TMath::Cos(n*(dPsi1-dPsi2)),1.);
303 fOverlapEBE2[0][0]->Fill((dEta1+dEta2)/2.,TMath::Cos(n*(dPsi1-dPsi2)),1.);
304 fOverlapEBE2[0][1]->Fill(TMath::Abs(dEta1-dEta2),TMath::Cos(n*(dPsi1-dPsi2)),1.);
308 fOverlapEBE[1][0]->Fill((dPt1+dPt2)/2.,TMath::Cos(n*(dPsi1-dPsi2)),1.);
309 fOverlapEBE[1][1]->Fill(TMath::Abs(dPt1-dPt2),TMath::Cos(n*(dPsi1-dPsi2)),1.);
310 fOverlapEBE2[1][0]->Fill((dEta1+dEta2)/2.,TMath::Cos(n*(dPsi1-dPsi2)),1.);
311 fOverlapEBE2[1][1]->Fill(TMath::Abs(dEta1-dEta2),TMath::Cos(n*(dPsi1-dPsi2)),1.);
313 } // end of if(aftsTrack->InPOISelection()) // 2nd POI
314 } // end of for(Int_t j=i+1;j<nPrim;j++)
315 } // end of if(aftsTrack->InPOISelection()) // 1st POI
316 } // end of if(fEvaluateDifferential3pCorrelator)
317 } else // to if(aftsTrack)
320 cout<<" WARNING (MH): No particle! (i.e. aftsTrack is a NULL pointer in Make().)"<<endl;
323 } // end of for(Int_t i=0;i<nPrim;i++)
325 // Calculate the final expressions for S_{p,k}:
326 for(Int_t p=0;p<4;p++) // to be improved (what is maximum p that I need?)
328 for(Int_t k=0;k<4;k++) // to be improved (what is maximum k that I need?)
330 (*fSpk)(p,k)=pow((*fSpk)(p,k),p+1);
334 // e) Calculate 3-p correlator cos[n(phi1+phi2-2*phi3)] in terms of Q_{n,k} and S_{p,k}:
335 if(anEvent->GetEventNSelTracksRP() >= 3)
337 this->Calculate3pCorrelator();
338 this->CalculateNonIsotropicTerms();
341 // f) Calculate differential 3-p azimuthal correlator cos[n(psi1+psi2-2*phi3)] in terms of Q_{2n} and p_{n}:
342 if(fEvaluateDifferential3pCorrelator && anEvent->GetEventNSelTracksRP() >= 1)
344 Double_t gIntegrated3pCorrelator = 0.;
345 this->CalculateDifferential3pCorrelator(gIntegrated3pCorrelator); // to be improved - add relevant if statements for the min # POIs as well
347 //3particle correlator vs ref. mult
348 f3pPOICorrelatorVsM->Fill(nRefMult,gIntegrated3pCorrelator);
351 // g) Reset all event-by-event quantities:
352 this->ResetEventByEventQuantities();
354 } // end of AliFlowAnalysisWithMixedHarmonics::Make(AliFlowEventSimple* anEvent)
356 //================================================================================================================
358 void AliFlowAnalysisWithMixedHarmonics::Finish()
360 // Calculate the final results.
362 // a) Check all pointers used in this method;
363 // b) Access settings for analysis with mixed harmonics;
364 // c) Correct for detector effects;
365 // d) Print on the screen the final results.
367 this->CheckPointersUsedInFinish();
368 this->AccessSettings();
369 this->CorrectForDetectorEffects();
370 if(fCalculateVsM){this->CorrectForDetectorEffectsVsM();}
371 if(fPrintOnTheScreen){this->PrintOnTheScreen();}
373 } // end of AliFlowAnalysisWithMixedHarmonics::Finish()
375 //================================================================================================================
377 void AliFlowAnalysisWithMixedHarmonics::GetOutputHistograms(TList *outputListHistos)
379 // Get pointers to all objects saved in the output file.
381 // a) Get pointers for common control histograms.
384 this->SetHistList(outputListHistos);
388 cout<<" WARNING (MH): fHistList is NULL in GetOutputHistograms() !!!!"<<endl;
392 this->GetPointersForBaseHistograms();
393 this->GetPointersForCommonHistograms();
394 this->GetPointersForAllEventProfiles();
395 this->GetPointersForResultsHistograms();
399 cout<<" WARNING (MH): outputListHistos is NULL in GetOutputHistograms() !!!!"<<endl;
404 } // end of void AliFlowAnalysisWithMixedHarmonics::GetOutputHistograms(TList *outputListHistos)
406 //================================================================================================================
408 void AliFlowAnalysisWithMixedHarmonics::GetPointersForBaseHistograms()
410 // Get pointers to base histograms.
412 TString analysisSettingsName = "fAnalysisSettings";
413 TProfile *analysisSettings = dynamic_cast<TProfile*>(fHistList->FindObject(analysisSettingsName.Data()));
416 this->SetAnalysisSettings(analysisSettings);
420 cout<<" WARNING (MH): analysisSettings is NULL in GetPointersForBaseHistograms() !!!!"<<endl;
425 } // end of void AliFlowAnalysisWithMixedHarmonics::GetPointersForBaseHistograms()
427 //================================================================================================================
429 void AliFlowAnalysisWithMixedHarmonics::GetPointersForCommonHistograms()
431 // Get pointers to common control histograms.
433 TString commonHistsName = "AliFlowCommonHistMH";
434 AliFlowCommonHist *commonHist = dynamic_cast<AliFlowCommonHist*>(fHistList->FindObject(commonHistsName.Data()));
437 this->SetCommonHists(commonHist);
441 cout<<" WARNING (MH): commonHist is NULL in GetPointersForCommonHistograms() !!!!"<<endl;
446 } // end of void AliFlowAnalysisWithMixedHarmonics::GetPointersForCommonHistograms()
448 //================================================================================================================
450 void AliFlowAnalysisWithMixedHarmonics::GetPointersForAllEventProfiles()
452 // Get pointers to profiles holding final results.
454 TList *profileList = NULL;
455 profileList = dynamic_cast<TList*>(fHistList->FindObject("Profiles"));
459 cout<<" WARNING (MH): profileList is NULL in GetPointersForAllEventProfiles() !!!!"<<endl;
464 TString s3pCorrelatorProName = "f3pCorrelatorPro";
465 TProfile *p3pCorrelatorPro = dynamic_cast<TProfile*>(profileList->FindObject(s3pCorrelatorProName.Data()));
468 this->Set3pCorrelatorPro(p3pCorrelatorPro);
470 TString s3pCorrelatorVsMProName = "f3pCorrelatorVsMPro";
471 TProfile *p3pCorrelatorVsMPro = dynamic_cast<TProfile*>(profileList->FindObject(s3pCorrelatorVsMProName.Data()));
472 if(p3pCorrelatorVsMPro)
474 this->Set3pCorrelatorVsMPro(p3pCorrelatorVsMPro);
476 TString s3pPOICorrelatorVsMName = "f3pPOICorrelatorVsM";
477 TProfile *p3pPOICorrelatorVsM = dynamic_cast<TProfile*>(profileList->FindObject(s3pPOICorrelatorVsMName.Data()));
478 if(p3pPOICorrelatorVsM)
480 this->Set3pPOICorrelatorVsM(p3pPOICorrelatorVsM);
482 TString nonIsotropicTermsProName = "fNonIsotropicTermsPro";
483 TProfile *nonIsotropicTermsPro = dynamic_cast<TProfile*>(profileList->FindObject(nonIsotropicTermsProName.Data()));
484 if(nonIsotropicTermsPro)
486 this->SetNonIsotropicTermsPro(nonIsotropicTermsPro);
488 TString nonIsotropicTermsVsMProName = "fNonIsotropicTermsVsMPro";
489 TProfile2D *nonIsotropicTermsVsMPro = dynamic_cast<TProfile2D*>(profileList->FindObject(nonIsotropicTermsVsMProName.Data()));
490 if(nonIsotropicTermsVsMPro)
492 this->SetNonIsotropicTermsVsMPro(nonIsotropicTermsVsMPro);
494 TString psdFlag[2] = {"PtSum","PtDiff"};
495 for(Int_t sd=0;sd<2;sd++)
497 TProfile *p3pCorrelatorVsPtSumDiffPro = dynamic_cast<TProfile*>(profileList->FindObject(Form("f3pCorrelatorVs%sPro",psdFlag[sd].Data())));
498 if(p3pCorrelatorVsPtSumDiffPro)
500 this->Set3pCorrelatorVsPtSumDiffPro(p3pCorrelatorVsPtSumDiffPro,sd);
504 TProfile *g2pCorrelatorCosPsiDiff = dynamic_cast<TProfile *>(profileList->FindObject("f2pCorrelatorCosPsiDiff"));
505 if(g2pCorrelatorCosPsiDiff)
506 this->Set2pCorrelatorCosPsiDiff(g2pCorrelatorCosPsiDiff);
507 TProfile *g2pCorrelatorCosPsiSum = dynamic_cast<TProfile *>(profileList->FindObject("f2pCorrelatorCosPsiSum"));
508 if(g2pCorrelatorCosPsiSum)
509 this->Set2pCorrelatorCosPsiSum(g2pCorrelatorCosPsiSum);
510 TProfile *g2pCorrelatorSinPsiDiff = dynamic_cast<TProfile *>(profileList->FindObject("f2pCorrelatorSinPsiDiff"));
511 if(g2pCorrelatorSinPsiDiff)
512 this->Set2pCorrelatorSinPsiDiff(g2pCorrelatorSinPsiDiff);
513 TProfile *g2pCorrelatorSinPsiSum = dynamic_cast<TProfile *>(profileList->FindObject("f2pCorrelatorSinPsiSum"));
514 if(g2pCorrelatorSinPsiSum)
515 this->Set2pCorrelatorSinPsiSum(g2pCorrelatorSinPsiSum);
517 } // end of void AliFlowAnalysisWithMixedHarmonics::GetPointersForAllEventProfiles()
519 //================================================================================================================
521 void AliFlowAnalysisWithMixedHarmonics::GetPointersForResultsHistograms()
523 // Get pointers to histograms holding final results.
525 TList *resultsList = NULL;
526 resultsList = dynamic_cast<TList*>(fHistList->FindObject("Results"));
530 cout<<" WARNING (MH): resultsList is NULL in GetPointersForResultsHistograms() !!!!"<<endl;
534 TString s3pCorrelatorHistName = "f3pCorrelatorHist";
535 TH1D *h3pCorrelatorHist = dynamic_cast<TH1D*>(resultsList->FindObject(s3pCorrelatorHistName.Data()));
536 if(h3pCorrelatorHist)
538 this->Set3pCorrelatorHist(h3pCorrelatorHist);
540 TString s3pCorrelatorVsMHistName = "f3pCorrelatorVsMHist";
541 TH1D *h3pCorrelatorVsMHist = dynamic_cast<TH1D*>(resultsList->FindObject(s3pCorrelatorVsMHistName.Data()));
542 if(h3pCorrelatorVsMHist)
544 this->Set3pCorrelatorVsMHist(h3pCorrelatorVsMHist);
546 TString detectorBiasHistName = "fDetectorBiasHist";
547 TH1D *detectorBiasHist = dynamic_cast<TH1D*>(resultsList->FindObject(detectorBiasHistName.Data()));
550 this->SetDetectorBiasHist(detectorBiasHist);
552 TString detectorBiasVsMHistName = "fDetectorBiasVsMHist";
553 TH1D *detectorBiasVsMHist = dynamic_cast<TH1D*>(resultsList->FindObject(detectorBiasVsMHistName.Data()));
554 if(detectorBiasVsMHist)
556 this->SetDetectorBiasVsMHist(detectorBiasVsMHist);
559 } // end of void AliFlowAnalysisWithMixedHarmonics::GetPointersForResultsHistograms()
561 //================================================================================================================
563 void AliFlowAnalysisWithMixedHarmonics::WriteHistograms(TString outputFileName)
565 // Store the final results in output .root file.
566 TFile *output = new TFile(outputFileName.Data(),"RECREATE");
567 fHistList->Write(fHistList->GetName(),TObject::kSingleKey);
571 //================================================================================================================
573 void AliFlowAnalysisWithMixedHarmonics::WriteHistograms(TDirectoryFile *outputFileName)
575 // Store the final results in output .root file.
576 fHistList->SetName("cobjMH");
577 fHistList->SetOwner(kTRUE);
578 outputFileName->Add(fHistList);
579 outputFileName->Write(outputFileName->GetName(),TObject::kSingleKey);
582 //================================================================================================================
584 void AliFlowAnalysisWithMixedHarmonics::StoreHarmonic()
586 // Store harmonic n used in cos[n*(phi1+phi2-2phi3)] and cos[n*(psi1+psi2-2phi3)].
588 (fCommonHists->GetHarmonic())->Fill(0.5,fHarmonic);
590 } // end of void AliFlowAnalysisWithMixedHarmonics::StoreHarmonic()
592 //================================================================================================================
594 void AliFlowAnalysisWithMixedHarmonics::InitializeArrays()
596 // Initialize arrays.
598 for(Int_t sd=0;sd<2;sd++)
602 fReEtaEBE[sd] = NULL;
603 fImEtaEBE[sd] = NULL;
604 f3pCorrelatorVsPtSumDiffPro[sd] = NULL;
605 f3pCorrelatorVsEtaSumDiffPro[sd] = NULL;
607 for(Int_t fs=0;fs<2;fs++) // 1st/2nd POI which is also RP
609 for(Int_t sd=0;sd<2;sd++)
611 fOverlapEBE[fs][sd] = NULL;
612 fOverlapEBE2[fs][sd] = NULL;
616 } // end of AliFlowAnalysisWithMixedHarmonics::InitializeArrays()
618 //================================================================================================================
620 void AliFlowAnalysisWithMixedHarmonics::BookAndNestAllLists()
622 // Book and nest all list in base list fHistList.
625 fWeightsList->SetName("Weights");
626 fWeightsList->SetOwner(kTRUE);
627 fHistList->Add(fWeightsList);
629 fProfileList->SetName("Profiles");
630 fProfileList->SetOwner(kTRUE);
631 fHistList->Add(fProfileList);
633 fResultsList->SetName("Results");
634 fResultsList->SetOwner(kTRUE);
635 fHistList->Add(fResultsList);
637 } // end of void AliFlowAnalysisWithMixedHarmonics::BookAndNestAllLists()
639 //================================================================================================================
641 void AliFlowAnalysisWithMixedHarmonics::BookProfileHoldingSettings()
643 // Book profile to hold all analysis settings.
645 TString analysisSettingsName = "fAnalysisSettings";
646 fAnalysisSettings = new TProfile(analysisSettingsName.Data(),"Settings for analysis with mixed harmonics",10,0,10);
647 fAnalysisSettings->SetStats(kFALSE);
648 fAnalysisSettings->GetXaxis()->SetLabelSize(0.03);
649 fAnalysisSettings->GetXaxis()->SetBinLabel(1,"Corr. for det. effects?");
650 fAnalysisSettings->Fill(0.5,(Int_t)fCorrectForDetectorEffects);
651 fAnalysisSettings->GetXaxis()->SetBinLabel(2,"# of mult. bins");
652 fAnalysisSettings->Fill(1.5,fNoOfMultipicityBins);
653 fAnalysisSettings->GetXaxis()->SetBinLabel(3,"Width of mult. bins");
654 fAnalysisSettings->Fill(2.5,fMultipicityBinWidth);
655 fAnalysisSettings->GetXaxis()->SetBinLabel(4,"Minimal mult.");
656 fAnalysisSettings->Fill(3.5,fMinMultiplicity);
657 fAnalysisSettings->GetXaxis()->SetBinLabel(5,"Print on the screen?");
658 fAnalysisSettings->Fill(4.5,(Int_t)fPrintOnTheScreen);
659 fAnalysisSettings->GetXaxis()->SetBinLabel(6,"fHarmonic");
660 fAnalysisSettings->Fill(5.5,(Int_t)fHarmonic);
661 fAnalysisSettings->GetXaxis()->SetBinLabel(7,"fOppositeChargesPOI");
662 fAnalysisSettings->Fill(6.5,(Int_t)fOppositeChargesPOI);
663 fAnalysisSettings->GetXaxis()->SetBinLabel(8,"fEvaluateDifferential3pCorrelator");
664 fAnalysisSettings->Fill(7.5,(Int_t)fOppositeChargesPOI);
665 fAnalysisSettings->GetXaxis()->SetBinLabel(9,"fCalculateVsM");
666 fAnalysisSettings->Fill(8.5,(Int_t)fCalculateVsM);
667 fAnalysisSettings->GetXaxis()->SetBinLabel(10,"fShowBinLabelsVsM");
668 fAnalysisSettings->Fill(9.5,(Int_t)fShowBinLabelsVsM);
669 fHistList->Add(fAnalysisSettings);
671 } // end of void AliFlowAnalysisWithMixedHarmonics::BookProfileHoldingSettings()
673 //================================================================================================================
675 void AliFlowAnalysisWithMixedHarmonics::BookCommonHistograms()
677 // Book common control histograms and common histograms for final results.
679 TString commonHistsName = "AliFlowCommonHistMH";
680 fCommonHists = new AliFlowCommonHist(commonHistsName.Data());
681 fHistList->Add(fCommonHists);
683 } // end of void AliFlowAnalysisWithMixedHarmonics::BookCommonHistograms()
685 //================================================================================================================
687 void AliFlowAnalysisWithMixedHarmonics::BookAllEventByEventQuantities()
689 // Book all event-by-event quantitites.
693 // Q_{n,k} and S{p,k}:
694 fReQnk = new TMatrixD(2*n,9); // to be improved(bound on k)
695 fImQnk = new TMatrixD(2*n,9); // to be improved(bound on k)
696 fSpk = new TMatrixD(4,4); // to be improved(bound on p and k)
698 // p_n vs [(p1+p2)/2,|p1-p2|]
699 if(!fEvaluateDifferential3pCorrelator){return;}
700 TString psdFlag[2] = {"PtSum","PtDiff"};
701 TString p2sdFlag[2] = {"PtSum","PtDiff"};
702 TString fsFlag[2] = {"1st","2nd"};
703 for(Int_t sd=0;sd<2;sd++)
705 fRePEBE[sd] = new TProfile(Form("fRePEBE%s",psdFlag[sd].Data()),"",fnBinsPt,0.,fPtMax);
706 fImPEBE[sd] = new TProfile(Form("fImPEBE%s",psdFlag[sd].Data()),"",fnBinsPt,0.,fPtMax);
707 fReEtaEBE[sd] = new TProfile(Form("fReEtaEBE%s",p2sdFlag[sd].Data()),"",fnBinsEta,fEtaMin,fEtaMax);
708 fImEtaEBE[sd] = new TProfile(Form("fImEtaEBE%s",p2sdFlag[sd].Data()),"",fnBinsEta,fEtaMin,fEtaMax);
710 for(Int_t fs=0;fs<2;fs++)
712 for(Int_t sd=0;sd<2;sd++)
714 fOverlapEBE[fs][sd] = new TProfile(Form("%s POI, %s",fsFlag[sd].Data(),psdFlag[sd].Data()),"",fnBinsPt,0.,fPtMax);
715 fOverlapEBE2[fs][sd] = new TProfile(Form("%s POI 2, %s",fsFlag[sd].Data(),p2sdFlag[sd].Data()),"",fnBinsEta,fEtaMin,fEtaMax);
719 } // end fo void AliFlowAnalysisWithMixedHarmonics::BookAllEventByEventQuantities()
721 //================================================================================================================
723 void AliFlowAnalysisWithMixedHarmonics::BookAllAllEventQuantities()
725 // Book all all-event quantitites.
727 // a) Book histos and profiles without any binning in multiplicity, pt or eta;
728 // b) Book quantites with multiplicity binning;
729 // c) Book quantites with binning in (p1+p2)/2 and |p1-p2|.
732 if(fCalculateVsM){this->BookVsM();}
733 if(fEvaluateDifferential3pCorrelator){this->BookDifferential();}
735 } // end of void AliFlowAnalysisWithMixedHarmonics::BookAllAllEventQuantities()
737 //================================================================================================================
739 void AliFlowAnalysisWithMixedHarmonics::BookDefault()
741 // Book histos and profiles without any binning in multiplicity, pt or eta.
743 // a) 3-p correlator <<cos[n*(phi1+phi2-2phi3)]>> for all events (not corrected for detector effects);
744 // b) Non-isotropic terms in the decomposition of <<cos[n(phi1+phi2-2phi3)]>>;
745 // c) 3-p correlator <<cos[n(phi1+phi2-2phi3)]>> corrected for detector effects;
746 // d) Histogram which quantifies bias coming from detector inefficiencies to 3-p correlator <<cos[n(phi1+phi2-2phi3)]>>.
748 // a) 3-p correlator <<cos[n*(phi1+phi2-2phi3)]>> for all events (not corrected for detector effects);
749 TString s3pCorrelatorProName = "f3pCorrelatorPro";
750 f3pCorrelatorPro = new TProfile(s3pCorrelatorProName.Data(),"",1,0,1);
751 f3pCorrelatorPro->SetStats(kFALSE);
752 f3pCorrelatorPro->GetXaxis()->SetLabelOffset(0.01);
753 f3pCorrelatorPro->GetXaxis()->SetLabelSize(0.05);
756 f3pCorrelatorPro->GetXaxis()->SetBinLabel(1,"#LT#LTcos(#phi_{1}+#phi_{2}-2#phi_{3})#GT#GT");
759 f3pCorrelatorPro->GetXaxis()->SetBinLabel(1,Form("#LT#LTcos[%i(#phi_{1}+#phi_{2}-2#phi_{3})]#GT#GT",fHarmonic));
761 fProfileList->Add(f3pCorrelatorPro);
763 // b) Non-isotropic terms in the decomposition of <<cos[n(phi1+phi2-2phi3)]>>:
764 TString nonIsotropicTermsProName = "fNonIsotropicTermsPro";
765 fNonIsotropicTermsPro = new TProfile(nonIsotropicTermsProName.Data(),"",8,0,8);
766 fNonIsotropicTermsPro->SetStats(kFALSE);
769 fNonIsotropicTermsPro->SetTitle("Non-isotropic terms in decomposition of #LT#LTcos(#phi_{1}+#phi_{2}-2#phi_{3})#GT#GT");
770 fNonIsotropicTermsPro->GetXaxis()->SetBinLabel(1,"cos(#phi_{1})");
771 fNonIsotropicTermsPro->GetXaxis()->SetBinLabel(2,"sin(#phi_{1})");
772 fNonIsotropicTermsPro->GetXaxis()->SetBinLabel(3,"cos(2#phi_{1})");
773 fNonIsotropicTermsPro->GetXaxis()->SetBinLabel(4,"sin(2#phi_{1})");
774 fNonIsotropicTermsPro->GetXaxis()->SetBinLabel(5,"cos(#phi_{1}+#phi_{2})");
775 fNonIsotropicTermsPro->GetXaxis()->SetBinLabel(6,"sin(#phi_{1}+#phi_{2})");
776 fNonIsotropicTermsPro->GetXaxis()->SetBinLabel(7,"cos(2#phi_{1}-#phi_{2})");
777 fNonIsotropicTermsPro->GetXaxis()->SetBinLabel(8,"sin(2#phi_{1}-#phi_{2})");
778 // fNonIsotropicTermsPro->GetXaxis()->SetBinLabel(9,"cos(#phi_{1}-#phi_{2}-#phi_{3})"); // not needed
779 // fNonIsotropicTermsPro->GetXaxis()->SetBinLabel(10,"sin(#phi_{1}-#phi_{2}-#phi_{3})"); // not needed
782 fNonIsotropicTermsPro->SetTitle(Form("Non-isotropic terms in decomposition of #LT#LTcos[%i(#phi_{1}+#phi_{2}-2#phi_{3})]#GT#GT",fHarmonic));
783 fNonIsotropicTermsPro->GetXaxis()->SetBinLabel(1,Form("cos(%d#phi_{1})",fHarmonic));
784 fNonIsotropicTermsPro->GetXaxis()->SetBinLabel(2,Form("sin(%d#phi_{1})",fHarmonic));
785 fNonIsotropicTermsPro->GetXaxis()->SetBinLabel(3,Form("cos(%d#phi_{1})",2*fHarmonic));
786 fNonIsotropicTermsPro->GetXaxis()->SetBinLabel(4,Form("sin(%d#phi_{1})",2*fHarmonic));
787 fNonIsotropicTermsPro->GetXaxis()->SetBinLabel(5,Form("cos[%d(#phi_{1}+#phi_{2})]",fHarmonic));
788 fNonIsotropicTermsPro->GetXaxis()->SetBinLabel(6,Form("sin[%d(#phi_{1}+#phi_{2})]",fHarmonic));
789 fNonIsotropicTermsPro->GetXaxis()->SetBinLabel(7,Form("cos[%d(2#phi_{1}-#phi_{2})]",fHarmonic));
790 fNonIsotropicTermsPro->GetXaxis()->SetBinLabel(8,Form("sin[%d(2#phi_{1}-#phi_{2})]",fHarmonic));
791 // fNonIsotropicTermsPro->GetXaxis()->SetBinLabel(9,Form("cos(%d(#phi_{1}-#phi_{2}-#phi_{3}))",fHarmonic)); // not needed
792 // fNonIsotropicTermsPro->GetXaxis()->SetBinLabel(10,Form("sin(%d(#phi_{1}-#phi_{2}-#phi_{3}))",fHarmonic)); // not needed
794 fProfileList->Add(fNonIsotropicTermsPro);
796 // c) 3-p correlator <<cos[n(phi1+phi2-2phi3)]>> corrected for detector effects:
797 TString s3pCorrelatorHistName = "f3pCorrelatorHist";
798 f3pCorrelatorHist = new TH1D(s3pCorrelatorHistName.Data(),"",1,0,1);
799 f3pCorrelatorHist->SetStats(kFALSE);
800 f3pCorrelatorHist->GetXaxis()->SetLabelOffset(0.01);
801 f3pCorrelatorHist->GetXaxis()->SetLabelSize(0.05);
804 f3pCorrelatorHist->GetXaxis()->SetBinLabel(1,"#LT#LTcos(#phi_{1}+#phi_{2}-2#phi_{3})#GT#GT");
807 f3pCorrelatorHist->GetXaxis()->SetBinLabel(1,Form("#LT#LTcos[%i(#phi_{1}+#phi_{2}-2#phi_{3})]#GT#GT",fHarmonic));
809 fResultsList->Add(f3pCorrelatorHist);
811 // d) Histogram which quantifies bias coming from detector inefficiencies to 3-p correlator <<cos[n(phi1+phi2-2phi3)]>>:
812 TString detectorBiasHistName = "fDetectorBiasHist";
813 fDetectorBiasHist = new TH1D(detectorBiasHistName.Data(),"Bias coming from detector inefficiences",1,0,1);
814 fDetectorBiasHist->SetStats(kFALSE);
817 fDetectorBiasHist->GetXaxis()->SetBinLabel(1,"#frac{corrected}{measured} #LT#LTcos(#phi_{1}+#phi_{2}-2#phi_{3})#GT#GT");
820 fDetectorBiasHist->GetXaxis()->SetBinLabel(1,Form("#frac{corrected}{measured} #LT#LTcos[%i(#phi_{1}+#phi_{2}-2#phi_{3})]#GT#GT",fHarmonic));
822 fResultsList->Add(fDetectorBiasHist);
824 } // end of void AliFlowAnalysisWithMixedHarmonics::BookDefault()
826 //================================================================================================================
828 void AliFlowAnalysisWithMixedHarmonics::BookVsM()
830 // Book histos and profiles holding results vs multiplicity.
832 // a) 3-p correlator <<cos[n*(phi1+phi2-2phi3)]>> for all events (not corrected for detector effects) vs M;
833 // b) Non-isotropic terms in the decomposition of <<cos[n(phi1+phi2-2phi3)]>> vs M;
834 // c) 3-p correlator <<cos[n(phi1+phi2-2phi3)]>> corrected for detector effects vs M;
835 // d) Histogram which quantifies bias coming from detector inefficiencies to 3-p correlator <<cos[n(phi1+phi2-2phi3)]>> vs M.
837 // a) 3-p correlator <<cos[n*(phi1+phi2-2phi3)]>> for all events (not corrected for detector effects) vs M:
838 TString s3pCorrelatorVsMProName = "f3pCorrelatorVsMPro";
839 f3pCorrelatorVsMPro = new TProfile(s3pCorrelatorVsMProName.Data(),"",fNoOfMultipicityBins+2,0,fNoOfMultipicityBins+2);
840 f3pCorrelatorVsMPro->SetStats(kFALSE);
843 f3pCorrelatorVsMPro->SetTitle("#LT#LTcos(#phi_{1}+#phi_{2}-2#phi_{3})#GT#GT #font[72]{vs} M");
846 f3pCorrelatorVsMPro->SetTitle(Form("#LT#LTcos[%d(#phi_{1}+#phi_{2}-2#phi_{3})]#GT#GT #font[72]{vs} M",fHarmonic));
848 if(fShowBinLabelsVsM)
850 f3pCorrelatorVsMPro->GetXaxis()->SetBinLabel(1,Form("M < %d",(Int_t)fMinMultiplicity));
851 for(Int_t b=2;b<=fNoOfMultipicityBins+1;b++)
853 f3pCorrelatorVsMPro->GetXaxis()->SetBinLabel(b,Form("%d #leq M < %d",(Int_t)(fMinMultiplicity+(b-2)*fMultipicityBinWidth),(Int_t)(fMinMultiplicity+(b-1)*fMultipicityBinWidth)));
855 f3pCorrelatorVsMPro->GetXaxis()->SetBinLabel(fNoOfMultipicityBins+2,Form(" M #geq %d",(Int_t)(fMinMultiplicity+fNoOfMultipicityBins*fMultipicityBinWidth)));
858 f3pCorrelatorVsMPro->GetXaxis()->SetTitle("M");
860 fProfileList->Add(f3pCorrelatorVsMPro);
862 TString s3pPOICorrelatorVsMName = "f3pPOICorrelatorVsM";
863 f3pPOICorrelatorVsM = new TProfile(s3pPOICorrelatorVsMName.Data(),"",fNoOfMultipicityBins+2,0,fNoOfMultipicityBins+2);
864 f3pPOICorrelatorVsM->SetStats(kFALSE);
867 f3pPOICorrelatorVsM->SetTitle("#LT#LTcos(#psi_{1}+#psi_{2}-2#phi_{3})#GT#GT #font[72]{vs} M");
870 f3pPOICorrelatorVsM->SetTitle(Form("#LT#LTcos[%d(#psi_{1}+#psi_{2}-2#phi_{3})]#GT#GT #font[72]{vs} M",fHarmonic));
872 if(fShowBinLabelsVsM)
874 f3pPOICorrelatorVsM->GetXaxis()->SetBinLabel(1,Form("M < %d",(Int_t)fMinMultiplicity));
875 for(Int_t b=2;b<=fNoOfMultipicityBins+1;b++)
877 f3pPOICorrelatorVsM->GetXaxis()->SetBinLabel(b,Form("%d #leq M < %d",(Int_t)(fMinMultiplicity+(b-2)*fMultipicityBinWidth),(Int_t)(fMinMultiplicity+(b-1)*fMultipicityBinWidth)));
879 f3pPOICorrelatorVsM->GetXaxis()->SetBinLabel(fNoOfMultipicityBins+2,Form(" M #geq %d",(Int_t)(fMinMultiplicity+fNoOfMultipicityBins*fMultipicityBinWidth)));
882 f3pPOICorrelatorVsM->GetXaxis()->SetTitle("M");
884 fProfileList->Add(f3pPOICorrelatorVsM);
886 // b) Non-isotropic terms in the decomposition of <<cos[n(phi1+phi2-2phi3)]>> vs M:
887 TString s3pCorrelatorVsMHistName = "f3pCorrelatorVsMHist";
888 f3pCorrelatorVsMHist = new TH1D(s3pCorrelatorVsMHistName.Data(),"",fNoOfMultipicityBins+2,0,fNoOfMultipicityBins+2);
889 f3pCorrelatorVsMHist->SetStats(kFALSE);
892 f3pCorrelatorVsMHist->SetTitle("cos(#phi_{1}+#phi_{2}-2#phi_{3}) #font[72]{vs} M");
895 f3pCorrelatorVsMHist->SetTitle(Form("cos[%d(#phi_{1}+#phi_{2}-2#phi_{3})] #font[72]{vs} M",fHarmonic));
897 if(fShowBinLabelsVsM)
899 f3pCorrelatorVsMHist->GetXaxis()->SetBinLabel(1,Form("M < %d",(Int_t)fMinMultiplicity));
900 for(Int_t b=2;b<=fNoOfMultipicityBins+1;b++)
902 f3pCorrelatorVsMHist->GetXaxis()->SetBinLabel(b,Form("%d #leq M < %d",(Int_t)(fMinMultiplicity+(b-2)*fMultipicityBinWidth),(Int_t)(fMinMultiplicity+(b-1)*fMultipicityBinWidth)));
904 f3pCorrelatorVsMHist->GetXaxis()->SetBinLabel(fNoOfMultipicityBins+2,Form(" M #geq %d",(Int_t)(fMinMultiplicity+fNoOfMultipicityBins*fMultipicityBinWidth)));
907 f3pCorrelatorVsMHist->GetXaxis()->SetTitle("M");
909 fResultsList->Add(f3pCorrelatorVsMHist);
911 // c) 3-p correlator <<cos[n(phi1+phi2-2phi3)]>> corrected for detector effects vs M:
912 TString nonIsotropicTermsVsMProName = "fNonIsotropicTermsVsMPro";
913 fNonIsotropicTermsVsMPro = new TProfile2D(nonIsotropicTermsVsMProName.Data(),"",8,0,8,fNoOfMultipicityBins+2,0,fNoOfMultipicityBins+2);
914 fNonIsotropicTermsVsMPro->SetStats(kFALSE);
917 fNonIsotropicTermsVsMPro->SetTitle("Non-isotropic terms in decomposition of #LT#LTcos(#phi_{1}+#phi_{2}-2#phi_{3})#GT#GT #font[72]{vs} M");
918 fNonIsotropicTermsVsMPro->GetXaxis()->SetBinLabel(1,"cos(#phi_{1})");
919 fNonIsotropicTermsVsMPro->GetXaxis()->SetBinLabel(2,"sin(#phi_{1})");
920 fNonIsotropicTermsVsMPro->GetXaxis()->SetBinLabel(3,"cos(2#phi_{1})");
921 fNonIsotropicTermsVsMPro->GetXaxis()->SetBinLabel(4,"sin(2#phi_{1})");
922 fNonIsotropicTermsVsMPro->GetXaxis()->SetBinLabel(5,"cos(#phi_{1}+#phi_{2})");
923 fNonIsotropicTermsVsMPro->GetXaxis()->SetBinLabel(6,"sin(#phi_{1}+#phi_{2})");
924 fNonIsotropicTermsVsMPro->GetXaxis()->SetBinLabel(7,"cos(2#phi_{1}-#phi_{2})");
925 fNonIsotropicTermsVsMPro->GetXaxis()->SetBinLabel(8,"sin(2#phi_{1}-#phi_{2})");
926 // fNonIsotropicTermsVsMPro->GetXaxis()->SetBinLabel(9,"cos(#phi_{1}-#phi_{2}-#phi_{3})"); // not needed
927 // fNonIsotropicTermsVsMPro->GetXaxis()->SetBinLabel(10,"sin(#phi_{1}-#phi_{2}-#phi_{3})"); // not needed
930 fNonIsotropicTermsVsMPro->SetTitle(Form("Non-isotropic terms in decomposition of #LT#LTcos[%d(#phi_{1}+#phi_{2}-2#phi_{3})]#GT#GT",fHarmonic));
931 fNonIsotropicTermsVsMPro->GetXaxis()->SetBinLabel(1,Form("cos(%d#phi_{1})",fHarmonic));
932 fNonIsotropicTermsVsMPro->GetXaxis()->SetBinLabel(2,Form("sin(%d#phi_{1})",fHarmonic));
933 fNonIsotropicTermsVsMPro->GetXaxis()->SetBinLabel(3,Form("cos(%d#phi_{1})",2*fHarmonic));
934 fNonIsotropicTermsVsMPro->GetXaxis()->SetBinLabel(4,Form("sin(%d#phi_{1})",2*fHarmonic));
935 fNonIsotropicTermsVsMPro->GetXaxis()->SetBinLabel(5,Form("cos[%d(#phi_{1}+#phi_{2})]",fHarmonic));
936 fNonIsotropicTermsVsMPro->GetXaxis()->SetBinLabel(6,Form("sin[%d(#phi_{1}+#phi_{2})]",fHarmonic));
937 fNonIsotropicTermsVsMPro->GetXaxis()->SetBinLabel(7,Form("cos[%d(2#phi_{1}-#phi_{2})]",fHarmonic));
938 fNonIsotropicTermsVsMPro->GetXaxis()->SetBinLabel(8,Form("sin[%d(2#phi_{1}-#phi_{2})]",fHarmonic));
939 // fNonIsotropicTermsVsMPro->GetXaxis()->SetBinLabel(9,Form("cos(%d(#phi_{1}-#phi_{2}-#phi_{3}))",fHarmonic)); // not needed
940 // fNonIsotropicTermsVsMPro->GetXaxis()->SetBinLabel(10,Form("sin(%d(#phi_{1}-#phi_{2}-#phi_{3}))",fHarmonic)); // not needed
942 if(fShowBinLabelsVsM)
944 fNonIsotropicTermsVsMPro->GetYaxis()->SetBinLabel(1,Form("M < %d",(Int_t)fMinMultiplicity));
945 for(Int_t b=2;b<=fNoOfMultipicityBins+1;b++)
947 fNonIsotropicTermsVsMPro->GetYaxis()->SetBinLabel(b,Form("%d #leq M < %d",(Int_t)(fMinMultiplicity+(b-2)*fMultipicityBinWidth),(Int_t)(fMinMultiplicity+(b-1)*fMultipicityBinWidth)));
949 fNonIsotropicTermsVsMPro->GetYaxis()->SetBinLabel(fNoOfMultipicityBins+2,Form(" M #geq %d",(Int_t)(fMinMultiplicity+fNoOfMultipicityBins*fMultipicityBinWidth)));
952 fNonIsotropicTermsVsMPro->GetYaxis()->SetTitle("M");
954 fProfileList->Add(fNonIsotropicTermsVsMPro);
956 // d) Histogram which quantifies bias coming from detector inefficiencies to 3-p correlator <<cos[n(phi1+phi2-2phi3)]>> vs M:
957 TString detectorBiasVsMHistName = "fDetectorBiasVsMHist";
958 fDetectorBiasVsMHist = new TH1D(detectorBiasVsMHistName.Data(),"",fNoOfMultipicityBins+2,0,fNoOfMultipicityBins+2);
959 fDetectorBiasVsMHist->SetStats(kFALSE);
962 fDetectorBiasVsMHist->SetTitle("#frac{corrected}{measured} #LT#LTcos(#phi_{1}+#phi_{2}-2#phi_{3})#GT#GT #font[72]{vs} M");
965 fDetectorBiasVsMHist->SetTitle(Form("#frac{corrected}{measured} #LT#LTcos[%d(#phi_{1}+#phi_{2}-2#phi_{3})]#GT#GT #font[72]{vs} M",fHarmonic));
967 if(fShowBinLabelsVsM)
969 fDetectorBiasVsMHist->GetXaxis()->SetBinLabel(1,Form("M < %d",(Int_t)fMinMultiplicity));
970 for(Int_t b=2;b<=fNoOfMultipicityBins+1;b++)
972 fDetectorBiasVsMHist->GetXaxis()->SetBinLabel(b,Form("%d #leq M < %d",(Int_t)(fMinMultiplicity+(b-2)*fMultipicityBinWidth),(Int_t)(fMinMultiplicity+(b-1)*fMultipicityBinWidth)));
974 fDetectorBiasVsMHist->GetXaxis()->SetBinLabel(fNoOfMultipicityBins+2,Form(" M #geq %d",(Int_t)(fMinMultiplicity+fNoOfMultipicityBins*fMultipicityBinWidth)));
977 fDetectorBiasVsMHist->GetXaxis()->SetTitle("M");
979 fResultsList->Add(fDetectorBiasVsMHist);
981 } // end of void AliFlowAnalysisWithMixedHarmonics::BookVsM()
983 //================================================================================================================
985 void AliFlowAnalysisWithMixedHarmonics::BookDifferential()
987 // Book histos and profiles holding results vs (p1+p2)/2 and |p1-p2|.
989 TString psdFlag[2] = {"PtSum","PtDiff"};
990 TString psdTitleFlag[2] = {"(p_{T,1}+ p_{T,2})/2","#left|p_{T,1}- p_{T,2}#right|"};
991 TString psdFlag2[2] = {"EtaSum","EtaDiff"};
992 TString psdTitleFlag2[2] = {"(#eta_{1}+ #eta_{2})/2","#left|#eta_{1}- #eta_{2}#right|"};
993 //TString s3pCorrelatorVsPtSumDiffProName = "f3pCorrelatorVsPtSumDiffPro";
994 for(Int_t sd=0;sd<2;sd++)
996 f3pCorrelatorVsPtSumDiffPro[sd] = new TProfile(Form("f3pCorrelatorVs%sPro",psdFlag[sd].Data()),"",fnBinsPt,0.,fPtMax);
997 f3pCorrelatorVsPtSumDiffPro[sd]->SetStats(kFALSE);
998 f3pCorrelatorVsEtaSumDiffPro[sd] = new TProfile(Form("f3pCorrelatorVs%sPro",psdFlag2[sd].Data()),"",fnBinsEta,fEtaMin,fEtaMax);
999 f3pCorrelatorVsEtaSumDiffPro[sd]->SetStats(kFALSE);
1000 //f3pCorrelatorVsPtSumDiffPro[sd]->SetLabelSize(0.05);
1001 //f3pCorrelatorVsPtSumDiffPro[sd]->SetMarkerStyle(25);
1004 f3pCorrelatorVsPtSumDiffPro[sd]->SetTitle(Form("#LT#LTcos(#psi_{1}+#psi_{2}-2#phi_{3})#GT#GT #font[72]{vs} %s",psdTitleFlag[sd].Data()));
1005 f3pCorrelatorVsEtaSumDiffPro[sd]->SetTitle(Form("#LT#LTcos(#psi_{1}+#psi_{2}-2#phi_{3})#GT#GT #font[72]{vs} %s",psdTitleFlag2[sd].Data()));
1008 f3pCorrelatorVsPtSumDiffPro[sd]->SetTitle(Form("#LT#LTcos[%d(#psi_{1}+#psi_{2}-2#phi_{3})]#GT#GT #font[72]{vs} %s",fHarmonic,psdTitleFlag[sd].Data()));
1009 f3pCorrelatorVsEtaSumDiffPro[sd]->SetTitle(Form("#LT#LTcos[%d(#psi_{1}+#psi_{2}-2#phi_{3})]#GT#GT #font[72]{vs} %s",fHarmonic,psdTitleFlag2[sd].Data()));
1011 f3pCorrelatorVsPtSumDiffPro[sd]->GetXaxis()->SetTitle(psdTitleFlag[sd].Data());
1012 fProfileList->Add(f3pCorrelatorVsPtSumDiffPro[sd]);
1013 f3pCorrelatorVsEtaSumDiffPro[sd]->GetXaxis()->SetTitle(psdTitleFlag2[sd].Data());
1014 fProfileList->Add(f3pCorrelatorVsEtaSumDiffPro[sd]);
1017 f2pCorrelatorCosPsiDiff = new TProfile("f2pCorrelatorCosPsiDiff","",fnBinsPt,0.,fPtMax);
1018 f2pCorrelatorCosPsiDiff->SetStats(kFALSE);
1019 f2pCorrelatorCosPsiSum = new TProfile("f2pCorrelatorCosPsiSum","",fnBinsPt,0.,fPtMax);
1020 f2pCorrelatorCosPsiSum->SetStats(kFALSE);
1021 f2pCorrelatorSinPsiDiff = new TProfile("f2pCorrelatorSinPsiDiff","",fnBinsPt,0.,fPtMax);
1022 f2pCorrelatorSinPsiDiff->SetStats(kFALSE);
1023 f2pCorrelatorSinPsiSum = new TProfile("f2pCorrelatorSinPsiSum","",fnBinsPt,0.,fPtMax);
1024 f2pCorrelatorSinPsiSum->SetStats(kFALSE);
1025 if(fHarmonic == 1) {
1026 f2pCorrelatorCosPsiDiff->SetTitle(Form("#LT#LTcos(#psi_{1}-#psi_{2})#GT#GT #font[72]{vs} %s",psdTitleFlag[1].Data()));
1027 f2pCorrelatorCosPsiSum->SetTitle(Form("#LT#LTcos(#psi_{1}+#psi_{2})#GT#GT #font[72]{vs} %s",psdTitleFlag[1].Data()));
1028 f2pCorrelatorSinPsiDiff->SetTitle(Form("#LT#LTsin(#psi_{1}-#psi_{2})#GT#GT #font[72]{vs} %s",psdTitleFlag[1].Data()));
1029 f2pCorrelatorSinPsiSum->SetTitle(Form("#LT#LTsin(#psi_{1}+#psi_{2})#GT#GT #font[72]{vs} %s",psdTitleFlag[1].Data()));
1032 f2pCorrelatorCosPsiDiff->SetTitle(Form("#LT#LTcos[%d(#psi_{1}-#psi_{2})]#GT#GT #font[72]{vs} %s",fHarmonic,psdTitleFlag2[1].Data()));
1033 f2pCorrelatorCosPsiSum->SetTitle(Form("#LT#LTcos[%d(#psi_{1}+#psi_{2})]#GT#GT #font[72]{vs} %s",fHarmonic,psdTitleFlag2[1].Data()));
1034 f2pCorrelatorSinPsiDiff->SetTitle(Form("#LT#LTsin[%d(#psi_{1}-#psi_{2})]#GT#GT #font[72]{vs} %s",fHarmonic,psdTitleFlag2[1].Data()));
1035 f2pCorrelatorSinPsiSum->SetTitle(Form("#LT#LTsin[%d(#psi_{1}+#psi_{2})]#GT#GT #font[72]{vs} %s",fHarmonic,psdTitleFlag2[1].Data()));
1037 fProfileList->Add(f2pCorrelatorCosPsiDiff);
1038 fProfileList->Add(f2pCorrelatorCosPsiSum);
1039 fProfileList->Add(f2pCorrelatorSinPsiDiff);
1040 fProfileList->Add(f2pCorrelatorSinPsiSum);
1042 } // end of void AliFlowAnalysisWithMixedHarmonics::BookDifferential()
1044 //================================================================================================================
1046 void AliFlowAnalysisWithMixedHarmonics::AccessConstants()
1048 // Access needed common constants from AliFlowCommonConstants.
1050 fnBinsPhi = AliFlowCommonConstants::GetMaster()->GetNbinsPhi();
1051 fPhiMin = AliFlowCommonConstants::GetMaster()->GetPhiMin();
1052 fPhiMax = AliFlowCommonConstants::GetMaster()->GetPhiMax();
1053 if(fnBinsPhi) fPhiBinWidth = (fPhiMax-fPhiMin)/fnBinsPhi;
1054 fnBinsPt = AliFlowCommonConstants::GetMaster()->GetNbinsPt();
1055 fPtMin = AliFlowCommonConstants::GetMaster()->GetPtMin();
1056 fPtMax = AliFlowCommonConstants::GetMaster()->GetPtMax();
1057 if(fnBinsPt) fPtBinWidth = (fPtMax-fPtMin)/fnBinsPt;
1058 fnBinsEta = AliFlowCommonConstants::GetMaster()->GetNbinsEta();
1059 fEtaMin = AliFlowCommonConstants::GetMaster()->GetEtaMin();
1060 fEtaMax = AliFlowCommonConstants::GetMaster()->GetEtaMax();
1061 if(fnBinsEta) fEtaBinWidth = (fEtaMax-fEtaMin)/fnBinsEta;
1063 } // end of void AliFlowAnalysisWithMixedHarmonics::AccessConstants()
1065 //================================================================================================================
1067 void AliFlowAnalysisWithMixedHarmonics::CrossCheckSettings()
1069 // Cross-check if the user settings make sense.
1073 } // end of void AliFlowAnalysisWithMixedHarmonics::CrossCheckSettings()
1075 //================================================================================================================
1077 void AliFlowAnalysisWithMixedHarmonics::BookAndFillWeightsHistograms()
1079 // Book and fill (by accessing file "weights.root") histograms which hold phi, pt and eta weights.
1084 cout<<" WARNING (MH): fWeightsList is NULL in BookAndFillWeightsHistograms() !!!!"<<endl;
1088 // Profile to hold flags for weights:
1089 TString fUseParticleWeightsName = "fUseParticleWeightsMH";
1090 fUseParticleWeights = new TProfile(fUseParticleWeightsName.Data(),"0 = particle weight not used, 1 = particle weight used ",3,0,3);
1091 fUseParticleWeights->SetStats(kFALSE);
1092 fUseParticleWeights->SetLabelSize(0.06);
1093 (fUseParticleWeights->GetXaxis())->SetBinLabel(1,"w_{#phi}");
1094 (fUseParticleWeights->GetXaxis())->SetBinLabel(2,"w_{p_{T}}");
1095 (fUseParticleWeights->GetXaxis())->SetBinLabel(3,"w_{#eta}");
1096 fUseParticleWeights->Fill(0.5,(Int_t)fUsePhiWeights);
1097 fUseParticleWeights->Fill(1.5,(Int_t)fUsePtWeights);
1098 fUseParticleWeights->Fill(2.5,(Int_t)fUseEtaWeights);
1099 fWeightsList->Add(fUseParticleWeights);
1103 if(fWeightsList->FindObject("phi_weights"))
1105 fPhiWeights = dynamic_cast<TH1F*>(fWeightsList->FindObject("phi_weights"));
1106 if(TMath::Abs(fPhiWeights->GetBinWidth(1)-fPhiBinWidth)>pow(10.,-6.))
1109 cout<<" WARNING (MH): Inconsistent binning in histograms for phi-weights throughout the code."<<endl;
1116 cout<<" WARNING (MH): fWeightsList->FindObject(\"phi_weights\") is NULL in BookAndFillWeightsHistograms() !!!!"<<endl;
1120 } // end of if(fUsePhiWeights)
1124 if(fWeightsList->FindObject("pt_weights"))
1126 fPtWeights = dynamic_cast<TH1D*>(fWeightsList->FindObject("pt_weights"));
1127 if(TMath::Abs(fPtWeights->GetBinWidth(1)-fPtBinWidth)>pow(10.,-6.))
1130 cout<<" WARNING (MH): Inconsistent binning in histograms for pt-weights throughout the code."<<endl;
1137 cout<<" WARNING (MH): fWeightsList->FindObject(\"pt_weights\") is NULL in BookAndFillWeightsHistograms() !!!!"<<endl;
1141 } // end of if(fUsePtWeights)
1145 if(fWeightsList->FindObject("eta_weights"))
1147 fEtaWeights = dynamic_cast<TH1D*>(fWeightsList->FindObject("eta_weights"));
1148 if(TMath::Abs(fEtaWeights->GetBinWidth(1)-fEtaBinWidth)>pow(10.,-6.))
1151 cout<<" WARNING (MH): Inconsistent binning in histograms for eta-weights throughout the code."<<endl;
1158 cout<<" WARNING (MH): fUseEtaWeights && fWeightsList->FindObject(\"eta_weights\") is NULL in BookAndFillWeightsHistograms() !!!!"<<endl;
1162 } // end of if(fUseEtaWeights)
1164 } // end of AliFlowAnalysisWithMixedHarmonics::BookAndFillWeightsHistograms()
1166 //================================================================================================================
1168 void AliFlowAnalysisWithMixedHarmonics::CheckPointersUsedInMake()
1170 // Check pointers used in method Make().
1172 if(!fReQnk || !fImQnk || !fSpk )
1175 cout<<" WARNING (MH): fReQnk || fImQnk || fSpk is NULL in CheckPointersUsedInMake() !!!!"<<endl;
1179 if(!f3pCorrelatorPro)
1182 cout<<" WARNING (MH): f3pCorrelatorPro is NULL in CheckPointersUsedInMake() !!!!"<<endl;
1186 if(!fNonIsotropicTermsPro)
1189 cout<<" WARNING (MH): fNonIsotropicTermsPro is NULL in CheckPointersUsedInMake() !!!!"<<endl;
1193 if(!f3pCorrelatorVsMPro && fCalculateVsM)
1196 cout<<" WARNING (MH): f3pCorrelatorVsMPro is NULL in CheckPointersUsedInMake() !!!!"<<endl;
1200 if(!f3pPOICorrelatorVsM && fCalculateVsM)
1203 cout<<" WARNING (MH): f3pPOICorrelatorVsM is NULL in CheckPointersUsedInMake() !!!!"<<endl;
1207 if(!fNonIsotropicTermsVsMPro && fCalculateVsM)
1210 cout<<" WARNING (MH): fNonIsotropicTermsVsMPro is NULL in CheckPointersUsedInMake() !!!!"<<endl;
1215 if(!f2pCorrelatorCosPsiDiff) {
1217 cout<<" WARNING (MH): f2pCorrelatorCosPsiDiff is NULL in CheckPointersUsedInMake() !!!!"<<endl;
1221 if(!f2pCorrelatorCosPsiSum) {
1223 cout<<" WARNING (MH): f2pCorrelatorCosPsiSum is NULL in CheckPointersUsedInMake() !!!!"<<endl;
1227 if(!f2pCorrelatorSinPsiDiff) {
1229 cout<<" WARNING (MH): f2pCorrelatorSinPsiDiff is NULL in CheckPointersUsedInMake() !!!!"<<endl;
1233 if(!f2pCorrelatorSinPsiSum) {
1235 cout<<" WARNING (MH): f2pCorrelatorSinPsiSum is NULL in CheckPointersUsedInMake() !!!!"<<endl;
1240 if(!fEvaluateDifferential3pCorrelator){return;}
1241 for(Int_t sd=0;sd<2;sd++)
1243 if(!(f3pCorrelatorVsPtSumDiffPro[sd]))
1246 cout<<" WARNING (MH): "<<Form("f3pCorrelatorVsPtSumDiffPro[%d]",sd)<<" is NULL in CheckPointersUsedInMake() !!!!"<<endl;
1250 if(!(f3pCorrelatorVsEtaSumDiffPro[sd]))
1253 cout<<" WARNING (MH): "<<Form("f3pCorrelatorVsEtaSumDiffPro[%d]",sd)<<" is NULL in CheckPointersUsedInMake() !!!!"<<endl;
1258 for(Int_t sd=0;sd<2;sd++)
1260 if(!fRePEBE[sd]||!fImPEBE[sd])
1263 cout<<" WARNING (MH): "<<Form("!fRePEBE[%d]||!fImPEBE[%d]",sd,sd)<<" is NULL in CheckPointersUsedInMake() !!!!"<<endl;
1267 if(!fReEtaEBE[sd]||!fImEtaEBE[sd])
1270 cout<<" WARNING (MH): "<<Form("!fReEtaEBE[%d]||!fImEtaEBE[%d]",sd,sd)<<" is NULL in CheckPointersUsedInMake() !!!!"<<endl;
1274 for(Int_t fs=0;fs<2;fs++)
1276 if(!fOverlapEBE[fs][sd]||!fOverlapEBE[fs][sd])
1279 cout<<" WARNING (MH): "<<Form("!fOverlapEBE[%d][%d]||!fOverlapEBE[%d][%d]",fs,sd,fs,sd)<<" is NULL in CheckPointersUsedInMake() !!!!"<<endl;
1283 if(!fOverlapEBE2[fs][sd]||!fOverlapEBE2[fs][sd])
1286 cout<<" WARNING (MH): "<<Form("!fOverlapEBE2[%d][%d]||!fOverlapEBE2[%d][%d]",fs,sd,fs,sd)<<" is NULL in CheckPointersUsedInMake() !!!!"<<endl;
1290 } // end of for(Int_t fs=0;fs<2;fs++)
1291 } // end of for(Int_t sd=0;sd<2;sd++)
1293 } // end of AliFlowAnalysisWithMixedHarmonics::CheckPointersUsedInMake()
1295 //================================================================================================================
1297 void AliFlowAnalysisWithMixedHarmonics::CheckPointersUsedInFinish()
1299 // Check pointers used in method Finish().
1301 if(!fAnalysisSettings)
1304 cout<<" WARNING (MH): fAnalysisSettings is NULL in CheckPointersUsedInFinish() !!!!"<<endl;
1308 if(!f3pCorrelatorPro)
1311 cout<<" WARNING (MH): f3pCorrelatorPro is NULL in CheckPointersUsedInFinish() !!!!"<<endl;
1315 if(!fNonIsotropicTermsPro)
1318 cout<<" WARNING (MH): fNonIsotropicTermsPro is NULL in CheckPointersUsedInFinish() !!!!"<<endl;
1322 if(!f3pPOICorrelatorVsM && fCalculateVsM)
1325 cout<<" WARNING (MH): f3pPOICorrelatorVsM is NULL in CheckPointersUsedInFinish() !!!!"<<endl;
1329 if(!f3pCorrelatorVsMPro && fCalculateVsM)
1332 cout<<" WARNING (MH): f3pCorrelatorVsMPro is NULL in CheckPointersUsedInFinish() !!!!"<<endl;
1336 if(!f3pCorrelatorVsMHist && fCalculateVsM)
1339 cout<<" WARNING (MH): f3pCorrelatorVsMHist is NULL in CheckPointersUsedInFinish() !!!!"<<endl;
1343 if(!fNonIsotropicTermsVsMPro && fCalculateVsM)
1346 cout<<" WARNING (MH): fNonIsotropicTermsVsMPro is NULL in CheckPointersUsedInFinish() !!!!"<<endl;
1351 if(!f2pCorrelatorCosPsiDiff) {
1353 cout<<" WARNING (MH): f2pCorrelatorCosPsiDiff is NULL in CheckPointersUsedInFinish() !!!!"<<endl;
1357 if(!f2pCorrelatorCosPsiSum) {
1359 cout<<" WARNING (MH): f2pCorrelatorCosPsiSum is NULL in CheckPointersUsedInFinish() !!!!"<<endl;
1363 if(!f2pCorrelatorSinPsiDiff) {
1365 cout<<" WARNING (MH): f2pCorrelatorSinPsiDiff is NULL in CheckPointersUsedInFinish() !!!!"<<endl;
1369 if(!f2pCorrelatorSinPsiSum) {
1371 cout<<" WARNING (MH): f2pCorrelatorSinPsiSum is NULL in CheckPointersUsedInFinish() !!!!"<<endl;
1376 if(!f3pCorrelatorHist)
1379 cout<<" WARNING (MH): f3pCorrelatorHist is NULL in CheckPointersUsedInFinish() !!!!"<<endl;
1383 if(!fDetectorBiasHist)
1386 cout<<" WARNING (MH): fDetectorBiasHist is NULL in CheckPointersUsedInFinish() !!!!"<<endl;
1390 /* to be improved - enabled eventually
1391 if(!fDetectorBiasVsMHist && fCalculateVsM)
1394 cout<<" WARNING (MH): !fDetectorBiasVsMHist is NULL in CheckPointersUsedInFinish() !!!!"<<endl;
1399 if(!fEvaluateDifferential3pCorrelator){return;}
1400 for(Int_t sd=0;sd<2;sd++)
1402 if(!(f3pCorrelatorVsPtSumDiffPro[sd]))
1405 cout<<" WARNING (MH): "<<Form("f3pCorrelatorVsPtSumDiffPro[%d]",sd)<<" is NULL in CheckPointersUsedInFinish() !!!!"<<endl;
1409 if(!(f3pCorrelatorVsEtaSumDiffPro[sd]))
1412 cout<<" WARNING (MH): "<<Form("f3pCorrelatorVsEtaSumDiffPro[%d]",sd)<<" is NULL in CheckPointersUsedInFinish() !!!!"<<endl;
1418 } // end of AliFlowAnalysisWithMixedHarmonics::CheckPointersUsedInFinish()
1420 //================================================================================================================
1422 void AliFlowAnalysisWithMixedHarmonics::PrintOnTheScreen()
1424 // Print the final results on the screen.
1426 // <<cos[n*(phi1+phi2-2phi3)]>>:
1427 Double_t d3pCorrelator = 0.;
1428 Double_t d3pCorrelatorError = 0.;
1429 if(!fCorrectForDetectorEffects)
1431 d3pCorrelator = f3pCorrelatorPro->GetBinContent(1);
1432 d3pCorrelatorError = f3pCorrelatorPro->GetBinError(1);
1435 d3pCorrelator = f3pCorrelatorHist->GetBinContent(1);
1436 d3pCorrelatorError = f3pCorrelatorHist->GetBinError(1);
1439 // <<cos[n*(psi1+psi2-2phi3)]>>:
1440 Double_t d3pCorrelatorPoi = 0.;
1441 Double_t d3pCorrelatorPoiError = 0.;
1442 GetCorrelatorAndError(f3pCorrelatorVsPtSumDiffPro[0],
1444 d3pCorrelatorPoiError);
1446 cout<<"*******************************************************"<<endl;
1447 cout<<"*******************************************************"<<endl;
1448 cout<<" Mixed Harmonics "<<endl;
1452 cout<<" cos["<<fHarmonic<<"(phi1+phi2-2phi3)] = "<<d3pCorrelator<<" +/- "<<d3pCorrelatorError<<endl;
1453 cout<<" cos["<<fHarmonic<<"(psi1+psi2-2phi3)] = "<<d3pCorrelatorPoi<<" +/- "<<d3pCorrelatorPoiError<<endl;
1456 cout<<" cos(phi1+phi2-2phi3) = "<<d3pCorrelator<<" +/- "<<d3pCorrelatorError<<endl;
1457 cout<<" cos(psi1+psi2-2phi3) = "<<d3pCorrelatorPoi<<" +/- "<<d3pCorrelatorPoiError<<endl;
1459 if(!fCorrectForDetectorEffects)
1461 cout<<" Detector Bias = "<<fDetectorBiasHist->GetBinContent(1)<<" (not corrected for)"<<endl;
1464 cout<<" Detector Bias = "<<fDetectorBiasHist->GetBinContent(1)<<" (corrected for)"<<endl;
1467 cout<<" nEvts = "<<(Int_t)fCommonHists->GetHistMultRP()->GetEntries()<<", <M> = "<<(Double_t)fCommonHists->GetHistMultRP()->GetMean()<<endl;
1468 cout<<"*******************************************************"<<endl;
1469 cout<<"*******************************************************"<<endl;
1471 } // end of void AliFlowAnalysisWithMixedHarmonics::PrintOnTheScreen()
1473 //================================================================================================================
1475 void AliFlowAnalysisWithMixedHarmonics::AccessSettings()
1477 // Access the settings for analysis with mixed harmonics.
1479 fCorrectForDetectorEffects = (Bool_t)fAnalysisSettings->GetBinContent(1);
1480 fNoOfMultipicityBins = (Int_t)fAnalysisSettings->GetBinContent(2);
1481 fMultipicityBinWidth = (Double_t)fAnalysisSettings->GetBinContent(3);
1482 fMinMultiplicity = (Double_t)fAnalysisSettings->GetBinContent(4);
1483 fPrintOnTheScreen = (Bool_t)fAnalysisSettings->GetBinContent(5);
1484 fHarmonic = (Int_t)fAnalysisSettings->GetBinContent(6);
1485 fOppositeChargesPOI = (Bool_t)fAnalysisSettings->GetBinContent(7);
1486 fEvaluateDifferential3pCorrelator = (Bool_t)fAnalysisSettings->GetBinContent(8);
1487 fCalculateVsM = (Bool_t)fAnalysisSettings->GetBinContent(9);
1488 fShowBinLabelsVsM = (Bool_t)fAnalysisSettings->GetBinContent(10);
1490 } // end of AliFlowAnalysisWithMixedHarmonics::AccessSettings()
1492 //================================================================================================================
1494 void AliFlowAnalysisWithMixedHarmonics::CorrectForDetectorEffects()
1496 // Correct measured 3-p correlator cos[n(phi1+phi2-2phi3)] for detector effects.
1498 Double_t measured3pCorrelator = f3pCorrelatorPro->GetBinContent(1); // biased by detector effects
1499 Double_t corrected3pCorrelator = 0.; // corrected for detector effects
1500 Double_t nonIsotropicTerms[10] = {0.}; // there are 10 distinct non-isotropic terms
1501 for(Int_t nit=0;nit<10;nit++)
1503 nonIsotropicTerms[nit] = fNonIsotropicTermsPro->GetBinContent(nit+1);
1505 // Calculate corrected 3-p correlator:
1506 corrected3pCorrelator = measured3pCorrelator
1507 - nonIsotropicTerms[2]*nonIsotropicTerms[4]
1508 - nonIsotropicTerms[3]*nonIsotropicTerms[5]
1509 - 2.*nonIsotropicTerms[0]*nonIsotropicTerms[6]
1510 - 2.*nonIsotropicTerms[1]*nonIsotropicTerms[7]
1511 + 2.*nonIsotropicTerms[2]*(pow(nonIsotropicTerms[0],2.)-pow(nonIsotropicTerms[1],2.))
1512 + 4.*nonIsotropicTerms[3]*nonIsotropicTerms[0]*nonIsotropicTerms[1];
1513 // Store corrected correlator:
1514 if(fCorrectForDetectorEffects)
1516 f3pCorrelatorHist->SetBinContent(1,corrected3pCorrelator);
1517 f3pCorrelatorHist->SetBinError(1,f3pCorrelatorPro->GetBinError(1)); // to be improved (propagate error for non-isotropic terms)
1519 // Quantify bias from detector inefficiences to 3-p correlator. Remark: Bias is quantified as a
1520 // ratio between corrected and measured 3-p correlator:
1521 // bias = corrected/measured
1522 // This bias is stored in histogram fDetectorBias.
1524 if(TMath::Abs(measured3pCorrelator)>1.e-44)
1526 bias = corrected3pCorrelator/measured3pCorrelator;
1527 fDetectorBiasHist->SetBinContent(1,bias);
1530 } // end of AliFlowAnalysisWithMixedHarmonics::CorrectForDetectorEffects()
1532 //================================================================================================================
1534 void AliFlowAnalysisWithMixedHarmonics::CorrectForDetectorEffectsVsM()
1536 // Correct measured 3-p correlator cos[n(phi1+phi2-2phi3)] vs M for detector effects.
1538 for(Int_t b=1;b<=fNoOfMultipicityBins+2;b++)
1540 Double_t measured3pCorrelator = f3pCorrelatorVsMPro->GetBinContent(b); // biased by detector effects
1541 Double_t corrected3pCorrelator = 0.; // corrected for detector effects
1542 Double_t nonIsotropicTerms[10] = {0.}; // there are 10 distinct non-isotropic terms
1543 for(Int_t nit=0;nit<10;nit++)
1545 nonIsotropicTerms[nit] = fNonIsotropicTermsVsMPro->GetBinContent(fNonIsotropicTermsVsMPro->GetBin(nit+1,b));
1547 // Calculate corrected 3-p correlator:
1548 corrected3pCorrelator = measured3pCorrelator
1549 - nonIsotropicTerms[2]*nonIsotropicTerms[4]
1550 - nonIsotropicTerms[3]*nonIsotropicTerms[5]
1551 - 2.*nonIsotropicTerms[0]*nonIsotropicTerms[6]
1552 - 2.*nonIsotropicTerms[1]*nonIsotropicTerms[7]
1553 + 2.*nonIsotropicTerms[2]*(pow(nonIsotropicTerms[0],2.)-pow(nonIsotropicTerms[1],2.))
1554 + 4.*nonIsotropicTerms[3]*nonIsotropicTerms[0]*nonIsotropicTerms[1];
1555 // Store corrected correlator:
1556 if(fCorrectForDetectorEffects)
1558 f3pCorrelatorVsMHist->SetBinContent(b,corrected3pCorrelator);
1559 f3pCorrelatorVsMHist->SetBinError(b,f3pCorrelatorVsMPro->GetBinError(b)); // to be improved (propagate error for non-isotropic terms)
1561 // Quantify bias from detector inefficiences to 3-p correlator. Remark: Bias is quantified as a
1562 // ratio between corrected and measured 3-p correlator:
1563 // bias = corrected/measured
1564 // This bias is stored in histogram fDetectorBias.
1566 if(measured3pCorrelator)
1568 bias = corrected3pCorrelator/measured3pCorrelator;
1569 fDetectorBiasVsMHist->SetBinContent(b,bias);
1571 } // end of for(Int_t b=1;b<=fNoOfMultipicityBins;b++)
1573 } // end of AliFlowAnalysisWithMixedHarmonics::CorrectForDetectorEffectsVsM()
1575 //================================================================================================================
1577 void AliFlowAnalysisWithMixedHarmonics::ResetEventByEventQuantities()
1579 // Reset all event-by-event quantities.
1585 if(!fEvaluateDifferential3pCorrelator){return;}
1586 for(Int_t sd=0;sd<2;sd++)
1588 fRePEBE[sd]->Reset();
1589 fImPEBE[sd]->Reset();
1590 fReEtaEBE[sd]->Reset();
1591 fImEtaEBE[sd]->Reset();
1593 for(Int_t fs=0;fs<2;fs++)
1595 for(Int_t sd=0;sd<2;sd++)
1597 fOverlapEBE[fs][sd]->Reset();
1598 fOverlapEBE2[fs][sd]->Reset();
1602 } // end of void AliFlowAnalysisWithMixedHarmonics::ResetEventByEventQuantities()
1604 //================================================================================================================
1606 void AliFlowAnalysisWithMixedHarmonics::Calculate3pCorrelator()
1608 // Calculate 3-p azimuthal correlator cos[n(phi1+phi2-2phi3)] in terms of Q_{n,k} and S_{p,k}.
1610 // a) Calculate 3-p correlator without using particle weights;
1611 // b) Calculate 3-p correlator with using particle weights.
1613 // a) Calculate 3-p correlator without using particle weights:
1614 if(!(fUsePhiWeights || fUsePtWeights || fUseEtaWeights))
1616 // Multiplicity (number of RPs):
1617 Double_t dMult = (*fSpk)(0,0);
1618 // Real and imaginary parts of non-weighted Q-vectors (Q_{n,0}) evaluated in harmonics n and 2n:
1619 Double_t dReQ1n = (*fReQnk)(0,0);
1620 Double_t dReQ2n = (*fReQnk)(1,0);
1621 Double_t dImQ1n = (*fImQnk)(0,0);
1622 Double_t dImQ2n = (*fImQnk)(1,0);
1623 // 3-particle azimuthal correlator <cos(n*(phi1+phi2-2phi3))>:
1624 Double_t three1n1n2n = (pow(dReQ1n,2.)*dReQ2n + 2.*dReQ1n*dImQ1n*dImQ2n - pow(dImQ1n,2.)*dReQ2n
1625 - 2.*(pow(dReQ1n,2.)+pow(dImQ1n,2.))
1626 - (pow(dReQ2n,2.)+pow(dImQ2n,2.))+2.*dMult)
1627 / (dMult*(dMult-1.)*(dMult-2.));
1629 // Fill all-events profile:
1630 f3pCorrelatorPro->Fill(0.5,three1n1n2n,dMult*(dMult-1.)*(dMult-2.));
1632 // 3-particle azimuthal correlator <cos(n*(phi1+phi2-2phi3))> vs multiplicity:
1635 if(dMult<fMinMultiplicity)
1637 f3pCorrelatorVsMPro->Fill(0.5,three1n1n2n,dMult*(dMult-1.)*(dMult-2.));
1638 } else if(dMult>=fMinMultiplicity+fNoOfMultipicityBins*fMultipicityBinWidth)
1640 f3pCorrelatorVsMPro->Fill(0.5+fNoOfMultipicityBins+1,three1n1n2n,dMult*(dMult-1.)*(dMult-2.));
1643 f3pCorrelatorVsMPro->Fill(1.5+(Int_t)((dMult-fMinMultiplicity)/fMultipicityBinWidth),three1n1n2n,dMult*(dMult-1.)*(dMult-2.));
1645 } // end of if(fCalculateVsM)
1647 } // end of if(!(fUsePhiWeights || fUsePtWeights || fUseEtaWeights))
1649 // b) Calculate 3-p correlator with using particle weights:
1650 if(fUsePhiWeights || fUsePtWeights || fUseEtaWeights)
1653 } // end of if(fUsePhiWeights || fUsePtWeights || fUseEtaWeights)
1655 } // end of void AliFlowAnalysisWithMixedHarmonics::Calculate3pCorrelator()
1657 //================================================================================================================
1659 void AliFlowAnalysisWithMixedHarmonics::CalculateNonIsotropicTerms()
1661 // Calculate non-isotropic terms which appear in the decomposition of 3-p correlator <cos[n(phi1+phi2-2phi3)]>.
1663 // a) Calculate without using particle weights;
1664 // b) Calculate using particle weights.
1666 // For detector with uniform acceptance all these terms vanish. These non-isotropic terms are stored in fNonIsotropicTermsPro.
1667 // Binning of fNonIsotropicTermsPro is organized as follows:
1668 // 1st bin: <<cos(n*phi1)>>
1669 // 2nd bin: <<sin(n*phi1)>>
1670 // 3rd bin: <<cos(2n*phi1)>>
1671 // 4th bin: <<sin(2n*phi1)>>
1672 // 5th bin: <<cos(n*(phi1+phi2)>>
1673 // 6th bin: <<sin(n*(phi1+phi2)>>
1674 // 7th bin: <<cos(n*(2phi1-phi2)>>
1675 // 8th bin: <<sin(n*(2phi1-phi2)>>
1676 // 9th bin: <<cos(n*(phi1-phi2-phi3)>> // not needed
1677 // 10th bin: <<sin(n*(phi1-phi2-phi3)>> // not needed
1679 // a) Calculate without using particle weights:
1680 if(!(fUsePhiWeights || fUsePtWeights || fUseEtaWeights))
1682 // Multiplicity (number of RPs):
1683 Double_t dMult = (*fSpk)(0,0);
1684 // Real and imaginary parts of non-weighted Q-vectors (Q_{n,0}) evaluated in harmonics n and 2n:
1685 Double_t dReQ1n = (*fReQnk)(0,0);
1686 Double_t dReQ2n = (*fReQnk)(1,0);
1687 Double_t dImQ1n = (*fImQnk)(0,0);
1688 Double_t dImQ2n = (*fImQnk)(1,0);
1689 // 1-particle terms:
1690 Double_t cosP1n = 0.; // <cos(n*(phi1))>
1691 Double_t sinP1n = 0.; // <sin(n*(phi1))>
1692 Double_t cosP2n = 0.; // <cos(2n*(phi1))>
1693 Double_t sinP2n = 0.; // <sin(2n*(phi1))>
1696 cosP1n = dReQ1n/dMult;
1697 sinP1n = dImQ1n/dMult;
1698 cosP2n = dReQ2n/dMult;
1699 sinP2n = dImQ2n/dMult;
1700 // All-event avarages:
1701 fNonIsotropicTermsPro->Fill(0.5,cosP1n,dMult); // <<cos(n*(phi1))>>
1702 fNonIsotropicTermsPro->Fill(1.5,sinP1n,dMult); // <<sin(n*(phi1))>>
1703 fNonIsotropicTermsPro->Fill(2.5,cosP2n,dMult); // <<cos(2n*(phi1))>>
1704 fNonIsotropicTermsPro->Fill(3.5,sinP2n,dMult); // <<sin(2n*(phi1))>>
1705 // All-event avarages vs M:
1708 if(dMult<fMinMultiplicity)
1710 fNonIsotropicTermsVsMPro->Fill(0.5,0.5,cosP1n,dMult); // <<cos(n*(phi1))>>
1711 fNonIsotropicTermsVsMPro->Fill(1.5,0.5,sinP1n,dMult); // <<sin(n*(phi1))>>
1712 fNonIsotropicTermsVsMPro->Fill(2.5,0.5,cosP2n,dMult); // <<cos(2n*(phi1))>>
1713 fNonIsotropicTermsVsMPro->Fill(3.5,0.5,sinP2n,dMult); // <<sin(2n*(phi1))>>
1714 } else if(dMult>=fMinMultiplicity+fNoOfMultipicityBins*fMultipicityBinWidth)
1716 fNonIsotropicTermsVsMPro->Fill(0.5,0.5+fNoOfMultipicityBins+1,cosP1n,dMult); // <<cos(n*(phi1))>>
1717 fNonIsotropicTermsVsMPro->Fill(1.5,0.5+fNoOfMultipicityBins+1,sinP1n,dMult); // <<sin(n*(phi1))>>
1718 fNonIsotropicTermsVsMPro->Fill(2.5,0.5+fNoOfMultipicityBins+1,cosP2n,dMult); // <<cos(2n*(phi1))>>
1719 fNonIsotropicTermsVsMPro->Fill(3.5,0.5+fNoOfMultipicityBins+1,sinP2n,dMult); // <<sin(2n*(phi1))>>
1722 fNonIsotropicTermsVsMPro->Fill(0.5,1.5+(Int_t)((dMult-fMinMultiplicity)/fMultipicityBinWidth),cosP1n,dMult); // <<cos(n*(phi1))>>
1723 fNonIsotropicTermsVsMPro->Fill(1.5,1.5+(Int_t)((dMult-fMinMultiplicity)/fMultipicityBinWidth),sinP1n,dMult); // <<sin(n*(phi1))>>
1724 fNonIsotropicTermsVsMPro->Fill(2.5,1.5+(Int_t)((dMult-fMinMultiplicity)/fMultipicityBinWidth),cosP2n,dMult); // <<cos(2n*(phi1))>>
1725 fNonIsotropicTermsVsMPro->Fill(3.5,1.5+(Int_t)((dMult-fMinMultiplicity)/fMultipicityBinWidth),sinP2n,dMult); // <<sin(2n*(phi1))>>
1727 } // end of if(fCalculateVsM)
1728 } // end of if(dMult>0)
1729 // 2-particle terms:
1730 Double_t cosP1nP1n = 0.; // <cos(n*(phi1+phi2))>
1731 Double_t sinP1nP1n = 0.; // <sin(n*(phi1+phi2))>
1732 Double_t cosP2nM1n = 0.; // <cos(n*(2phi1-phi2))>
1733 Double_t sinP2nM1n = 0.; // <sin(n*(2phi1-phi2))>
1736 cosP1nP1n = (pow(dReQ1n,2)-pow(dImQ1n,2)-dReQ2n)/(dMult*(dMult-1));
1737 sinP1nP1n = (2.*dReQ1n*dImQ1n-dImQ2n)/(dMult*(dMult-1));
1738 cosP2nM1n = (dReQ2n*dReQ1n+dImQ2n*dImQ1n-dReQ1n)/(dMult*(dMult-1));
1739 sinP2nM1n = (dImQ2n*dReQ1n-dReQ2n*dImQ1n-dImQ1n)/(dMult*(dMult-1));
1740 // All-event avarages:
1741 fNonIsotropicTermsPro->Fill(4.5,cosP1nP1n,dMult*(dMult-1.)); // <<cos(n*(phi1+phi2))>>
1742 fNonIsotropicTermsPro->Fill(5.5,sinP1nP1n,dMult*(dMult-1.)); // <<sin(n*(phi1+phi2))>>
1743 fNonIsotropicTermsPro->Fill(6.5,cosP2nM1n,dMult*(dMult-1.)); // <<cos(n*(2phi1-phi2))>>
1744 fNonIsotropicTermsPro->Fill(7.5,sinP2nM1n,dMult*(dMult-1.)); // <<sin(n*(2phi1-phi2))>>
1745 // All-event avarages vs M:
1748 if(dMult<fMinMultiplicity)
1750 fNonIsotropicTermsVsMPro->Fill(4.5,0.5,cosP1nP1n,dMult*(dMult-1.)); // <<cos(n*(phi1+phi2))>>
1751 fNonIsotropicTermsVsMPro->Fill(5.5,0.5,sinP1nP1n,dMult*(dMult-1.)); // <<sin(n*(phi1+phi2))>>
1752 fNonIsotropicTermsVsMPro->Fill(6.5,0.5,cosP2nM1n,dMult*(dMult-1.)); // <<cos(n*(2phi1-phi2))>>
1753 fNonIsotropicTermsVsMPro->Fill(7.5,0.5,sinP2nM1n,dMult*(dMult-1.)); // <<sin(n*(2phi1-phi2))>>
1754 } else if(dMult>=fMinMultiplicity+fNoOfMultipicityBins*fMultipicityBinWidth)
1756 fNonIsotropicTermsVsMPro->Fill(4.5,0.5+fNoOfMultipicityBins+1,cosP1nP1n,dMult*(dMult-1.)); // <<cos(n*(phi1+phi2))>>
1757 fNonIsotropicTermsVsMPro->Fill(5.5,0.5+fNoOfMultipicityBins+1,sinP1nP1n,dMult*(dMult-1.)); // <<sin(n*(phi1+phi2))>>
1758 fNonIsotropicTermsVsMPro->Fill(6.5,0.5+fNoOfMultipicityBins+1,cosP2nM1n,dMult*(dMult-1.)); // <<cos(n*(2phi1-phi2))>>
1759 fNonIsotropicTermsVsMPro->Fill(7.5,0.5+fNoOfMultipicityBins+1,sinP2nM1n,dMult*(dMult-1.)); // <<sin(n*(2phi1-phi2))>>
1762 fNonIsotropicTermsVsMPro->Fill(4.5,1.5+(Int_t)((dMult-fMinMultiplicity)/fMultipicityBinWidth),cosP1nP1n,dMult*(dMult-1.)); // <<cos(n*(phi1+phi2))>>
1763 fNonIsotropicTermsVsMPro->Fill(5.5,1.5+(Int_t)((dMult-fMinMultiplicity)/fMultipicityBinWidth),sinP1nP1n,dMult*(dMult-1.)); // <<sin(n*(phi1+phi2))>>
1764 fNonIsotropicTermsVsMPro->Fill(6.5,1.5+(Int_t)((dMult-fMinMultiplicity)/fMultipicityBinWidth),cosP2nM1n,dMult*(dMult-1.)); // <<cos(n*(2phi1-phi2))>>
1765 fNonIsotropicTermsVsMPro->Fill(7.5,1.5+(Int_t)((dMult-fMinMultiplicity)/fMultipicityBinWidth),sinP2nM1n,dMult*(dMult-1.)); // <<sin(n*(2phi1-phi2))>>
1767 } // end of if(fCalculateVsM)
1768 } // end of if(dMult>1)
1769 // 3-particle: correct and ready but not needed, hence commented out.
1771 Double_t cosP1nM1nM1n = 0.; // <cos(n*(phi1-phi2-phi3))>
1772 Double_t sinP1nM1nM1n = 0.; // <sin(n*(phi1-phi2-phi3))>
1775 cosP1nM1nM1n = (dReQ1n*(pow(dReQ1n,2)+pow(dImQ1n,2))-dReQ1n*dReQ2n-dImQ1n*dImQ2n-2.*(dMult-1)*dReQ1n)
1776 / (dMult*(dMult-1)*(dMult-2));
1777 sinP1nM1nM1n = (-dImQ1n*(pow(dReQ1n,2)+pow(dImQ1n,2))+dReQ1n*dImQ2n-dImQ1n*dReQ2n+2.*(dMult-1)*dImQ1n)
1778 / (dMult*(dMult-1)*(dMult-2));
1779 // All-events avarages:
1780 fNonIsotropicTermsPro->Fill(8.5,cosP1nM1nM1n,dMult*(dMult-1.)*(dMult-2.)); // <<cos(n*(phi1-phi2-phi3))>>
1781 fNonIsotropicTermsPro->Fill(9.5,sinP1nM1nM1n,dMult*(dMult-1.)*(dMult-2.)); // <<sin(n*(phi1-phi2-phi3))>>
1782 // All-events avarages vs M:
1785 if(dMult<fMinMultiplicity)
1787 fNonIsotropicTermsVsMPro->Fill(8.5,0.5,cosP1nM1nM1n,dMult*(dMult-1.)*(dMult-2.)); // <<cos(n*(phi1-phi2-phi3))>>
1788 fNonIsotropicTermsVsMPro->Fill(9.5,0.5,sinP1nM1nM1n,dMult*(dMult-1.)*(dMult-2.)); // <<sin(n*(phi1-phi2-phi3))>>
1789 } else if(dMult>=fMinMultiplicity+fNoOfMultipicityBins*fMultipicityBinWidth)
1791 fNonIsotropicTermsVsMPro->Fill(8.5,0.5+fNoOfMultipicityBins+1,cosP1nM1nM1n,dMult*(dMult-1.)*(dMult-2.)); // <<cos(n*(phi1-phi2-phi3))>>
1792 fNonIsotropicTermsVsMPro->Fill(9.5,0.5+fNoOfMultipicityBins+1,sinP1nM1nM1n,dMult*(dMult-1.)*(dMult-2.)); // <<sin(n*(phi1-phi2-phi3))>>
1795 fNonIsotropicTermsVsMPro->Fill(8.5,1.5+(Int_t)((dMult-fMinMultiplicity)/fMultipicityBinWidth),
1796 cosP1nM1nM1n,dMult*(dMult-1.)*(dMult-2.)); // <<cos(n*(phi1-phi2-phi3))>>
1797 fNonIsotropicTermsVsMPro->Fill(9.5,1.5+(Int_t)((dMult-fMinMultiplicity)/fMultipicityBinWidth),
1798 sinP1nM1nM1n,dMult*(dMult-1.)*(dMult-2.)); // <<sin(n*(phi1-phi2-phi3))>>
1800 } // end of if(fCalculateVsM)
1801 } // end of if(dMult>2)
1803 } // end of if(!(fUsePhiWeights || fUsePtWeights || fUseEtaWeights))
1805 // b) Calculate using particle weights:
1806 if(fUsePhiWeights || fUsePtWeights || fUseEtaWeights)
1809 } // end of if(fUsePhiWeights || fUsePtWeights || fUseEtaWeights)
1811 } // end of void AliFlowAnalysisWithMixedHarmonics::CalculateNonIsotropicTerms()
1813 //================================================================================================================
1815 void AliFlowAnalysisWithMixedHarmonics::CalculateDifferential3pCorrelator(Double_t &gIntegratedValue)
1817 // Calculate differential 3-p azimuthal correlator cos[n(psi1+psi2-2phi3)] in terms of Q_{2n}, p_{n}, q1_{n} and q2_{n}.
1819 // a) Calculate differential 3-p correlator without using particle weights;
1820 // b) Calculate differential 3-p correlator with using particle weights.
1822 // a) Calculate differential 3-p correlator without using particle weights:
1823 if(!(fUsePhiWeights || fUsePtWeights || fUseEtaWeights))
1825 Int_t iBinCounter = 0;
1826 Double_t gSumBinContentTimesWeight = 0., gSumWeight = 0.;
1827 Double_t gSumBinContentTimesWeightSquared = 0.;
1829 // Multiplicity (number of RPs):
1830 Double_t dMult = (*fSpk)(0,0);
1831 // Real and imaginary parts of non-weighted Q-vectors (Q_{n,0}) evaluated in harmonic 2n:
1832 Double_t dReQ2n = (*fReQnk)(1,0);
1833 Double_t dImQ2n = (*fImQnk)(1,0);
1834 for(Int_t sd=0;sd<2;sd++)
1836 // [(p1+p2)/2,|p1-p2|]
1837 // looping over all bins and calculating reduced correlations:
1838 for(Int_t b=1;b<=fnBinsPt;b++)
1840 // real and imaginary parts of p_{n}:
1841 Double_t p1nRe = fRePEBE[sd]->GetBinContent(b)*fRePEBE[sd]->GetBinEntries(b);
1842 Double_t p1nIm = fImPEBE[sd]->GetBinContent(b)*fImPEBE[sd]->GetBinEntries(b);
1843 // overlap 1: to be improved (terminology)
1844 Double_t overlap1 = fOverlapEBE[0][sd]->GetBinContent(b)*fOverlapEBE[0][sd]->GetBinEntries(b);
1845 // overlap 2: to be improved (terminology)
1846 Double_t overlap2 = fOverlapEBE[1][sd]->GetBinContent(b)*fOverlapEBE[1][sd]->GetBinEntries(b);
1847 // number of pairs of POIs in particular (p1+p2)/2 or |p1-p2| bin:
1848 Double_t mp = fRePEBE[sd]->GetBinEntries(b);
1849 // number of pairs of POI1/RP and POI2 in particular (p1+p2)/2 or |p1-p2| bin:
1850 Double_t mOverlap1 = fOverlapEBE[0][sd]->GetBinEntries(b);
1851 // number of pairs of POI2/RP and POI1 in particular (p1+p2)/2 or |p1-p2| bin:
1852 Double_t mOverlap2 = fOverlapEBE[1][sd]->GetBinEntries(b);
1853 // e-b-e weight for cos[n(psi1+psi2-2phi3)]:
1854 Double_t weight = mp*dMult-mOverlap1-mOverlap2;
1856 Double_t cosP2nphi1M1npsi2M1npsi2 = 0; // cos[n(psi1+psi2-2phi3)]
1859 cosP2nphi1M1npsi2M1npsi2 = (p1nRe*dReQ2n+p1nIm*dImQ2n-overlap1-overlap2)/(weight);
1861 f3pCorrelatorVsPtSumDiffPro[sd]->Fill(fPtMin+(b-1)*fPtBinWidth,cosP2nphi1M1npsi2M1npsi2,weight);
1865 gSumBinContentTimesWeight += f3pCorrelatorVsPtSumDiffPro[sd]->GetBinContent(b)*f3pCorrelatorVsPtSumDiffPro[sd]->GetBinEntries(b);
1866 gSumWeight += f3pCorrelatorVsPtSumDiffPro[sd]->GetBinEntries(b);
1867 gSumBinContentTimesWeightSquared += TMath::Power(gSumBinContentTimesWeight,2);
1869 } // end of for(Int_t b=1;b<=fnBinsPt;b++)
1871 // [(eta1+eta2)/2,|eta1-eta2|]
1872 // looping over all bins and calculating reduced correlations:
1873 for(Int_t k=1;k<=fnBinsEta;k++)
1875 // real and imaginary parts of p_{n}:
1876 Double_t p1nRe = fReEtaEBE[sd]->GetBinContent(k)*fReEtaEBE[sd]->GetBinEntries(k);
1877 Double_t p1nIm = fImEtaEBE[sd]->GetBinContent(k)*fImEtaEBE[sd]->GetBinEntries(k);
1878 // overlap 1: to be improved (terminology)
1879 Double_t overlap1 = fOverlapEBE2[0][sd]->GetBinContent(k)*fOverlapEBE2[0][sd]->GetBinEntries(k);
1880 // overlap 2: to be improved (terminology)
1881 Double_t overlap2 = fOverlapEBE2[1][sd]->GetBinContent(k)*fOverlapEBE2[1][sd]->GetBinEntries(k);
1882 // number of pairs of POIs in particular (eta1+eta2)/2 or |eta1-eta2| bin:
1883 Double_t mp = fReEtaEBE[sd]->GetBinEntries(k);
1884 // number of pairs of POI1/RP and POI2 in particular (eta1+eta2)/2 or |eta1-eta2| bin:
1885 Double_t mOverlap1 = fOverlapEBE2[0][sd]->GetBinEntries(k);
1886 // number of pairs of POI2/RP and POI1 in particular (eta1+eta2)/2 or |eta1-eta2| bin:
1887 Double_t mOverlap2 = fOverlapEBE2[1][sd]->GetBinEntries(k);
1888 // e-b-e weight for cos[n(psi1+psi2-2phi3)]:
1889 Double_t weight = mp*dMult-mOverlap1-mOverlap2;
1891 Double_t cosP2nphi1M1npsi2M1npsi2 = 0; // cos[n(psi1+psi2-2phi3)]
1894 cosP2nphi1M1npsi2M1npsi2 = (p1nRe*dReQ2n+p1nIm*dImQ2n-overlap1-overlap2)/(weight);
1896 f3pCorrelatorVsEtaSumDiffPro[sd]->Fill(fEtaMin+(k-1)*fEtaBinWidth,cosP2nphi1M1npsi2M1npsi2,weight);
1897 } // end of for(Int_t k=1;k<=fnBinsEta;k++)
1898 } // end of for(Int_t sd=0;sd<2;sd++)
1900 gIntegratedValue = -1000.;
1901 if((gSumWeight)&&(iBinCounter))
1902 gIntegratedValue = gSumBinContentTimesWeight/gSumWeight;
1903 } // end of if(!(fUsePhiWeights || fUsePtWeights || fUseEtaWeights))
1905 // b) Calculate differential 3-p correlator by using particle weights:
1906 if(fUsePhiWeights || fUsePtWeights || fUseEtaWeights)
1909 } // end of if(fUsePhiWeights || fUsePtWeights || fUseEtaWeights)
1911 } // end of void AliFlowAnalysisWithMixedHarmonics::CalculateDifferential3pCorrelator()
1913 //================================================================================================================
1915 void AliFlowAnalysisWithMixedHarmonics::GetCorrelatorAndError(TProfile *g3pCorrelatorVsPt, Double_t &g3pCorrelatorValue, Double_t &g3pCorrelatorError) {
1916 //Retrieves the 3p correlator <<cos[n(psi1+psi2-2phi3)]>>
1918 Double_t gSumXi = 0.;
1919 Double_t gSumYi = 0.;
1920 Double_t gSumXiYi = 0.;
1921 Double_t gSumXiYi2 = 0.;
1922 Double_t gSumXi2Yi2 = 0.;
1923 Double_t gSumDeltaXi2 = 0.;
1924 Double_t gSumYi2DeltaXi2 = 0.;
1926 for(Int_t iBin = 1; iBin <= g3pCorrelatorVsPt->GetNbinsX(); iBin++) {
1927 gSumXi += g3pCorrelatorVsPt->GetBinEntries(iBin);
1928 gSumYi += g3pCorrelatorVsPt->GetBinContent(iBin);
1929 gSumXiYi += g3pCorrelatorVsPt->GetBinEntries(iBin)*g3pCorrelatorVsPt->GetBinContent(iBin);
1930 gSumXiYi2 += g3pCorrelatorVsPt->GetBinEntries(iBin)*TMath::Power(g3pCorrelatorVsPt->GetBinContent(iBin),2);
1931 gSumXi2Yi2 += TMath::Power(g3pCorrelatorVsPt->GetBinEntries(iBin)*g3pCorrelatorVsPt->GetBinContent(iBin),2);
1932 gSumDeltaXi2 += TMath::Power(g3pCorrelatorVsPt->GetBinError(iBin),2);
1933 gSumYi2DeltaXi2 += TMath::Power(g3pCorrelatorVsPt->GetBinContent(iBin),2) + TMath::Power(g3pCorrelatorVsPt->GetBinError(iBin),2);
1936 g3pCorrelatorValue = -1000.;
1937 g3pCorrelatorError = 1000.;
1940 g3pCorrelatorValue = gSumXiYi/gSumXi;
1941 if((gSumXi != 0.)&&(gSumXiYi != 0.))
1942 g3pCorrelatorError = TMath::Abs((gSumXiYi/gSumXi))*TMath::Sqrt(TMath::Power((TMath::Sqrt(gSumYi2DeltaXi2)/gSumXiYi),2) + TMath::Power((gSumDeltaXi2/gSumXi),2));
1944 //================================================================================================================