]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWG/FLOW/Base/AliFlowAnalysisWithMultiparticleCorrelations.cxx
Merge branch 'feature-movesplit'
[u/mrichter/AliRoot.git] / PWG / FLOW / Base / AliFlowAnalysisWithMultiparticleCorrelations.cxx
CommitLineData
37d2f768 1/*************************************************************************
2* Copyright(c) 1998-2008, ALICE Experiment at CERN, All rights reserved. *
3* *
4* Author: The ALICE Off-line Project. *
5* Contributors are mentioned in the code where appropriate. *
6* *
7* Permission to use, copy, modify and distribute this software and its *
8* documentation strictly for non-commercial purposes is hereby granted *
9* without fee, provided that the above copyright notice appears in all *
10* copies and that both the copyright notice and this permission notice *
11* appear in the supporting documentation. The authors make no claims *
12* about the suitability of this software for any purpose. It is *
13* provided "as is" without express or implied warranty. *
14**************************************************************************/
15
16 /************************************
17 * flow analysis with multi-particle *
18 * correlations *
19 * *
20 * author: Ante Bilandzic *
21 * (abilandzic@gmail.com) *
22 ************************************/
23
24#define AliFlowAnalysisWithMultiparticleCorrelations_cxx
25
26#include "AliFlowAnalysisWithMultiparticleCorrelations.h"
27
28using std::endl;
29using std::cout;
30using std::flush;
5e2539d9 31using std::ofstream;
32using std::ios;
37d2f768 33
34//================================================================================================================
35
36ClassImp(AliFlowAnalysisWithMultiparticleCorrelations)
37
38AliFlowAnalysisWithMultiparticleCorrelations::AliFlowAnalysisWithMultiparticleCorrelations():
39 // 0.) Base:
40 fHistList(NULL),
7ecb5af4 41 fInternalFlagsPro(NULL),
42 fUseInternalFlags(kFALSE),
43 fMinNoRPs(-44),
44 fMaxNoRPs(-44),
45 fExactNoRPs(-44),
9fba36ea 46 fPropagateError(kTRUE),
4ffd61b4 47 fAnalysisTag(""),
48 fDumpThePoints(kFALSE),
49 fMaxNoEventsPerFile(100),
37d2f768 50 // 1.) Control histograms:
51 fControlHistogramsList(NULL),
7ecb5af4 52 fControlHistogramsFlagsPro(NULL),
9efbd2f5 53 fFillControlHistograms(kFALSE),
54 fFillKinematicsHist(kFALSE),
55 fFillMultDistributionsHist(kFALSE),
56 fFillMultCorrelationsHist(kFALSE),
7ecb5af4 57 // 2.) Q-vector:
9efbd2f5 58 fQvectorList(NULL),
59 fQvectorFlagsPro(NULL),
60 fCalculateQvector(kFALSE),
68a8e667 61 fCalculateDiffQvectors(kFALSE),
7ecb5af4 62 // 3.) Correlations:
63 fCorrelationsList(NULL),
64 fCorrelationsFlagsPro(NULL),
6696a113 65 fCalculateCorrelations(kFALSE),
66 fMaxHarmonic(6), // TBI this shall not be hardwired in the ideal world...
67 fMaxCorrelator(8),
68 fCalculateIsotropic(kFALSE),
69 fCalculateSame(kFALSE),
70 fSkipZeroHarmonics(kFALSE),
71 fCalculateSameIsotropic(kFALSE),
72 fCalculateAll(kFALSE),
73 fDontGoBeyond(0),
68a8e667 74 fCalculateOnlyForHarmonicQC(kFALSE),
75 fCalculateOnlyForSC(kFALSE),
76 fCalculateOnlyCos(kFALSE),
77 fCalculateOnlySin(kFALSE),
78 // 4.) Event-by-event cumulants:
79 fEbECumulantsList(NULL),
80 fEbECumulantsFlagsPro(NULL),
81 fCalculateEbECumulants(kFALSE),
7ecb5af4 82 // 5.) Weights:
83 fWeightsList(NULL),
84 fWeightsFlagsPro(NULL),
7ecb5af4 85 // 6.) Nested loops:
86 fNestedLoopsList(NULL),
87 fNestedLoopsFlagsPro(NULL),
88 fCrossCheckWithNestedLoops(kFALSE),
68a8e667 89 fCrossCheckDiffWithNestedLoops(kFALSE),
7ecb5af4 90 fNestedLoopsResultsCosPro(NULL),
91 fNestedLoopsResultsSinPro(NULL),
68a8e667 92 fNestedLoopsDiffResultsPro(NULL),
7ecb5af4 93 // 7.) 'Standard candles':
94 fStandardCandlesList(NULL),
95 fStandardCandlesFlagsPro(NULL),
96 fCalculateStandardCandles(kFALSE),
68a8e667 97 fPropagateErrorSC(kTRUE),
6d19c373 98 fStandardCandlesHist(NULL),
68a8e667 99 fProductsSCPro(NULL),
100 // 8.) Q-cumulants:
101 fQcumulantsList(NULL),
102 fQcumulantsFlagsPro(NULL),
103 fCalculateQcumulants(kFALSE),
104 fHarmonicQC(2),
105 fPropagateErrorQC(kTRUE),
106 fQcumulantsHist(NULL),
107 fReferenceFlowHist(NULL),
108 fProductsQCPro(NULL),
109 // 9.) Differential correlations:
110 fDiffCorrelationsList(NULL),
111 fDiffCorrelationsFlagsPro(NULL),
112 fCalculateDiffCorrelations(kFALSE),
dd96bd81 113 fCalculateDiffCos(kTRUE),
114 fCalculateDiffSin(kFALSE),
115 fCalculateDiffCorrelationsVsPt(kTRUE),
116 fUseDefaultBinning(kTRUE),
117 fnDiffBins(-44),
118 fRangesDiffBins(NULL),
68a8e667 119 fDiffBinNo(-1)
37d2f768 120 {
121 // Constructor.
122
123 // a) Book grandmother of all lists;
124 // b) Initialize all arrays.
125
126 // a) Book grandmother of all lists:
127 fHistList = new TList();
128 fHistList->SetName("cobjMPC");
129 fHistList->SetOwner(kTRUE);
130
131 // b) Initialize all arrays:
132 this->InitializeArraysForControlHistograms();
7ecb5af4 133 this->InitializeArraysForQvector();
134 this->InitializeArraysForCorrelations();
68a8e667 135 this->InitializeArraysForEbECumulants();
136 this->InitializeArraysForWeights();
137 this->InitializeArraysForQcumulants();
138 this->InitializeArraysForDiffCorrelations();
dd96bd81 139 this->InitializeArraysForNestedLoops();
7ecb5af4 140
37d2f768 141 } // end of AliFlowAnalysisWithMultiparticleCorrelations::AliFlowAnalysisWithMultiparticleCorrelations()
142
143//================================================================================================================
144
145AliFlowAnalysisWithMultiparticleCorrelations::~AliFlowAnalysisWithMultiparticleCorrelations()
146{
147 // Destructor.
148
149 delete fHistList;
150
151} // end of AliFlowAnalysisWithMultiparticleCorrelations::~AliFlowAnalysisWithMultiparticleCorrelations()
152
153//================================================================================================================
154
155void AliFlowAnalysisWithMultiparticleCorrelations::Init()
156{
157 // Well, this is method Init().
158
159 // a) Trick to avoid name clashes, part 1;
160 // b) Cross-check the initial settings before starting this adventure;
161 // c) Book all objects;
162 // d) Set all flags;
163 // *) Trick to avoid name clashes, part 2.
164
165 // a) Trick to avoid name clashes, part 1:
166 Bool_t oldHistAddStatus = TH1::AddDirectoryStatus();
167 TH1::AddDirectory(kFALSE);
168
169 // b) Cross-check the initial settings before starting this adventure:
170 this->CrossCheckSettings();
171
172 // c) Book all objects:
173 this->BookAndNestAllLists();
7ecb5af4 174 this->BookEverythingForBase();
37d2f768 175 this->BookEverythingForControlHistograms();
9efbd2f5 176 this->BookEverythingForQvector();
7ecb5af4 177 this->BookEverythingForWeights();
178 this->BookEverythingForCorrelations();
68a8e667 179 this->BookEverythingForEbECumulants();
7ecb5af4 180 this->BookEverythingForNestedLoops();
181 this->BookEverythingForStandardCandles();
68a8e667 182 this->BookEverythingForQcumulants();
9fba36ea 183 this->BookEverythingForDiffCorrelations();
37d2f768 184
185 // d) Set all flags:
186 // ...
187
188 // *) Trick to avoid name clashes, part 2:
189 TH1::AddDirectory(oldHistAddStatus);
190
191} // end of void AliFlowAnalysisWithMultiparticleCorrelations::Init()
192
193//================================================================================================================
194
195void AliFlowAnalysisWithMultiparticleCorrelations::Make(AliFlowEventSimple *anEvent)
196{
197 // Running over data only in this method.
198
7ecb5af4 199 // a) Cross-check internal flags;
6d19c373 200 // b) Cross-check all pointers used in this method;
201 // c) Fill control histograms;
202 // d) Fill Q-vector components;
203 // e) Calculate multi-particle correlations from Q-vector components;
68a8e667 204 // f) Calculate e-b-e cumulants;
205 // g) Reset Q-vector components;
4ffd61b4 206 // h) Cross-check results with nested loops;
207 // i) Dump the points.
7ecb5af4 208
209 // a) Cross-check internal flags:
210 if(fUseInternalFlags){if(!this->CrossCheckInternalFlags(anEvent)){return;}}
211
6d19c373 212 // b) Cross-check all pointers used in this method:
68a8e667 213 this->CrossCheckPointersUsedInMake(); // TBI shall I call this method first
6d19c373 214
215 // c) Fill control histograms:
7ecb5af4 216 if(fFillControlHistograms){this->FillControlHistograms(anEvent);}
37d2f768 217
6d19c373 218 // d) Fill Q-vector components:
68a8e667 219 if(fCalculateQvector||fCalculateDiffQvectors){this->FillQvector(anEvent);}
7ecb5af4 220
6d19c373 221 // e) Calculate multi-particle correlations from Q-vector components:
6696a113 222 if(fCalculateCorrelations){this->CalculateCorrelations(anEvent);}
68a8e667 223 if(fCalculateDiffCorrelations){this->CalculateDiffCorrelations(anEvent);}
7ecb5af4 224
68a8e667 225 // f) Calculate e-b-e cumulants:
226 if(fCalculateEbECumulants){this->CalculateEbECumulants(anEvent);}
6d19c373 227
68a8e667 228 // g) Reset Q-vector components:
229 if(fCalculateQvector||fCalculateDiffQvectors){this->ResetQvector();}
7ecb5af4 230
68a8e667 231 // h) Cross-check results with nested loops:
7ecb5af4 232 if(fCrossCheckWithNestedLoops){this->CrossCheckWithNestedLoops(anEvent);}
68a8e667 233 if(fCrossCheckDiffWithNestedLoops){this->CrossCheckDiffWithNestedLoops(anEvent);}
7ecb5af4 234
4ffd61b4 235 // i) Dump the points:
236 if(fDumpThePoints){this->DumpThePoints(anEvent);}
237
37d2f768 238} // end of AliFlowAnalysisWithMultiparticleCorrelations::Make(AliFlowEventSimple *anEvent)
239
240//=======================================================================================================================
241
242void AliFlowAnalysisWithMultiparticleCorrelations::Finish()
243{
7ecb5af4 244 // Closing the curtains.
245
6696a113 246 // a) Cross-check pointers used in this method;
68a8e667 247 // b) Calculate 'standard candles';
248 // c) Calculate Q-cumulants.
6696a113 249
250 // a) Cross-check pointers used in this method:
251 this->CrossCheckPointersUsedInFinish();
7ecb5af4 252
253 // b) Calculate 'standard candles':
254 if(fCalculateStandardCandles){this->CalculateStandardCandles();}
255
68a8e667 256 // c) Calculate Q-cumulants:
257 if(fCalculateQcumulants){this->CalculateQcumulants();this->CalculateReferenceFlow();}
258
37d2f768 259 // ...
68a8e667 260
6d19c373 261 printf("\n ... Closing the curtains ... \n\n");
37d2f768 262
263} // end of AliFlowAnalysisWithMultiparticleCorrelations::Finish()
264
265//=======================================================================================================================
266
6696a113 267void AliFlowAnalysisWithMultiparticleCorrelations::CrossCheckPointersUsedInFinish()
268{
269 // Cross-check all pointers used in method Finish().
270
6d19c373 271 // a) Correlations;
68a8e667 272 // b) 'Standard candles';
273 // c) Q-cumulants.
6d19c373 274
275 TString sMethodName = "AliFlowAnalysisWithMultiparticleCorrelations::CrossCheckPointersUsedInFinish()";
276
277 // a) Correlations:
278 if(fCalculateCorrelations)
6696a113 279 {
6d19c373 280 for(Int_t cs=0;cs<2;cs++)
281 {
68a8e667 282 if(fCalculateOnlyCos && 1==cs){continue;}
283 else if(fCalculateOnlySin && 0==cs){continue;}
6d19c373 284 for(Int_t c=0;c<fMaxCorrelator;c++)
285 {
03823be7 286 if(c==fDontGoBeyond){continue;}
287 if(fCalculateOnlyForHarmonicQC && c%2==0){continue;}
6d19c373 288 if(!fCorrelationsPro[cs][c]){Fatal(sMethodName.Data(),"fCorrelationsPro[%d][%d] is NULL, for one reason or another...",cs,c);}
289 }
290 }
68a8e667 291 if(fCalculateQcumulants && fPropagateErrorQC && !fProductsQCPro)
292 {Fatal(sMethodName.Data(),"fCalculateQcumulants && fPropagateErrorQC && !fProductsQCPro");}
6d19c373 293 } // if(fCalculateCorrelations)
294
295 // b) 'Standard candles':
296 if(fCalculateStandardCandles)
297 {
298 if(!fStandardCandlesHist){Fatal(sMethodName.Data(),"fStandardCandlesHist is NULL, for one reason or another...");}
68a8e667 299 if(fPropagateErrorSC)
300 {
301 if(!fProductsSCPro){Fatal(sMethodName.Data(),"fProductsSCPro is NULL, for one reason or another...");}
302 }
6d19c373 303 } // if(fCalculateStandardCandles)
6696a113 304
68a8e667 305 // c) Q-cumulants:
306 if(fCalculateQcumulants)
307 {
308 if(!fQcumulantsHist){Fatal(sMethodName.Data(),"fQcumulantsHist is NULL, for one reason or another...");}
309 if(!fReferenceFlowHist){Fatal(sMethodName.Data(),"fReferenceFlowHist is NULL, for one reason or another...");}
310 if(fPropagateErrorQC)
311 {
312 if(!fProductsQCPro){Fatal(sMethodName.Data(),"fProductsQCPro is NULL, for one reason or another...");}
313 }
314 } // if(fCalculateQcumulants)
315
6696a113 316} // void AliFlowAnalysisWithMultiparticleCorrelations::CrossCheckPointersUsedInFinish()
317
318//=======================================================================================================================
319
6d19c373 320void AliFlowAnalysisWithMultiparticleCorrelations::CrossCheckPointersUsedInMake()
321{
322 // Cross-check all pointers used in method Make().
323
324 // a) Correlations;
68a8e667 325 // b) Event-by-event cumulants;
326 // c) ...
6d19c373 327
328 TString sMethodName = "AliFlowAnalysisWithMultiparticleCorrelations::CrossCheckPointersUsedInMake()";
329
330 // a) Correlations:
331 if(fCalculateCorrelations)
332 {
333 for(Int_t cs=0;cs<2;cs++)
334 {
68a8e667 335 if(fCalculateOnlyCos && 1==cs){continue;}
336 else if(fCalculateOnlySin && 0==cs){continue;}
6d19c373 337 for(Int_t c=0;c<fMaxCorrelator;c++)
338 {
03823be7 339 if(c==fDontGoBeyond){continue;}
340 if(fCalculateOnlyForHarmonicQC && c%2==0){continue;}
6d19c373 341 if(!fCorrelationsPro[cs][c]){Fatal(sMethodName.Data(),"fCorrelationsPro[%d][%d] is NULL, for one reason or another...",cs,c);}
342 }
343 }
68a8e667 344 if(fCalculateQcumulants && fPropagateErrorQC && !fProductsQCPro)
345 {Fatal(sMethodName.Data(),"fCalculateQcumulants && fPropagateErrorQC && !fProductsQCPro");}
6d19c373 346 } // if(fCalculateCorrelations)
347
68a8e667 348 // b) Event-by-event cumulants:
349 if(fCalculateEbECumulants)
6d19c373 350 {
68a8e667 351 for(Int_t cs=0;cs<2;cs++)
352 {
353 for(Int_t c=0;c<fMaxCorrelator;c++)
354 {
355 if(!fEbECumulantsPro[cs][c]){Fatal(sMethodName.Data(),"fEbECumulantsPro[%d][%d] is NULL, for one reason or another...",cs,c);}
356 }
357 }
358 } // if(fCalculateEbECumulants)
6d19c373 359
360} // void AliFlowAnalysisWithMultiparticleCorrelations::CrossCheckPointersUsedInMake()
361
362//=======================================================================================================================
363
7ecb5af4 364void AliFlowAnalysisWithMultiparticleCorrelations::CalculateStandardCandles()
365{
9efbd2f5 366 // Calculate 'standard candles'.
367
6d19c373 368 // 'Standard candle' (SC) is defined in terms of average (all-event!) correlations as follows:
369 // SC(-n1,-n2,n2,n1) = <<Cos(-n1,-n2,n2,n1)>> - <<Cos(-n1,n1)>>*<<Cos(-n2,n2)>>, n1 > n2.
370
9efbd2f5 371 TString sMethodName = "AliFlowAnalysisWithMultiparticleCorrelations::CalculateStandardCandles()";
372
68a8e667 373 Int_t nBins = fStandardCandlesHist->GetNbinsX();
374 Int_t nBins2p = fCorrelationsPro[0][1]->GetNbinsX();
375 Int_t nBins4p = fCorrelationsPro[0][3]->GetNbinsX();
376 for(Int_t b=1;b<=nBins;b++)
6d19c373 377 {
68a8e667 378 // Standard candle:
379 Double_t dSCn1n2n2n1 = 0.; // SC(-n1,-n2,n2,n1)
380 Double_t dSCn1n2n2n1Err = 0.; // SC(-n1,-n2,n2,n1) stat. error
9fba36ea 381 fPropagateError = kTRUE;
382
68a8e667 383 // Correlations:
384 Double_t dCosn1n2n2n1 = 0.; // <<Cos(-n1,-n2,n2,n1)>>
385 Double_t dCosn1n2n2n1Err = 0.; // <<Cos(-n1,-n2,n2,n1)>> stat. error
6d19c373 386 Double_t dCosn1n1 = 0.; // <<Cos(-n1,n1)>>
68a8e667 387 Double_t dCosn1n1Err = 0.; // <<Cos(-n1,n1)>> stat. error
388 Double_t dCosn2n2 = 0.; // <<Cos(-n2,n2)>>
389 Double_t dCosn2n2Err = 0.; // <<Cos(-n2,n2)>> stat. error
390
391 // Labels:
392 TString labeln1n2n2n1 = TString(fStandardCandlesHist->GetXaxis()->GetBinLabel(b)).ReplaceAll("SC","Cos");
393 TString n1 = TString(fStandardCandlesHist->GetXaxis()->GetBinLabel(b))(4);
394 TString n2 = TString(fStandardCandlesHist->GetXaxis()->GetBinLabel(b))(7);
395 if(n1.EqualTo("-") || n1.EqualTo(",")){Fatal(sMethodName.Data(),"n1.EqualTo...");}
396 if(n2.EqualTo("-") || n2.EqualTo(",")){Fatal(sMethodName.Data(),"n2.EqualTo...");}
397 TString labeln1n1 = Form("Cos(-%s,%s)",n1.Data(),n1.Data());
398 TString labeln2n2 = Form("Cos(-%s,%s)",n2.Data(),n2.Data());
399 //cout<<labeln1n2n2n1.Data()<<endl;
400 //cout<<labeln1n1.Data()<<endl;
401 //cout<<labeln2n2.Data()<<endl;
402 //cout<<endl;
403
404 // Access <<Cos(-n1,-n2,n2,n1)>>:
405 for(Int_t b4p=1;b4p<=nBins4p;b4p++)
6d19c373 406 {
68a8e667 407 if(labeln1n2n2n1.EqualTo(fCorrelationsPro[0][3]->GetXaxis()->GetBinLabel(b4p)))
6d19c373 408 {
68a8e667 409 //cout<<labeln1n2n2n1.Data()<<endl;
410 dCosn1n2n2n1 = fCorrelationsPro[0][3]->GetBinContent(b4p);
411 dCosn1n2n2n1Err = fCorrelationsPro[0][3]->GetBinError(b4p);
412 break;
413 }
414 } // for(Int_t b4p=1;b4p<=nBins4p;b4p++)
dd96bd81 415 if(TMath::Abs(dCosn1n2n2n1) < 1.e-44)
416 {
417 cout<<Form("labeln1n2n2n1 = %s",labeln1n2n2n1.Data())<<endl;
418 Warning(sMethodName.Data(),"TMath::Abs(dCosn1n2n2n1) < 1.e-44 !!!!");
419 }
6d19c373 420
68a8e667 421 // Access <<Cos(-n1,n1)>> and <<Cos(-n2,n2)>>:
422 for(Int_t b2p=1;b2p<=nBins2p;b2p++)
6d19c373 423 {
68a8e667 424 if(labeln1n1.EqualTo(fCorrelationsPro[0][1]->GetXaxis()->GetBinLabel(b2p)))
6d19c373 425 {
68a8e667 426 //cout<<labeln1n1.Data()<<endl;
427 dCosn1n1 = fCorrelationsPro[0][1]->GetBinContent(b2p);
428 dCosn1n1Err = fCorrelationsPro[0][1]->GetBinError(b2p);
429 }
430 else if(labeln2n2.EqualTo(fCorrelationsPro[0][1]->GetXaxis()->GetBinLabel(b2p)))
6d19c373 431 {
68a8e667 432 //cout<<labeln2n2.Data()<<endl;
433 dCosn2n2 = fCorrelationsPro[0][1]->GetBinContent(b2p);
434 dCosn2n2Err = fCorrelationsPro[0][1]->GetBinError(b2p);
435 }
436 if(TMath::Abs(dCosn1n1) > 0. && TMath::Abs(dCosn2n2) > 0.){break;} // found 'em both!
437 } // for(Int_t b2p=1;b2p<=nBins2p;b2p++)
dd96bd81 438 if(TMath::Abs(dCosn1n1) < 1.e-44)
439 {
440 cout<<Form("labeln1n1 = %s",labeln1n1.Data())<<endl;
441 Warning(sMethodName.Data(),"TMath::Abs(dCosn1n1) < 1.e-44 !!!!");
442 }
443 if(TMath::Abs(dCosn2n2) < 1.e-44)
444 {
445 cout<<Form("labeln2n2 = %s",labeln2n2.Data())<<endl;
446 Warning(sMethodName.Data(),"TMath::Abs(dCosn2n2) < 1.e-44 !!!!");
447 }
68a8e667 448
449 // Calculate standard candles:
450 dSCn1n2n2n1 = dCosn1n2n2n1-dCosn1n1*dCosn2n2;
451
452 // Store the final results:
453 fStandardCandlesHist->SetBinContent(b,dSCn1n2n2n1);
454
455 // Error propagation:
456 if(!fPropagateErrorSC)
457 {
458 fStandardCandlesHist->SetBinError(b,0.);
459 continue;
460 }
461
462 // Access covariances (multiplied by weight dependent prefactor):
463 Double_t wCovCosn1n2n2n1Cosn1n1 = Covariance(labeln1n2n2n1.Data(),labeln1n1.Data(),fProductsSCPro); // weighted Cov(<Cos(-n1,-n2,n2,n1)>,<Cos(-n1,n1)>)
464 Double_t wCovCosn1n2n2n1Cosn2n2 = Covariance(labeln1n2n2n1.Data(),labeln2n2.Data(),fProductsSCPro); // weighted Cov(<Cos(-n1,-n2,n2,n1)>,<Cos(-n2,n2)>)
465 Double_t wCovCosn1n1Cosn2n2 = Covariance(labeln1n1.Data(),labeln2n2.Data(),fProductsSCPro); // weighted Cov(<Cos(-n1,n1)>,<Cos(-n2,n2)>)
466
467 // Explicit error propagation:
468 Double_t dSCn1n2n2n1ErrSquared = pow(dCosn1n1,2.)*pow(dCosn2n2Err,2.) + pow(dCosn2n2,2.)*pow(dCosn1n1Err,2.)
469 + pow(dCosn1n2n2n1Err,2.) + 2.*dCosn1n1*dCosn2n2*wCovCosn1n1Cosn2n2
470 - 2.*dCosn1n1*wCovCosn1n2n2n1Cosn2n2 - 2.*dCosn2n2*wCovCosn1n2n2n1Cosn1n1;
471 if(dSCn1n2n2n1ErrSquared > 0.)
472 {
473 dSCn1n2n2n1Err = pow(dSCn1n2n2n1ErrSquared,0.5);
9fba36ea 474 } else
475 {
476 Warning(sMethodName.Data(),"dSCn1n2n2n1ErrSquared > 0. is not satisfied for %s !!!!",labeln1n2n2n1.ReplaceAll("Cos","SC").Data());
477 fPropagateError = kFALSE;
478 }
68a8e667 479
480 // Store the final stat. error:
9fba36ea 481 if(fPropagateError)
482 {
483 fStandardCandlesHist->SetBinError(b,dSCn1n2n2n1Err);
484 }
68a8e667 485 } // for(Int_t b=1;b<=nBins;b++)
486
9fba36ea 487 fPropagateError = kTRUE;
488
68a8e667 489 return;
7ecb5af4 490
491} // void AliFlowAnalysisWithMultiparticleCorrelations::CalculateStandardCandles()
492
493//=======================================================================================================================
494
495void AliFlowAnalysisWithMultiparticleCorrelations::InitializeArraysForCorrelations()
496{
497 // Initialize all arrays for correlations.
498
6696a113 499 for(Int_t cs=0;cs<2;cs++) // [0=cos,1=sin]
7ecb5af4 500 {
6696a113 501 for(Int_t c=0;c<8;c++) // [1p,2p,...,8p]
502 {
503 fCorrelationsPro[cs][c] = NULL;
504 }
7ecb5af4 505 }
506
507} // void AliFlowAnalysisWithMultiparticleCorrelations::InitializeArraysForCorrelations()
508
509//=======================================================================================================================
510
68a8e667 511void AliFlowAnalysisWithMultiparticleCorrelations::InitializeArraysForEbECumulants()
512{
513 // Initialize all arrays for event-by-event cumulants.
514
515 for(Int_t cs=0;cs<2;cs++) // [0=cos,1=sin]
516 {
517 for(Int_t c=0;c<8;c++) // [1p,2p,...,8p]
518 {
519 fEbECumulantsPro[cs][c] = NULL;
520 }
521 }
522
523} // void AliFlowAnalysisWithMultiparticleCorrelations::InitializeArraysForEbECumulants()
524
525//=======================================================================================================================
526
527void AliFlowAnalysisWithMultiparticleCorrelations::InitializeArraysForDiffCorrelations()
528{
529 // Initialize all arrays for differential correlations.
530
531 for(Int_t cs=0;cs<2;cs++) // [0=cos,1=sin]
532 {
533 for(Int_t c=0;c<4;c++) // [1p,2p,3p,4p]
534 {
535 fDiffCorrelationsPro[cs][c] = NULL;
536 fDiffHarmonics[cs][c] = 0;
537 }
538 }
539
540 // Default values:
541 // Cos, 2p:
542 fDiffHarmonics[1][0] = -2;
543 fDiffHarmonics[1][1] = 2;
544 // Cos, 3p:
545 fDiffHarmonics[2][0] = -3;
546 fDiffHarmonics[2][1] = 1;
547 fDiffHarmonics[2][2] = 2;
548 // Cos, 4p:
549 fDiffHarmonics[3][0] = -2;
550 fDiffHarmonics[3][1] = -2;
551 fDiffHarmonics[3][2] = 2;
552 fDiffHarmonics[3][3] = 2;
553
554} // void AliFlowAnalysisWithMultiparticleCorrelations::InitializeArraysForDiffCorrelations()
555
556//=======================================================================================================================
557
dd96bd81 558void AliFlowAnalysisWithMultiparticleCorrelations::InitializeArraysForNestedLoops()
559{
560 // Initialize all arrays for nested loops.
561
562 fCrossCheckDiffCSCOBN[0] = 0; // cos/sin
563 fCrossCheckDiffCSCOBN[1] = 2; // correlator order
564 fCrossCheckDiffCSCOBN[2] = 4; // bin number
565
566} // void AliFlowAnalysisWithMultiparticleCorrelations::InitializeArraysForNestedLoops()
567
568//=======================================================================================================================
569
6696a113 570void AliFlowAnalysisWithMultiparticleCorrelations::CalculateCorrelations(AliFlowEventSimple *anEvent)
7ecb5af4 571{
572 // Calculate multi-particle correlations from Q-vector components.
573
68a8e667 574 // a) Calculate all booked multi-particle correlations;
575 // b) Calculate products needed for QC error propagation;
576 // c) Calculate products needed for SC error propagation.
7ecb5af4 577
68a8e667 578 TString sMethodName = "AliFlowAnalysisWithMultiparticleCorrelations::CalculateCorrelations(AliFlowEventSimple *anEvent)";
579 if(!anEvent){Fatal(sMethodName.Data(),"'anEvent'!?!? You again!!!!");}
6d19c373 580
68a8e667 581 // a) Calculate all booked multi-particle correlations:
6696a113 582 Double_t dMultRP = anEvent->GetNumberOfRPs(); // TBI shall I promote this variable into data member?
68a8e667 583 for(Int_t cs=0;cs<2;cs++) // cos/sin
584 {
585 if(fCalculateOnlyCos && 1==cs){continue;}
586 else if(fCalculateOnlySin && 0==cs){continue;}
587 for(Int_t co=0;co<8;co++) // correlator order (TBI hardwired 8)
588 {
589 if(dMultRP < co+1){break;} // defines min. number of particles in an event for a certain correlator to make sense
590 Int_t nBins = 0;
591 if(fCorrelationsPro[cs][co]){nBins = fCorrelationsPro[cs][co]->GetNbinsX();}
592 else{continue;}
593 for(Int_t b=1;b<=nBins;b++)
594 {
595 TString sBinLabel = fCorrelationsPro[cs][co]->GetXaxis()->GetBinLabel(b);
596 if(sBinLabel.EqualTo("")){break;}
597 Double_t num = CastStringToCorrelation(sBinLabel.Data(),kTRUE);
598 Double_t den = CastStringToCorrelation(sBinLabel.Data(),kFALSE);
599 Double_t weight = den; // TBI: add support for other options for the weight eventually
600 if(den>0.)
601 {
602 fCorrelationsPro[cs][co]->Fill(b-.5,num/den,weight);
603 } else{Warning(sMethodName.Data(),"if(den>0.)");}
604 } // for(Int_t b=1;b<=nBins;b++)
605 } // for(Int_t co=0;co<8;co++) // correlator order (TBI hardwired 8)
606 } // for(Int_t cs=0;cs<=1;cs++) // cos/sin
607
608 // b) Calculate products needed for QC error propagation:
609 if(fCalculateQcumulants && fPropagateErrorQC){this->CalculateProductsOfCorrelations(anEvent,fProductsQCPro);}
610
611 // c) Calculate products needed for SC error propagation:
612 if(fCalculateStandardCandles && fPropagateErrorSC){this->CalculateProductsOfCorrelations(anEvent,fProductsSCPro);}
613
614} // void AliFlowAnalysisWithMultiparticleCorrelations::CalculateCorrelations(AliFlowEventSimple *anEvent)
615
616//=======================================================================================================================
617
618void AliFlowAnalysisWithMultiparticleCorrelations::CalculateDiffCorrelations(AliFlowEventSimple *anEvent)
619{
620 // Calculate differential multi-particle correlations from Q-, p- and q-vector components.
621
622 TString sMethodName = "AliFlowAnalysisWithMultiparticleCorrelations::CalculateCorrelations(AliFlowEventSimple *anEvent)";
623 if(!anEvent){Fatal(sMethodName.Data(),"'anEvent'!?!? You again!!!!");}
624
625 Int_t nBins = 0; // TBI promote this to data member?
626 for(Int_t cs=0;cs<2;cs++) // [0=cos,1=sin]
627 {
628 if(nBins != 0){break;}
629 for(Int_t co=0;co<4;co++) // [1p,2p,3p,4p]
630 {
631 if(fDiffCorrelationsPro[cs][co] && 0==nBins)
632 {
633 nBins = fDiffCorrelationsPro[cs][co]->GetNbinsX();
634 }
635 } // for(Int_t co=0;co<4;co++) // [1p,2p,3p,4p]
636 } // for(Int_t cs=0;cs<2;cs++) // [0=cos,1=sin]
637
638 // TBI: The lines below are genuine, most delicious, spaghetti ever... To be reimplemented (one day).
dd96bd81 639 if(fCalculateDiffCos)
640 {
68a8e667 641 for(Int_t b=1;b<=nBins;b++)
642 {
643 fDiffBinNo = b-1;
644 // <2'>:
645 Double_t num2 = TwoDiff(fDiffHarmonics[1][0],fDiffHarmonics[1][1]).Re();
646 Double_t den2 = TwoDiff(0,0).Re();
647 Double_t w2 = den2; // TBI add support for other options for the weight
648 if(den2>0.){fDiffCorrelationsPro[0][1]->Fill(fDiffCorrelationsPro[0][1]->GetBinCenter(b),num2/den2,w2);}
649 // <3'>:
650 Double_t num3 = ThreeDiff(fDiffHarmonics[2][0],fDiffHarmonics[2][1],fDiffHarmonics[2][2]).Re();
651 Double_t den3 = ThreeDiff(0,0,0).Re();
652 Double_t w3 = den3; // TBI add support for other options for the weight
653 if(den3>0.){fDiffCorrelationsPro[0][2]->Fill(fDiffCorrelationsPro[0][2]->GetBinCenter(b),num3/den3,w3);}
654 // <4'>:
655 Double_t num4 = FourDiff(fDiffHarmonics[3][0],fDiffHarmonics[3][1],fDiffHarmonics[3][2],fDiffHarmonics[3][3]).Re();
656 Double_t den4 = FourDiff(0,0,0,0).Re();
657 Double_t w4 = den4; // TBI add support for other options for the weight
658 if(den4>0.){fDiffCorrelationsPro[0][3]->Fill(fDiffCorrelationsPro[0][3]->GetBinCenter(b),num4/den4,w4);}
659 } // for(Int_t b=1;b<=nBins;b++)
dd96bd81 660 }
661 // TBI: The lines below are genuine, most delicious, spaghetti ever... To be reimplemented (one day).
662 if(fCalculateDiffSin)
663 {
664 for(Int_t b=1;b<=nBins;b++)
665 {
666 fDiffBinNo = b-1;
667 // <2'>:
668 Double_t num2 = TwoDiff(fDiffHarmonics[1][0],fDiffHarmonics[1][1]).Im();
669 Double_t den2 = TwoDiff(0,0).Re();
670 Double_t w2 = den2; // TBI add support for other options for the weight
671 if(den2>0.){fDiffCorrelationsPro[1][1]->Fill(fDiffCorrelationsPro[1][1]->GetBinCenter(b),num2/den2,w2);}
672 // <3'>:
673 Double_t num3 = ThreeDiff(fDiffHarmonics[2][0],fDiffHarmonics[2][1],fDiffHarmonics[2][2]).Im();
674 Double_t den3 = ThreeDiff(0,0,0).Re();
675 Double_t w3 = den3; // TBI add support for other options for the weight
676 if(den3>0.){fDiffCorrelationsPro[1][2]->Fill(fDiffCorrelationsPro[1][2]->GetBinCenter(b),num3/den3,w3);}
677 // <4'>:
678 Double_t num4 = FourDiff(fDiffHarmonics[3][0],fDiffHarmonics[3][1],fDiffHarmonics[3][2],fDiffHarmonics[3][3]).Im();
679 Double_t den4 = FourDiff(0,0,0,0).Re();
680 Double_t w4 = den4; // TBI add support for other options for the weight
681 if(den4>0.){fDiffCorrelationsPro[1][3]->Fill(fDiffCorrelationsPro[1][3]->GetBinCenter(b),num4/den4,w4);}
682 } // for(Int_t b=1;b<=nBins;b++)
683 }
68a8e667 684
685} // void AliFlowAnalysisWithMultiparticleCorrelations::CalculateDiffCorrelations(AliFlowEventSimple *anEvent)
686
687//=======================================================================================================================
688
689Double_t AliFlowAnalysisWithMultiparticleCorrelations::CastStringToCorrelation(const char *string, Bool_t numerator)
690{
691 // Cast string of the generic form Cos/Sin(-n_1,-n_2,...,n_{k-1},n_k) in the corresponding correlation value.
692 // If you issue a call to this method with setting numerator = kFALSE, then you are getting back for free
693 // the corresponding denumerator (a.k.a. weight 'number of combinations').
694
695 // TBI:
696 // a) add protection against cases a la:
697 // string = Cos(-3,-4,5,6,5,6,-3)
698 // method = Six(-3,-4,5,6,5,-3).Re()
699 // b) cross-check with nested loops this method
700
701 Double_t dValue = 0.; // return value
702
703 TString sMethodName = "AliFlowAnalysisWithMultiparticleCorrelations::CastStringToCorrelation(const char *string, Bool_t numerator)";
704
705 if(!(TString(string).BeginsWith("Cos") || TString(string).BeginsWith("Sin")))
706 {
707 cout<<Form("And the fatal string is... '%s'. Congratulations!!",string)<<endl;
708 Fatal(sMethodName.Data(),"!(TString(string).BeginsWith(...");
709 }
710
711 Bool_t bRealPart = kTRUE;
712 if(TString(string).BeginsWith("Sin")){bRealPart = kFALSE;}
713
714 Int_t n[8] = {0,0,0,0,0,0,0,0}; // harmonics, supporting up to 8p correlations
715 UInt_t whichCorr = 0;
716 for(Int_t t=0;t<=TString(string).Length();t++)
717 {
718 if(TString(string[t]).EqualTo(",") || TString(string[t]).EqualTo(")")) // TBI this is just ugly
719 {
720 n[whichCorr] = string[t-1] - '0';
721 if(TString(string[t-2]).EqualTo("-")){n[whichCorr] = -1*n[whichCorr];}
722 if(!(TString(string[t-2]).EqualTo("-")
723 || TString(string[t-2]).EqualTo(",")
724 || TString(string[t-2]).EqualTo("("))) // TBI relax this eventually to allow two-digits harmonics
725 {
726 cout<<Form("And the fatal string is... '%s'. Congratulations!!",string)<<endl;
727 Fatal(sMethodName.Data(),"!(TString(string[t-2]).EqualTo(...");
728 }
729 whichCorr++;
730 if(whichCorr>=9){Fatal(sMethodName.Data(),"whichCorr>=9");} // not supporting corr. beyond 8p
731 } // if(TString(string[t]).EqualTo(",") || TString(string[t]).EqualTo(")")) // TBI this is just ugly
732 } // for(UInt_t t=0;t<=TString(string).Length();t++)
733
734 switch(whichCorr)
735 {
736 case 1:
737 if(!numerator){dValue = One(0).Re();}
738 else if(bRealPart){dValue = One(n[0]).Re();}
739 else{dValue = One(n[0]).Im();}
740 break;
741
742 case 2:
743 if(!numerator){dValue = Two(0,0).Re();}
744 else if(bRealPart){dValue = Two(n[0],n[1]).Re();}
745 else{dValue = Two(n[0],n[1]).Im();}
746 break;
747
748 case 3:
749 if(!numerator){dValue = Three(0,0,0).Re();}
750 else if(bRealPart){dValue = Three(n[0],n[1],n[2]).Re();}
751 else{dValue = Three(n[0],n[1],n[2]).Im();}
752 break;
753
754 case 4:
755 if(!numerator){dValue = Four(0,0,0,0).Re();}
756 else if(bRealPart){dValue = Four(n[0],n[1],n[2],n[3]).Re();}
757 else{dValue = Four(n[0],n[1],n[2],n[3]).Im();}
758 break;
759
760 case 5:
761 if(!numerator){dValue = Five(0,0,0,0,0).Re();}
762 else if(bRealPart){dValue = Five(n[0],n[1],n[2],n[3],n[4]).Re();}
763 else{dValue = Five(n[0],n[1],n[2],n[3],n[4]).Im();}
764 break;
765
766 case 6:
767 if(!numerator){dValue = Six(0,0,0,0,0,0).Re();}
768 else if(bRealPart){dValue = Six(n[0],n[1],n[2],n[3],n[4],n[5]).Re();}
769 else{dValue = Six(n[0],n[1],n[2],n[3],n[4],n[5]).Im();}
770 break;
771
772 case 7:
773 if(!numerator){dValue = Seven(0,0,0,0,0,0,0).Re();}
774 else if(bRealPart){dValue = Seven(n[0],n[1],n[2],n[3],n[4],n[5],n[6]).Re();}
775 else{dValue = Seven(n[0],n[1],n[2],n[3],n[4],n[5],n[6]).Im();}
776 break;
777
778 case 8:
779 if(!numerator){dValue = Eight(0,0,0,0,0,0,0,0).Re();}
780 else if(bRealPart){dValue = Eight(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7]).Re();}
781 else{dValue = Eight(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7]).Im();}
782 break;
783
784 default:
785 cout<<Form("And the fatal 'whichCorr' value is... %d. Congratulations!!",whichCorr)<<endl;
786 Fatal(sMethodName.Data(),"switch(whichCorr)");
787 } // switch(whichCorr)
788
789 return dValue;
790
791} // Double_t AliFlowAnalysisWithMultiparticleCorrelations::CastStringToCorrelation(const char *string, Bool_t numerator)
792
793//=======================================================================================================================
794
795void AliFlowAnalysisWithMultiparticleCorrelations::CalculateProductsOfCorrelations(AliFlowEventSimple *anEvent, TProfile2D *profile2D)
796{
797 // Calculate products of multi-particle correlations (needed for error propagation).
798
799 TString sMethodName = "AliFlowAnalysisWithMultiparticleCorrelations::CalculateProductsOfCorrelations(AliFlowEventSimple *anEvent, TProfile2D *profile2D)";
800 if(!anEvent){Fatal(sMethodName.Data(),"Sorry, 'anEvent' is on holidays.");}
801 if(!profile2D){Fatal(sMethodName.Data(),"Sorry, 'profile2D' is on holidays.");}
802
803 Int_t nBins = profile2D->GetXaxis()->GetNbins();
804 for(Int_t bx=2;bx<=nBins;bx++)
805 {
806 for(Int_t by=1;by<bx;by++)
807 {
808 const char *binLabelX = profile2D->GetXaxis()->GetBinLabel(bx);
809 const char *binLabelY = profile2D->GetYaxis()->GetBinLabel(by);
810 Double_t numX = this->CastStringToCorrelation(binLabelX,kTRUE); // numerator
811 Double_t denX = this->CastStringToCorrelation(binLabelX,kFALSE); // denominator
812 Double_t wX = denX; // weight TBI add support for other options
813 Double_t numY = this->CastStringToCorrelation(binLabelY,kTRUE); // numerator
814 Double_t denY = this->CastStringToCorrelation(binLabelY,kFALSE); // denominator
815 Double_t wY = denY; // weight TBI add support for other options
816 if(TMath::Abs(denX) > 0. && TMath::Abs(denY) > 0.)
817 {
818 profile2D->Fill(bx-0.5,by-0.5,(numX/denX)*(numY/denY),wX*wY);
dd96bd81 819 } else
820 {
821 cout<<endl;
822 cout<<"Cannot calculate product for:"<<endl;
823 cout<<Form("binLabelX = %s",binLabelX)<<endl;
824 cout<<Form("binLabelY = %s",binLabelY)<<endl;
825 cout<<Form("anEvent->GetNumberOfRPs() = %d",anEvent->GetNumberOfRPs())<<endl;
826 Fatal(sMethodName.Data(),"if(TMath::Abs(denX) > 0. && TMath::Abs(denY) > 0.)");
827 } // else
68a8e667 828 } // for(Int_t by=1;by<bx;by++)
829 } // for(Int_t bx=2;bx<=nBins;bx++)
830
831} // void CalculateProductsOfCorrelations(AliFlowEventSimple *anEvent, TProfile2D *profile2D)
832
833//=======================================================================================================================
7ecb5af4 834
68a8e667 835void AliFlowAnalysisWithMultiparticleCorrelations::CalculateEbECumulants(AliFlowEventSimple *anEvent)
836{
837 // Calculate e-b-e cumulants from Q-vector components.
838
839 // TBI this mathod is far (very far, in fact) from being finalized :'(
840
841 // a) Calculate and store e-b-e cumulants.
842
843 TString sMethodName = "AliFlowAnalysisWithMultiparticleCorrelations::CalculateEbECumulants(AliFlowEventSimple *anEvent)";
844 if(!anEvent){Fatal(sMethodName.Data(),"'anEvent'!?!? You again!!!!");}
845
846 // a) Calculate and store e-b-e cumulants:
847 Double_t dMultRP = anEvent->GetNumberOfRPs(); // TBI shall I promote this variable into data member?
6696a113 848 Int_t binNo[8]; for(Int_t c=0;c<8;c++){binNo[c]=1;}
849 // 1-p:
850 for(Int_t n1=-fMaxHarmonic;n1<=fMaxHarmonic;n1++)
7ecb5af4 851 {
6696a113 852 if(fSkipZeroHarmonics && 0==n1){continue;}
853 if(fCalculateAll)
7ecb5af4 854 {
6696a113 855 TComplex oneN = One(n1); // numerator
856 Double_t oneD = One(0).Re(); // denominator
857 Double_t oneW = oneD; // weight TBI add other possibilities here for the weight
858 if(oneD>0. && dMultRP>=1)
859 {
68a8e667 860 fEbECumulantsPro[0][0]->Fill(binNo[0]-.5,oneN.Re()/oneD,oneW);
861 fEbECumulantsPro[1][0]->Fill(binNo[0]++-.5,oneN.Im()/oneD,oneW);
6696a113 862 } else {Warning(sMethodName.Data(),"if(oneD>0. && dMultRP>=1) ");}
863 }
864 if(1==fDontGoBeyond){continue;}
865 // 2-p:
866 for(Int_t n2=n1;n2<=fMaxHarmonic;n2++)
7ecb5af4 867 {
6696a113 868 if(fSkipZeroHarmonics && 0==n2){continue;}
869 if(fCalculateAll
870 || (fCalculateIsotropic && 0==n1+n2)
871 || (fCalculateSame && TMath::Abs(n1)==TMath::Abs(n2))
872 || (fCalculateSameIsotropic && 0==n1+n2 && TMath::Abs(n1)==TMath::Abs(n2)))
873 {
68a8e667 874 Double_t cumulants2pCos = Two(n1,n2).Re()/Two(0,0).Re()
875 - (One(n1).Re()/One(0).Re())*(One(n2).Re()/One(0).Re())
876 + (One(n1).Im()/One(0).Re())*(One(n2).Im()/One(0).Re());
877
878 Double_t cumulants2pSin = Two(n1,n2).Im()/Two(0,0).Re()
879 - (One(n1).Re()/One(0).Re())*(One(n2).Im()/One(0).Re())
880 - (One(n2).Re()/One(0).Re())*(One(n1).Im()/One(0).Re());
881
882 if(/*twoD>0. &&*/ dMultRP>=2)
6696a113 883 {
68a8e667 884 fEbECumulantsPro[0][1]->Fill(binNo[1]-.5,cumulants2pCos,1.);;
885 fEbECumulantsPro[1][1]->Fill(binNo[1]++-.5,cumulants2pSin,1.);;
886 } else {Warning(sMethodName.Data(),"/*twoD>0. &&*/ dMultRP>=2");}
6696a113 887 }
888 if(2==fDontGoBeyond){continue;}
68a8e667 889
890 /*
891
6696a113 892 // 3-p:
893 for(Int_t n3=n2;n3<=fMaxHarmonic;n3++)
894 {
895 if(fSkipZeroHarmonics && 0==n3){continue;}
896 if(fCalculateAll
897 || (fCalculateIsotropic && 0==n1+n2+n3)
898 || (fCalculateSame && TMath::Abs(n1)==TMath::Abs(n2) && TMath::Abs(n1)==TMath::Abs(n3))
899 || (fCalculateSameIsotropic && 0==n1+n2+n3 && TMath::Abs(n1)==TMath::Abs(n2) && TMath::Abs(n1)==TMath::Abs(n3)))
900 {
901 TComplex threeN = Three(n1,n2,n3); // numerator
902 Double_t threeD = Three(0,0,0).Re(); // denominator
903 Double_t threeW = threeD; // weight TBI add other possibilities here for the weight
904 if(threeD>0. && dMultRP>=3)
905 {
68a8e667 906 fEbECumulantsPro[0][2]->Fill(binNo[2]-.5,threeN.Re()/threeD,threeW);
907 fEbECumulantsPro[1][2]->Fill(binNo[2]++-.5,threeN.Im()/threeD,threeW);
6696a113 908 } else {Warning(sMethodName.Data(),"threeD>0. && dMultRP>=3");}
909 }
910 if(3==fDontGoBeyond){continue;}
911 // 4-p:
912 for(Int_t n4=n3;n4<=fMaxHarmonic;n4++)
913 {
914 if(fSkipZeroHarmonics && 0==n4){continue;}
915 if(fCalculateAll
916 || (fCalculateIsotropic && 0==n1+n2+n3+n4)
917 || (fCalculateSame && TMath::Abs(n1)==TMath::Abs(n2) && TMath::Abs(n1)==TMath::Abs(n3)
918 && TMath::Abs(n1)==TMath::Abs(n4))
919 || (fCalculateSameIsotropic && 0==n1+n2+n3+n4 && TMath::Abs(n1)==TMath::Abs(n2)
920 && TMath::Abs(n1)==TMath::Abs(n3) && TMath::Abs(n1)==TMath::Abs(n4)))
921 {
922 TComplex fourN = Four(n1,n2,n3,n4); // numerator
923 Double_t fourD = Four(0,0,0,0).Re(); // denominator
924 Double_t fourW = fourD; // weight TBI add other possibilities here for the weight
925 if(fourD>0. && dMultRP>=4)
926 {
68a8e667 927 fEbECumulantsPro[0][3]->Fill(binNo[3]-.5,fourN.Re()/fourD,fourW);
928 fEbECumulantsPro[1][3]->Fill(binNo[3]++-.5,fourN.Im()/fourD,fourW);
6696a113 929 } else {Warning(sMethodName.Data(),"fourD>0. && dMultRP>=4");}
930 }
931 if(4==fDontGoBeyond){continue;}
932 // 5-p:
933 for(Int_t n5=n4;n5<=fMaxHarmonic;n5++)
934 {
935 if(fSkipZeroHarmonics && 0==n5){continue;}
936 if(fCalculateAll
937 || (fCalculateIsotropic && 0==n1+n2+n3+n4+n5)
938 || (fCalculateSame && TMath::Abs(n1)==TMath::Abs(n2) && TMath::Abs(n1)==TMath::Abs(n3)
939 && TMath::Abs(n1)==TMath::Abs(n4) && TMath::Abs(n1)==TMath::Abs(n5))
940 || (fCalculateSameIsotropic && 0==n1+n2+n3+n4+n5 && TMath::Abs(n1)==TMath::Abs(n2)
941 && TMath::Abs(n1)==TMath::Abs(n3) && TMath::Abs(n1)==TMath::Abs(n4) && TMath::Abs(n1)==TMath::Abs(n5)))
942 {
943 TComplex fiveN = Five(n1,n2,n3,n4,n5); // numerator
944 Double_t fiveD = Five(0,0,0,0,0).Re(); // denominator
945 Double_t fiveW = fiveD; // weight TBI add other possibilities here for the weight
946 if(fiveD>0. && dMultRP>=5)
947 {
68a8e667 948 fEbECumulantsPro[0][4]->Fill(binNo[4]-.5,fiveN.Re()/fiveD,fiveW);
949 fEbECumulantsPro[1][4]->Fill(binNo[4]++-.5,fiveN.Im()/fiveD,fiveW);
6696a113 950 } else {Warning(sMethodName.Data(),"fiveD>0. && dMultRP>=5");}
951 }
952 if(5==fDontGoBeyond){continue;}
953 // 6-p:
954 for(Int_t n6=n5;n6<=fMaxHarmonic;n6++)
955 {
956 if(fSkipZeroHarmonics && 0==n6){continue;}
957 if(fCalculateAll
958 || (fCalculateIsotropic && 0==n1+n2+n3+n4+n5+n6)
959 || (fCalculateSame && TMath::Abs(n1)==TMath::Abs(n2) && TMath::Abs(n1)==TMath::Abs(n3)
960 && TMath::Abs(n1)==TMath::Abs(n4) && TMath::Abs(n1)==TMath::Abs(n5) && TMath::Abs(n1)==TMath::Abs(n6))
961 || (fCalculateSameIsotropic && 0==n1+n2+n3+n4+n5+n6 && TMath::Abs(n1)==TMath::Abs(n2) && TMath::Abs(n1)==TMath::Abs(n3)
962 && TMath::Abs(n1)==TMath::Abs(n4) && TMath::Abs(n1)==TMath::Abs(n5) && TMath::Abs(n1)==TMath::Abs(n6)))
963 {
964 TComplex sixN = Six(n1,n2,n3,n4,n5,n6); // numerator
965 Double_t sixD = Six(0,0,0,0,0,0).Re(); // denominator
966 Double_t sixW = sixD; // weight TBI add other possibilities here for the weight
967 if(sixD>0. && dMultRP>=6)
968 {
68a8e667 969 fEbECumulantsPro[0][5]->Fill(binNo[5]-.5,sixN.Re()/sixD,sixW);
970 fEbECumulantsPro[1][5]->Fill(binNo[5]++-.5,sixN.Im()/sixD,sixW);
6696a113 971 } else {Warning(sMethodName.Data(),"sixD>0. && dMultRP>=6");}
972 }
973 if(6==fDontGoBeyond){continue;}
974 // 7-p:
975 for(Int_t n7=n6;n7<=fMaxHarmonic;n7++)
976 {
977 if(fSkipZeroHarmonics && 0==n7){continue;}
978 if(fCalculateAll
979 || (fCalculateIsotropic && 0==n1+n2+n3+n4+n5+n6+n7)
980 || (fCalculateSame && TMath::Abs(n1)==TMath::Abs(n2) && TMath::Abs(n1)==TMath::Abs(n3) && TMath::Abs(n1)==TMath::Abs(n4)
981 && TMath::Abs(n1)==TMath::Abs(n5) && TMath::Abs(n1)==TMath::Abs(n6) && TMath::Abs(n1)==TMath::Abs(n7))
982 || (fCalculateSameIsotropic && 0==n1+n2+n3+n4+n5+n6+n7 && TMath::Abs(n1)==TMath::Abs(n2) && TMath::Abs(n1)==TMath::Abs(n3)
983 && TMath::Abs(n1)==TMath::Abs(n4) && TMath::Abs(n1)==TMath::Abs(n5) && TMath::Abs(n1)==TMath::Abs(n6)
984 && TMath::Abs(n1)==TMath::Abs(n7)))
985 {
986 TComplex sevenN = Seven(n1,n2,n3,n4,n5,n6,n7); // numerator
987 Double_t sevenD = Seven(0,0,0,0,0,0,0).Re(); // denominator
988 Double_t sevenW = sevenD; // weight TBI add other possibilities here for the weight
989 if(sevenD>0. && dMultRP>=7)
990 {
68a8e667 991 fEbECumulantsPro[0][6]->Fill(binNo[6]-.5,sevenN.Re()/sevenD,sevenW);
992 fEbECumulantsPro[1][6]->Fill(binNo[6]++-.5,sevenN.Im()/sevenD,sevenW);
6696a113 993 } else {Warning(sMethodName.Data(),"sevenD>0. && dMultRP>=7");}
994 }
995 if(7==fDontGoBeyond){continue;}
996 // 8-p:
997 for(Int_t n8=n7;n8<=fMaxHarmonic;n8++)
998 {
999 if(fSkipZeroHarmonics && 0==n8){continue;}
1000 if(fCalculateAll
1001 || (fCalculateIsotropic && 0==n1+n2+n3+n4+n5+n6+n7+n8)
1002 || (fCalculateSame && TMath::Abs(n1)==TMath::Abs(n2) && TMath::Abs(n1)==TMath::Abs(n3) && TMath::Abs(n1)==TMath::Abs(n4)
1003 && TMath::Abs(n1)==TMath::Abs(n5) && TMath::Abs(n1)==TMath::Abs(n6) && TMath::Abs(n1)==TMath::Abs(n7)
1004 && TMath::Abs(n1)==TMath::Abs(n8))
1005 || (fCalculateSameIsotropic && 0==n1+n2+n3+n4+n5+n6+n7+n8 && TMath::Abs(n1)==TMath::Abs(n2) && TMath::Abs(n1)==TMath::Abs(n3)
1006 && TMath::Abs(n1)==TMath::Abs(n4) && TMath::Abs(n1)==TMath::Abs(n5) && TMath::Abs(n1)==TMath::Abs(n6)
1007 && TMath::Abs(n1)==TMath::Abs(n7) && TMath::Abs(n1)==TMath::Abs(n8)))
1008 {
1009 TComplex eightN = Eight(n1,n2,n3,n4,n5,n6,n7,n8); // numerator
1010 Double_t eightD = Eight(0,0,0,0,0,0,0,0).Re(); // denominator
1011 Double_t eightW = eightD; // weight TBI add other possibilities here for the weight
1012 if(eightD>0. && dMultRP>=8)
1013 {
68a8e667 1014 fEbECumulantsPro[0][7]->Fill(binNo[7]-.5,eightN.Re()/eightD,eightW);
1015 fEbECumulantsPro[1][7]->Fill(binNo[7]++-.5,eightN.Im()/eightD,eightW);
6696a113 1016 }
1017 }
1018 } // for(Int_t n8=n7;n8<=fMaxHarmonic;n8++)
1019 } // for(Int_t n7=n6;n7<=fMaxHarmonic;n7++)
1020 } // for(Int_t n6=n5;n6<=fMaxHarmonic;n6++)
1021 } // for(Int_t n5=n4;n5<=fMaxHarmonic;n5++)
1022 } // for(Int_t n4=n3;n4<=fMaxHarmonic;n4++)
1023 } // for(Int_t n3=n2;n3<=fMaxHarmonic;n3++)
68a8e667 1024
1025 */
1026
6696a113 1027 } // for(Int_t n2=n1;n2<=fMaxHarmonic;n2++)
1028 } // for(Int_t n1=-fMaxHarmonic;n1<=fMaxHarmonic;n1++)
1029
68a8e667 1030} // void AliFlowAnalysisWithMultiparticleCorrelations::CalculateEbECumulants(AliFlowEventSimple *anEvent)
7ecb5af4 1031
1032//=======================================================================================================================
1033
68a8e667 1034void AliFlowAnalysisWithMultiparticleCorrelations::CrossCheckWithNestedLoops(AliFlowEventSimple *anEvent)
6d19c373 1035{
68a8e667 1036 // Cross-check results for multi-particle correlations with nested loops.
6d19c373 1037
68a8e667 1038 // TBI add few comments here, there and over there
1039 // TBI this method is rather messy :'(
6d19c373 1040
68a8e667 1041 Int_t h1 = (Int_t)fNestedLoopsFlagsPro->GetBinContent(2);
1042 Int_t h2 = (Int_t)fNestedLoopsFlagsPro->GetBinContent(3);
1043 Int_t h3 = (Int_t)fNestedLoopsFlagsPro->GetBinContent(4);
1044 Int_t h4 = (Int_t)fNestedLoopsFlagsPro->GetBinContent(5);
1045 Int_t h5 = (Int_t)fNestedLoopsFlagsPro->GetBinContent(6);
1046 Int_t h6 = (Int_t)fNestedLoopsFlagsPro->GetBinContent(7);
1047 Int_t h7 = (Int_t)fNestedLoopsFlagsPro->GetBinContent(8);
1048 Int_t h8 = (Int_t)fNestedLoopsFlagsPro->GetBinContent(9);
6d19c373 1049
68a8e667 1050 this->ResetQvector();
1051 this->FillQvector(anEvent);
6d19c373 1052
68a8e667 1053 if(TMath::Abs(One(0).Re())>0.)
6d19c373 1054 {
68a8e667 1055 fNestedLoopsResultsCosPro->Fill(1.5,One(h1).Re()/One(0).Re(),One(0).Re());
1056 fNestedLoopsResultsSinPro->Fill(1.5,One(h1).Im()/One(0).Re(),One(0).Re());
1057 }
1058 if(TMath::Abs(Two(0,0).Re())>0.)
1059 {
1060 fNestedLoopsResultsCosPro->Fill(3.5,Two(h1,h2).Re()/Two(0,0).Re(),Two(0,0).Re());
1061 fNestedLoopsResultsSinPro->Fill(3.5,Two(h1,h2).Im()/Two(0,0).Re(),Two(0,0).Re());
6d19c373 1062 }
68a8e667 1063 if(TMath::Abs(Three(0,0,0).Re())>0.)
6d19c373 1064 {
68a8e667 1065 fNestedLoopsResultsCosPro->Fill(5.5,Three(h1,h2,h3).Re()/Three(0,0,0).Re(),Three(0,0,0).Re());
1066 fNestedLoopsResultsSinPro->Fill(5.5,Three(h1,h2,h3).Im()/Three(0,0,0).Re(),Three(0,0,0).Re());
1067 }
1068 if(TMath::Abs(Four(0,0,0,0).Re())>0.)
6d19c373 1069 {
68a8e667 1070 fNestedLoopsResultsCosPro->Fill(7.5,Four(h1,h2,h3,h4).Re()/Four(0,0,0,0).Re(),Four(0,0,0,0).Re());
1071 fNestedLoopsResultsSinPro->Fill(7.5,Four(h1,h2,h3,h4).Im()/Four(0,0,0,0).Re(),Four(0,0,0,0).Re());
1072 }
1073 if(TMath::Abs(Five(0,0,0,0,0).Re())>0.)
6d19c373 1074 {
68a8e667 1075 fNestedLoopsResultsCosPro->Fill(9.5,Five(h1,h2,h3,h4,h5).Re()/Five(0,0,0,0,0).Re(),Five(0,0,0,0,0).Re());
1076 fNestedLoopsResultsSinPro->Fill(9.5,Five(h1,h2,h3,h4,h5).Im()/Five(0,0,0,0,0).Re(),Five(0,0,0,0,0).Re());
1077 }
1078 if(TMath::Abs(Six(0,0,0,0,0,0).Re())>0.)
7ecb5af4 1079 {
68a8e667 1080 fNestedLoopsResultsCosPro->Fill(11.5,Six(h1,h2,h3,h4,h5,h6).Re()/Six(0,0,0,0,0,0).Re(),Six(0,0,0,0,0,0).Re());
1081 fNestedLoopsResultsSinPro->Fill(11.5,Six(h1,h2,h3,h4,h5,h6).Im()/Six(0,0,0,0,0,0).Re(),Six(0,0,0,0,0,0).Re());
1082 }
1083 if(TMath::Abs(Seven(0,0,0,0,0,0,0).Re())>0.)
1084 {
1085 fNestedLoopsResultsCosPro->Fill(13.5,Seven(h1,h2,h3,h4,h5,h6,h7).Re()/Seven(0,0,0,0,0,0,0).Re(),Seven(0,0,0,0,0,0,0).Re());
1086 fNestedLoopsResultsSinPro->Fill(13.5,Seven(h1,h2,h3,h4,h5,h6,h7).Im()/Seven(0,0,0,0,0,0,0).Re(),Seven(0,0,0,0,0,0,0).Re());
1087 }
1088 if(TMath::Abs(Eight(0,0,0,0,0,0,0,0).Re())>0.)
1089 {
1090 fNestedLoopsResultsCosPro->Fill(15.5,Eight(h1,h2,h3,h4,h5,h6,h7,h8).Re()/Eight(0,0,0,0,0,0,0,0).Re(),Eight(0,0,0,0,0,0,0,0).Re());
1091 fNestedLoopsResultsSinPro->Fill(15.5,Eight(h1,h2,h3,h4,h5,h6,h7,h8).Im()/Eight(0,0,0,0,0,0,0,0).Re(),Eight(0,0,0,0,0,0,0,0).Re());
1092 }
7ecb5af4 1093
1094 Int_t nPrim = anEvent->NumberOfTracks();
6696a113 1095 Double_t dMultRP = anEvent->GetNumberOfRPs(); // TBI shall I promote this variable into data member?
7ecb5af4 1096 AliFlowTrackSimple *aftsTrack = NULL;
1097 Double_t dPhi1=0.,dPhi2=0.,dPhi3=0.,dPhi4=0.,dPhi5=0.,dPhi6=0.,dPhi7=0.,dPhi8=0.;
1098 Double_t wPhi1=1.,wPhi2=1.,wPhi3=1.,wPhi4=1.,wPhi5=1.,wPhi6=1.,wPhi7=1.,wPhi8=1.;
1099
1100 // 1-particle stuff: TBI
6696a113 1101 if(dMultRP>=1)
7ecb5af4 1102 {
1103 for(Int_t i1=0;i1<nPrim;i1++)
1104 {
1105 aftsTrack = anEvent->GetTrack(i1);
1106 if(!(aftsTrack->InRPSelection())){continue;}
1107 dPhi1 = aftsTrack->Phi();
68a8e667 1108 if(fUseWeights[0][0]){wPhi1 = Weight(dPhi1,"RP","phi");}
7ecb5af4 1109 // Fill:
1110 fNestedLoopsResultsCosPro->Fill(0.5,TMath::Cos(h1*dPhi1),wPhi1);
1111 fNestedLoopsResultsSinPro->Fill(0.5,TMath::Sin(h1*dPhi1),wPhi1);
1112 } // end of for(Int_t i1=0;i1<nPrim;i1++)
1113 } // end of if(nPrim>=1)
1114
1115 // 2-particle correlations:
6696a113 1116 if(dMultRP>=2)
7ecb5af4 1117 {
1118 for(Int_t i1=0;i1<nPrim;i1++)
1119 {
1120 aftsTrack = anEvent->GetTrack(i1);
1121 if(!(aftsTrack->InRPSelection())){continue;}
1122 dPhi1 = aftsTrack->Phi();
68a8e667 1123 if(fUseWeights[0][0]){wPhi1 = Weight(dPhi1,"RP","phi");}
7ecb5af4 1124 for(Int_t i2=0;i2<nPrim;i2++)
1125 {
1126 if(i2==i1){continue;}
1127 aftsTrack = anEvent->GetTrack(i2);
1128 if(!(aftsTrack->InRPSelection())){continue;}
1129 dPhi2 = aftsTrack->Phi();
68a8e667 1130 if(fUseWeights[0][0]){wPhi2 = Weight(dPhi2,"RP","phi");}
7ecb5af4 1131 // Fill:
1132 fNestedLoopsResultsCosPro->Fill(2.5,TMath::Cos(h1*dPhi1+h2*dPhi2),wPhi1*wPhi2);
1133 fNestedLoopsResultsSinPro->Fill(2.5,TMath::Sin(h1*dPhi1+h2*dPhi2),wPhi1*wPhi2);
1134 } // end of for(Int_t i2=0;i2<nPrim;i2++)
1135 } // end of for(Int_t i1=0;i1<nPrim;i1++)
1136 } // end of if(nPrim>=2)
1137
1138 // 3-particle correlations:
6696a113 1139 if(dMultRP>=3)
7ecb5af4 1140 {
1141 for(Int_t i1=0;i1<nPrim;i1++)
1142 {
1143 aftsTrack=anEvent->GetTrack(i1);
1144 if(!(aftsTrack->InRPSelection())){continue;}
1145 dPhi1=aftsTrack->Phi();
68a8e667 1146 if(fUseWeights[0][0]){wPhi1 = Weight(dPhi1,"RP","phi");}
7ecb5af4 1147 for(Int_t i2=0;i2<nPrim;i2++)
1148 {
1149 if(i2==i1){continue;}
1150 aftsTrack=anEvent->GetTrack(i2);
1151 if(!(aftsTrack->InRPSelection())){continue;}
1152 dPhi2=aftsTrack->Phi();
68a8e667 1153 if(fUseWeights[0][0]){wPhi2 = Weight(dPhi2,"RP","phi");}
7ecb5af4 1154 for(Int_t i3=0;i3<nPrim;i3++)
1155 {
1156 if(i3==i1||i3==i2){continue;}
1157 aftsTrack=anEvent->GetTrack(i3);
1158 if(!(aftsTrack->InRPSelection())){continue;}
1159 dPhi3=aftsTrack->Phi();
68a8e667 1160 if(fUseWeights[0][0]){wPhi3 = Weight(dPhi3,"RP","phi");}
7ecb5af4 1161 // Fill:
1162 fNestedLoopsResultsCosPro->Fill(4.5,TMath::Cos(h1*dPhi1+h2*dPhi2+h3*dPhi3),wPhi1*wPhi2*wPhi3);
1163 fNestedLoopsResultsSinPro->Fill(4.5,TMath::Sin(h1*dPhi1+h2*dPhi2+h3*dPhi3),wPhi1*wPhi2*wPhi3);
1164 } // end of for(Int_t i3=0;i3<nPrim;i3++)
1165 } // end of for(Int_t i2=0;i2<nPrim;i2++)
1166 } // end of for(Int_t i1=0;i1<nPrim;i1++)
1167 } // end of if(nPrim>=3)
1168
1169 // 4-particle correlations:
6696a113 1170 if(dMultRP>=4)
7ecb5af4 1171 {
1172 for(Int_t i1=0;i1<nPrim;i1++)
1173 {
1174 aftsTrack=anEvent->GetTrack(i1);
1175 if(!(aftsTrack->InRPSelection())){continue;}
1176 dPhi1=aftsTrack->Phi();
68a8e667 1177 if(fUseWeights[0][0]){wPhi1 = Weight(dPhi1,"RP","phi");}
7ecb5af4 1178 for(Int_t i2=0;i2<nPrim;i2++)
1179 {
1180 if(i2==i1){continue;}
1181 aftsTrack=anEvent->GetTrack(i2);
1182 if(!(aftsTrack->InRPSelection())){continue;}
1183 dPhi2=aftsTrack->Phi();
68a8e667 1184 if(fUseWeights[0][0]){wPhi2 = Weight(dPhi2,"RP","phi");}
7ecb5af4 1185 for(Int_t i3=0;i3<nPrim;i3++)
1186 {
1187 if(i3==i1||i3==i2){continue;}
1188 aftsTrack=anEvent->GetTrack(i3);
1189 if(!(aftsTrack->InRPSelection())){continue;}
1190 dPhi3=aftsTrack->Phi();
68a8e667 1191 if(fUseWeights[0][0]){wPhi3 = Weight(dPhi3,"RP","phi");}
7ecb5af4 1192 for(Int_t i4=0;i4<nPrim;i4++)
1193 {
1194 if(i4==i1||i4==i2||i4==i3){continue;}
1195 aftsTrack=anEvent->GetTrack(i4);
1196 if(!(aftsTrack->InRPSelection())){continue;}
1197 dPhi4=aftsTrack->Phi();
68a8e667 1198 if(fUseWeights[0][0]){wPhi4 = Weight(dPhi4,"RP","phi");}
7ecb5af4 1199 // Fill:
1200 fNestedLoopsResultsCosPro->Fill(6.5,TMath::Cos(h1*dPhi1+h2*dPhi2+h3*dPhi3+h4*dPhi4),wPhi1*wPhi2*wPhi3*wPhi4);
1201 fNestedLoopsResultsSinPro->Fill(6.5,TMath::Sin(h1*dPhi1+h2*dPhi2+h3*dPhi3+h4*dPhi4),wPhi1*wPhi2*wPhi3*wPhi4);
1202 } // end of for(Int_t i4=0;i4<nPrim;i4++)
1203 } // end of for(Int_t i3=0;i3<nPrim;i3++)
1204 } // end of for(Int_t i2=0;i2<nPrim;i2++)
1205 } // end of for(Int_t i1=0;i1<nPrim;i1++)
1206 } // end of if(nPrim>=)
1207
1208 // 5-particle correlations:
6696a113 1209 if(dMultRP>=5)
7ecb5af4 1210 {
1211 for(Int_t i1=0;i1<nPrim;i1++)
1212 {
1213 aftsTrack=anEvent->GetTrack(i1);
1214 if(!(aftsTrack->InRPSelection())){continue;}
1215 dPhi1=aftsTrack->Phi();
68a8e667 1216 if(fUseWeights[0][0]){wPhi1 = Weight(dPhi1,"RP","phi");}
7ecb5af4 1217 for(Int_t i2=0;i2<nPrim;i2++)
1218 {
1219 if(i2==i1){continue;}
1220 aftsTrack=anEvent->GetTrack(i2);
1221 if(!(aftsTrack->InRPSelection())){continue;}
1222 dPhi2=aftsTrack->Phi();
68a8e667 1223 if(fUseWeights[0][0]){wPhi2 = Weight(dPhi2,"RP","phi");}
7ecb5af4 1224 for(Int_t i3=0;i3<nPrim;i3++)
1225 {
1226 if(i3==i1||i3==i2){continue;}
1227 aftsTrack=anEvent->GetTrack(i3);
1228 if(!(aftsTrack->InRPSelection())){continue;}
1229 dPhi3=aftsTrack->Phi();
68a8e667 1230 if(fUseWeights[0][0]){wPhi3 = Weight(dPhi3,"RP","phi");}
7ecb5af4 1231 for(Int_t i4=0;i4<nPrim;i4++)
1232 {
1233 if(i4==i1||i4==i2||i4==i3){continue;}
1234 aftsTrack=anEvent->GetTrack(i4);
1235 if(!(aftsTrack->InRPSelection())){continue;}
1236 dPhi4=aftsTrack->Phi();
68a8e667 1237 if(fUseWeights[0][0]){wPhi4 = Weight(dPhi4,"RP","phi");}
7ecb5af4 1238 for(Int_t i5=0;i5<nPrim;i5++)
1239 {
1240 if(i5==i1||i5==i2||i5==i3||i5==i4){continue;}
1241 aftsTrack=anEvent->GetTrack(i5);
1242 if(!(aftsTrack->InRPSelection())){continue;}
1243 dPhi5=aftsTrack->Phi();
68a8e667 1244 if(fUseWeights[0][0]){wPhi5 = Weight(dPhi5,"RP","phi");}
7ecb5af4 1245 // Fill:
1246 fNestedLoopsResultsCosPro->Fill(8.5,TMath::Cos(h1*dPhi1+h2*dPhi2+h3*dPhi3+h4*dPhi4+h5*dPhi5),wPhi1*wPhi2*wPhi3*wPhi4*wPhi5);
1247 fNestedLoopsResultsSinPro->Fill(8.5,TMath::Sin(h1*dPhi1+h2*dPhi2+h3*dPhi3+h4*dPhi4+h5*dPhi5),wPhi1*wPhi2*wPhi3*wPhi4*wPhi5);
1248 } // end of for(Int_t i5=0;i5<nPrim;i5++)
1249 } // end of for(Int_t i4=0;i4<nPrim;i4++)
1250 } // end of for(Int_t i3=0;i3<nPrim;i3++)
1251 } // end of for(Int_t i2=0;i2<nPrim;i2++)
1252 } // end of for(Int_t i1=0;i1<nPrim;i1++)
1253 } // end of if(nPrim>=5)
1254
1255 // 6-particle correlations:
6696a113 1256 if(dMultRP>=6)
7ecb5af4 1257 {
1258 for(Int_t i1=0;i1<nPrim;i1++)
1259 {
1260 aftsTrack=anEvent->GetTrack(i1);
1261 if(!(aftsTrack->InRPSelection())){continue;}
1262 dPhi1=aftsTrack->Phi();
68a8e667 1263 if(fUseWeights[0][0]){wPhi1 = Weight(dPhi1,"RP","phi");}
7ecb5af4 1264 for(Int_t i2=0;i2<nPrim;i2++)
1265 {
1266 if(i2==i1){continue;}
1267 aftsTrack=anEvent->GetTrack(i2);
1268 if(!(aftsTrack->InRPSelection())){continue;}
1269 dPhi2=aftsTrack->Phi();
68a8e667 1270 if(fUseWeights[0][0]){wPhi2 = Weight(dPhi2,"RP","phi");}
7ecb5af4 1271 for(Int_t i3=0;i3<nPrim;i3++)
1272 {
1273 if(i3==i1||i3==i2){continue;}
1274 aftsTrack=anEvent->GetTrack(i3);
1275 if(!(aftsTrack->InRPSelection())){continue;}
1276 dPhi3=aftsTrack->Phi();
68a8e667 1277 if(fUseWeights[0][0]){wPhi3 = Weight(dPhi3,"RP","phi");}
7ecb5af4 1278 for(Int_t i4=0;i4<nPrim;i4++)
1279 {
1280 if(i4==i1||i4==i2||i4==i3){continue;}
1281 aftsTrack=anEvent->GetTrack(i4);
1282 if(!(aftsTrack->InRPSelection())){continue;}
1283 dPhi4=aftsTrack->Phi();
68a8e667 1284 if(fUseWeights[0][0]){wPhi4 = Weight(dPhi4,"RP","phi");}
7ecb5af4 1285 for(Int_t i5=0;i5<nPrim;i5++)
1286 {
1287 if(i5==i1||i5==i2||i5==i3||i5==i4){continue;}
1288 aftsTrack=anEvent->GetTrack(i5);
1289 if(!(aftsTrack->InRPSelection())){continue;}
1290 dPhi5=aftsTrack->Phi();
68a8e667 1291 if(fUseWeights[0][0]){wPhi5=Weight(dPhi5,"RP","phi");}
7ecb5af4 1292 for(Int_t i6=0;i6<nPrim;i6++)
1293 {
1294 if(i6==i1||i6==i2||i6==i3||i6==i4||i6==i5){continue;}
1295 aftsTrack=anEvent->GetTrack(i6);
1296 if(!(aftsTrack->InRPSelection())){continue;}
1297 dPhi6=aftsTrack->Phi();
68a8e667 1298 if(fUseWeights[0][0]){wPhi6=Weight(dPhi6,"RP","phi");}
7ecb5af4 1299 // Fill:
1300 fNestedLoopsResultsCosPro->Fill(10.5,TMath::Cos(h1*dPhi1+h2*dPhi2+h3*dPhi3+h4*dPhi4+h5*dPhi5+h6*dPhi6),wPhi1*wPhi2*wPhi3*wPhi4*wPhi5*wPhi6);
1301 fNestedLoopsResultsSinPro->Fill(10.5,TMath::Sin(h1*dPhi1+h2*dPhi2+h3*dPhi3+h4*dPhi4+h5*dPhi5+h6*dPhi6),wPhi1*wPhi2*wPhi3*wPhi4*wPhi5*wPhi6);
1302 } // end of for(Int_t i6=0;i6<nPrim;i6++)
1303 } // end of for(Int_t i5=0;i5<nPrim;i5++)
1304 } // end of for(Int_t i4=0;i4<nPrim;i4++)
1305 } // end of for(Int_t i3=0;i3<nPrim;i3++)
1306 } // end of for(Int_t i2=0;i2<nPrim;i2++)
1307 } // end of for(Int_t i1=0;i1<nPrim;i1++)
1308 } // end of if(nPrim>=6)
1309
1310 // 7-particle correlations:
6696a113 1311 if(dMultRP>=7)
7ecb5af4 1312 {
1313 for(Int_t i1=0;i1<nPrim;i1++)
1314 {
1315 aftsTrack=anEvent->GetTrack(i1);
1316 if(!(aftsTrack->InRPSelection())){continue;}
1317 dPhi1=aftsTrack->Phi();
68a8e667 1318 if(fUseWeights[0][0]){wPhi1=Weight(dPhi1,"RP","phi");}
7ecb5af4 1319 for(Int_t i2=0;i2<nPrim;i2++)
1320 {
1321 if(i2==i1){continue;}
1322 aftsTrack=anEvent->GetTrack(i2);
1323 if(!(aftsTrack->InRPSelection())){continue;}
1324 dPhi2=aftsTrack->Phi();
68a8e667 1325 if(fUseWeights[0][0]){wPhi2=Weight(dPhi2,"RP","phi");}
7ecb5af4 1326 for(Int_t i3=0;i3<nPrim;i3++)
1327 {
1328 if(i3==i1||i3==i2){continue;}
1329 aftsTrack=anEvent->GetTrack(i3);
1330 if(!(aftsTrack->InRPSelection())){continue;}
1331 dPhi3=aftsTrack->Phi();
68a8e667 1332 if(fUseWeights[0][0]){wPhi3=Weight(dPhi3,"RP","phi");}
7ecb5af4 1333 for(Int_t i4=0;i4<nPrim;i4++)
1334 {
1335 if(i4==i1||i4==i2||i4==i3){continue;}
1336 aftsTrack=anEvent->GetTrack(i4);
1337 if(!(aftsTrack->InRPSelection())){continue;}
1338 dPhi4=aftsTrack->Phi();
68a8e667 1339 if(fUseWeights[0][0]){wPhi4=Weight(dPhi4,"RP","phi");}
7ecb5af4 1340 for(Int_t i5=0;i5<nPrim;i5++)
1341 {
1342 if(i5==i1||i5==i2||i5==i3||i5==i4){continue;}
1343 aftsTrack=anEvent->GetTrack(i5);
1344 if(!(aftsTrack->InRPSelection())){continue;}
1345 dPhi5=aftsTrack->Phi();
68a8e667 1346 if(fUseWeights[0][0]){wPhi5=Weight(dPhi5,"RP","phi");}
7ecb5af4 1347 for(Int_t i6=0;i6<nPrim;i6++)
1348 {
1349 if(i6==i1||i6==i2||i6==i3||i6==i4||i6==i5){continue;}
1350 aftsTrack=anEvent->GetTrack(i6);
1351 if(!(aftsTrack->InRPSelection())){continue;}
1352 dPhi6=aftsTrack->Phi();
68a8e667 1353 if(fUseWeights[0][0]){wPhi6=Weight(dPhi6,"RP","phi");}
7ecb5af4 1354 for(Int_t i7=0;i7<nPrim;i7++)
1355 {
1356 if(i7==i1||i7==i2||i7==i3||i7==i4||i7==i5||i7==i6){continue;}
1357 aftsTrack=anEvent->GetTrack(i7);
1358 if(!(aftsTrack->InRPSelection())){continue;}
1359 dPhi7=aftsTrack->Phi();
68a8e667 1360 if(fUseWeights[0][0]){wPhi7=Weight(dPhi7,"RP","phi");}
7ecb5af4 1361 // Fill:
1362 fNestedLoopsResultsCosPro->Fill(12.5,TMath::Cos(h1*dPhi1+h2*dPhi2+h3*dPhi3+h4*dPhi4+h5*dPhi5+h6*dPhi6+h7*dPhi7),wPhi1*wPhi2*wPhi3*wPhi4*wPhi5*wPhi6*wPhi7);
1363 fNestedLoopsResultsSinPro->Fill(12.5,TMath::Sin(h1*dPhi1+h2*dPhi2+h3*dPhi3+h4*dPhi4+h5*dPhi5+h6*dPhi6+h7*dPhi7),wPhi1*wPhi2*wPhi3*wPhi4*wPhi5*wPhi6*wPhi7);
1364 } // end of for(Int_t i7=0;i7<nPrim;i7++)
1365 } // end of for(Int_t i6=0;i6<nPrim;i6++)
1366 } // end of for(Int_t i5=0;i5<nPrim;i5++)
1367 } // end of for(Int_t i4=0;i4<nPrim;i4++)
1368 } // end of for(Int_t i3=0;i3<nPrim;i3++)
1369 } // end of for(Int_t i2=0;i2<nPrim;i2++)
1370 } // end of for(Int_t i1=0;i1<nPrim;i1++)
1371 } // end of if(nPrim>=7)
1372
1373 // 8-particle correlations:
6696a113 1374 if(dMultRP>=8)
7ecb5af4 1375 {
1376 for(Int_t i1=0;i1<nPrim;i1++)
1377 {
1378 aftsTrack=anEvent->GetTrack(i1);
1379 if(!(aftsTrack->InRPSelection())){continue;}
1380 dPhi1=aftsTrack->Phi();
68a8e667 1381 if(fUseWeights[0][0]){wPhi1=Weight(dPhi1,"RP","phi");}
7ecb5af4 1382 for(Int_t i2=0;i2<nPrim;i2++)
1383 {
1384 if(i2==i1){continue;}
1385 aftsTrack=anEvent->GetTrack(i2);
1386 if(!(aftsTrack->InRPSelection())){continue;}
1387 dPhi2=aftsTrack->Phi();
68a8e667 1388 if(fUseWeights[0][0]){wPhi2=Weight(dPhi2,"RP","phi");}
7ecb5af4 1389 for(Int_t i3=0;i3<nPrim;i3++)
1390 {
1391 if(i3==i1||i3==i2){continue;}
1392 aftsTrack=anEvent->GetTrack(i3);
1393 if(!(aftsTrack->InRPSelection())){continue;}
1394 dPhi3=aftsTrack->Phi();
68a8e667 1395 if(fUseWeights[0][0]){wPhi3=Weight(dPhi3,"RP","phi");}
7ecb5af4 1396 for(Int_t i4=0;i4<nPrim;i4++)
1397 {
1398 if(i4==i1||i4==i2||i4==i3){continue;}
1399 aftsTrack=anEvent->GetTrack(i4);
1400 if(!(aftsTrack->InRPSelection())){continue;}
1401 dPhi4=aftsTrack->Phi();
68a8e667 1402 if(fUseWeights[0][0]){wPhi4=Weight(dPhi4,"RP","phi");}
7ecb5af4 1403 for(Int_t i5=0;i5<nPrim;i5++)
1404 {
1405 if(i5==i1||i5==i2||i5==i3||i5==i4){continue;}
1406 aftsTrack=anEvent->GetTrack(i5);
1407 if(!(aftsTrack->InRPSelection())){continue;}
1408 dPhi5=aftsTrack->Phi();
68a8e667 1409 if(fUseWeights[0][0]){wPhi5=Weight(dPhi5,"RP","phi");}
7ecb5af4 1410 for(Int_t i6=0;i6<nPrim;i6++)
1411 {
1412 if(i6==i1||i6==i2||i6==i3||i6==i4||i6==i5){continue;}
1413 aftsTrack=anEvent->GetTrack(i6);
1414 if(!(aftsTrack->InRPSelection())){continue;}
1415 dPhi6=aftsTrack->Phi();
68a8e667 1416 if(fUseWeights[0][0]){wPhi6=Weight(dPhi6,"RP","phi");}
7ecb5af4 1417 for(Int_t i7=0;i7<nPrim;i7++)
1418 {
1419 if(i7==i1||i7==i2||i7==i3||i7==i4||i7==i5||i7==i6){continue;}
1420 aftsTrack=anEvent->GetTrack(i7);
1421 if(!(aftsTrack->InRPSelection())){continue;}
1422 dPhi7=aftsTrack->Phi();
68a8e667 1423 if(fUseWeights[0][0]){wPhi7=Weight(dPhi7,"RP","phi");}
7ecb5af4 1424 for(Int_t i8=0;i8<nPrim;i8++)
1425 {
1426 if(i8==i1||i8==i2||i8==i3||i8==i4||i8==i5||i8==i6||i8==i7){continue;}
1427 aftsTrack=anEvent->GetTrack(i8);
1428 if(!(aftsTrack->InRPSelection())){continue;}
1429 dPhi8=aftsTrack->Phi();
68a8e667 1430 if(fUseWeights[0][0]){wPhi8=Weight(dPhi8,"RP","phi");}
7ecb5af4 1431 // Fill:
1432 fNestedLoopsResultsCosPro->Fill(14.5,TMath::Cos(h1*dPhi1+h2*dPhi2+h3*dPhi3+h4*dPhi4+h5*dPhi5+h6*dPhi6+h7*dPhi7+h8*dPhi8),wPhi1*wPhi2*wPhi3*wPhi4*wPhi5*wPhi6*wPhi7*wPhi8);
1433 fNestedLoopsResultsSinPro->Fill(14.5,TMath::Sin(h1*dPhi1+h2*dPhi2+h3*dPhi3+h4*dPhi4+h5*dPhi5+h6*dPhi6+h7*dPhi7+h8*dPhi8),wPhi1*wPhi2*wPhi3*wPhi4*wPhi5*wPhi6*wPhi7*wPhi8);
1434 } // end of for(Int_t i8=0;i8<nPrim;i8++)
1435 } // end of for(Int_t i7=0;i7<nPrim;i7++)
1436 } // end of for(Int_t i6=0;i6<nPrim;i6++)
1437 } // end of for(Int_t i5=0;i5<nPrim;i5++)
1438 } // end of for(Int_t i4=0;i4<nPrim;i4++)
1439 } // end of for(Int_t i3=0;i3<nPrim;i3++)
1440 } // end of for(Int_t i2=0;i2<nPrim;i2++)
1441 } // end of for(Int_t i1=0;i1<nPrim;i1++)
1442 } // end of if(nPrim>=8)
1443
1444 // *) Printout: TBI move somewhere else
1445 printf("\n cosine:");
1446 printf("\n 1-p => Q-vector: %.12f",fNestedLoopsResultsCosPro->GetBinContent(2));
1447 printf("\n 1-p => Nested loops: %.12f",fNestedLoopsResultsCosPro->GetBinContent(1));
1448 printf("\n 2-p => Q-vector: %.12f",fNestedLoopsResultsCosPro->GetBinContent(4));
1449 printf("\n 2-p => Nested loops: %.12f",fNestedLoopsResultsCosPro->GetBinContent(3));
1450 printf("\n 3-p => Q-vector: %.12f",fNestedLoopsResultsCosPro->GetBinContent(6));
1451 printf("\n 3-p => Nested loops: %.12f",fNestedLoopsResultsCosPro->GetBinContent(5));
1452 printf("\n 4-p => Q-vector: %.12f",fNestedLoopsResultsCosPro->GetBinContent(8));
1453 printf("\n 4-p => Nested loops: %.12f",fNestedLoopsResultsCosPro->GetBinContent(7));
1454 printf("\n 5-p => Q-vector: %.12f",fNestedLoopsResultsCosPro->GetBinContent(10));
1455 printf("\n 5-p => Nested loops: %.12f",fNestedLoopsResultsCosPro->GetBinContent(9));
1456 printf("\n 6-p => Q-vector: %.12f",fNestedLoopsResultsCosPro->GetBinContent(12));
1457 printf("\n 6-p => Nested loops: %.12f",fNestedLoopsResultsCosPro->GetBinContent(11));
1458 printf("\n 7-p => Q-vector: %.12f",fNestedLoopsResultsCosPro->GetBinContent(14));
1459 printf("\n 7-p => Nested loops: %.12f",fNestedLoopsResultsCosPro->GetBinContent(13));
1460 printf("\n 8-p => Q-vector: %.12f",fNestedLoopsResultsCosPro->GetBinContent(16));
1461 printf("\n 8-p => Nested loops: %.12f",fNestedLoopsResultsCosPro->GetBinContent(15));
1462
1463 printf("\n\n sinus:");
1464 printf("\n 1-p => Q-vector: %.12f",fNestedLoopsResultsSinPro->GetBinContent(2));
1465 printf("\n 1-p => Nested loops: %.12f",fNestedLoopsResultsSinPro->GetBinContent(1));
1466 printf("\n 2-p => Q-vector: %.12f",fNestedLoopsResultsSinPro->GetBinContent(4));
1467 printf("\n 2-p => Nested loops: %.12f",fNestedLoopsResultsSinPro->GetBinContent(3));
1468 printf("\n 3-p => Q-vector: %.12f",fNestedLoopsResultsSinPro->GetBinContent(6));
1469 printf("\n 3-p => Nested loops: %.12f",fNestedLoopsResultsSinPro->GetBinContent(5));
1470 printf("\n 4-p => Q-vector: %.12f",fNestedLoopsResultsSinPro->GetBinContent(8));
1471 printf("\n 4-p => Nested loops: %.12f",fNestedLoopsResultsSinPro->GetBinContent(7));
1472 printf("\n 5-p => Q-vector: %.12f",fNestedLoopsResultsSinPro->GetBinContent(10));
1473 printf("\n 5-p => Nested loops: %.12f",fNestedLoopsResultsSinPro->GetBinContent(9));
1474 printf("\n 6-p => Q-vector: %.12f",fNestedLoopsResultsSinPro->GetBinContent(12));
1475 printf("\n 6-p => Nested loops: %.12f",fNestedLoopsResultsSinPro->GetBinContent(11));
1476 printf("\n 7-p => Q-vector: %.12f",fNestedLoopsResultsSinPro->GetBinContent(14));
1477 printf("\n 7-p => Nested loops: %.12f",fNestedLoopsResultsSinPro->GetBinContent(13));
1478 printf("\n 8-p => Q-vector: %.12f",fNestedLoopsResultsSinPro->GetBinContent(16));
1479 printf("\n 8-p => Nested loops: %.12f",fNestedLoopsResultsSinPro->GetBinContent(15));
1480
1481 printf("\n\n");
1482
1483} // void AliFlowAnalysisWithMultiparticleCorrelations::CrossCheckWithNestedLoops(AliFlowEventSimple *anEvent)
1484
1485//=======================================================================================================================
1486
68a8e667 1487void AliFlowAnalysisWithMultiparticleCorrelations::CrossCheckDiffWithNestedLoops(AliFlowEventSimple *anEvent)
1488{
1489 // Cross-check results for differential multi-particle correlations with nested loops.
1490
1491 TString sMethodName = "AliFlowAnalysisWithMultiparticleCorrelations::CrossCheckDiffWithNestedLoops(AliFlowEventSimple *anEvent)";
1492
1493 Int_t nPrim = anEvent->NumberOfTracks();
1494 AliFlowTrackSimple *aftsTrack = NULL;
1495 Double_t dPsi1=0.,dPhi2=0.,dPhi3=0.,dPhi4=0.;
1496 Double_t wPsi1=1.,wPhi2=1.,wPhi3=1.,wPhi4=1.;
1497
dd96bd81 1498 Int_t cs = fCrossCheckDiffCSCOBN[0]; // cos/sin
1499
1500 // TBI reimplement lines below in a more civilised manner:
1501 Bool_t bCrossCheck2p = kFALSE;
68a8e667 1502 Bool_t bCrossCheck3p = kFALSE;
1503 Bool_t bCrossCheck4p = kFALSE;
dd96bd81 1504
1505 if(fCrossCheckDiffCSCOBN[1] == 2){bCrossCheck2p = kTRUE;}
1506 else if(fCrossCheckDiffCSCOBN[1] == 3){bCrossCheck3p = kTRUE;}
1507 else if(fCrossCheckDiffCSCOBN[1] == 4){bCrossCheck4p = kTRUE;}
1508
68a8e667 1509 if(Int_t(bCrossCheck2p + bCrossCheck3p + bCrossCheck4p) > 1)
1510 {
1511 Fatal(sMethodName.Data(),"Int_t(bCrossCheck2p + bCrossCheck3p + bCrossCheck4p) > 1");
1512 }
1513 if(!(bCrossCheck2p || bCrossCheck3p || bCrossCheck4p))
1514 {
1515 Fatal(sMethodName.Data(),"!(bCrossCheck2p || bCrossCheck3p || bCrossCheck4p)");
1516 }
dd96bd81 1517 Int_t nDiffBinNo = fCrossCheckDiffCSCOBN[2];
1518 Double_t dPt = 0., dEta = 0.;
68a8e667 1519
1520 // <2'>:
dd96bd81 1521 for(Int_t i1=0;i1<nPrim;i1++) // Loop over particles in a differential bin
68a8e667 1522 {
1523 aftsTrack=anEvent->GetTrack(i1);
1524 if(!(aftsTrack->InPOISelection())){continue;}
1525 dPsi1=aftsTrack->Phi();
dd96bd81 1526 if(fCalculateDiffCorrelationsVsPt)
1527 {
1528 dPt=aftsTrack->Pt();
1529 if(fDiffCorrelationsPro[0][1]->FindBin(dPt) != nDiffBinNo){continue;} // TBI spaghetti again
1530 } else
1531 {
1532 dEta=aftsTrack->Eta();
1533 if(fDiffCorrelationsPro[0][1]->FindBin(dEta) != nDiffBinNo){continue;} // TBI spaghetti again
1534 }
68a8e667 1535 if(fUseWeights[1][0]){wPsi1=Weight(dPsi1,"POI","phi");}
1536 for(Int_t i2=0;i2<nPrim;i2++) // Loop over particles in an event
1537 {
1538 if(i2==i1){continue;} // get rid of autocorrelations
1539 aftsTrack=anEvent->GetTrack(i2);
1540 if(!(aftsTrack->InRPSelection())){continue;}
1541 dPhi2=aftsTrack->Phi();
1542 if(fUseWeights[0][0]){wPhi2=Weight(dPhi2,"RP","phi");}
1543 // Fill profiles:
dd96bd81 1544 if(bCrossCheck2p)
1545 {
1546 if(fCrossCheckDiffCSCOBN[0] == 0)
1547 {
1548 fNestedLoopsDiffResultsPro->Fill(0.5,TMath::Cos(fDiffHarmonics[1][0]*dPsi1+fDiffHarmonics[1][1]*dPhi2),wPsi1*wPhi2);
1549 } else {fNestedLoopsDiffResultsPro->Fill(0.5,TMath::Sin(fDiffHarmonics[1][0]*dPsi1+fDiffHarmonics[1][1]*dPhi2),wPsi1*wPhi2);}
1550 } // if(bCrossCheck2p)
68a8e667 1551 } // for(Int_t i2=0;i2<nPrim;i2++)
1552 } // for(Int_t i1=0;i1<nPrim;i1++)
1553
1554 // <3'>:
1555 for(Int_t i1=0;i1<nPrim;i1++) // Loop over particles in a differential bin
1556 {
1557 aftsTrack=anEvent->GetTrack(i1);
1558 if(!(aftsTrack->InPOISelection())){continue;}
1559 dPsi1=aftsTrack->Phi();
dd96bd81 1560 if(fCalculateDiffCorrelationsVsPt)
1561 {
1562 dPt=aftsTrack->Pt();
1563 if(fDiffCorrelationsPro[0][1]->FindBin(dPt) != nDiffBinNo){continue;} // TBI spaghetti again
1564 } else
1565 {
1566 dEta=aftsTrack->Eta();
1567 if(fDiffCorrelationsPro[0][1]->FindBin(dEta) != nDiffBinNo){continue;} // TBI spaghetti again
1568 }
68a8e667 1569 if(fUseWeights[1][0]){wPsi1=Weight(dPsi1,"POI","phi");}
1570 for(Int_t i2=0;i2<nPrim;i2++) // Loop over particles in an event
1571 {
1572 if(i2==i1){continue;} // get rid of autocorrelations
1573 aftsTrack=anEvent->GetTrack(i2);
1574 if(!(aftsTrack->InRPSelection())){continue;}
1575 dPhi2=aftsTrack->Phi();
1576 if(fUseWeights[0][0]){wPhi2=Weight(dPhi2,"RP","phi");}
1577 for(Int_t i3=0;i3<nPrim;i3++)
1578 {
1579 if(i3==i1||i3==i2){continue;} // get rid of autocorrelations
1580 aftsTrack=anEvent->GetTrack(i3);
1581 if(!(aftsTrack->InRPSelection())){continue;}
1582 dPhi3=aftsTrack->Phi();
1583 if(fUseWeights[0][0]){wPhi3=Weight(dPhi3,"RP","phi");}
1584 // Fill the profiles:
dd96bd81 1585 if(bCrossCheck3p)
1586 {
1587 if(fCrossCheckDiffCSCOBN[0] == 0)
1588 {
1589 fNestedLoopsDiffResultsPro->Fill(0.5,TMath::Cos(fDiffHarmonics[2][0]*dPsi1+fDiffHarmonics[2][1]*dPhi2+fDiffHarmonics[2][2]*dPhi3),wPsi1*wPhi2*wPhi3);
1590 } else {fNestedLoopsDiffResultsPro->Fill(0.5,TMath::Sin(fDiffHarmonics[2][0]*dPsi1+fDiffHarmonics[2][1]*dPhi2+fDiffHarmonics[2][2]*dPhi3),wPsi1*wPhi2*wPhi3);}
1591 } // if(bCrossCheck3p)
68a8e667 1592 } // end of for(Int_t i3=0;i3<nPrim;i3++)
1593 } // for(Int_t i2=0;i2<nPrim;i2++)
1594 } // for(Int_t i1=0;i1<nPrim;i1++)
1595
1596 // <4'>:
1597 for(Int_t i1=0;i1<nPrim;i1++) // Loop over particles in a differential bin
1598 {
1599 aftsTrack=anEvent->GetTrack(i1);
1600 if(!(aftsTrack->InPOISelection())){continue;}
1601 dPsi1=aftsTrack->Phi();
dd96bd81 1602 if(fCalculateDiffCorrelationsVsPt)
1603 {
1604 dPt=aftsTrack->Pt();
1605 if(fDiffCorrelationsPro[0][1]->FindBin(dPt) != nDiffBinNo){continue;} // TBI spaghetti again
1606 } else
1607 {
1608 dEta=aftsTrack->Eta();
1609 if(fDiffCorrelationsPro[0][1]->FindBin(dEta) != nDiffBinNo){continue;} // TBI spaghetti again
1610 }
68a8e667 1611 if(fUseWeights[1][0]){wPsi1=Weight(dPsi1,"POI","phi");}
1612 for(Int_t i2=0;i2<nPrim;i2++) // Loop over particles in an event
1613 {
1614 if(i2==i1){continue;} // get rid of autocorrelations
1615 aftsTrack=anEvent->GetTrack(i2);
1616 if(!(aftsTrack->InRPSelection())){continue;}
1617 dPhi2=aftsTrack->Phi();
1618 if(fUseWeights[0][0]){wPhi2=Weight(dPhi2,"RP","phi");}
1619 for(Int_t i3=0;i3<nPrim;i3++)
1620 {
1621 if(i3==i1||i3==i2){continue;} // get rid of autocorrelations
1622 aftsTrack=anEvent->GetTrack(i3);
1623 if(!(aftsTrack->InRPSelection())){continue;}
1624 dPhi3=aftsTrack->Phi();
1625 if(fUseWeights[0][0]){wPhi3=Weight(dPhi3,"RP","phi");}
1626 for(Int_t i4=0;i4<nPrim;i4++)
1627 {
1628 if(i4==i1||i4==i2||i4==i3){continue;} // get rid of autocorrelations
1629 aftsTrack=anEvent->GetTrack(i4);
1630 if(!(aftsTrack->InRPSelection())){continue;}
1631 dPhi4=aftsTrack->Phi();
1632 if(fUseWeights[0][0]){wPhi4=Weight(dPhi4,"RP","phi");}
1633 // Fill the profiles:
dd96bd81 1634 if(bCrossCheck4p)
1635 {
1636 if(fCrossCheckDiffCSCOBN[0] == 0)
1637 {
1638 fNestedLoopsDiffResultsPro->Fill(0.5,TMath::Cos(fDiffHarmonics[3][0]*dPsi1+fDiffHarmonics[3][1]*dPhi2+fDiffHarmonics[3][2]*dPhi3+fDiffHarmonics[3][3]*dPhi4),wPsi1*wPhi2*wPhi3*wPhi4);
1639 } else {fNestedLoopsDiffResultsPro->Fill(0.5,TMath::Sin(fDiffHarmonics[3][0]*dPsi1+fDiffHarmonics[3][1]*dPhi2+fDiffHarmonics[3][2]*dPhi3+fDiffHarmonics[3][3]*dPhi4),wPsi1*wPhi2*wPhi3*wPhi4);}
1640 } // if(bCrossCheck4p)
68a8e667 1641 } // end of for(Int_t i4=0;i4<nPrim;i4++)
1642 } // end of for(Int_t i3=0;i3<nPrim;i3++)
1643 } // for(Int_t i2=0;i2<nPrim;i2++)
1644 } // for(Int_t i1=0;i1<nPrim;i1++)
1645
1646 // Printout:
1647 // 2-p:
1648 if(bCrossCheck2p)
1649 {
dd96bd81 1650 printf("\n 2-p => Q-vector: %.12f",fDiffCorrelationsPro[cs][1]->GetBinContent(nDiffBinNo));
68a8e667 1651 printf("\n 2-p => Nested loops: %.12f\n",fNestedLoopsDiffResultsPro->GetBinContent(1));
1652 }
1653 // 3-p:
1654 if(bCrossCheck3p)
1655 {
dd96bd81 1656 printf("\n 3-p => Q-vector: %.12f",fDiffCorrelationsPro[cs][2]->GetBinContent(nDiffBinNo));
68a8e667 1657 printf("\n 3-p => Nested loops: %.12f\n",fNestedLoopsDiffResultsPro->GetBinContent(1));
1658 }
1659 // 4-p:
1660 if(bCrossCheck4p)
1661 {
dd96bd81 1662 printf("\n 4-p => Q-vector: %.12f",fDiffCorrelationsPro[cs][3]->GetBinContent(nDiffBinNo));
68a8e667 1663 printf("\n 4-p => Nested loops: %.12f\n",fNestedLoopsDiffResultsPro->GetBinContent(1));
1664 }
1665
1666} // void AliFlowAnalysisWithMultiparticleCorrelations::CrossCheckDiffWithNestedLoops(AliFlowEventSimple *anEvent)
1667
1668//=======================================================================================================================
1669
7ecb5af4 1670void AliFlowAnalysisWithMultiparticleCorrelations::FillQvector(AliFlowEventSimple *anEvent)
1671{
1672 // Fill Q-vector components.
1673
1674 Int_t nTracks = anEvent->NumberOfTracks(); // TBI shall I promote this to data member?
1675 Double_t dPhi = 0., wPhi = 1.; // azimuthal angle and corresponding phi weight
1676 Double_t dPt = 0., wPt = 1.; // transverse momentum and corresponding pT weight
1677 Double_t dEta = 0., wEta = 1.; // pseudorapidity and corresponding eta weight
1678 Double_t wToPowerP = 1.; // weight raised to power p
1679 for(Int_t t=0;t<nTracks;t++) // loop over all tracks
1680 {
1681 AliFlowTrackSimple *pTrack = anEvent->GetTrack(t);
1682 if(!pTrack){printf("\n AAAARGH: pTrack is NULL in MPC::FillQvector(...) !!!!"); continue;}
68a8e667 1683 if(!(pTrack->InRPSelection() || pTrack->InPOISelection())){printf("\n AAAARGH: pTrack is neither RP nor POI !!!!"); continue;}
1684 if(pTrack->InRPSelection()) // fill Q-vector components only with reference particles
7ecb5af4 1685 {
dd96bd81 1686 wPhi = 1.; wPt = 1.; wEta = 1.; wToPowerP = 1.; // TBI this shall go somewhere else, for performance sake
1687
68a8e667 1688 // Access kinematic variables for RP and corresponding weights:
7ecb5af4 1689 dPhi = pTrack->Phi(); // azimuthal angle
68a8e667 1690 if(fUseWeights[0][0]){wPhi = Weight(dPhi,"RP","phi");} // corresponding phi weight
7ecb5af4 1691 //if(dPhi < 0.){dPhi += TMath::TwoPi();} TBI
1692 //if(dPhi > TMath::TwoPi()){dPhi -= TMath::TwoPi();} TBI
1693 dPt = pTrack->Pt();
68a8e667 1694 if(fUseWeights[0][1]){wPt = Weight(dPt,"RP","pt");} // corresponding pT weight
7ecb5af4 1695 dEta = pTrack->Eta();
68a8e667 1696 if(fUseWeights[0][2]){wEta = Weight(dEta,"RP","eta");} // corresponding eta weight
7ecb5af4 1697 // Calculate Q-vector components:
6696a113 1698 for(Int_t h=0;h<fMaxHarmonic*fMaxCorrelator+1;h++)
7ecb5af4 1699 {
68a8e667 1700 for(Int_t wp=0;wp<fMaxCorrelator+1;wp++) // weight power
1701 {
1702 if(fUseWeights[0][0]||fUseWeights[0][1]||fUseWeights[0][2]){wToPowerP = pow(wPhi*wPt*wEta,wp);}
1703 fQvector[h][wp] += TComplex(wToPowerP*TMath::Cos(h*dPhi),wToPowerP*TMath::Sin(h*dPhi));
1704 } // for(Int_t wp=0;wp<fMaxCorrelator+1;wp++)
1705 } // for(Int_t h=0;h<fMaxHarmonic*fMaxCorrelator+1;h++)
1706 } // if(pTrack->InRPSelection()) // fill Q-vector components only with reference particles
1707
1708 // Differential Q-vectors (a.k.a. p-vector and q-vector):
1709 if(!fCalculateDiffQvectors){continue;}
1710 if(pTrack->InPOISelection())
1711 {
1712 wPhi = 1.; wPt = 1.; wEta = 1.; wToPowerP = 1.; // TBI this shall go somewhere else, for performance sake
1713
1714 // Access kinematic variables for POI and corresponding weights:
1715 dPhi = pTrack->Phi(); // azimuthal angle
1716 if(fUseWeights[1][0]){wPhi = Weight(dPhi,"POI","phi");} // corresponding phi weight
1717 //if(dPhi < 0.){dPhi += TMath::TwoPi();} TBI
1718 //if(dPhi > TMath::TwoPi()){dPhi -= TMath::TwoPi();} TBI
1719 dPt = pTrack->Pt();
1720 if(fUseWeights[1][1]){wPt = Weight(dPt,"POI","pt");} // corresponding pT weight
1721 dEta = pTrack->Eta();
1722 if(fUseWeights[1][2]){wEta = Weight(dEta,"POI","eta");} // corresponding eta weight
1723 // Determine bin:
dd96bd81 1724 Int_t binNo = -44;
1725 if(fCalculateDiffCorrelationsVsPt)
1726 {
1727 binNo = fDiffCorrelationsPro[0][0]->FindBin(dPt); // TBI: hardwired [0][0]
1728 } else
1729 {
1730 binNo = fDiffCorrelationsPro[0][0]->FindBin(dEta); // TBI: hardwired [0][0]
1731 }
68a8e667 1732 // Calculate p-vector components:
1733 for(Int_t h=0;h<fMaxHarmonic*fMaxCorrelator+1;h++)
1734 {
1735 for(Int_t wp=0;wp<fMaxCorrelator+1;wp++) // weight power
7ecb5af4 1736 {
68a8e667 1737 if(fUseWeights[1][0]||fUseWeights[1][1]||fUseWeights[1][2]){wToPowerP = pow(wPhi*wPt*wEta,wp);}
1738 fpvector[binNo-1][h][wp] += TComplex(wToPowerP*TMath::Cos(h*dPhi),wToPowerP*TMath::Sin(h*dPhi));
1739
1740 if(pTrack->InRPSelection())
1741 {
1742 // Fill q-vector components:
dd96bd81 1743 wPhi = 1.; wPt = 1.; wEta = 1.; wToPowerP = 1.; // TBI this shall go somewhere else, for performance sake
1744
1745 if(fUseWeights[0][0]){wPhi = Weight(dPhi,"RP","phi");} // corresponding phi weight
1746 //if(dPhi < 0.){dPhi += TMath::TwoPi();} TBI
1747 //if(dPhi > TMath::TwoPi()){dPhi -= TMath::TwoPi();} TBI
1748 if(fUseWeights[0][1]){wPt = Weight(dPt,"RP","pt");} // corresponding pT weight
1749 if(fUseWeights[0][2]){wEta = Weight(dEta,"RP","eta");} // corresponding eta weight
1750 if(fUseWeights[1][0]){wPhi = Weight(dPhi,"POI","phi");} // corresponding phi weight
1751 //if(dPhi < 0.){dPhi += TMath::TwoPi();} TBI
1752 //if(dPhi > TMath::TwoPi()){dPhi -= TMath::TwoPi();} TBI
1753 if(fUseWeights[1][1]){wPt = Weight(dPt,"POI","pt");} // corresponding pT weight
1754 if(fUseWeights[1][2]){wEta = Weight(dEta,"POI","eta");} // corresponding eta weight
1755 if(fUseWeights[0][0]||fUseWeights[0][1]||fUseWeights[0][2]||fUseWeights[1][0]||fUseWeights[1][1]||fUseWeights[1][2]){wToPowerP = pow(wPhi*wPt*wEta,wp);}
68a8e667 1756 fqvector[binNo-1][h][wp] += TComplex(wToPowerP*TMath::Cos(h*dPhi),wToPowerP*TMath::Sin(h*dPhi));
1757 } // if(pTrack->InRPSelection())
dd96bd81 1758
68a8e667 1759 } // for(Int_t wp=0;wp<fMaxCorrelator+1;wp++)
6696a113 1760 } // for(Int_t h=0;h<fMaxHarmonic*fMaxCorrelator+1;h++)
68a8e667 1761 } // if(pTrack->InPOISelection())
1762
7ecb5af4 1763 } // for(Int_t t=0;t<nTracks;t++) // loop over all tracks
1764
1765} // void AliFlowAnalysisWithMultiparticleCorrelations::FillQvector(AliFlowEventSimple *anEvent)
1766
1767//=======================================================================================================================
1768
37d2f768 1769void AliFlowAnalysisWithMultiparticleCorrelations::CrossCheckSettings()
1770{
1771 // Cross-check all initial settings in this method.
1772
6696a113 1773 // a) Few cross-checks for control histograms;
6d19c373 1774 // b) Few cross-checks for flags for correlations;
68a8e667 1775 // c) 'Standard candles';
1776 // d) Q-cumulants;
dd96bd81 1777 // e) Weights;
1778 // f) Differential correlations;
4ffd61b4 1779 // g) Nested loops;
1780 // h) Dump the points.
6696a113 1781
1782 TString sMethodName = "AliFlowAnalysisWithMultiparticleCorrelations::CrossCheckSettings()";
1783
1784 // a) Few cross-checks for control histograms: TBI the lines below are not really what they are supposed to be...
1785 /*
1786 if(fFillKinematicsHist && !fFillControlHistograms){Fatal(sMethodName.Data(),"fFillKinematicsHist && !fFillControlHistograms");}
1787 if(fFillMultDistributionsHist && !fFillControlHistograms){Fatal(sMethodName.Data(),"fFillMultDistributionsHist && !fFillControlHistograms");}
1788 if(fFillMultCorrelationsHist && !fFillControlHistograms){Fatal(sMethodName.Data(),"fFillMultCorrelationsHist && !fFillControlHistograms");}
1789 */
1790
1791 // b) Few cross-checks for flags for correlations: // TBI the lines bellow can be civilized
1792 Int_t iSum = (Int_t)fCalculateIsotropic + (Int_t)fCalculateSame + (Int_t)fCalculateSameIsotropic;
1793 if(iSum>1){Fatal(sMethodName.Data(),"iSum is doing crazy things...");}
68a8e667 1794 if(fCalculateOnlyCos && fCalculateOnlySin){Fatal(sMethodName.Data(),"fCalculateOnlyCos && fCalculateOnlySin");}
37d2f768 1795
6d19c373 1796 // c) 'Standard candles':
1797 if(fCalculateStandardCandles && !fCalculateCorrelations)
1798 {
1799 Fatal(sMethodName.Data(),"fCalculateStandardCandles && !fCalculateCorrelations");
1800 }
68a8e667 1801 if(fCalculateStandardCandles && fCalculateCorrelations && fCalculateSameIsotropic)
1802 {
1803 Fatal(sMethodName.Data(),"fCalculateStandardCandles && fCalculateCorrelations && fCalculateSameIsotropic");
1804 }
1805 if(fCalculateStandardCandles && fCalculateOnlyForHarmonicQC)
1806 {
1807 Fatal(sMethodName.Data(),"fCalculateStandardCandles && fCalculateOnlyForHarmonicQC");
1808 }
1809 if(fCalculateStandardCandles && fCalculateOnlyForSC && (4!=fDontGoBeyond))
1810 {
1811 Fatal(sMethodName.Data(),"fCalculateStandardCandles && fCalculateOnlyForSC && (4!=fDontGoBeyond)");
1812 }
1813 if(fCalculateStandardCandles && !fPropagateErrorSC)
1814 {
1815 Warning(sMethodName.Data(),"fCalculateStandardCandles && !fPropagateErrorSC");
1816 }
1817 if(fCalculateStandardCandles && fCalculateOnlySin)
1818 {
1819 Fatal(sMethodName.Data(),"fCalculateStandardCandles && fCalculateOnlySin");
1820 }
dd96bd81 1821 if(fCalculateStandardCandles && fDontGoBeyond < 3)
1822 {
1823 Fatal(sMethodName.Data(),"fCalculateStandardCandles && fDontGoBeyond < 3");
1824 }
68a8e667 1825
1826 // d) Q-cumulants:
1827 if(fCalculateQcumulants && !fCalculateCorrelations)
1828 {
1829 Fatal(sMethodName.Data(),"fCalculateQcumulants && !fCalculateCorrelations");
1830 }
1831 if(fCalculateQcumulants && !(fHarmonicQC > 0))
1832 {
1833 Fatal(sMethodName.Data(),"fCalculateQcumulants && !(fHarmonicQC > 0)");
1834 }
1835 if(fCalculateQcumulants && fCalculateOnlyForSC)
1836 {
1837 Fatal(sMethodName.Data(),"fCalculateQcumulants && fCalculateOnlyForSC");
1838 }
1839 if(fCalculateQcumulants && !fPropagateErrorQC)
1840 {
1841 Warning(sMethodName.Data(),"fCalculateQcumulants && !fPropagateErrorQC");
1842 }
1843 if(fCalculateQcumulants && fCalculateOnlySin)
1844 {
1845 Fatal(sMethodName.Data(),"fCalculateQcumulants && fCalculateOnlySin");
1846 }
1847
1848 // e) Weights:
1849 for(Int_t rp=0;rp<2;rp++) // [RP,POI]
1850 {
1851 for(Int_t ppe=0;ppe<3;ppe++) // [phi,pt,eta]
1852 {
1853 if(fUseWeights[rp][ppe] && !fWeightsHist[rp][ppe])
1854 {
1855 Fatal(sMethodName.Data(),"fUseWeights[rp][ppe] && !fWeightsHist[rp][ppe], rp = %d, ppe = %d",rp,ppe);
1856 }
1857 }
1858 }
6d19c373 1859
dd96bd81 1860 // f) Differential correlations:
03823be7 1861 if(fCalculateDiffCorrelations && !fCalculateDiffQvectors)
1862 {
1863 Fatal(sMethodName.Data(),"fCalculateDiffCorrelations && !fCalculateDiffQvectors");
1864 }
1865 if(fCalculateDiffCorrelations && !fCalculateQvector)
1866 {
1867 Fatal(sMethodName.Data(),"fCalculateDiffCorrelations && !fCalculateQvector");
1868 }
1869 if(!fCalculateDiffCorrelations && fCalculateDiffQvectors)
1870 {
1871 Fatal(sMethodName.Data(),"!fCalculateDiffCorrelations && fCalculateDiffQvectors");
1872 }
dd96bd81 1873 if(fCalculateDiffCorrelations && !fUseDefaultBinning && (fnDiffBins < 1 || !fRangesDiffBins))
1874 {
1875 Fatal(sMethodName.Data(),"fCalculateDiffCorrelations && !fUseDefaultBinning && (fnDiffBins < 1 || !fRangesDiffBins)");
1876 }
1877 if(fCalculateDiffCorrelations && !(fCalculateDiffCos || fCalculateDiffSin))
1878 {
1879 Fatal(sMethodName.Data(),"fCalculateDiffCorrelations && !(fCalculateDiffCos || fCalculateDiffSin)");
1880 }
03823be7 1881 if(fCalculateDiffCorrelations && fDontFill[1])
1882 {
1883 Warning(sMethodName.Data(),"fCalculateDiffCorrelations && fDontFill[1]");
1884 }
dd96bd81 1885
1886 // g) Nested loops:
1887 if(fCrossCheckDiffWithNestedLoops && (1 == fCrossCheckDiffCSCOBN[0] && !fCalculateDiffSin))
1888 {
1889 Fatal(sMethodName.Data(),"fCrossCheckDiffWithNestedLoops && (1 == fCrossCheckDiffCSCOBN[0] && !CalculateDiffSin)");
1890 }
1891 if(fCrossCheckDiffWithNestedLoops && (0 == fCrossCheckDiffCSCOBN[0] && !fCalculateDiffCos))
1892 {
1893 Fatal(sMethodName.Data(),"fCrossCheckDiffWithNestedLoops && (0 == fCrossCheckDiffCSCOBN[0] && !CalculateDiffCos)");
1894 }
1895
4ffd61b4 1896 // h) Dump the points:
1897 if(fDumpThePoints && !fFillMultDistributionsHist)
1898 {
1899 Fatal(sMethodName.Data(),"if(fDumpThePoints && !fFillMultDistributionsHist)");
1900 }
1901 if(fDumpThePoints && fMaxNoEventsPerFile <= 0)
1902 {
1903 Fatal(sMethodName.Data(),"if(fDumpThePoints && fMaxNoEventsPerFile <= 0)");
1904 }
1905
37d2f768 1906} // end of void AliFlowAnalysisWithMultiparticleCorrelations::CrossCheckSettings()
1907
1908//=======================================================================================================================
1909
1910void AliFlowAnalysisWithMultiparticleCorrelations::BookAndNestAllLists()
1911{
1912 // Book and nest all lists nested in the base list fHistList.
1913
1914 // a) Book and nest lists for control histograms;
68a8e667 1915 // b) Book and nest lists for Q-vectors;
7ecb5af4 1916 // c) Book and nest lists for correlations;
68a8e667 1917 // d) Book and nest lists for e-b-e cumulants;
9efbd2f5 1918 // e) Book and nest lists for weights;
1919 // f) Book and nest lists for nested loops;
68a8e667 1920 // g) Book and nest lists for 'standard candles';
1921 // h) Book and nest lists for Q-cumulants;
1922 // i) Book and nest lists for differential correlations.
37d2f768 1923
1924 // a) Book and nest lists for control histograms:
1925 fControlHistogramsList = new TList();
1926 fControlHistogramsList->SetName("Control Histograms");
1927 fControlHistogramsList->SetOwner(kTRUE);
1928 fHistList->Add(fControlHistogramsList);
1929
68a8e667 1930 // b) Book and nest lists for Q-vectors:
9efbd2f5 1931 fQvectorList = new TList();
68a8e667 1932 fQvectorList->SetName("Q-vectors");
9efbd2f5 1933 fQvectorList->SetOwner(kTRUE);
1934 fHistList->Add(fQvectorList);
7ecb5af4 1935
1936 // c) Book and nest lists for correlations:
1937 fCorrelationsList = new TList();
1938 fCorrelationsList->SetName("Correlations");
1939 fCorrelationsList->SetOwner(kTRUE);
1940 fHistList->Add(fCorrelationsList);
1941
68a8e667 1942 // d) Book and nest lists for e-b-e cumulants:
1943 fEbECumulantsList = new TList();
1944 fEbECumulantsList->SetName("E-b-e Cumulants");
1945 fEbECumulantsList->SetOwner(kTRUE);
1946 fHistList->Add(fEbECumulantsList);
7ecb5af4 1947
9efbd2f5 1948 // e) Book and nest lists for weights:
1949 fWeightsList = new TList();
1950 fWeightsList->SetName("Weights");
1951 fWeightsList->SetOwner(kTRUE);
1952 fHistList->Add(fWeightsList);
1953
1954 // f) Book and nest lists for nested loops:
7ecb5af4 1955 fNestedLoopsList = new TList();
1956 fNestedLoopsList->SetName("Nested Loops");
1957 fNestedLoopsList->SetOwner(kTRUE);
1958 fHistList->Add(fNestedLoopsList);
1959
9efbd2f5 1960 // g) Book and nest lists for 'standard candles':
7ecb5af4 1961 fStandardCandlesList = new TList();
1962 fStandardCandlesList->SetName("Standard Candles");
1963 fStandardCandlesList->SetOwner(kTRUE);
1964 fHistList->Add(fStandardCandlesList);
1965
68a8e667 1966 // h) Book and nest lists for Q-cumulants:
1967 fQcumulantsList = new TList();
1968 fQcumulantsList->SetName("Q-cumulants");
1969 fQcumulantsList->SetOwner(kTRUE);
1970 fHistList->Add(fQcumulantsList);
1971
1972 // i) Book and nest lists for differential correlations:
1973 fDiffCorrelationsList = new TList();
1974 fDiffCorrelationsList->SetName("Differential Correlations");
1975 fDiffCorrelationsList->SetOwner(kTRUE);
1976 fHistList->Add(fDiffCorrelationsList);
1977
37d2f768 1978} // end of void AliFlowAnalysisWithMultiparticleCorrelations::BookAndNestAllLists()
1979
1980//=======================================================================================================================
1981
1982void AliFlowAnalysisWithMultiparticleCorrelations::WriteHistograms(TString outputFileName)
1983{
1984 // Store the final results in output file <outputFileName>.root.
1985
1986 TFile *output = new TFile(outputFileName.Data(),"RECREATE");
1987 fHistList->Write(fHistList->GetName(),TObject::kSingleKey);
1988
1989 delete output;
1990
1991} // end of void AliFlowAnalysisWithMultiparticleCorrelations::WriteHistograms(TString outputFileName)
1992
1993//=======================================================================================================================
1994
1995void AliFlowAnalysisWithMultiparticleCorrelations::WriteHistograms(TDirectoryFile *outputFileName)
1996{
1997 // Store the final results in output file <outputFileName>.root.
1998
1999 outputFileName->Add(fHistList);
2000 outputFileName->Write(outputFileName->GetName(),TObject::kSingleKey);
2001
2002} // end of void AliFlowAnalysisWithMultiparticleCorrelations::WriteHistograms(TDirectoryFile *outputFileName)
2003
2004//=======================================================================================================================
2005
2006void AliFlowAnalysisWithMultiparticleCorrelations::BookEverythingForControlHistograms()
2007{
2008 // Book all the stuff for control histograms.
2009
2010 // a) Book the profile holding all the flags for control histograms;
2011 // b) Book all control histograms;
2012 // b0) Book TH1D *fKinematicsHist[2][3];
2013 // b1) Book TH1D *fMultDistributionsHist[3];
2014 // b2) Book TH2D *fMultCorrelationsHist[3].
2015
2016 // a) Book the profile holding all the flags for control histograms: TBI stil incomplete
03823be7 2017 fControlHistogramsFlagsPro = new TProfile("fControlHistogramsFlagsPro","Flags and settings for control histograms",7,0,7);
37d2f768 2018 fControlHistogramsFlagsPro->SetTickLength(-0.01,"Y");
2019 fControlHistogramsFlagsPro->SetMarkerStyle(25);
2020 fControlHistogramsFlagsPro->SetLabelSize(0.04);
2021 fControlHistogramsFlagsPro->SetLabelOffset(0.02,"Y");
2022 fControlHistogramsFlagsPro->SetStats(kFALSE);
7ecb5af4 2023 fControlHistogramsFlagsPro->SetFillColor(kGray);
2024 fControlHistogramsFlagsPro->SetLineColor(kBlack);
2025 fControlHistogramsFlagsPro->GetXaxis()->SetBinLabel(1,"fFillControlHistograms"); fControlHistogramsFlagsPro->Fill(0.5,fFillControlHistograms);
6696a113 2026 fControlHistogramsFlagsPro->GetXaxis()->SetBinLabel(2,"fFillKinematicsHist"); fControlHistogramsFlagsPro->Fill(1.5,fFillKinematicsHist);
2027 fControlHistogramsFlagsPro->GetXaxis()->SetBinLabel(3,"fFillMultDistributionsHist"); fControlHistogramsFlagsPro->Fill(2.5,fFillMultDistributionsHist);
2028 fControlHistogramsFlagsPro->GetXaxis()->SetBinLabel(4,"fFillMultCorrelationsHist"); fControlHistogramsFlagsPro->Fill(3.5,fFillMultCorrelationsHist);
03823be7 2029 fControlHistogramsFlagsPro->GetXaxis()->SetBinLabel(5,"fDontFill[0=RP]"); fControlHistogramsFlagsPro->Fill(4.5,fDontFill[0]);
2030 fControlHistogramsFlagsPro->GetXaxis()->SetBinLabel(6,"fDontFill[1=POI]"); fControlHistogramsFlagsPro->Fill(5.5,fDontFill[1]);
2031 fControlHistogramsFlagsPro->GetXaxis()->SetBinLabel(7,"fDontFill[2=REF]"); fControlHistogramsFlagsPro->Fill(6.5,fDontFill[2]);
37d2f768 2032 fControlHistogramsList->Add(fControlHistogramsFlagsPro);
2033
6696a113 2034 if(!fFillControlHistograms){return;} // TBI is this safe? Well, perhaps it is if I can't implement it better...
7ecb5af4 2035
37d2f768 2036 // b) Book all control histograms: // TBI add setters for all these values
2037 // b0) Book TH1D *fKinematicsHist[2][3]:
37d2f768 2038 TString name[2][3] = {{"RP,phi","RP,pt","RP,eta"},{"POI,phi","POI,pt","POI,eta"}}; // [RP,POI][phi,pt,eta]
2039 TString title[2] = {"Reference particles (RP)","Particles of interest (POI)"}; // [RP,POI]
2040 Int_t lineColor[2] = {kBlue,kRed}; // [RP,POI]
2041 Int_t fillColor[2] = {kBlue-10,kRed-10}; // [RP,POI]
2042 TString xAxisTitle[3] = {"#phi","p_{T}","#eta"}; // [phi,pt,eta]
645e447d 2043 if(fFillKinematicsHist)
37d2f768 2044 {
645e447d 2045 for(Int_t rp=0;rp<2;rp++) // [RP,POI]
37d2f768 2046 {
03823be7 2047 if(fDontFill[rp]){continue;}
645e447d 2048 for(Int_t ppe=0;ppe<3;ppe++) // [phi,pt,eta]
2049 {
2050 fKinematicsHist[rp][ppe] = new TH1D(name[rp][ppe].Data(),title[rp].Data(),fnBins[rp][ppe],fMin[rp][ppe],fMax[rp][ppe]);
2051 fKinematicsHist[rp][ppe]->GetXaxis()->SetTitle(xAxisTitle[ppe].Data());
2052 fKinematicsHist[rp][ppe]->SetLineColor(lineColor[rp]);
2053 fKinematicsHist[rp][ppe]->SetFillColor(fillColor[rp]);
2054 fKinematicsHist[rp][ppe]->SetMinimum(0.);
2055 fControlHistogramsList->Add(fKinematicsHist[rp][ppe]);
2056 }
37d2f768 2057 }
645e447d 2058 } // if(fFillKinematicsHist)
37d2f768 2059
2060 // b1) Book TH1D *fMultDistributionsHist[3]: // TBI add setters for all these values
37d2f768 2061 TString nameMult[3] = {"Multiplicity (RP)","Multiplicity (POI)","Multiplicity (REF)"}; // [RP,POI,reference multiplicity]
2062 TString titleMult[3] = {"Reference particles (RP)","Particles of interest (POI)",""}; // [RP,POI,reference multiplicity]
2063 Int_t lineColorMult[3] = {kBlue,kRed,kGreen+2}; // [RP,POI,reference multiplicity]
2064 Int_t fillColorMult[3] = {kBlue-10,kRed-10,kGreen-10}; // [RP,POI,reference multiplicity]
2065 TString xAxisTitleMult[3] = {"Multiplicity (RP)","Multiplicity (POI)","Multiplicity (REF)"}; // [phi,pt,eta]
645e447d 2066 if(fFillMultDistributionsHist)
37d2f768 2067 {
645e447d 2068 for(Int_t rprm=0;rprm<3;rprm++) // [RP,POI,reference multiplicity]
2069 {
03823be7 2070 if(fDontFill[rprm]){continue;}
645e447d 2071 fMultDistributionsHist[rprm] = new TH1D(nameMult[rprm].Data(),titleMult[rprm].Data(),fnBinsMult[rprm],fMinMult[rprm],fMaxMult[rprm]);
2072 fMultDistributionsHist[rprm]->GetXaxis()->SetTitle(xAxisTitleMult[rprm].Data());
2073 fMultDistributionsHist[rprm]->SetLineColor(lineColorMult[rprm]);
2074 fMultDistributionsHist[rprm]->SetFillColor(fillColorMult[rprm]);
2075 fControlHistogramsList->Add(fMultDistributionsHist[rprm]);
2076 } // for(Int_t rprm=0;rprm<3;rprm++) // [RP,POI,reference multiplicity]
2077 } // if(fFillMultDistributionsHist)
2078
4ffd61b4 2079 // b2) Book TH2I *fMultCorrelationsHist[3]:
645e447d 2080 if(fFillMultCorrelationsHist)
2081 {
03823be7 2082 if(!fDontFill[0] && !fDontFill[1])
2083 {
2084 fMultCorrelationsHist[0] = new TH2I("Multiplicity (RP vs. POI)","Multiplicity (RP vs. POI)",fnBinsMult[0],fMinMult[0],fMaxMult[0],fnBinsMult[1],fMinMult[1],fMaxMult[1]);
2085 fMultCorrelationsHist[0]->GetXaxis()->SetTitle(xAxisTitleMult[0].Data());
2086 fMultCorrelationsHist[0]->GetYaxis()->SetTitle(xAxisTitleMult[1].Data());
2087 fControlHistogramsList->Add(fMultCorrelationsHist[0]);
2088 }
2089 if(!fDontFill[0] && !fDontFill[2])
2090 {
2091 fMultCorrelationsHist[1] = new TH2I("Multiplicity (RP vs. REF)","Multiplicity (RP vs. REF)",fnBinsMult[0],fMinMult[0],fMaxMult[0],fnBinsMult[2],fMinMult[2],fMaxMult[2]);
2092 fMultCorrelationsHist[1]->GetXaxis()->SetTitle(xAxisTitleMult[0].Data());
2093 fMultCorrelationsHist[1]->GetYaxis()->SetTitle(xAxisTitleMult[2].Data());
2094 fControlHistogramsList->Add(fMultCorrelationsHist[1]);
2095 }
2096 if(!fDontFill[1] && !fDontFill[2])
2097 {
2098 fMultCorrelationsHist[2] = new TH2I("Multiplicity (POI vs. REF)","Multiplicity (POI vs. REF)",fnBinsMult[1],fMinMult[1],fMaxMult[1],fnBinsMult[2],fMinMult[2],fMaxMult[2]);
2099 fMultCorrelationsHist[2]->GetXaxis()->SetTitle(xAxisTitleMult[1].Data());
2100 fMultCorrelationsHist[2]->GetYaxis()->SetTitle(xAxisTitleMult[2].Data());
2101 fControlHistogramsList->Add(fMultCorrelationsHist[2]);
2102 }
645e447d 2103 } // if(fFillMultCorrelationsHist){
37d2f768 2104
2105} // void AliFlowAnalysisWithMultiparticleCorrelations::BookEverythingForControlHistograms()
2106
2107//=======================================================================================================================
2108
2109void AliFlowAnalysisWithMultiparticleCorrelations::FillControlHistograms(AliFlowEventSimple *anEvent)
2110{
2111 // Fill control histograms.
37d2f768 2112 // a) Fill TH1D *fKinematicsHist[2][3];
2113 // b) Fill TH1D *fMultDistributionsHist[3];
2114 // c) Fill TH2D *fMultCorrelationsHist[3].
2115
2116 // a) Fill TH1D *fKinematicsHist[2][3]:
6696a113 2117 if(fFillKinematicsHist)
37d2f768 2118 {
6696a113 2119 Int_t nTracks = anEvent->NumberOfTracks(); // TBI shall I promote this to data member?
2120 for(Int_t t=0;t<nTracks;t++) // loop over all tracks
37d2f768 2121 {
6696a113 2122 AliFlowTrackSimple *pTrack = anEvent->GetTrack(t);
2123 if(!pTrack){printf("\n AAAARGH: pTrack is NULL in MPC::FCH() !!!!");continue;}
2124 if(pTrack)
37d2f768 2125 {
6696a113 2126 Double_t dPhi = pTrack->Phi();
2127 //if(dPhi < 0.){dPhi += TMath::TwoPi();} TBI
2128 //if(dPhi > TMath::TwoPi()){dPhi -= TMath::TwoPi();} TBI
2129 Double_t dPt = pTrack->Pt();
2130 Double_t dEta = pTrack->Eta();
2131 Double_t dPhiPtEta[3] = {dPhi,dPt,dEta};
2132 for(Int_t rp=0;rp<2;rp++) // [RP,POI]
37d2f768 2133 {
6696a113 2134 for(Int_t ppe=0;ppe<3;ppe++) // [phi,pt,eta]
2135 {
2136 if((0==rp && pTrack->InRPSelection()) || (1==rp && pTrack->InPOISelection())) // TBI
2137 {
03823be7 2138 if(fKinematicsHist[rp][ppe]){fKinematicsHist[rp][ppe]->Fill(dPhiPtEta[ppe]);}
6696a113 2139 }
2140 } // for(Int_t ppe=0;ppe<3;ppe++) // [phi,pt,eta]
2141 } // for(Int_t rp=0;rp<2;rp++) // [RP,POI]
2142 } // if(pTrack)
2143 } // for(Int_t t=0;t<nTracks;t++) // loop over all tracks
2144 } // if(fFillKinematicsHist)
37d2f768 2145
2146 // b) Fill TH1D *fMultDistributionsHist[3]:
2147 Double_t dMultRP = anEvent->GetNumberOfRPs(); // TBI shall I promote these 3 variables into data members?
2148 Double_t dMultPOI = anEvent->GetNumberOfPOIs();
2149 Double_t dMultREF = anEvent->GetReferenceMultiplicity();
2150 Double_t dMult[3] = {dMultRP,dMultPOI,dMultREF};
2151 for(Int_t rprm=0;rprm<3;rprm++) // [RP,POI,reference multiplicity]
2152 {
03823be7 2153 if(fFillMultDistributionsHist && fMultDistributionsHist[rprm]){fMultDistributionsHist[rprm]->Fill(dMult[rprm]);}
37d2f768 2154 }
2155
4ffd61b4 2156 // c) Fill TH2I *fMultCorrelationsHist[3]:
6696a113 2157 if(fFillMultCorrelationsHist)
2158 {
03823be7 2159 if(fMultCorrelationsHist[0]){fMultCorrelationsHist[0]->Fill((Int_t)dMultRP,(Int_t)dMultPOI);} // RP vs. POI
2160 if(fMultCorrelationsHist[1]){fMultCorrelationsHist[1]->Fill((Int_t)dMultRP,(Int_t)dMultREF);} // RP vs. refMult
2161 if(fMultCorrelationsHist[2]){fMultCorrelationsHist[2]->Fill((Int_t)dMultPOI,(Int_t)dMultREF);} // POI vs. refMult
6696a113 2162 } // if(fFillMultCorrelationsHist)
37d2f768 2163
2164} // void AliFlowAnalysisWithMultiparticleCorrelations::FillControlHistograms(AliFlowEventSimple *anEvent)
2165
2166//=======================================================================================================================
2167
2168void AliFlowAnalysisWithMultiparticleCorrelations::InitializeArraysForControlHistograms()
2169{
2170 // Initialize all arrays for control histograms.
2171
2172 // a) Initialize TH1D *fKinematicsHist[2][3];
2173 // b) Initialize TH1D *fMultDistributionsHist[3];
645e447d 2174 // c) Initialize TH2D *fMultCorrelationsHist[3];
03823be7 2175 // d) Initialize Bool_t fDontFill[3];
2176 // e) Initialize default binning values for fKinematicsHist[2][3];
2177 // f) Initialize default binning values for fMultCorrelationsHist[3].
645e447d 2178
37d2f768 2179 // a) Initialize TH1D *fKinematicsHist[2][3]:
2180 for(Int_t rp=0;rp<2;rp++) // [RP,POI]
2181 {
2182 for(Int_t ppe=0;ppe<3;ppe++) // [phi,pt,eta]
2183 {
2184 fKinematicsHist[rp][ppe] = NULL;
2185 }
2186 }
2187
2188 // b) Initialize TH1D *fMultDistributionsHist[3]:
2189 for(Int_t rprm=0;rprm<3;rprm++) // [RP,POI,reference multiplicity]
2190 {
2191 fMultDistributionsHist[rprm] = NULL;
2192 }
2193
4ffd61b4 2194 // c) Initialize TH2I *fMultCorrelationsHist[3]:
37d2f768 2195 for(Int_t r=0;r<3;r++) // [RP vs. POI, RP vs. refMult, POI vs. refMult]
2196 {
2197 fMultCorrelationsHist[r] = NULL;
2198 }
2199
03823be7 2200 // d) Initialize Bool_t fDontFill[3]:
2201 for(Int_t rpr=0;rpr<3;rpr++) // [RP,POI,REF]
2202 {
2203 fDontFill[rpr] = kFALSE;
2204 }
2205
2206 // e) Initialize default binning values for fKinematicsHist[2][3]:
645e447d 2207 // nBins:
2208 fnBins[0][0] = 360; // [RP][phi]
2209 fnBins[0][1] = 1000; // [RP][pt]
2210 fnBins[0][2] = 1000; // [RP][eta]
2211 fnBins[1][0] = 360; // [POI][phi]
2212 fnBins[1][1] = 1000; // [POI][pt]
2213 fnBins[1][2] = 1000; // [POI][eta]
2214 // Min:
2215 fMin[0][0] = 0.; // [RP][phi]
2216 fMin[0][1] = 0.; // [RP][pt]
2217 fMin[0][2] = -1.; // [RP][eta]
2218 fMin[1][0] = 0.; // [POI][phi]
2219 fMin[1][1] = 0.; // [POI][pt]
2220 fMin[1][2] = -1.; // [POI][eta]
2221 // Max:
2222 fMax[0][0] = TMath::TwoPi(); // [RP][phi]
2223 fMax[0][1] = 10.; // [RP][pt]
2224 fMax[0][2] = 1.; // [RP][eta]
2225 fMax[1][0] = TMath::TwoPi(); // [POI][phi]
2226 fMax[1][1] = 10.; // [POI][pt]
2227 fMax[1][2] = 1.; // [POI][eta]
2228
03823be7 2229 // f) Initialize default binning values for fMultCorrelationsHist[3]:
645e447d 2230 // nBins:
2231 fnBinsMult[0] = 3000; // [RP]
2232 fnBinsMult[1] = 3000; // [POI]
2233 fnBinsMult[2] = 3000; // [REF]
2234 // Min:
2235 fMinMult[0] = 0.; // [RP]
2236 fMinMult[1] = 0.; // [POI]
2237 fMinMult[2] = 0.; // [REF]
2238 // Max:
2239 fMaxMult[0] = 3000.; // [RP]
2240 fMaxMult[1] = 3000.; // [POI]
2241 fMaxMult[2] = 3000.; // [REF]
2242
37d2f768 2243} // void AliFlowAnalysisWithMultiparticleCorrelations::InitializeArraysForControlHistograms()
2244
2245//=======================================================================================================================
2246
9efbd2f5 2247void AliFlowAnalysisWithMultiparticleCorrelations::BookEverythingForQvector()
2248{
2249 // Book all the stuff for Q-vector.
2250
2251 // a) Book the profile holding all the flags for Q-vector;
2252 // ...
2253
2254 // a) Book the profile holding all the flags for Q-vector:
68a8e667 2255 fQvectorFlagsPro = new TProfile("fQvectorFlagsPro","Flags for Q-vectors",2,0,2);
9efbd2f5 2256 fQvectorFlagsPro->SetTickLength(-0.01,"Y");
2257 fQvectorFlagsPro->SetMarkerStyle(25);
2258 fQvectorFlagsPro->SetLabelSize(0.03);
2259 fQvectorFlagsPro->SetLabelOffset(0.02,"Y");
2260 fQvectorFlagsPro->SetStats(kFALSE);
2261 fQvectorFlagsPro->SetFillColor(kGray);
2262 fQvectorFlagsPro->SetLineColor(kBlack);
2263 fQvectorFlagsPro->GetXaxis()->SetBinLabel(1,"fCalculateQvector"); fQvectorFlagsPro->Fill(0.5,fCalculateQvector);
68a8e667 2264 fQvectorFlagsPro->GetXaxis()->SetBinLabel(2,"fCalculateDiffQvectors"); fQvectorFlagsPro->Fill(1.5,fCalculateDiffQvectors);
9efbd2f5 2265 fQvectorList->Add(fQvectorFlagsPro);
2266
9efbd2f5 2267 // ...
2268
2269} // void AliFlowAnalysisWithMultiparticleCorrelations::BookEverythingForQvector()
2270
2271//=======================================================================================================================
2272
7ecb5af4 2273void AliFlowAnalysisWithMultiparticleCorrelations::BookEverythingForCorrelations()
2274{
2275 // Book all the stuff for correlations.
2276
2277 // TBI this method can be implemented in a much more civilised way.
2278
2279 // a) Book the profile holding all the flags for correlations;
6696a113 2280 // b) Book TProfile *fCorrelationsPro[2][8] ([0=cos,1=sin][1p,2p,...,8p]).
7ecb5af4 2281
68a8e667 2282 TString sMethodName = "void AliFlowAnalysisWithMultiparticleCorrelations::BookEverythingForCorrelations()";
2283
7ecb5af4 2284 // a) Book the profile holding all the flags for correlations:
68a8e667 2285 fCorrelationsFlagsPro = new TProfile("fCorrelationsFlagsPro","Flags for correlations",13,0,13);
7ecb5af4 2286 fCorrelationsFlagsPro->SetTickLength(-0.01,"Y");
2287 fCorrelationsFlagsPro->SetMarkerStyle(25);
2288 fCorrelationsFlagsPro->SetLabelSize(0.03);
2289 fCorrelationsFlagsPro->SetLabelOffset(0.02,"Y");
2290 fCorrelationsFlagsPro->SetStats(kFALSE);
2291 fCorrelationsFlagsPro->SetFillColor(kGray);
2292 fCorrelationsFlagsPro->SetLineColor(kBlack);
2293 fCorrelationsFlagsPro->GetXaxis()->SetBinLabel(1,"fCalculateCorrelations"); fCorrelationsFlagsPro->Fill(0.5,fCalculateCorrelations);
2294 fCorrelationsFlagsPro->GetXaxis()->SetBinLabel(2,"fMaxHarmonic"); fCorrelationsFlagsPro->Fill(1.5,fMaxHarmonic);
2295 fCorrelationsFlagsPro->GetXaxis()->SetBinLabel(3,"fMaxCorrelator"); fCorrelationsFlagsPro->Fill(2.5,fMaxCorrelator);
6696a113 2296 fCorrelationsFlagsPro->GetXaxis()->SetBinLabel(4,"fCalculateIsotropic"); fCorrelationsFlagsPro->Fill(3.5,fCalculateIsotropic);
2297 fCorrelationsFlagsPro->GetXaxis()->SetBinLabel(5,"fCalculateSame"); fCorrelationsFlagsPro->Fill(4.5,fCalculateSame);
2298 fCorrelationsFlagsPro->GetXaxis()->SetBinLabel(6,"fSkipZeroHarmonics"); fCorrelationsFlagsPro->Fill(5.5,fSkipZeroHarmonics);
2299 fCorrelationsFlagsPro->GetXaxis()->SetBinLabel(7,"fCalculateSameIsotropic"); fCorrelationsFlagsPro->Fill(6.5,fCalculateSameIsotropic);
2300 fCorrelationsFlagsPro->GetXaxis()->SetBinLabel(8,"fCalculateAll"); fCorrelationsFlagsPro->Fill(7.5,fCalculateAll);
2301 fCorrelationsFlagsPro->GetXaxis()->SetBinLabel(9,"fDontGoBeyond"); fCorrelationsFlagsPro->Fill(8.5,fDontGoBeyond);
68a8e667 2302 fCorrelationsFlagsPro->GetXaxis()->SetBinLabel(10,"fCalculateOnlyForHarmonicQC"); fCorrelationsFlagsPro->Fill(9.5,fCalculateOnlyForHarmonicQC);
2303 fCorrelationsFlagsPro->GetXaxis()->SetBinLabel(11,"fCalculateOnlyForSC"); fCorrelationsFlagsPro->Fill(10.5,fCalculateOnlyForSC);
2304 fCorrelationsFlagsPro->GetXaxis()->SetBinLabel(12,"fCalculateOnlyCos"); fCorrelationsFlagsPro->Fill(11.5,fCalculateOnlyCos);
2305 fCorrelationsFlagsPro->GetXaxis()->SetBinLabel(13,"fCalculateOnlySin"); fCorrelationsFlagsPro->Fill(12.5,fCalculateOnlySin);
7ecb5af4 2306 fCorrelationsList->Add(fCorrelationsFlagsPro);
2307
2308 if(!fCalculateCorrelations){return;} // TBI is this safe enough?
2309
68a8e667 2310 // b) Book TProfile *fCorrelationsPro[2][8] ([0=cos,1=sin][1p,2p,...,8p]): // TBI hardwired 8, shall be fMaxCorrelator
2311 cout<<" => Booking TProfile *fCorrelationsPro[2][8]..."<<endl;
6696a113 2312 TString sCosSin[2] = {"Cos","Sin"};
2313 Int_t markerColor[2] = {kBlue,kRed};
2314 Int_t markerStyle[2] = {kFullSquare,kFullSquare};
2315 Int_t nBins[8] = {1,1,1,1,1,1,1,1}; // TBI hardwired 8, shall be fMaxCorrelator
2316 Int_t nBinsTitle[8] = {1,1,1,1,1,1,1,1}; // TBI hardwired 8, shall be fMaxCorrelator
2317 Int_t nToBeFilled[8] = {0,0,0,0,0,0,0,0}; // TBI hardwired 8, shall be fMaxCorrelator
2318 for(Int_t c=0;c<fMaxCorrelator;c++) // [1p,2p,...,8p]
7ecb5af4 2319 {
6696a113 2320 // Implementing \binom{n+k-1}{k}, which is the resulting number of sets obtained
2321 // after sampling n starting elements into k subsets, repetitions allowed.
2322 // In my case, n=2*fMaxHarmonic+1, k=c+1, hence:
9efbd2f5 2323 nBins[c] = (Int_t)(TMath::Factorial(2*fMaxHarmonic+1+c+1-1)
2324 / (TMath::Factorial(2*fMaxHarmonic+1-1)*TMath::Factorial(c+1)));
6696a113 2325 nBinsTitle[c] = nBins[c];
68a8e667 2326 if(c>=fDontGoBeyond){nBins[c]=1;} // TBI is this really safe?
6696a113 2327 } // for(Int_t c=0;c<8;c++) // [1p,2p,...,8p]
2328 for(Int_t cs=0;cs<2;cs++) // [0=cos,1=sin]
2329 {
68a8e667 2330 if(fCalculateOnlyCos && 1==cs){continue;}
2331 else if(fCalculateOnlySin && 0==cs){continue;}
6696a113 2332 for(Int_t c=0;c<fMaxCorrelator;c++) // [1p,2p,...,8p]
2333 {
03823be7 2334 if(c==fDontGoBeyond){continue;}
2335 if(fCalculateOnlyForHarmonicQC && c%2==0){continue;}
6696a113 2336 fCorrelationsPro[cs][c] = new TProfile(Form("%dpCorrelations%s",c+1,sCosSin[cs].Data()),"",nBins[c],0.,1.*nBins[c]);
2337 fCorrelationsPro[cs][c]->Sumw2();
2338 fCorrelationsPro[cs][c]->SetStats(kFALSE);
2339 fCorrelationsPro[cs][c]->SetMarkerColor(markerColor[cs]);
2340 fCorrelationsPro[cs][c]->SetMarkerStyle(markerStyle[cs]);
2341 fCorrelationsList->Add(fCorrelationsPro[cs][c]);
2342 } // for(Int_t c=0;c<8;c++) // [1p,2p,...,8p]
2343 } // for(Int_t cs=0;cs<2;cs++) // [0=cos,1=sin]
2344 // Set all bin labels: TBI this can be implemented better, most likely...
68a8e667 2345 Int_t binNo[2][8];
2346 for(Int_t cs=0;cs<2;cs++) // [0=cos,1=sin]
2347 {
2348 if(fCalculateOnlyCos && 1==cs){continue;}
2349 else if(fCalculateOnlySin && 0==cs){continue;}
2350 for(Int_t c=0;c<fMaxCorrelator;c++)
2351 {
2352 binNo[cs][c] = 1;
2353 }
2354 } // for(Int_t cs=0;cs<2;cs++) // [0=cos,1=sin]
2355
6696a113 2356 for(Int_t n1=-fMaxHarmonic;n1<=fMaxHarmonic;n1++)
7ecb5af4 2357 {
68a8e667 2358 cout<< Form(" Patience, this takes some time... n1 = %d/%d\r",n1+fMaxHarmonic,2*fMaxHarmonic)<<flush; // TBI
6696a113 2359 if(fSkipZeroHarmonics && 0==n1){continue;}
68a8e667 2360 if(fCalculateOnlyForHarmonicQC && TMath::Abs(n1) != fHarmonicQC){continue;}
6696a113 2361 if(fCalculateAll)
2362 {
68a8e667 2363 for(Int_t cs=0;cs<2;cs++)
2364 {
2365 if(fCalculateOnlyCos && 1==cs){continue;}
2366 else if(fCalculateOnlySin && 0==cs){continue;}
03823be7 2367 if(fCorrelationsPro[cs][0]){fCorrelationsPro[cs][0]->GetXaxis()->SetBinLabel(binNo[cs][0]++,Form("%s(%d)",sCosSin[cs].Data(),n1));}
68a8e667 2368 } // for(Int_t cs=0;cs<2;cs++)
6696a113 2369 nToBeFilled[0]++;
2370 }
2371 if(1==fDontGoBeyond){continue;}
2372 for(Int_t n2=n1;n2<=fMaxHarmonic;n2++)
2373 {
2374 if(fSkipZeroHarmonics && 0==n2){continue;}
68a8e667 2375 if(fCalculateOnlyForHarmonicQC && TMath::Abs(n2) != fHarmonicQC){continue;}
6696a113 2376 if(fCalculateAll || (fCalculateIsotropic && 0==n1+n2) || (fCalculateSame && TMath::Abs(n1)==TMath::Abs(n2))
68a8e667 2377 || (fCalculateSameIsotropic && 0==n1+n2 && TMath::Abs(n1)==TMath::Abs(n2))
2378 || (fCalculateOnlyForHarmonicQC && 0==n1+n2)
2379 || (fCalculateOnlyForSC && 0==n1+n2))
6696a113 2380 {
68a8e667 2381 for(Int_t cs=0;cs<2;cs++)
2382 {
2383 if(fCalculateOnlyCos && 1==cs){continue;}
2384 else if(fCalculateOnlySin && 0==cs){continue;}
03823be7 2385 if(fCorrelationsPro[cs][1]){fCorrelationsPro[cs][1]->GetXaxis()->SetBinLabel(binNo[cs][1]++,Form("%s(%d,%d)",sCosSin[cs].Data(),n1,n2));}
68a8e667 2386 } // for(Int_t cs=0;cs<2;cs++)
6696a113 2387 nToBeFilled[1]++;
2388 }
2389 if(2==fDontGoBeyond){continue;}
2390 for(Int_t n3=n2;n3<=fMaxHarmonic;n3++)
2391 {
2392 if(fSkipZeroHarmonics && 0==n3){continue;}
68a8e667 2393 if(fCalculateOnlyForHarmonicQC && TMath::Abs(n3) != fHarmonicQC){continue;}
6696a113 2394 if(fCalculateAll || (fCalculateIsotropic && 0==n1+n2+n3) || (fCalculateSame && TMath::Abs(n1)==TMath::Abs(n2) && TMath::Abs(n1)==TMath::Abs(n3))
68a8e667 2395 || (fCalculateSameIsotropic && 0==n1+n2+n3 && TMath::Abs(n1)==TMath::Abs(n2) && TMath::Abs(n1)==TMath::Abs(n3))
2396 || (fCalculateOnlyForHarmonicQC && 0==n1+n2+n3))
6696a113 2397 {
68a8e667 2398 for(Int_t cs=0;cs<2;cs++)
2399 {
2400 if(fCalculateOnlyCos && 1==cs){continue;}
2401 else if(fCalculateOnlySin && 0==cs){continue;}
03823be7 2402 if(fCorrelationsPro[cs][2]){fCorrelationsPro[cs][2]->GetXaxis()->SetBinLabel(binNo[cs][2]++,Form("%s(%d,%d,%d)",sCosSin[cs].Data(),n1,n2,n3));}
68a8e667 2403 } // for(Int_t cs=0;cs<2;cs++)
6696a113 2404 nToBeFilled[2]++;
2405 }
2406 if(3==fDontGoBeyond){continue;}
2407 for(Int_t n4=n3;n4<=fMaxHarmonic;n4++)
2408 {
2409 if(fSkipZeroHarmonics && 0==n4){continue;}
68a8e667 2410 if(fCalculateOnlyForHarmonicQC && TMath::Abs(n4) != fHarmonicQC){continue;}
6696a113 2411 if(fCalculateAll || (fCalculateIsotropic && 0==n1+n2+n3+n4) || (fCalculateSame && TMath::Abs(n1)==TMath::Abs(n2) && TMath::Abs(n1)==TMath::Abs(n3) && TMath::Abs(n1)==TMath::Abs(n4))
68a8e667 2412 || (fCalculateSameIsotropic && 0==n1+n2+n3+n4 && TMath::Abs(n1)==TMath::Abs(n2) && TMath::Abs(n1)==TMath::Abs(n3) && TMath::Abs(n1)==TMath::Abs(n4))
2413 || (fCalculateOnlyForHarmonicQC && 0==n1+n2+n3+n4)
2414 || (fCalculateOnlyForSC && (0==n1+n4 && 0==n2+n3 && n1 != n2 && n3 != n4)))
6696a113 2415 {
68a8e667 2416 for(Int_t cs=0;cs<2;cs++)
2417 {
2418 if(fCalculateOnlyCos && 1==cs){continue;}
2419 else if(fCalculateOnlySin && 0==cs){continue;}
03823be7 2420 if(fCorrelationsPro[cs][3]){fCorrelationsPro[cs][3]->GetXaxis()->SetBinLabel(binNo[cs][3]++,Form("%s(%d,%d,%d,%d)",sCosSin[cs].Data(),n1,n2,n3,n4));}
68a8e667 2421 } // for(Int_t cs=0;cs<2;cs++)
6696a113 2422 nToBeFilled[3]++;
2423 }
2424 if(4==fDontGoBeyond){continue;}
2425 for(Int_t n5=n4;n5<=fMaxHarmonic;n5++)
2426 {
2427 if(fSkipZeroHarmonics && 0==n5){continue;}
68a8e667 2428 if(fCalculateOnlyForHarmonicQC && TMath::Abs(n5) != fHarmonicQC){continue;}
6696a113 2429 if(fCalculateAll || (fCalculateIsotropic && 0==n1+n2+n3+n4+n5)
2430 || (fCalculateSame && TMath::Abs(n1)==TMath::Abs(n2) && TMath::Abs(n1)==TMath::Abs(n3) && TMath::Abs(n1)==TMath::Abs(n4) && TMath::Abs(n1)==TMath::Abs(n5))
68a8e667 2431 || (fCalculateSameIsotropic && 0==n1+n2+n3+n4+n5 && TMath::Abs(n1)==TMath::Abs(n2) && TMath::Abs(n1)==TMath::Abs(n3) && TMath::Abs(n1)==TMath::Abs(n4) && TMath::Abs(n1)==TMath::Abs(n5))
2432 || (fCalculateOnlyForHarmonicQC && 0==n1+n2+n3+n4+n5))
6696a113 2433 {
68a8e667 2434 for(Int_t cs=0;cs<2;cs++)
2435 {
2436 if(fCalculateOnlyCos && 1==cs){continue;}
2437 else if(fCalculateOnlySin && 0==cs){continue;}
03823be7 2438 if(fCorrelationsPro[cs][4]){fCorrelationsPro[cs][4]->GetXaxis()->SetBinLabel(binNo[cs][4]++,Form("%s(%d,%d,%d,%d,%d)",sCosSin[cs].Data(),n1,n2,n3,n4,n5));}
68a8e667 2439 } // for(Int_t cs=0;cs<2;cs++)
6696a113 2440 nToBeFilled[4]++;
2441 }
2442 if(5==fDontGoBeyond){continue;}
2443 for(Int_t n6=n5;n6<=fMaxHarmonic;n6++)
2444 {
2445 if(fSkipZeroHarmonics && 0==n6){continue;}
68a8e667 2446 if(fCalculateOnlyForHarmonicQC && TMath::Abs(n6) != fHarmonicQC){continue;}
6696a113 2447 if(fCalculateAll || (fCalculateIsotropic && 0==n1+n2+n3+n4+n5+n6)
2448 || (fCalculateSame && TMath::Abs(n1)==TMath::Abs(n2) && TMath::Abs(n1)==TMath::Abs(n3) && TMath::Abs(n1)==TMath::Abs(n4)
2449 && TMath::Abs(n1)==TMath::Abs(n5) && TMath::Abs(n1)==TMath::Abs(n6))
2450 || (fCalculateSameIsotropic && 0==n1+n2+n3+n4+n5+n6 && TMath::Abs(n1)==TMath::Abs(n2) && TMath::Abs(n1)==TMath::Abs(n3)
68a8e667 2451 && TMath::Abs(n1)==TMath::Abs(n4) && TMath::Abs(n1)==TMath::Abs(n5) && TMath::Abs(n1)==TMath::Abs(n6))
2452 || (fCalculateOnlyForHarmonicQC && 0==n1+n2+n3+n4+n5+n6))
6696a113 2453 {
68a8e667 2454 for(Int_t cs=0;cs<2;cs++)
2455 {
2456 if(fCalculateOnlyCos && 1==cs){continue;}
2457 else if(fCalculateOnlySin && 0==cs){continue;}
03823be7 2458 if(fCorrelationsPro[cs][5]){fCorrelationsPro[cs][5]->GetXaxis()->SetBinLabel(binNo[cs][5]++,Form("%s(%d,%d,%d,%d,%d,%d)",sCosSin[cs].Data(),n1,n2,n3,n4,n5,n6));}
68a8e667 2459 } // for(Int_t cs=0;cs<2;cs++)
6696a113 2460 nToBeFilled[5]++;
2461 }
2462 if(6==fDontGoBeyond){continue;}
2463 for(Int_t n7=n6;n7<=fMaxHarmonic;n7++)
2464 {
2465 if(fSkipZeroHarmonics && 0==n7){continue;}
68a8e667 2466 if(fCalculateOnlyForHarmonicQC && TMath::Abs(n7) != fHarmonicQC){continue;}
6696a113 2467 if(fCalculateAll || (fCalculateIsotropic && 0==n1+n2+n3+n4+n5+n6+n7)
2468 || (fCalculateSame && TMath::Abs(n1)==TMath::Abs(n2) && TMath::Abs(n1)==TMath::Abs(n3) && TMath::Abs(n1)==TMath::Abs(n4)
2469 && TMath::Abs(n1)==TMath::Abs(n5) && TMath::Abs(n1)==TMath::Abs(n6) && TMath::Abs(n1)==TMath::Abs(n7))
2470 || (fCalculateSameIsotropic && 0==n1+n2+n3+n4+n5+n6+n7 && TMath::Abs(n1)==TMath::Abs(n2) && TMath::Abs(n1)==TMath::Abs(n3) && TMath::Abs(n1)==TMath::Abs(n4)
68a8e667 2471 && TMath::Abs(n1)==TMath::Abs(n5) && TMath::Abs(n1)==TMath::Abs(n6) && TMath::Abs(n1)==TMath::Abs(n7))
2472 || (fCalculateOnlyForHarmonicQC && 0==n1+n2+n3+n4+n5+n6+n7))
6696a113 2473 {
68a8e667 2474 for(Int_t cs=0;cs<2;cs++)
2475 {
2476 if(fCalculateOnlyCos && 1==cs){continue;}
2477 else if(fCalculateOnlySin && 0==cs){continue;}
03823be7 2478 if(fCorrelationsPro[cs][6]){fCorrelationsPro[cs][6]->GetXaxis()->SetBinLabel(binNo[cs][6]++,Form("%s(%d,%d,%d,%d,%d,%d,%d)",sCosSin[cs].Data(),n1,n2,n3,n4,n5,n6,n7));}
68a8e667 2479 } // for(Int_t cs=0;cs<2;cs++)
6696a113 2480 nToBeFilled[6]++;
2481 }
2482 if(7==fDontGoBeyond){continue;}
2483 for(Int_t n8=n7;n8<=fMaxHarmonic;n8++)
2484 {
2485 if(fSkipZeroHarmonics && 0==n8){continue;}
68a8e667 2486 if(fCalculateOnlyForHarmonicQC && TMath::Abs(n8) != fHarmonicQC){continue;}
6696a113 2487 if(fCalculateAll || (fCalculateIsotropic && 0==n1+n2+n3+n4+n5+n6+n7+n8)
2488 || (fCalculateSame && TMath::Abs(n1)==TMath::Abs(n2) && TMath::Abs(n1)==TMath::Abs(n3) && TMath::Abs(n1)==TMath::Abs(n4)
2489 && TMath::Abs(n1)==TMath::Abs(n5) && TMath::Abs(n1)==TMath::Abs(n6) && TMath::Abs(n1)==TMath::Abs(n7) && TMath::Abs(n1)==TMath::Abs(n8))
2490 || (fCalculateSameIsotropic && 0==n1+n2+n3+n4+n5+n6+n7+n8 && TMath::Abs(n1)==TMath::Abs(n2) && TMath::Abs(n1)==TMath::Abs(n3)
2491 && TMath::Abs(n1)==TMath::Abs(n4) && TMath::Abs(n1)==TMath::Abs(n5) && TMath::Abs(n1)==TMath::Abs(n6) && TMath::Abs(n1)==TMath::Abs(n7)
68a8e667 2492 && TMath::Abs(n1)==TMath::Abs(n8))
2493 || (fCalculateOnlyForHarmonicQC && 0==n1+n2+n3+n4+n5+n6+n7+n8))
6696a113 2494 {
68a8e667 2495 for(Int_t cs=0;cs<2;cs++)
2496 {
2497 if(fCalculateOnlyCos && 1==cs){continue;}
2498 else if(fCalculateOnlySin && 0==cs){continue;}
03823be7 2499 if(fCorrelationsPro[cs][7]){fCorrelationsPro[cs][7]->GetXaxis()->SetBinLabel(binNo[cs][7]++,Form("%s(%d,%d,%d,%d,%d,%d,%d,%d)",sCosSin[cs].Data(),n1,n2,n3,n4,n5,n6,n7,n8));}
68a8e667 2500 } // for(Int_t cs=0;cs<2;cs++)
6696a113 2501 nToBeFilled[7]++;
2502 }
2503 } // for(Int_t n8=n7;n8<=fMaxHarmonic;n8++)
2504 } // for(Int_t n7=n6;n7<=fMaxHarmonic;n7++)
2505 } // for(Int_t n6=n5;n6<=fMaxHarmonic;n6++)
2506 } // for(Int_t n5=n4;n5<=fMaxHarmonic;n5++)
2507 } // for(Int_t n4=n3;n4<=fMaxHarmonic;n4++)
2508 } // for(Int_t n3=n2;n3<=fMaxHarmonic;n3++)
2509 } // for(Int_t n2=n1;n2<=fMaxHarmonic;n2++)
2510 } // for(Int_t n1=-fMaxHarmonic;n1<=fMaxHarmonic;n1++)
2511
2512 for(Int_t cs=0;cs<2;cs++) // [0=cos,1=sin]
2513 {
68a8e667 2514 if(fCalculateOnlyCos && 1==cs){continue;}
2515 else if(fCalculateOnlySin && 0==cs){continue;}
6696a113 2516 for(Int_t c=0;c<fMaxCorrelator;c++) // [1p,2p,...,8p]
2517 {
03823be7 2518 if(!fCorrelationsPro[cs][c]){continue;}
6696a113 2519 fCorrelationsPro[cs][c]->SetTitle(Form("%d-p correlations, %s terms, %d/%d in total",c+1,sCosSin[cs].Data(),nToBeFilled[c],nBinsTitle[c]));
2520 fCorrelationsPro[cs][c]->GetXaxis()->SetRangeUser(0.,fCorrelationsPro[cs][c]->GetBinLowEdge(nToBeFilled[c]+1));
2521 }
7ecb5af4 2522 }
68a8e667 2523 cout<<" Booked. "<<endl; // TBI
7ecb5af4 2524
2525} // end of void AliFlowAnalysisWithMultiparticleCorrelations::BookEverythingForCorrelations()
2526
2527//=======================================================================================================================
2528
68a8e667 2529void AliFlowAnalysisWithMultiparticleCorrelations::BookEverythingForDiffCorrelations()
2530{
2531 // Book all the stuff for differential correlations.
2532
2533 // a) Book the profile holding all the flags for differential correlations;
2534 // b) Book TProfile *fDiffCorrelationsPro[2][4] ([0=cos,1=sin][1p,2p,3p,4p]).
2535
2536 TString sMethodName = "void AliFlowAnalysisWithMultiparticleCorrelations::BookEverythingForDiffCorrelations()";
2537
2538 // a) Book the profile holding all the flags for differential correlations:
dd96bd81 2539 fDiffCorrelationsFlagsPro = new TProfile("fDiffCorrelationsFlagsPro","Flags for differential correlations",5,0,5);
68a8e667 2540 fDiffCorrelationsFlagsPro->SetTickLength(-0.01,"Y");
2541 fDiffCorrelationsFlagsPro->SetMarkerStyle(25);
2542 fDiffCorrelationsFlagsPro->SetLabelSize(0.03);
2543 fDiffCorrelationsFlagsPro->SetLabelOffset(0.02,"Y");
2544 fDiffCorrelationsFlagsPro->SetStats(kFALSE);
2545 fDiffCorrelationsFlagsPro->SetFillColor(kGray);
2546 fDiffCorrelationsFlagsPro->SetLineColor(kBlack);
2547 fDiffCorrelationsFlagsPro->GetXaxis()->SetBinLabel(1,"fCalculateDiffCorrelations"); fDiffCorrelationsFlagsPro->Fill(0.5,fCalculateDiffCorrelations);
dd96bd81 2548 fDiffCorrelationsFlagsPro->GetXaxis()->SetBinLabel(2,"fCalculateDiffCos"); fDiffCorrelationsFlagsPro->Fill(1.5,fCalculateDiffCos);
2549 fDiffCorrelationsFlagsPro->GetXaxis()->SetBinLabel(3,"fCalculateDiffSin"); fDiffCorrelationsFlagsPro->Fill(2.5,fCalculateDiffSin);
2550 fDiffCorrelationsFlagsPro->GetXaxis()->SetBinLabel(4,"fCalculateDiffCorrelationsVsPt"); fDiffCorrelationsFlagsPro->Fill(3.5,fCalculateDiffCorrelationsVsPt);
2551 fDiffCorrelationsFlagsPro->GetXaxis()->SetBinLabel(5,"fUseDefaultBinning"); fDiffCorrelationsFlagsPro->Fill(4.5,fUseDefaultBinning);
68a8e667 2552 fDiffCorrelationsList->Add(fDiffCorrelationsFlagsPro);
2553
03823be7 2554 if(!fCalculateDiffCorrelations){return;}
2555
68a8e667 2556 // b) Book TProfile *fDiffCorrelationsPro[2][4] ([0=cos,1=sin][1p,2p,3p,4p]):
2557 Bool_t fDiffStore[2][4] = {{0,1,1,1},{0,0,0,0}}; // store or not TBI promote to data member, and implement setter perhaps
68a8e667 2558 Int_t markerColor[2] = {kRed,kGreen};
2559 Int_t markerStyle[2] = {kFullSquare,kOpenSquare};
2560 TString sCosSin[2] = {"Cos","Sin"};
2561 TString sLabel[4] = {Form("%d",fDiffHarmonics[0][0]),
2562 Form("%d,%d",fDiffHarmonics[1][0],fDiffHarmonics[1][1]),
2563 Form("%d,%d,%d",fDiffHarmonics[2][0],fDiffHarmonics[2][1],fDiffHarmonics[2][2]),
2564 Form("%d,%d,%d,%d",fDiffHarmonics[3][0],fDiffHarmonics[3][1],fDiffHarmonics[3][2],fDiffHarmonics[3][3])};
2565
2566 for(Int_t cs=0;cs<2;cs++) // [0=cos,1=sin]
2567 {
dd96bd81 2568 if(!fCalculateDiffCos && 0==cs){continue;}
2569 if(!fCalculateDiffSin && 1==cs){continue;}
2570
68a8e667 2571 for(Int_t c=0;c<4;c++) // [1p,2p,3p,4p]
2572 {
dd96bd81 2573 if(fCalculateDiffCorrelationsVsPt)
2574 {
2575 if(fUseDefaultBinning)
2576 {
2577 // vs pt, default binning:
2578 fDiffCorrelationsPro[cs][c] = new TProfile(Form("%s, %dp, %s",sCosSin[cs].Data(),c+1,"pt"),
2579 Form("%s(%s)",sCosSin[cs].Data(),sLabel[c].Data()),
2580 100,0.,10.);
2581 } else // if(fUseDefaultBinning)
2582 {
2583 // vs pt, non-default binning:
2584 fDiffCorrelationsPro[cs][c] = new TProfile(Form("%s, %dp, %s",sCosSin[cs].Data(),c+1,"pt"),
2585 Form("%s(%s)",sCosSin[cs].Data(),sLabel[c].Data()),
2586 fnDiffBins,fRangesDiffBins);
2587 }// else // if(fUseDefaultBinning)
2588 fDiffCorrelationsPro[cs][c]->Sumw2();
2589 fDiffCorrelationsPro[cs][c]->SetStats(kFALSE);
2590 fDiffCorrelationsPro[cs][c]->SetMarkerColor(markerColor[cs]);
2591 fDiffCorrelationsPro[cs][c]->SetMarkerStyle(markerStyle[cs]);
2592 fDiffCorrelationsPro[cs][c]->GetXaxis()->SetTitle("p_{T}");
2593 if(fDiffStore[cs][c]){fDiffCorrelationsList->Add(fDiffCorrelationsPro[cs][c]);}
2594 } else // if(fCalculateDiffCorrelationsVsPt)
2595 {
2596 if(fUseDefaultBinning)
2597 {
2598 // vs eta, default binning:
2599 fDiffCorrelationsPro[cs][c] = new TProfile(Form("%s, %dp, %s",sCosSin[cs].Data(),c+1,"eta"),
2600 Form("%s(%s)",sCosSin[cs].Data(),sLabel[c].Data()),
2601 100,-1.,1.);
2602 } else // if(fUseDefaultBinning)
2603 {
2604 // vs eta, non-default binning:
2605 fDiffCorrelationsPro[cs][c] = new TProfile(Form("%s, %dp, %s",sCosSin[cs].Data(),c+1,"eta"),
2606 Form("%s(%s)",sCosSin[cs].Data(),sLabel[c].Data()),
2607 fnDiffBins,fRangesDiffBins);
2608 } // else // if(fUseDefaultBinning)
2609 fDiffCorrelationsPro[cs][c]->Sumw2();
2610 fDiffCorrelationsPro[cs][c]->SetStats(kFALSE);
2611 fDiffCorrelationsPro[cs][c]->SetMarkerColor(markerColor[cs]);
2612 fDiffCorrelationsPro[cs][c]->SetMarkerStyle(markerStyle[cs]);
2613 fDiffCorrelationsPro[cs][c]->GetXaxis()->SetTitle("#eta");
2614 if(fDiffStore[cs][c]){fDiffCorrelationsList->Add(fDiffCorrelationsPro[cs][c]);}
2615 } // else // if(fCalculateDiffCorrelationsVsPt)
68a8e667 2616 } // for(Int_t c=0;c<4;c++) // [1p,2p,3p,4p]
2617 } // for(Int_t cs=0;cs<2;cs++) // [0=cos,1=sin]
2618
2619} // void AliFlowAnalysisWithMultiparticleCorrelations::BookEverythingForDiffCorrelations()
2620
2621//=======================================================================================================================
2622
2623void AliFlowAnalysisWithMultiparticleCorrelations::BookEverythingForEbECumulants()
7ecb5af4 2624{
68a8e667 2625 // Book all the stuff for event-by-event cumulants.
7ecb5af4 2626
68a8e667 2627 // a) Book the profile holding all the flags for e-b-e cumulants;
2628 // b) Book TProfile *fEbECumulantsPro[2][8] ([0=cos,1=sin][1p,2p,...,8p]).
7ecb5af4 2629
68a8e667 2630 TString sMethodName = "void AliFlowAnalysisWithMultiparticleCorrelations::BookEverythingForEbECumulants()";
7ecb5af4 2631
68a8e667 2632 // a) Book the profile holding all the flags for e-b-e cumulants:
2633 fEbECumulantsFlagsPro = new TProfile("fEbECumulantsFlagsPro","Flags for e-b-e cumulants",1,0,1);
2634 fEbECumulantsFlagsPro->SetTickLength(-0.01,"Y");
2635 fEbECumulantsFlagsPro->SetMarkerStyle(25);
2636 fEbECumulantsFlagsPro->SetLabelSize(0.03);
2637 fEbECumulantsFlagsPro->SetLabelOffset(0.02,"Y");
2638 fEbECumulantsFlagsPro->SetStats(kFALSE);
2639 fEbECumulantsFlagsPro->SetFillColor(kGray);
2640 fEbECumulantsFlagsPro->SetLineColor(kBlack);
2641 fEbECumulantsFlagsPro->GetXaxis()->SetBinLabel(1,"fCalculateEbECumulants"); fEbECumulantsFlagsPro->Fill(0.5,fCalculateEbECumulants);
2642 fEbECumulantsList->Add(fEbECumulantsFlagsPro);
2643
2644 if(!fCalculateEbECumulants){return;} // TBI is this safe enough?
2645
2646 // b) Book TProfile *fEbECumulantsPro[2][8] ([0=cos,1=sin][1p,2p,...,8p]):
2647 TString sCosSin[2] = {"Cos","Sin"};
2648 Int_t markerColor[2] = {kBlue,kRed};
2649 Int_t markerStyle[2] = {kFullSquare,kFullSquare};
2650 Int_t nBins[8] = {1,1,1,1,1,1,1,1}; // TBI hardwired 8, shall be fMaxCorrelator
2651 Int_t nBinsTitle[8] = {1,1,1,1,1,1,1,1}; // TBI hardwired 8, shall be fMaxCorrelator
2652 Int_t nToBeFilled[8] = {0,0,0,0,0,0,0,0}; // TBI hardwired 8, shall be fMaxCorrelator
2653 for(Int_t c=0;c<fMaxCorrelator;c++) // [1p,2p,...,8p]
2654 {
2655 // Implementing \binom{n+k-1}{k}, which is the resulting number of sets obtained
2656 // after sampling n starting elements into k subsets, repetitions allowed.
2657 // In my case, n=2*fMaxHarmonic+1, k=c+1, hence:
2658 nBins[c] = (Int_t)(TMath::Factorial(2*fMaxHarmonic+1+c+1-1)
2659 / (TMath::Factorial(2*fMaxHarmonic+1-1)*TMath::Factorial(c+1)));
2660 nBinsTitle[c] = nBins[c];
2661 if(c>=fDontGoBeyond){nBins[c]=1;} // TBI a bit of spaghetti here...
2662 } // for(Int_t c=0;c<8;c++) // [1p,2p,...,8p]
2663 for(Int_t cs=0;cs<2;cs++) // [0=cos,1=sin]
2664 {
2665 for(Int_t c=0;c<fMaxCorrelator;c++) // [1p,2p,...,8p]
2666 {
2667 fEbECumulantsPro[cs][c] = new TProfile(Form("%dpEbECumulants%s",c+1,sCosSin[cs].Data()),"",nBins[c],0.,1.*nBins[c]);
2668 fEbECumulantsPro[cs][c]->Sumw2();
2669 fEbECumulantsPro[cs][c]->SetStats(kFALSE);
2670 fEbECumulantsPro[cs][c]->SetMarkerColor(markerColor[cs]);
2671 fEbECumulantsPro[cs][c]->SetMarkerStyle(markerStyle[cs]);
2672 fEbECumulantsList->Add(fEbECumulantsPro[cs][c]);
2673 } // for(Int_t c=0;c<8;c++) // [1p,2p,...,8p]
2674 } // for(Int_t cs=0;cs<2;cs++) // [0=cos,1=sin]
2675 // Set all bin labels: TBI this can be implemented better, most likely...
2676 Int_t binNo[8]; for(Int_t c=0;c<fMaxCorrelator;c++){binNo[c]=1;} // TBI hardwired 8, shall be fMaxCorrelator
2677 for(Int_t n1=-fMaxHarmonic;n1<=fMaxHarmonic;n1++)
2678 {
2679 if(fSkipZeroHarmonics && 0==n1){continue;}
2680 if(fCalculateAll)
2681 {
2682 fEbECumulantsPro[0][0]->GetXaxis()->SetBinLabel(binNo[0],Form("Cos(%d)",n1));
2683 fEbECumulantsPro[1][0]->GetXaxis()->SetBinLabel(binNo[0]++,Form("Sin(%d)",n1));
2684 nToBeFilled[0]++;
2685 }
2686 if(1==fDontGoBeyond){continue;}
2687 for(Int_t n2=n1;n2<=fMaxHarmonic;n2++)
2688 {
2689 if(fSkipZeroHarmonics && 0==n2){continue;}
2690 if(fCalculateAll || (fCalculateIsotropic && 0==n1+n2) || (fCalculateSame && TMath::Abs(n1)==TMath::Abs(n2))
2691 || (fCalculateSameIsotropic && 0==n1+n2 && TMath::Abs(n1)==TMath::Abs(n2)))
2692 {
2693 fEbECumulantsPro[0][1]->GetXaxis()->SetBinLabel(binNo[1],Form("Cos(%d,%d)",n1,n2));
2694 fEbECumulantsPro[1][1]->GetXaxis()->SetBinLabel(binNo[1]++,Form("Sin(%d,%d)",n1,n2));
2695 nToBeFilled[1]++;
2696 }
2697 if(2==fDontGoBeyond){continue;}
2698 for(Int_t n3=n2;n3<=fMaxHarmonic;n3++)
2699 {
2700 if(fSkipZeroHarmonics && 0==n3){continue;}
2701 if(fCalculateAll || (fCalculateIsotropic && 0==n1+n2+n3) || (fCalculateSame && TMath::Abs(n1)==TMath::Abs(n2) && TMath::Abs(n1)==TMath::Abs(n3))
2702 || (fCalculateSameIsotropic && 0==n1+n2+n3 && TMath::Abs(n1)==TMath::Abs(n2) && TMath::Abs(n1)==TMath::Abs(n3)))
2703 {
2704 fEbECumulantsPro[0][2]->GetXaxis()->SetBinLabel(binNo[2],Form("Cos(%d,%d,%d)",n1,n2,n3));
2705 fEbECumulantsPro[1][2]->GetXaxis()->SetBinLabel(binNo[2]++,Form("Sin(%d,%d,%d)",n1,n2,n3));
2706 nToBeFilled[2]++;
2707 }
2708 if(3==fDontGoBeyond){continue;}
2709 for(Int_t n4=n3;n4<=fMaxHarmonic;n4++)
2710 {
2711 if(fSkipZeroHarmonics && 0==n4){continue;}
2712 if(fCalculateAll || (fCalculateIsotropic && 0==n1+n2+n3+n4) || (fCalculateSame && TMath::Abs(n1)==TMath::Abs(n2) && TMath::Abs(n1)==TMath::Abs(n3) && TMath::Abs(n1)==TMath::Abs(n4))
2713 || (fCalculateSameIsotropic && 0==n1+n2+n3+n4 && TMath::Abs(n1)==TMath::Abs(n2) && TMath::Abs(n1)==TMath::Abs(n3) && TMath::Abs(n1)==TMath::Abs(n4)))
2714 {
2715 fEbECumulantsPro[0][3]->GetXaxis()->SetBinLabel(binNo[3],Form("Cos(%d,%d,%d,%d)",n1,n2,n3,n4));
2716 fEbECumulantsPro[1][3]->GetXaxis()->SetBinLabel(binNo[3]++,Form("Sin(%d,%d,%d,%d)",n1,n2,n3,n4));
2717 nToBeFilled[3]++;
2718 }
2719 if(4==fDontGoBeyond){continue;}
2720 for(Int_t n5=n4;n5<=fMaxHarmonic;n5++)
2721 {
2722 if(fSkipZeroHarmonics && 0==n5){continue;}
2723 if(fCalculateAll || (fCalculateIsotropic && 0==n1+n2+n3+n4+n5)
2724 || (fCalculateSame && TMath::Abs(n1)==TMath::Abs(n2) && TMath::Abs(n1)==TMath::Abs(n3) && TMath::Abs(n1)==TMath::Abs(n4) && TMath::Abs(n1)==TMath::Abs(n5))
2725 || (fCalculateSameIsotropic && 0==n1+n2+n3+n4+n5 && TMath::Abs(n1)==TMath::Abs(n2) && TMath::Abs(n1)==TMath::Abs(n3) && TMath::Abs(n1)==TMath::Abs(n4) && TMath::Abs(n1)==TMath::Abs(n5)))
2726 {
2727 fEbECumulantsPro[0][4]->GetXaxis()->SetBinLabel(binNo[4],Form("Cos(%d,%d,%d,%d,%d)",n1,n2,n3,n4,n5));
2728 fEbECumulantsPro[1][4]->GetXaxis()->SetBinLabel(binNo[4]++,Form("Sin(%d,%d,%d,%d,%d)",n1,n2,n3,n4,n5));
2729 nToBeFilled[4]++;
2730 }
2731 if(5==fDontGoBeyond){continue;}
2732 for(Int_t n6=n5;n6<=fMaxHarmonic;n6++)
2733 {
2734 if(fSkipZeroHarmonics && 0==n6){continue;}
2735 if(fCalculateAll || (fCalculateIsotropic && 0==n1+n2+n3+n4+n5+n6)
2736 || (fCalculateSame && TMath::Abs(n1)==TMath::Abs(n2) && TMath::Abs(n1)==TMath::Abs(n3) && TMath::Abs(n1)==TMath::Abs(n4)
2737 && TMath::Abs(n1)==TMath::Abs(n5) && TMath::Abs(n1)==TMath::Abs(n6))
2738 || (fCalculateSameIsotropic && 0==n1+n2+n3+n4+n5+n6 && TMath::Abs(n1)==TMath::Abs(n2) && TMath::Abs(n1)==TMath::Abs(n3)
2739 && TMath::Abs(n1)==TMath::Abs(n4) && TMath::Abs(n1)==TMath::Abs(n5) && TMath::Abs(n1)==TMath::Abs(n6)))
2740 {
2741 fEbECumulantsPro[0][5]->GetXaxis()->SetBinLabel(binNo[5],Form("Cos(%d,%d,%d,%d,%d,%d)",n1,n2,n3,n4,n5,n6));
2742 fEbECumulantsPro[1][5]->GetXaxis()->SetBinLabel(binNo[5]++,Form("Sin(%d,%d,%d,%d,%d,%d)",n1,n2,n3,n4,n5,n6));
2743 nToBeFilled[5]++;
2744 }
2745 if(6==fDontGoBeyond){continue;}
2746 for(Int_t n7=n6;n7<=fMaxHarmonic;n7++)
2747 {
2748 if(fSkipZeroHarmonics && 0==n7){continue;}
2749 if(fCalculateAll || (fCalculateIsotropic && 0==n1+n2+n3+n4+n5+n6+n7)
2750 || (fCalculateSame && TMath::Abs(n1)==TMath::Abs(n2) && TMath::Abs(n1)==TMath::Abs(n3) && TMath::Abs(n1)==TMath::Abs(n4)
2751 && TMath::Abs(n1)==TMath::Abs(n5) && TMath::Abs(n1)==TMath::Abs(n6) && TMath::Abs(n1)==TMath::Abs(n7))
2752 || (fCalculateSameIsotropic && 0==n1+n2+n3+n4+n5+n6+n7 && TMath::Abs(n1)==TMath::Abs(n2) && TMath::Abs(n1)==TMath::Abs(n3) && TMath::Abs(n1)==TMath::Abs(n4)
2753 && TMath::Abs(n1)==TMath::Abs(n5) && TMath::Abs(n1)==TMath::Abs(n6) && TMath::Abs(n1)==TMath::Abs(n7)))
2754 {
2755 fEbECumulantsPro[0][6]->GetXaxis()->SetBinLabel(binNo[6],Form("Cos(%d,%d,%d,%d,%d,%d,%d)",n1,n2,n3,n4,n5,n6,n7));
2756 fEbECumulantsPro[1][6]->GetXaxis()->SetBinLabel(binNo[6]++,Form("Sin(%d,%d,%d,%d,%d,%d,%d)",n1,n2,n3,n4,n5,n6,n7));
2757 nToBeFilled[6]++;
2758 }
2759 if(7==fDontGoBeyond){continue;}
2760 for(Int_t n8=n7;n8<=fMaxHarmonic;n8++)
2761 {
2762 if(fSkipZeroHarmonics && 0==n8){continue;}
2763 if(fCalculateAll || (fCalculateIsotropic && 0==n1+n2+n3+n4+n5+n6+n7+n8)
2764 || (fCalculateSame && TMath::Abs(n1)==TMath::Abs(n2) && TMath::Abs(n1)==TMath::Abs(n3) && TMath::Abs(n1)==TMath::Abs(n4)
2765 && TMath::Abs(n1)==TMath::Abs(n5) && TMath::Abs(n1)==TMath::Abs(n6) && TMath::Abs(n1)==TMath::Abs(n7) && TMath::Abs(n1)==TMath::Abs(n8))
2766 || (fCalculateSameIsotropic && 0==n1+n2+n3+n4+n5+n6+n7+n8 && TMath::Abs(n1)==TMath::Abs(n2) && TMath::Abs(n1)==TMath::Abs(n3)
2767 && TMath::Abs(n1)==TMath::Abs(n4) && TMath::Abs(n1)==TMath::Abs(n5) && TMath::Abs(n1)==TMath::Abs(n6) && TMath::Abs(n1)==TMath::Abs(n7)
2768 && TMath::Abs(n1)==TMath::Abs(n8)))
2769 {
2770 fEbECumulantsPro[0][7]->GetXaxis()->SetBinLabel(binNo[7],Form("Cos(%d,%d,%d,%d,%d,%d,%d,%d)",n1,n2,n3,n4,n5,n6,n7,n8));
2771 fEbECumulantsPro[1][7]->GetXaxis()->SetBinLabel(binNo[7]++,Form("Sin(%d,%d,%d,%d,%d,%d,%d,%d)",n1,n2,n3,n4,n5,n6,n7,n8));
2772 nToBeFilled[7]++;
2773 }
2774 } // for(Int_t n8=n7;n8<=fMaxHarmonic;n8++)
2775 } // for(Int_t n7=n6;n7<=fMaxHarmonic;n7++)
2776 } // for(Int_t n6=n5;n6<=fMaxHarmonic;n6++)
2777 } // for(Int_t n5=n4;n5<=fMaxHarmonic;n5++)
2778 } // for(Int_t n4=n3;n4<=fMaxHarmonic;n4++)
2779 } // for(Int_t n3=n2;n3<=fMaxHarmonic;n3++)
2780 } // for(Int_t n2=n1;n2<=fMaxHarmonic;n2++)
2781 } // for(Int_t n1=-fMaxHarmonic;n1<=fMaxHarmonic;n1++)
7ecb5af4 2782
68a8e667 2783 for(Int_t cs=0;cs<2;cs++) // [0=cos,1=sin]
7ecb5af4 2784 {
68a8e667 2785 for(Int_t c=0;c<fMaxCorrelator;c++) // [1p,2p,...,8p]
2786 {
2787 fEbECumulantsPro[cs][c]->SetTitle(Form("%d-p e-b-e cumulants, %s terms, %d/%d in total",c+1,sCosSin[cs].Data(),nToBeFilled[c],nBinsTitle[c]));
2788 fEbECumulantsPro[cs][c]->GetXaxis()->SetRangeUser(0.,fEbECumulantsPro[cs][c]->GetBinLowEdge(nToBeFilled[c]+1));
2789 }
7ecb5af4 2790 }
7ecb5af4 2791
68a8e667 2792} // end of void AliFlowAnalysisWithMultiparticleCorrelations::BookEverythingForEbECumulants()
7ecb5af4 2793
2794//=======================================================================================================================
2795
2796void AliFlowAnalysisWithMultiparticleCorrelations::BookEverythingForNestedLoops()
2797{
2798 // Book all the stuff for nested loops.
2799
6696a113 2800 // TBI this method is just ugly, who implemented it like this...
2801
7ecb5af4 2802 // a) Set default harmonic values;
2803 // b) Book the profile holding all the flags for nested loops;
2804 // c) Book the profile holding all results for nested loops (cosine);
68a8e667 2805 // d) Book the profile holding all results for nested loops (sinus);
2806 // e) Book the profile holding all results for differential nested loops.
7ecb5af4 2807
6696a113 2808 // a) Set default harmonic values:
2809 //delete gRandom; // TBI this is not safe here,
2810 //gRandom = new TRandom3(0);
9efbd2f5 2811 Int_t h1 = (Int_t)pow(-1.,1.*gRandom->Integer(fMaxHarmonic+1))*gRandom->Integer(fMaxHarmonic+1); // TBI reimplement all these lines eventually
2812 Int_t h2 = (Int_t)pow(-1.,1.*gRandom->Integer(fMaxHarmonic+1))*gRandom->Integer(fMaxHarmonic+1);
2813 Int_t h3 = (Int_t)pow(-1.,1.*gRandom->Integer(fMaxHarmonic+1))*gRandom->Integer(fMaxHarmonic+1);
2814 Int_t h4 = (Int_t)pow(-1.,1.*gRandom->Integer(fMaxHarmonic+1))*gRandom->Integer(fMaxHarmonic+1);
2815 Int_t h5 = (Int_t)pow(-1.,1.*gRandom->Integer(fMaxHarmonic+1))*gRandom->Integer(fMaxHarmonic+1);
2816 Int_t h6 = (Int_t)pow(-1.,1.*gRandom->Integer(fMaxHarmonic+1))*gRandom->Integer(fMaxHarmonic+1);
2817 Int_t h7 = (Int_t)pow(-1.,1.*gRandom->Integer(fMaxHarmonic+1))*gRandom->Integer(fMaxHarmonic+1);
2818 Int_t h8 = (Int_t)pow(-1.,1.*gRandom->Integer(fMaxHarmonic+1))*gRandom->Integer(fMaxHarmonic+1);
6696a113 2819
7ecb5af4 2820 // REMARK: This values can be overriden in a steering macro via
2821 // mpc->GetNestedLoopsFlagsPro()->SetBinContent(<binNo>,<value>);
2822
2823 // b) Book the profile holding all the flags for nested loops:
68a8e667 2824 fNestedLoopsFlagsPro = new TProfile("fNestedLoopsFlagsPro","Flags for nested loops",10,0,10);
7ecb5af4 2825 fNestedLoopsFlagsPro->SetTickLength(-0.01,"Y");
2826 fNestedLoopsFlagsPro->SetMarkerStyle(25);
2827 fNestedLoopsFlagsPro->SetLabelSize(0.03);
2828 fNestedLoopsFlagsPro->SetLabelOffset(0.02,"Y");
2829 fNestedLoopsFlagsPro->SetStats(kFALSE);
2830 fNestedLoopsFlagsPro->SetFillColor(kGray);
2831 fNestedLoopsFlagsPro->SetLineColor(kBlack);
2832 fNestedLoopsFlagsPro->GetXaxis()->SetBinLabel(1,"fCrossCheckWithNestedLoops"); fNestedLoopsFlagsPro->Fill(0.5,fCrossCheckWithNestedLoops);
2833 fNestedLoopsFlagsPro->GetXaxis()->SetBinLabel(2,"h_{1}"); fNestedLoopsFlagsPro->Fill(1.5,h1);
2834 fNestedLoopsFlagsPro->GetXaxis()->SetBinLabel(3,"h_{2}"); fNestedLoopsFlagsPro->Fill(2.5,h2);
2835 fNestedLoopsFlagsPro->GetXaxis()->SetBinLabel(4,"h_{3}"); fNestedLoopsFlagsPro->Fill(3.5,h3);
2836 fNestedLoopsFlagsPro->GetXaxis()->SetBinLabel(5,"h_{4}"); fNestedLoopsFlagsPro->Fill(4.5,h4);
2837 fNestedLoopsFlagsPro->GetXaxis()->SetBinLabel(6,"h_{5}"); fNestedLoopsFlagsPro->Fill(5.5,h5);
2838 fNestedLoopsFlagsPro->GetXaxis()->SetBinLabel(7,"h_{6}"); fNestedLoopsFlagsPro->Fill(6.5,h6);
2839 fNestedLoopsFlagsPro->GetXaxis()->SetBinLabel(8,"h_{7}"); fNestedLoopsFlagsPro->Fill(7.5,h7);
2840 fNestedLoopsFlagsPro->GetXaxis()->SetBinLabel(9,"h_{8}"); fNestedLoopsFlagsPro->Fill(8.5,h8);
68a8e667 2841 fNestedLoopsFlagsPro->GetXaxis()->SetBinLabel(10,"fCrossCheckDiffWithNestedLoops"); fNestedLoopsFlagsPro->Fill(9.5,fCrossCheckDiffWithNestedLoops);
7ecb5af4 2842 fNestedLoopsList->Add(fNestedLoopsFlagsPro);
2843
7ecb5af4 2844 // c) Book the profile holding all results for nested loops (cosine):
2845 fNestedLoopsResultsCosPro = new TProfile("fNestedLoopsResultsCosPro","Nested loops results (cosine)",16,0,16);
2846 fNestedLoopsResultsCosPro->SetTickLength(-0.01,"Y");
2847 fNestedLoopsResultsCosPro->SetMarkerStyle(25);
2848 fNestedLoopsResultsCosPro->SetLabelSize(0.02);
2849 fNestedLoopsResultsCosPro->SetLabelOffset(0.02,"Y");
2850 fNestedLoopsResultsCosPro->SetStats(kFALSE);
2851 fNestedLoopsResultsCosPro->GetXaxis()->SetBinLabel(1,Form("N: 1p(%d)",h1));
2852 fNestedLoopsResultsCosPro->GetXaxis()->SetBinLabel(2,Form("Q: 1p(%d)",h1));
2853 fNestedLoopsResultsCosPro->GetXaxis()->SetBinLabel(3,Form("N: 2p(%d,%d)",h1,h2));
2854 fNestedLoopsResultsCosPro->GetXaxis()->SetBinLabel(4,Form("Q: 2p(%d,%d)",h1,h2));
2855 fNestedLoopsResultsCosPro->GetXaxis()->SetBinLabel(5,Form("N: 3p(%d,%d,%d)",h1,h2,h3));
2856 fNestedLoopsResultsCosPro->GetXaxis()->SetBinLabel(6,Form("Q: 3p(%d,%d,%d)",h1,h2,h3));
2857 fNestedLoopsResultsCosPro->GetXaxis()->SetBinLabel(7,Form("N: 4p(%d,%d,%d,%d)",h1,h2,h3,h4));
2858 fNestedLoopsResultsCosPro->GetXaxis()->SetBinLabel(8,Form("Q: 4p(%d,%d,%d,%d)",h1,h2,h3,h4));
2859 fNestedLoopsResultsCosPro->GetXaxis()->SetBinLabel(9,Form("N: 5p(%d,%d,%d,%d,%d)",h1,h2,h3,h4,h5));
2860 fNestedLoopsResultsCosPro->GetXaxis()->SetBinLabel(10,Form("Q: 5p(%d,%d,%d,%d,%d)",h1,h2,h3,h4,h5));
2861 fNestedLoopsResultsCosPro->GetXaxis()->SetBinLabel(11,Form("N: 6p(%d,%d,%d,%d,%d,%d)",h1,h2,h3,h4,h5,h6));
2862 fNestedLoopsResultsCosPro->GetXaxis()->SetBinLabel(12,Form("Q: 6p(%d,%d,%d,%d,%d,%d)",h1,h2,h3,h4,h5,h6));
2863 fNestedLoopsResultsCosPro->GetXaxis()->SetBinLabel(13,Form("N: 7p(%d,%d,%d,%d,%d,%d,%d)",h1,h2,h3,h4,h5,h6,h7));
2864 fNestedLoopsResultsCosPro->GetXaxis()->SetBinLabel(14,Form("Q: 7p(%d,%d,%d,%d,%d,%d,%d)",h1,h2,h3,h4,h5,h6,h7));
2865 fNestedLoopsResultsCosPro->GetXaxis()->SetBinLabel(15,Form("N: 8p(%d,%d,%d,%d,%d,%d,%d,%d)",h1,h2,h3,h4,h5,h6,h7,h8));
2866 fNestedLoopsResultsCosPro->GetXaxis()->SetBinLabel(16,Form("Q: 8p(%d,%d,%d,%d,%d,%d,%d,%d)",h1,h2,h3,h4,h5,h6,h7,h8));
68a8e667 2867 if(fCrossCheckWithNestedLoops){fNestedLoopsList->Add(fNestedLoopsResultsCosPro);} else{delete fNestedLoopsResultsCosPro;}
7ecb5af4 2868
2869 // d) Book the profile holding all results for nested loops (sinus):
2870 fNestedLoopsResultsSinPro = new TProfile("fNestedLoopsResultsSinPro","Nested loops results (sinus)",16,0,16);
2871 fNestedLoopsResultsSinPro->SetTickLength(-0.01,"Y");
2872 fNestedLoopsResultsSinPro->SetMarkerStyle(25);
2873 fNestedLoopsResultsSinPro->SetLabelSize(0.02);
2874 fNestedLoopsResultsSinPro->SetLabelOffset(0.02,"Y");
2875 fNestedLoopsResultsSinPro->SetStats(kFALSE);
2876 fNestedLoopsResultsSinPro->GetXaxis()->SetBinLabel(1,Form("N: 1p(%d)",h1));
2877 fNestedLoopsResultsSinPro->GetXaxis()->SetBinLabel(2,Form("Q: 1p(%d)",h1));
2878 fNestedLoopsResultsSinPro->GetXaxis()->SetBinLabel(3,Form("N: 2p(%d,%d)",h1,h2));
2879 fNestedLoopsResultsSinPro->GetXaxis()->SetBinLabel(4,Form("Q: 2p(%d,%d)",h1,h2));
2880 fNestedLoopsResultsSinPro->GetXaxis()->SetBinLabel(5,Form("N: 3p(%d,%d,%d)",h1,h2,h3));
2881 fNestedLoopsResultsSinPro->GetXaxis()->SetBinLabel(6,Form("Q: 3p(%d,%d,%d)",h1,h2,h3));
2882 fNestedLoopsResultsSinPro->GetXaxis()->SetBinLabel(7,Form("N: 4p(%d,%d,%d,%d)",h1,h2,h3,h4));
2883 fNestedLoopsResultsSinPro->GetXaxis()->SetBinLabel(8,Form("Q: 4p(%d,%d,%d,%d)",h1,h2,h3,h4));
2884 fNestedLoopsResultsSinPro->GetXaxis()->SetBinLabel(9,Form("N: 5p(%d,%d,%d,%d,%d)",h1,h2,h3,h4,h5));
2885 fNestedLoopsResultsSinPro->GetXaxis()->SetBinLabel(10,Form("Q: 5p(%d,%d,%d,%d,%d)",h1,h2,h3,h4,h5));
2886 fNestedLoopsResultsSinPro->GetXaxis()->SetBinLabel(11,Form("N: 6p(%d,%d,%d,%d,%d,%d)",h1,h2,h3,h4,h5,h6));
2887 fNestedLoopsResultsSinPro->GetXaxis()->SetBinLabel(12,Form("Q: 6p(%d,%d,%d,%d,%d,%d)",h1,h2,h3,h4,h5,h6));
2888 fNestedLoopsResultsSinPro->GetXaxis()->SetBinLabel(13,Form("N: 7p(%d,%d,%d,%d,%d,%d,%d)",h1,h2,h3,h4,h5,h6,h7));
2889 fNestedLoopsResultsSinPro->GetXaxis()->SetBinLabel(14,Form("Q: 7p(%d,%d,%d,%d,%d,%d,%d)",h1,h2,h3,h4,h5,h6,h7));
2890 fNestedLoopsResultsSinPro->GetXaxis()->SetBinLabel(15,Form("N: 8p(%d,%d,%d,%d,%d,%d,%d,%d)",h1,h2,h3,h4,h5,h6,h7,h8));
2891 fNestedLoopsResultsSinPro->GetXaxis()->SetBinLabel(16,Form("Q: 8p(%d,%d,%d,%d,%d,%d,%d,%d)",h1,h2,h3,h4,h5,h6,h7,h8));
68a8e667 2892 if(fCrossCheckWithNestedLoops){fNestedLoopsList->Add(fNestedLoopsResultsSinPro);} else{delete fNestedLoopsResultsSinPro;}
2893
2894 // e) Book the profile holding all results for differential nested loops:
2895 fNestedLoopsDiffResultsPro = new TProfile("fNestedLoopsDiffResultsPro","Differential nested loops results",1,0.,1.);
2896 fNestedLoopsDiffResultsPro->SetStats(kFALSE);
2897 if(fCrossCheckDiffWithNestedLoops){fNestedLoopsList->Add(fNestedLoopsDiffResultsPro);} else{delete fNestedLoopsDiffResultsPro;}
7ecb5af4 2898
2899} // void AliFlowAnalysisWithMultiparticleCorrelations::BookEverythingForNestedLoops()
2900
2901//=======================================================================================================================
2902
2903void AliFlowAnalysisWithMultiparticleCorrelations::BookEverythingForStandardCandles()
2904{
2905 // Book all the stuff for 'standard candles'.
2906
2907 // a) Book the profile holding all the flags for 'standard candles';
6d19c373 2908 // b) Book the histogram holding all results for 'standard candles';
68a8e667 2909 // c) Book TProfile2D *fProductsSCPro.
7ecb5af4 2910
9efbd2f5 2911 TString sMethodName = "AliFlowAnalysisWithMultiparticleCorrelations::BookEverythingForStandardCandles()";
2912
7ecb5af4 2913 // a) Book the profile holding all the flags for 'standard candles':
68a8e667 2914 fStandardCandlesFlagsPro = new TProfile("fStandardCandlesFlagsPro","Flags for standard candles",2,0,2);
7ecb5af4 2915 fStandardCandlesFlagsPro->SetTickLength(-0.01,"Y");
2916 fStandardCandlesFlagsPro->SetMarkerStyle(25);
2917 fStandardCandlesFlagsPro->SetLabelSize(0.03);
2918 fStandardCandlesFlagsPro->SetLabelOffset(0.02,"Y");
2919 fStandardCandlesFlagsPro->SetStats(kFALSE);
2920 fStandardCandlesFlagsPro->SetFillColor(kGray);
2921 fStandardCandlesFlagsPro->SetLineColor(kBlack);
2922 fStandardCandlesFlagsPro->GetXaxis()->SetBinLabel(1,"fCalculateStandardCandles"); fStandardCandlesFlagsPro->Fill(0.5,fCalculateStandardCandles);
68a8e667 2923 fStandardCandlesFlagsPro->GetXaxis()->SetBinLabel(2,"fPropagateErrorSC"); fStandardCandlesFlagsPro->Fill(1.5,fPropagateErrorSC);
7ecb5af4 2924 fStandardCandlesList->Add(fStandardCandlesFlagsPro);
2925
2926 if(!fCalculateStandardCandles){return;} // TBI is this safe like this?
2927
2928 // b) Book the histogram holding all results for 'standard candles':
9efbd2f5 2929 Int_t nBins = fMaxHarmonic*(fMaxHarmonic-1)/2;
68a8e667 2930 fStandardCandlesHist = new TH1D("fStandardCandlesHist","Standard candles (SC)",nBins,0.,1.*nBins);
7ecb5af4 2931 fStandardCandlesHist->SetStats(kFALSE);
6d19c373 2932 fStandardCandlesHist->SetMarkerStyle(kFullSquare);
2933 fStandardCandlesHist->SetMarkerColor(kBlue);
2934 fStandardCandlesHist->SetLineColor(kBlue);
9efbd2f5 2935 Int_t binNo = 1;
2936 for(Int_t n1=-fMaxHarmonic;n1<=-2;n1++)
2937 {
2938 for(Int_t n2=n1+1;n2<=-1;n2++)
2939 {
2940 fStandardCandlesHist->GetXaxis()->SetBinLabel(binNo++,Form("SC(%d,%d,%d,%d)",n1,n2,-1*n2,-1*n1));
2941 }
2942 }
2943 if(binNo-1 != nBins){Fatal(sMethodName.Data(),"Well, binNo-1 != nBins ... :'( ");}
7ecb5af4 2944 fStandardCandlesList->Add(fStandardCandlesHist);
2945
68a8e667 2946 if(!fPropagateErrorSC){return;} // TBI is this safe like this?
2947
2948 // c) Book TProfile2D *fProductsSCPro:
2949 Int_t nBins2D = fMaxHarmonic + fMaxHarmonic*(fMaxHarmonic-1)/2; // #2-p + #4-p distinct correlators in SC context
2950 if(nBins2D<=0){Fatal(sMethodName.Data(),"nBins2D<=0");} // well, just in case...
2951 fProductsSCPro = new TProfile2D("fProductsSCPro","Products of correlations",nBins2D,0.,nBins2D,nBins2D,0.,nBins2D);
2952 fProductsSCPro->SetStats(kFALSE);
2953 fProductsSCPro->Sumw2();
2954 for(Int_t b=1;b<=fMaxHarmonic;b++) // 2-p correlators
6d19c373 2955 {
68a8e667 2956 fProductsSCPro->GetXaxis()->SetBinLabel(b,Form("Cos(%d,%d)",-(fMaxHarmonic+1-b),(fMaxHarmonic+1-b)));
2957 fProductsSCPro->GetYaxis()->SetBinLabel(b,Form("Cos(%d,%d)",-(fMaxHarmonic+1-b),(fMaxHarmonic+1-b)));
2958 } // for(Int_t b=1;b<=fMaxHarmonic;b++) // 2-p correlators
2959 for(Int_t b=fMaxHarmonic+1;b<=nBins2D;b++) // 4-p correlators
6d19c373 2960 {
68a8e667 2961 TString sBinLabel = fStandardCandlesHist->GetXaxis()->GetBinLabel(b-fMaxHarmonic);
2962 if(sBinLabel.EqualTo("")){Fatal(sMethodName.Data(),"sBinLabel.EqualTo...");}
2963 fProductsSCPro->GetXaxis()->SetBinLabel(b,sBinLabel.ReplaceAll("SC","Cos").Data());
2964 fProductsSCPro->GetYaxis()->SetBinLabel(b,sBinLabel.ReplaceAll("SC","Cos").Data());
2965 } // for(Int_t b=fMaxHarmonic+1;b<=nBins2D;b++) // 4-p correlators
2966 fStandardCandlesList->Add(fProductsSCPro);
6d19c373 2967
7ecb5af4 2968} // end of void AliFlowAnalysisWithMultiparticleCorrelations::BookEverythingForStandardCandles()
2969
2970//=======================================================================================================================
2971
37d2f768 2972void AliFlowAnalysisWithMultiparticleCorrelations::GetOutputHistograms(TList *histList)
2973{
7ecb5af4 2974 // Get pointers for everything and everywhere from the base list "fHistList".
2975
2976 // a) Get pointer for base list fHistList;
2977 // b) Get pointer for profile holding internal flags and, well, set again all flags;
2978 // c) Get pointers for control histograms;
9efbd2f5 2979 // d) Get pointers for Q-vector;
2980 // e) Get pointers for correlations;
68a8e667 2981 // f) Get pointers for 'standard candles';
2982 // g) Get pointers for Q-cumulants;
2983 // h) Get pointers for differential correlations.
7ecb5af4 2984
6696a113 2985 TString sMethodName = "AliFlowAnalysisWithMultiparticleCorrelations::GetOutputHistograms(TList *histList)";
2986
7ecb5af4 2987 // a) Get pointer for base list fHistList and profile holding internal flags;
2988 fHistList = histList;
9efbd2f5 2989 if(!fHistList){Fatal(sMethodName.Data(),"fHistList is malicious today...");}
7ecb5af4 2990
2991 // b) Get pointer for profile holding internal flags and, well, set again all flags:
2992 fInternalFlagsPro = dynamic_cast<TProfile*>(fHistList->FindObject("fInternalFlagsPro"));
6696a113 2993 if(!fInternalFlagsPro){Fatal(sMethodName.Data(),"fInternalFlagsPro");}
7ecb5af4 2994 fUseInternalFlags = fInternalFlagsPro->GetBinContent(1);
9efbd2f5 2995 fMinNoRPs = (Int_t)fInternalFlagsPro->GetBinContent(2);
2996 fMaxNoRPs = (Int_t)fInternalFlagsPro->GetBinContent(3);
2997 fExactNoRPs = (Int_t)fInternalFlagsPro->GetBinContent(4);
9fba36ea 2998 fPropagateError = (Bool_t)fInternalFlagsPro->GetBinContent(5);
7ecb5af4 2999
3000 // c) Get pointers for control histograms:
3001 this->GetPointersForControlHistograms();
3002
9efbd2f5 3003 // d) Get pointers for Q-vector:
3004 this->GetPointersForQvector();
3005
3006 // e) Get pointers for correlations:
7ecb5af4 3007 this->GetPointersForCorrelations();
3008
9efbd2f5 3009 // f) Get pointers for 'standard candles':
7ecb5af4 3010 this->GetPointersForStandardCandles();
68a8e667 3011
3012 // g) Get pointers for Q-cumulants:
3013 this->GetPointersForQcumulants();
3014
3015 // h) Get pointers for differential correlations:
3016 this->GetPointersForDiffCorrelations();
7ecb5af4 3017
3018} // void AliFlowAnalysisWithMultiparticleCorrelations::GetOutputHistograms(TList *histList)
3019
3020//=======================================================================================================================
3021
9efbd2f5 3022void AliFlowAnalysisWithMultiparticleCorrelations::GetPointersForQvector()
3023{
3024 // Get pointers for Q-vector objects.
3025
68a8e667 3026 // a) Get pointer for fQvectorList;
3027 // b) Get pointer for fQvectorFlagsPro;
3028 // c) Set again all flags.
9efbd2f5 3029
3030 TString sMethodName = "AliFlowAnalysisWithMultiparticleCorrelations::GetPointersForQvector()";
3031
68a8e667 3032 // a) Get pointer for fQvectorList:
3033 fQvectorList = dynamic_cast<TList*>(fHistList->FindObject("Q-vectors"));
9efbd2f5 3034 if(!fQvectorList){Fatal(sMethodName.Data(),"fQvectorList");}
3035
68a8e667 3036 // b) Get pointer for fQvectorFlagsPro:
9efbd2f5 3037 fQvectorFlagsPro = dynamic_cast<TProfile*>(fQvectorList->FindObject("fQvectorFlagsPro"));
3038 if(!fQvectorFlagsPro){Fatal(sMethodName.Data(),"fQvectorFlagsPro");}
3039
68a8e667 3040 // c) Set again all flags:
9efbd2f5 3041 fCalculateQvector = (Bool_t)fQvectorFlagsPro->GetBinContent(1);
68a8e667 3042 fCalculateDiffQvectors = (Bool_t)fQvectorFlagsPro->GetBinContent(2);
9efbd2f5 3043
3044} // void AliFlowAnalysisWithMultiparticleCorrelations::GetPointersForQvector()
3045
3046//=======================================================================================================================
3047
7ecb5af4 3048void AliFlowAnalysisWithMultiparticleCorrelations::GetPointersForStandardCandles()
3049{
3050 // Get pointers for 'standard candles'.
3051
68a8e667 3052 // a) Get pointer for fStandardCandlesList;
3053 // b) Get pointer for fStandardCandlesFlagsPro;
3054 // c) Set again all flags;
3055 // d) Get pointer TH1D *fStandardCandlesHist;
3056 // e) Get pointer TProfile2D *fProductsSCPro.
7ecb5af4 3057
6696a113 3058 TString sMethodName = "AliFlowAnalysisWithMultiparticleCorrelations::GetPointersForStandardCandles()";
3059
68a8e667 3060 // a) Get pointer for fStandardCandlesList:
7ecb5af4 3061 fStandardCandlesList = dynamic_cast<TList*>(fHistList->FindObject("Standard Candles"));
6696a113 3062 if(!fStandardCandlesList){Fatal(sMethodName.Data(),"fStandardCandlesList");}
7ecb5af4 3063
68a8e667 3064 // b) Get pointer for fStandardCandlesFlagsPro:
7ecb5af4 3065 fStandardCandlesFlagsPro = dynamic_cast<TProfile*>(fStandardCandlesList->FindObject("fStandardCandlesFlagsPro"));
6696a113 3066 if(!fStandardCandlesFlagsPro){Fatal(sMethodName.Data(),"fStandardCandlesFlagsPro");}
7ecb5af4 3067
68a8e667 3068 // c) Set again all flags:
3069 fCalculateStandardCandles = (Bool_t)fStandardCandlesFlagsPro->GetBinContent(1);
3070 fPropagateErrorSC = (Bool_t)fStandardCandlesFlagsPro->GetBinContent(2);
7ecb5af4 3071
3072 if(!fCalculateStandardCandles){return;} // TBI is this safe enough
3073
68a8e667 3074 // d) Get pointer TH1D *fStandardCandlesHist:
7ecb5af4 3075 fStandardCandlesHist = dynamic_cast<TH1D*>(fStandardCandlesList->FindObject("fStandardCandlesHist"));
6d19c373 3076
68a8e667 3077 if(!fPropagateErrorSC){return;} // TBI is this safe enough
3078
3079 // e) Get pointer TProfile2D *fProductsSCPro:
3080 fProductsSCPro = dynamic_cast<TProfile2D*>(fStandardCandlesList->FindObject("fProductsSCPro"));
7ecb5af4 3081
3082} // void AliFlowAnalysisWithMultiparticleCorrelations::GetPointersForStandardCandles()
3083
3084//=======================================================================================================================
3085
3086void AliFlowAnalysisWithMultiparticleCorrelations::GetPointersForControlHistograms()
3087{
3088 // Get pointers for control histograms.
3089
3090 // a) Get pointer for fControlHistogramsList; TBI
3091 // b) Get pointer for fControlHistogramsFlagsPro; TBI
3092 // c) Set again all flags; TBI
3093 // d) Get pointers to TH1D *fKinematicsHist[2][3]; TBI
3094 // e) Get pointers to TH1D *fMultDistributionsHist[3]; TBI
3095 // f) Get pointers to TH2D *fMultCorrelationsHist[3]. TBI
3096
6696a113 3097 TString sMethodName = "AliFlowAnalysisWithMultiparticleCorrelations::GetPointersForControlHistograms()";
3098
7ecb5af4 3099 // a) Get pointer for fControlHistogramsList: TBI
3100 fControlHistogramsList = dynamic_cast<TList*>(fHistList->FindObject("Control Histograms"));
6696a113 3101 if(!fControlHistogramsList){Fatal(sMethodName.Data(),"fControlHistogramsList");}
7ecb5af4 3102
3103 // b) Get pointer for fControlHistogramsFlagsPro: TBI
3104 fControlHistogramsFlagsPro = dynamic_cast<TProfile*>(fControlHistogramsList->FindObject("fControlHistogramsFlagsPro"));
6696a113 3105 if(!fControlHistogramsFlagsPro){Fatal(sMethodName.Data(),"fControlHistogramsFlagsPro");}
37d2f768 3106
6696a113 3107 // c) Set again all flags:
7ecb5af4 3108 fFillControlHistograms = fControlHistogramsFlagsPro->GetBinContent(1);
6696a113 3109 fFillKinematicsHist = fControlHistogramsFlagsPro->GetBinContent(2);
3110 fFillMultDistributionsHist = fControlHistogramsFlagsPro->GetBinContent(3);
3111 fFillMultCorrelationsHist = fControlHistogramsFlagsPro->GetBinContent(4);
03823be7 3112 fDontFill[0] = fControlHistogramsFlagsPro->GetBinContent(5);
3113 fDontFill[1] = fControlHistogramsFlagsPro->GetBinContent(6);
3114 fDontFill[2] = fControlHistogramsFlagsPro->GetBinContent(7);
7ecb5af4 3115
3116 if(!fFillControlHistograms){return;} // TBI is this safe enough
3117
3118 // d) Get pointers to fKinematicsHist[2][3]: TBI
3119 TString name[2][3] = {{"RP,phi","RP,pt","RP,eta"},{"POI,phi","POI,pt","POI,eta"}}; // [RP,POI][phi,pt,eta]
3120 for(Int_t rp=0;rp<2;rp++) // [RP,POI]
3121 {
03823be7 3122 if(fDontFill[rp]){continue;}
7ecb5af4 3123 for(Int_t ppe=0;ppe<3;ppe++) // [phi,pt,eta]
37d2f768 3124 {
7ecb5af4 3125 fKinematicsHist[rp][ppe] = dynamic_cast<TH1D*>(fControlHistogramsList->FindObject(name[rp][ppe].Data()));
6696a113 3126 if(!fKinematicsHist[rp][ppe] && fFillKinematicsHist){Fatal(sMethodName.Data(),"%s",name[rp][ppe].Data());} // TBI
37d2f768 3127 }
7ecb5af4 3128 }
3129
3130 // e) Get pointers to TH1D *fMultDistributionsHist[3]:
3131 TString nameMult[3] = {"Multiplicity (RP)","Multiplicity (POI)","Multiplicity (REF)"}; // [RP,POI,reference multiplicity]
3132 for(Int_t rprm=0;rprm<3;rprm++) // [RP,POI,reference multiplicity]
3133 {
03823be7 3134 if(fDontFill[rprm]){continue;}
7ecb5af4 3135 fMultDistributionsHist[rprm] = dynamic_cast<TH1D*>(fControlHistogramsList->FindObject(nameMult[rprm].Data()));
6696a113 3136 if(!fMultDistributionsHist[rprm] && fFillMultDistributionsHist){Fatal(sMethodName.Data(),"%s",nameMult[rprm].Data());} // TBI
7ecb5af4 3137 } // for(Int_t rprm=0;rprm<3;rprm++) // [RP,POI,reference multiplicity]
3138
03823be7 3139 // f) Get pointers to TH2I *fMultCorrelationsHist[3]: TBI automatize the things here (at some point...)...
3140 if(!fDontFill[0] && !fDontFill[1])
3141 {
3142 fMultCorrelationsHist[0] = dynamic_cast<TH2I*>(fControlHistogramsList->FindObject("Multiplicity (RP vs. POI)"));
3143 if(!fMultCorrelationsHist[0] && fFillMultCorrelationsHist){Fatal(sMethodName.Data(),"Multiplicity (RP vs. POI)");} // TBI
3144 }
3145 if(!fDontFill[0] && !fDontFill[2])
3146 {
3147 fMultCorrelationsHist[1] = dynamic_cast<TH2I*>(fControlHistogramsList->FindObject("Multiplicity (RP vs. REF)"));
3148 if(!fMultCorrelationsHist[1] && fFillMultCorrelationsHist){Fatal(sMethodName.Data(),"Multiplicity (RP vs. REF)");} // TBI
3149 }
3150 if(!fDontFill[1] && !fDontFill[2])
3151 {
3152 fMultCorrelationsHist[2] = dynamic_cast<TH2I*>(fControlHistogramsList->FindObject("Multiplicity (POI vs. REF)"));
3153 if(!fMultCorrelationsHist[2] && fFillMultCorrelationsHist){Fatal(sMethodName.Data(),"Multiplicity (POI vs. REF)");} // TBI
3154 }
7ecb5af4 3155
3156} // void AliFlowAnalysisWithMultiparticleCorrelations::GetPointersForControlHistograms()
3157
3158//=======================================================================================================================
3159
3160void AliFlowAnalysisWithMultiparticleCorrelations::GetPointersForCorrelations()
3161{
3162 // Get pointers for correlations.
3163
3164 // a) Get pointer for fCorrelationsList; TBI
3165 // b) Get pointer for fCorrelationsFlagsPro; TBI
3166 // c) Set again all flags; TBI
6696a113 3167 // d) Get pointers to TProfile *fCorrelationsPro[2][8].
3168
3169 TString sMethodName = "AliFlowAnalysisWithMultiparticleCorrelations::GetPointersForCorrelations()";
7ecb5af4 3170
3171 // a) Get pointer for fCorrelationsList: TBI
3172 fCorrelationsList = dynamic_cast<TList*>(fHistList->FindObject("Correlations"));
6696a113 3173 if(!fCorrelationsList){Fatal(sMethodName.Data(),"fCorrelationsList");}
7ecb5af4 3174
3175 // b) Get pointer for fCorrelationsFlagsPro: TBI
3176 fCorrelationsFlagsPro = dynamic_cast<TProfile*>(fCorrelationsList->FindObject("fCorrelationsFlagsPro"));
3177
6696a113 3178 if(!fCorrelationsFlagsPro){Fatal(sMethodName.Data(),"fCorrelationsFlagsPro");}
7ecb5af4 3179
3180 // c) Set again all flags:
3181 fCalculateCorrelations = fCorrelationsFlagsPro->GetBinContent(1);
9efbd2f5 3182 fMaxHarmonic = (Int_t)fCorrelationsFlagsPro->GetBinContent(2);
3183 fMaxCorrelator = (Int_t)fCorrelationsFlagsPro->GetBinContent(3);
68a8e667 3184 fCalculateIsotropic = (Bool_t)fCorrelationsFlagsPro->GetBinContent(4);
3185 fCalculateSame = (Bool_t)fCorrelationsFlagsPro->GetBinContent(5);
3186 fSkipZeroHarmonics = (Bool_t)fCorrelationsFlagsPro->GetBinContent(6);
3187 fCalculateSameIsotropic = (Bool_t)fCorrelationsFlagsPro->GetBinContent(7);
3188 fCalculateAll = (Bool_t)fCorrelationsFlagsPro->GetBinContent(8);
9efbd2f5 3189 fDontGoBeyond = (Int_t)fCorrelationsFlagsPro->GetBinContent(9);
68a8e667 3190 fCalculateOnlyForHarmonicQC = (Bool_t)fCorrelationsFlagsPro->GetBinContent(10);
3191 fCalculateOnlyForSC = (Bool_t)fCorrelationsFlagsPro->GetBinContent(11);
3192 fCalculateOnlyCos = (Bool_t)fCorrelationsFlagsPro->GetBinContent(12);
3193 fCalculateOnlySin = (Bool_t)fCorrelationsFlagsPro->GetBinContent(13);
7ecb5af4 3194
6696a113 3195 if(!fCalculateCorrelations){return;} // TBI is this safe enough, that is the question...
7ecb5af4 3196
9efbd2f5 3197 // d) Get pointers to TProfile *fCorrelationsPro[2][8]:
3198 TString sCosSin[2] = {"Cos","Sin"};
3199 for(Int_t cs=0;cs<2;cs++)
7ecb5af4 3200 {
68a8e667 3201 if(fCalculateOnlyCos && 1==cs){continue;}
3202 else if(fCalculateOnlySin && 0==cs){continue;}
9efbd2f5 3203 for(Int_t c=0;c<fMaxCorrelator;c++)
3204 {
03823be7 3205 if(c==fDontGoBeyond){continue;}
3206 if(fCalculateOnlyForHarmonicQC && c%2==0){continue;}
9efbd2f5 3207 fCorrelationsPro[cs][c] = dynamic_cast<TProfile*>(fCorrelationsList->FindObject(Form("%dpCorrelations%s",c+1,sCosSin[cs].Data())));
3208 if(!fCorrelationsPro[cs][c]){Fatal(sMethodName.Data(),"%dpCorrelations%s",c+1,sCosSin[cs].Data());}
3209 }
7ecb5af4 3210 }
3211
3212} // void AliFlowAnalysisWithMultiparticleCorrelations::GetPointersForCorrelations()
37d2f768 3213
3214//=======================================================================================================================
3215
68a8e667 3216void AliFlowAnalysisWithMultiparticleCorrelations::GetPointersForQcumulants()
3217{
3218 // Get pointers for Q-cumulants.
3219
3220 // a) Get pointer for fQcumulantsList;
3221 // b) Get pointer for fQcumulantsFlagsPro;
3222 // c) Set again all flags;
3223 // d) Get pointer for fQcumulantsHist;
3224 // e) Get pointer for fReferenceFlowHist;
3225 // f) Get pointer for fProductsQCPro.
3226
3227 TString sMethodName = "AliFlowAnalysisWithMultiparticleCorrelations::GetPointersForQcumulants()";
3228
3229 // a) Get pointer for fQcumulantsList:
3230 fQcumulantsList = dynamic_cast<TList*>(fHistList->FindObject("Q-cumulants"));
3231 if(!fQcumulantsList){Fatal(sMethodName.Data(),"fQcumulantsList");}
3232
3233 // b) Get pointer for fQcumulantsFlagsPro:
3234 fQcumulantsFlagsPro = dynamic_cast<TProfile*>(fQcumulantsList->FindObject("fQcumulantsFlagsPro"));
3235 if(!fQcumulantsFlagsPro){Fatal(sMethodName.Data(),"fQcumulantsFlagsPro");}
3236
3237 // c) Set again all flags:
3238 fCalculateQcumulants = (Bool_t) fQcumulantsFlagsPro->GetBinContent(1);
3239 fHarmonicQC = (Int_t) fQcumulantsFlagsPro->GetBinContent(2);
3240 fPropagateErrorQC = (Bool_t) fQcumulantsFlagsPro->GetBinContent(3);
3241
3242 if(!fCalculateQcumulants){return;} // TBI is this safe enough
3243
3244 // d) Get pointer for fQcumulantsHist:
3245 fQcumulantsHist = dynamic_cast<TH1D*>(fQcumulantsList->FindObject("Q-cumulants"));
3246 if(!fQcumulantsHist){Fatal(sMethodName.Data(),"fQcumulantsHist");}
3247
3248 // e) Get pointer for fReferenceFlowHist:
3249 fReferenceFlowHist = dynamic_cast<TH1D*>(fQcumulantsList->FindObject("Reference Flow"));
3250 if(!fReferenceFlowHist){Fatal(sMethodName.Data(),"fReferenceFlowHist");}
3251
3252 if(!fPropagateErrorQC){return;} // TBI is this safe enough
3253
3254 // f) Get pointer for fProductsQCPro:
3255 fProductsQCPro = dynamic_cast<TProfile2D*>(fQcumulantsList->FindObject("fProductsQCPro"));
3256 if(!fProductsQCPro){Fatal(sMethodName.Data(),"fProductsQCPro");}
3257
3258} // void AliFlowAnalysisWithMultiparticleCorrelations::GetPointersForQcumulants()
3259
3260//=======================================================================================================================
3261
3262void AliFlowAnalysisWithMultiparticleCorrelations::GetPointersForDiffCorrelations()
3263{
3264 // Get pointers for differential correlations.
3265
3266 // a) Get pointer for fDiffCorrelationsList;
3267 // b) Get pointer for fDiffCorrelationsFlagsPro;
3268 // c) Set again all flags;
3269 // d) Get pointers to TProfile *fDiffCorrelationsPro[2][4].
3270
3271 TString sMethodName = "AliFlowAnalysisWithMultiparticleCorrelations::GetPointersForDiffCorrelations()";
3272
3273 // a) Get pointer for fDiffCorrelationsList:
3274 fDiffCorrelationsList = dynamic_cast<TList*>(fHistList->FindObject("Differential Correlations"));
3275 if(!fDiffCorrelationsList){Fatal(sMethodName.Data(),"fDiffCorrelationsList");}
3276
3277 // b) Get pointer for fDiffCorrelationsFlagsPro:
3278 fDiffCorrelationsFlagsPro = dynamic_cast<TProfile*>(fDiffCorrelationsList->FindObject("fDiffCorrelationsFlagsPro"));
3279 if(!fDiffCorrelationsFlagsPro){Fatal(sMethodName.Data(),"fDiffCorrelationsFlagsPro");}
3280
3281 // c) Set again all flags:
3282 fCalculateDiffCorrelations = fDiffCorrelationsFlagsPro->GetBinContent(1);
3283
3284 if(!fCalculateDiffCorrelations){return;}
3285
03823be7 3286 // TBI get all pointers below for diff. stuff eventually, not needed for the time being.
dd96bd81 3287
3288 // d) Get pointers to TProfile *fDiffCorrelationsPro[2][4]: // TBI
68a8e667 3289 /*
3290 TString sCosSin[2] = {"Cos","Sin"};
3291 for(Int_t cs=0;cs<2;cs++)
3292 {
3293 if(fCalculateOnlyCos && 1==cs){continue;}
3294 else if(fCalculateOnlySin && 0==cs){continue;}
3295 for(Int_t c=0;c<fMaxCorrelator;c++)
3296 {
3297 fCorrelationsPro[cs][c] = dynamic_cast<TProfile*>(fCorrelationsList->FindObject(Form("%dpCorrelations%s",c+1,sCosSin[cs].Data())));
3298 if(!fCorrelationsPro[cs][c]){Fatal(sMethodName.Data(),"%dpCorrelations%s",c+1,sCosSin[cs].Data());}
3299 }
3300 }
3301 */
3302
3303} // void AliFlowAnalysisWithMultiparticleCorrelations::GetPointersForDiffCorrelations()
3304
3305//=======================================================================================================================
3306
7ecb5af4 3307void AliFlowAnalysisWithMultiparticleCorrelations::InitializeArraysForQvector()
3308{
3309 // Initialize all arrays for Q-vector.
3310
6696a113 3311 for(Int_t h=0;h<fMaxHarmonic*fMaxCorrelator+1;h++)
7ecb5af4 3312 {
68a8e667 3313 for(Int_t wp=0;wp<fMaxCorrelator+1;wp++) // weight power
7ecb5af4 3314 {
68a8e667 3315 fQvector[h][wp] = TComplex(0.,0.);
3316 for(Int_t b=0;b<100;b++) // TBI hardwired 100
3317 {
3318 fpvector[b][h][wp] = TComplex(0.,0.);
3319 fqvector[b][h][wp] = TComplex(0.,0.);
3320 }
7ecb5af4 3321 }
3322 }
3323
3324} // void AliFlowAnalysisWithMultiparticleCorrelations::InitializeArraysForQvector()
3325
3326//=======================================================================================================================
3327
3328void AliFlowAnalysisWithMultiparticleCorrelations::ResetQvector()
3329{
3330 // Reset all Q-vector components to zero before starting a new event.
3331
6696a113 3332 for(Int_t h=0;h<fMaxHarmonic*fMaxCorrelator+1;h++)
7ecb5af4 3333 {
68a8e667 3334 for(Int_t wp=0;wp<fMaxCorrelator+1;wp++) // weight powe
7ecb5af4 3335 {
68a8e667 3336 fQvector[h][wp] = TComplex(0.,0.);
3337 if(!fCalculateDiffQvectors){continue;}
3338 for(Int_t b=0;b<100;b++) // TBI hardwired 100
3339 {
3340 fpvector[b][h][wp] = TComplex(0.,0.);
3341 fqvector[b][h][wp] = TComplex(0.,0.);
3342 }
6696a113 3343 }
3344 }
7ecb5af4 3345
3346} // void AliFlowAnalysisWithMultiparticleCorrelations::ResetQvector()
3347
3348//=======================================================================================================================
3349
68a8e667 3350TComplex AliFlowAnalysisWithMultiparticleCorrelations::Q(Int_t n, Int_t wp)
7ecb5af4 3351{
3352 // Using the fact that Q{-n,p} = Q{n,p}^*.
3353
68a8e667 3354 if(n>=0){return fQvector[n][wp];}
3355 return TComplex::Conjugate(fQvector[-n][wp]);
7ecb5af4 3356
68a8e667 3357} // TComplex AliFlowAnalysisWithMultiparticleCorrelations::Q(Int_t n, Int_t wp)
3358
3359//=======================================================================================================================
3360
3361TComplex AliFlowAnalysisWithMultiparticleCorrelations::p(Int_t n, Int_t wp)
3362{
3363 // Using the fact that p{-n,p} = p{n,p}^*.
3364
3365 if(n>=0){return fpvector[fDiffBinNo][n][wp];}
3366 return TComplex::Conjugate(fpvector[fDiffBinNo][-n][wp]);
3367
3368} // TComplex AliFlowAnalysisWithMultiparticleCorrelations::p(Int_t n, Int_t p)
3369
3370//=======================================================================================================================
3371
3372TComplex AliFlowAnalysisWithMultiparticleCorrelations::q(Int_t n, Int_t wp)
3373{
3374 // Using the fact that q{-n,p} = q{n,p}^*.
9fba36ea 3375
3376 // When weights are used for RPs and not for POIs, and vice versa, some gymnastics is required here:
3377 // TBI rethink and reimplement the lines below:
3378 Int_t nUseWeightsForRP = (Int_t)(fUseWeights[0][0] || fUseWeights[0][1] || fUseWeights[0][2]);
3379 Int_t nUseWeightsForPOI = (Int_t)(fUseWeights[1][0] || fUseWeights[1][1] || fUseWeights[1][2]);
3380 if(nUseWeightsForPOI == 1 && nUseWeightsForRP == 0){wp=1;}
3381 else if(nUseWeightsForPOI == 0 && nUseWeightsForRP == 1){wp-=1;}
3382
68a8e667 3383 if(n>=0){return fqvector[fDiffBinNo][n][wp];}
3384 return TComplex::Conjugate(fqvector[fDiffBinNo][-n][wp]);
3385
3386} // TComplex AliFlowAnalysisWithMultiparticleCorrelations::q(Int_t n, Int_t wp)
7ecb5af4 3387
3388//=======================================================================================================================
3389
3390TComplex AliFlowAnalysisWithMultiparticleCorrelations::One(Int_t n1)
3391{
3392 // Generic expression <exp[i(n1*phi1)]>. TBI comment
3393
3394 TComplex one = Q(n1,1);
3395
3396 return one;
3397
3398} // TComplex AliFlowAnalysisWithMultiparticleCorrelations::One(Int_t n1)
3399
3400//=======================================================================================================================
3401
3402TComplex AliFlowAnalysisWithMultiparticleCorrelations::Two(Int_t n1, Int_t n2)
3403{
3404 // Generic two-particle correlation <exp[i(n1*phi1+n2*phi2)]>.
3405
3406 TComplex two = Q(n1,1)*Q(n2,1)-Q(n1+n2,2);
3407
3408 return two;
3409
3410} // TComplex AliFlowAnalysisWithMultiparticleCorrelations::Two(Int_t n1, Int_t n2)
3411
3412//=======================================================================================================================
3413
3414TComplex AliFlowAnalysisWithMultiparticleCorrelations::Three(Int_t n1, Int_t n2, Int_t n3)
3415{
3416 // Generic three-particle correlation <exp[i(n1*phi1+n2*phi2+n3*phi3)]>.
3417
3418 TComplex three = Q(n1,1)*Q(n2,1)*Q(n3,1)-Q(n1+n2,2)*Q(n3,1)-Q(n2,1)*Q(n1+n3,2)
3419 - Q(n1,1)*Q(n2+n3,2)+2.*Q(n1+n2+n3,3);
3420
3421 return three;
3422
3423} // TComplex AliFlowAnalysisWithMultiparticleCorrelations::Three(Int_t n1, Int_t n2, Int_t n3)
3424
3425//=======================================================================================================================
3426
3427TComplex AliFlowAnalysisWithMultiparticleCorrelations::Four(Int_t n1, Int_t n2, Int_t n3, Int_t n4)
3428{
3429 // Generic four-particle correlation <exp[i(n1*phi1+n2*phi2+n3*phi3+n4*phi4)]>.
3430
3431 TComplex four = Q(n1,1)*Q(n2,1)*Q(n3,1)*Q(n4,1)-Q(n1+n2,2)*Q(n3,1)*Q(n4,1)-Q(n2,1)*Q(n1+n3,2)*Q(n4,1)
3432 - Q(n1,1)*Q(n2+n3,2)*Q(n4,1)+2.*Q(n1+n2+n3,3)*Q(n4,1)-Q(n2,1)*Q(n3,1)*Q(n1+n4,2)
3433 + Q(n2+n3,2)*Q(n1+n4,2)-Q(n1,1)*Q(n3,1)*Q(n2+n4,2)+Q(n1+n3,2)*Q(n2+n4,2)
3434 + 2.*Q(n3,1)*Q(n1+n2+n4,3)-Q(n1,1)*Q(n2,1)*Q(n3+n4,2)+Q(n1+n2,2)*Q(n3+n4,2)
3435 + 2.*Q(n2,1)*Q(n1+n3+n4,3)+2.*Q(n1,1)*Q(n2+n3+n4,3)-6.*Q(n1+n2+n3+n4,4);
3436
3437 return four;
3438
3439} // TComplex AliFlowAnalysisWithMultiparticleCorrelations::Four(Int_t n1, Int_t n2, Int_t n3, Int_t n4)
3440
3441//=======================================================================================================================
3442
3443TComplex AliFlowAnalysisWithMultiparticleCorrelations::Five(Int_t n1, Int_t n2, Int_t n3, Int_t n4, Int_t n5)
3444{
3445 // Generic five-particle correlation <exp[i(n1*phi1+n2*phi2+n3*phi3+n4*phi4+n5*phi5)]>.
3446
3447 TComplex five = Q(n1,1)*Q(n2,1)*Q(n3,1)*Q(n4,1)*Q(n5,1)-Q(n1+n2,2)*Q(n3,1)*Q(n4,1)*Q(n5,1)
3448 - Q(n2,1)*Q(n1+n3,2)*Q(n4,1)*Q(n5,1)-Q(n1,1)*Q(n2+n3,2)*Q(n4,1)*Q(n5,1)
3449 + 2.*Q(n1+n2+n3,3)*Q(n4,1)*Q(n5,1)-Q(n2,1)*Q(n3,1)*Q(n1+n4,2)*Q(n5,1)
3450 + Q(n2+n3,2)*Q(n1+n4,2)*Q(n5,1)-Q(n1,1)*Q(n3,1)*Q(n2+n4,2)*Q(n5,1)
3451 + Q(n1+n3,2)*Q(n2+n4,2)*Q(n5,1)+2.*Q(n3,1)*Q(n1+n2+n4,3)*Q(n5,1)
3452 - Q(n1,1)*Q(n2,1)*Q(n3+n4,2)*Q(n5,1)+Q(n1+n2,2)*Q(n3+n4,2)*Q(n5,1)
3453 + 2.*Q(n2,1)*Q(n1+n3+n4,3)*Q(n5,1)+2.*Q(n1,1)*Q(n2+n3+n4,3)*Q(n5,1)
3454 - 6.*Q(n1+n2+n3+n4,4)*Q(n5,1)-Q(n2,1)*Q(n3,1)*Q(n4,1)*Q(n1+n5,2)
3455 + Q(n2+n3,2)*Q(n4,1)*Q(n1+n5,2)+Q(n3,1)*Q(n2+n4,2)*Q(n1+n5,2)
3456 + Q(n2,1)*Q(n3+n4,2)*Q(n1+n5,2)-2.*Q(n2+n3+n4,3)*Q(n1+n5,2)
3457 - Q(n1,1)*Q(n3,1)*Q(n4,1)*Q(n2+n5,2)+Q(n1+n3,2)*Q(n4,1)*Q(n2+n5,2)
3458 + Q(n3,1)*Q(n1+n4,2)*Q(n2+n5,2)+Q(n1,1)*Q(n3+n4,2)*Q(n2+n5,2)
3459 - 2.*Q(n1+n3+n4,3)*Q(n2+n5,2)+2.*Q(n3,1)*Q(n4,1)*Q(n1+n2+n5,3)
3460 - 2.*Q(n3+n4,2)*Q(n1+n2+n5,3)-Q(n1,1)*Q(n2,1)*Q(n4,1)*Q(n3+n5,2)
3461 + Q(n1+n2,2)*Q(n4,1)*Q(n3+n5,2)+Q(n2,1)*Q(n1+n4,2)*Q(n3+n5,2)
3462 + Q(n1,1)*Q(n2+n4,2)*Q(n3+n5,2)-2.*Q(n1+n2+n4,3)*Q(n3+n5,2)
3463 + 2.*Q(n2,1)*Q(n4,1)*Q(n1+n3+n5,3)-2.*Q(n2+n4,2)*Q(n1+n3+n5,3)
3464 + 2.*Q(n1,1)*Q(n4,1)*Q(n2+n3+n5,3)-2.*Q(n1+n4,2)*Q(n2+n3+n5,3)
3465 - 6.*Q(n4,1)*Q(n1+n2+n3+n5,4)-Q(n1,1)*Q(n2,1)*Q(n3,1)*Q(n4+n5,2)
3466 + Q(n1+n2,2)*Q(n3,1)*Q(n4+n5,2)+Q(n2,1)*Q(n1+n3,2)*Q(n4+n5,2)
3467 + Q(n1,1)*Q(n2+n3,2)*Q(n4+n5,2)-2.*Q(n1+n2+n3,3)*Q(n4+n5,2)
3468 + 2.*Q(n2,1)*Q(n3,1)*Q(n1+n4+n5,3)-2.*Q(n2+n3,2)*Q(n1+n4+n5,3)
3469 + 2.*Q(n1,1)*Q(n3,1)*Q(n2+n4+n5,3)-2.*Q(n1+n3,2)*Q(n2+n4+n5,3)
3470 - 6.*Q(n3,1)*Q(n1+n2+n4+n5,4)+2.*Q(n1,1)*Q(n2,1)*Q(n3+n4+n5,3)
3471 - 2.*Q(n1+n2,2)*Q(n3+n4+n5,3)-6.*Q(n2,1)*Q(n1+n3+n4+n5,4)
3472 - 6.*Q(n1,1)*Q(n2+n3+n4+n5,4)+24.*Q(n1+n2+n3+n4+n5,5);
3473
3474 return five;
3475
3476} // TComplex AliFlowAnalysisWithMultiparticleCorrelations::Five(Int_t n1, Int_t n2, Int_t n3, Int_t n4, Int_t n5)
3477
3478//=======================================================================================================================
3479
3480TComplex AliFlowAnalysisWithMultiparticleCorrelations::Six(Int_t n1, Int_t n2, Int_t n3, Int_t n4, Int_t n5, Int_t n6)
3481{
3482 // Generic six-particle correlation <exp[i(n1*phi1+n2*phi2+n3*phi3+n4*phi4+n5*phi5+n6*phi6)]>.
3483
3484 TComplex six = Q(n1,1)*Q(n2,1)*Q(n3,1)*Q(n4,1)*Q(n5,1)*Q(n6,1)-Q(n1+n2,2)*Q(n3,1)*Q(n4,1)*Q(n5,1)*Q(n6,1)
3485 - Q(n2,1)*Q(n1+n3,2)*Q(n4,1)*Q(n5,1)*Q(n6,1)-Q(n1,1)*Q(n2+n3,2)*Q(n4,1)*Q(n5,1)*Q(n6,1)
3486 + 2.*Q(n1+n2+n3,3)*Q(n4,1)*Q(n5,1)*Q(n6,1)-Q(n2,1)*Q(n3,1)*Q(n1+n4,2)*Q(n5,1)*Q(n6,1)
3487 + Q(n2+n3,2)*Q(n1+n4,2)*Q(n5,1)*Q(n6,1)-Q(n1,1)*Q(n3,1)*Q(n2+n4,2)*Q(n5,1)*Q(n6,1)
3488 + Q(n1+n3,2)*Q(n2+n4,2)*Q(n5,1)*Q(n6,1)+2.*Q(n3,1)*Q(n1+n2+n4,3)*Q(n5,1)*Q(n6,1)
3489 - Q(n1,1)*Q(n2,1)*Q(n3+n4,2)*Q(n5,1)*Q(n6,1)+Q(n1+n2,2)*Q(n3+n4,2)*Q(n5,1)*Q(n6,1)
3490 + 2.*Q(n2,1)*Q(n1+n3+n4,3)*Q(n5,1)*Q(n6,1)+2.*Q(n1,1)*Q(n2+n3+n4,3)*Q(n5,1)*Q(n6,1)
3491 - 6.*Q(n1+n2+n3+n4,4)*Q(n5,1)*Q(n6,1)-Q(n2,1)*Q(n3,1)*Q(n4,1)*Q(n1+n5,2)*Q(n6,1)
3492 + Q(n2+n3,2)*Q(n4,1)*Q(n1+n5,2)*Q(n6,1)+Q(n3,1)*Q(n2+n4,2)*Q(n1+n5,2)*Q(n6,1)
3493 + Q(n2,1)*Q(n3+n4,2)*Q(n1+n5,2)*Q(n6,1)-2.*Q(n2+n3+n4,3)*Q(n1+n5,2)*Q(n6,1)
3494 - Q(n1,1)*Q(n3,1)*Q(n4,1)*Q(n2+n5,2)*Q(n6,1)+Q(n1+n3,2)*Q(n4,1)*Q(n2+n5,2)*Q(n6,1)
3495 + Q(n3,1)*Q(n1+n4,2)*Q(n2+n5,2)*Q(n6,1)+Q(n1,1)*Q(n3+n4,2)*Q(n2+n5,2)*Q(n6,1)
3496 - 2.*Q(n1+n3+n4,3)*Q(n2+n5,2)*Q(n6,1)+2.*Q(n3,1)*Q(n4,1)*Q(n1+n2+n5,3)*Q(n6,1)
3497 - 2.*Q(n3+n4,2)*Q(n1+n2+n5,3)*Q(n6,1)-Q(n1,1)*Q(n2,1)*Q(n4,1)*Q(n3+n5,2)*Q(n6,1)
3498 + Q(n1+n2,2)*Q(n4,1)*Q(n3+n5,2)*Q(n6,1)+Q(n2,1)*Q(n1+n4,2)*Q(n3+n5,2)*Q(n6,1)
3499 + Q(n1,1)*Q(n2+n4,2)*Q(n3+n5,2)*Q(n6,1)-2.*Q(n1+n2+n4,3)*Q(n3+n5,2)*Q(n6,1)
3500 + 2.*Q(n2,1)*Q(n4,1)*Q(n1+n3+n5,3)*Q(n6,1)-2.*Q(n2+n4,2)*Q(n1+n3+n5,3)*Q(n6,1)
3501 + 2.*Q(n1,1)*Q(n4,1)*Q(n2+n3+n5,3)*Q(n6,1)-2.*Q(n1+n4,2)*Q(n2+n3+n5,3)*Q(n6,1)
3502 - 6.*Q(n4,1)*Q(n1+n2+n3+n5,4)*Q(n6,1)-Q(n1,1)*Q(n2,1)*Q(n3,1)*Q(n4+n5,2)*Q(n6,1)
3503 + Q(n1+n2,2)*Q(n3,1)*Q(n4+n5,2)*Q(n6,1)+Q(n2,1)*Q(n1+n3,2)*Q(n4+n5,2)*Q(n6,1)
3504 + Q(n1,1)*Q(n2+n3,2)*Q(n4+n5,2)*Q(n6,1)-2.*Q(n1+n2+n3,3)*Q(n4+n5,2)*Q(n6,1)
3505 + 2.*Q(n2,1)*Q(n3,1)*Q(n1+n4+n5,3)*Q(n6,1)-2.*Q(n2+n3,2)*Q(n1+n4+n5,3)*Q(n6,1)
3506 + 2.*Q(n1,1)*Q(n3,1)*Q(n2+n4+n5,3)*Q(n6,1)-2.*Q(n1+n3,2)*Q(n2+n4+n5,3)*Q(n6,1)
3507 - 6.*Q(n3,1)*Q(n1+n2+n4+n5,4)*Q(n6,1)+2.*Q(n1,1)*Q(n2,1)*Q(n3+n4+n5,3)*Q(n6,1)
3508 - 2.*Q(n1+n2,2)*Q(n3+n4+n5,3)*Q(n6,1)-6.*Q(n2,1)*Q(n1+n3+n4+n5,4)*Q(n6,1)
3509 - 6.*Q(n1,1)*Q(n2+n3+n4+n5,4)*Q(n6,1)+24.*Q(n1+n2+n3+n4+n5,5)*Q(n6,1)
3510 - Q(n2,1)*Q(n3,1)*Q(n4,1)*Q(n5,1)*Q(n1+n6,2)+Q(n2+n3,2)*Q(n4,1)*Q(n5,1)*Q(n1+n6,2)
3511 + Q(n3,1)*Q(n2+n4,2)*Q(n5,1)*Q(n1+n6,2)+Q(n2,1)*Q(n3+n4,2)*Q(n5,1)*Q(n1+n6,2)
3512 - 2.*Q(n2+n3+n4,3)*Q(n5,1)*Q(n1+n6,2)+Q(n3,1)*Q(n4,1)*Q(n2+n5,2)*Q(n1+n6,2)
3513 - Q(n3+n4,2)*Q(n2+n5,2)*Q(n1+n6,2)+Q(n2,1)*Q(n4,1)*Q(n3+n5,2)*Q(n1+n6,2)
3514 - Q(n2+n4,2)*Q(n3+n5,2)*Q(n1+n6,2)-2.*Q(n4,1)*Q(n2+n3+n5,3)*Q(n1+n6,2)
3515 + Q(n2,1)*Q(n3,1)*Q(n4+n5,2)*Q(n1+n6,2)-Q(n2+n3,2)*Q(n4+n5,2)*Q(n1+n6,2)
3516 - 2.*Q(n3,1)*Q(n2+n4+n5,3)*Q(n1+n6,2)-2.*Q(n2,1)*Q(n3+n4+n5,3)*Q(n1+n6,2)
3517 + 6.*Q(n2+n3+n4+n5,4)*Q(n1+n6,2)-Q(n1,1)*Q(n3,1)*Q(n4,1)*Q(n5,1)*Q(n2+n6,2)
3518 + Q(n1+n3,2)*Q(n4,1)*Q(n5,1)*Q(n2+n6,2)+Q(n3,1)*Q(n1+n4,2)*Q(n5,1)*Q(n2+n6,2)
3519 + Q(n1,1)*Q(n3+n4,2)*Q(n5,1)*Q(n2+n6,2)-2.*Q(n1+n3+n4,3)*Q(n5,1)*Q(n2+n6,2)
3520 + Q(n3,1)*Q(n4,1)*Q(n1+n5,2)*Q(n2+n6,2)-Q(n3+n4,2)*Q(n1+n5,2)*Q(n2+n6,2)
3521 + Q(n1,1)*Q(n4,1)*Q(n3+n5,2)*Q(n2+n6,2)-Q(n1+n4,2)*Q(n3+n5,2)*Q(n2+n6,2)
3522 - 2.*Q(n4,1)*Q(n1+n3+n5,3)*Q(n2+n6,2)+Q(n1,1)*Q(n3,1)*Q(n4+n5,2)*Q(n2+n6,2)
3523 - Q(n1+n3,2)*Q(n4+n5,2)*Q(n2+n6,2)-2.*Q(n3,1)*Q(n1+n4+n5,3)*Q(n2+n6,2)
3524 - 2.*Q(n1,1)*Q(n3+n4+n5,3)*Q(n2+n6,2)+6.*Q(n1+n3+n4+n5,4)*Q(n2+n6,2)
3525 + 2.*Q(n3,1)*Q(n4,1)*Q(n5,1)*Q(n1+n2+n6,3)-2.*Q(n3+n4,2)*Q(n5,1)*Q(n1+n2+n6,3)
3526 - 2.*Q(n4,1)*Q(n3+n5,2)*Q(n1+n2+n6,3)-2.*Q(n3,1)*Q(n4+n5,2)*Q(n1+n2+n6,3)
3527 + 4.*Q(n3+n4+n5,3)*Q(n1+n2+n6,3)-Q(n1,1)*Q(n2,1)*Q(n4,1)*Q(n5,1)*Q(n3+n6,2)
3528 + Q(n1+n2,2)*Q(n4,1)*Q(n5,1)*Q(n3+n6,2)+Q(n2,1)*Q(n1+n4,2)*Q(n5,1)*Q(n3+n6,2)
3529 + Q(n1,1)*Q(n2+n4,2)*Q(n5,1)*Q(n3+n6,2)-2.*Q(n1+n2+n4,3)*Q(n5,1)*Q(n3+n6,2)
3530 + Q(n2,1)*Q(n4,1)*Q(n1+n5,2)*Q(n3+n6,2)-Q(n2+n4,2)*Q(n1+n5,2)*Q(n3+n6,2)
3531 + Q(n1,1)*Q(n4,1)*Q(n2+n5,2)*Q(n3+n6,2)-Q(n1+n4,2)*Q(n2+n5,2)*Q(n3+n6,2)
3532 - 2.*Q(n4,1)*Q(n1+n2+n5,3)*Q(n3+n6,2)+Q(n1,1)*Q(n2,1)*Q(n4+n5,2)*Q(n3+n6,2)
3533 - Q(n1+n2,2)*Q(n4+n5,2)*Q(n3+n6,2)-2.*Q(n2,1)*Q(n1+n4+n5,3)*Q(n3+n6,2)
3534 - 2.*Q(n1,1)*Q(n2+n4+n5,3)*Q(n3+n6,2)+6.*Q(n1+n2+n4+n5,4)*Q(n3+n6,2)
3535 + 2.*Q(n2,1)*Q(n4,1)*Q(n5,1)*Q(n1+n3+n6,3)-2.*Q(n2+n4,2)*Q(n5,1)*Q(n1+n3+n6,3)
3536 - 2.*Q(n4,1)*Q(n2+n5,2)*Q(n1+n3+n6,3)-2.*Q(n2,1)*Q(n4+n5,2)*Q(n1+n3+n6,3)
3537 + 4.*Q(n2+n4+n5,3)*Q(n1+n3+n6,3)+2.*Q(n1,1)*Q(n4,1)*Q(n5,1)*Q(n2+n3+n6,3)
3538 - 2.*Q(n1+n4,2)*Q(n5,1)*Q(n2+n3+n6,3)-2.*Q(n4,1)*Q(n1+n5,2)*Q(n2+n3+n6,3)
3539 - 2.*Q(n1,1)*Q(n4+n5,2)*Q(n2+n3+n6,3)+4.*Q(n1+n4+n5,3)*Q(n2+n3+n6,3)
3540 - 6.*Q(n4,1)*Q(n5,1)*Q(n1+n2+n3+n6,4)+6.*Q(n4+n5,2)*Q(n1+n2+n3+n6,4)
3541 - Q(n1,1)*Q(n2,1)*Q(n3,1)*Q(n5,1)*Q(n4+n6,2)+Q(n1+n2,2)*Q(n3,1)*Q(n5,1)*Q(n4+n6,2)
3542 + Q(n2,1)*Q(n1+n3,2)*Q(n5,1)*Q(n4+n6,2)+Q(n1,1)*Q(n2+n3,2)*Q(n5,1)*Q(n4+n6,2)
3543 - 2.*Q(n1+n2+n3,3)*Q(n5,1)*Q(n4+n6,2)+Q(n2,1)*Q(n3,1)*Q(n1+n5,2)*Q(n4+n6,2)
3544 - Q(n2+n3,2)*Q(n1+n5,2)*Q(n4+n6,2)+Q(n1,1)*Q(n3,1)*Q(n2+n5,2)*Q(n4+n6,2)
3545 - Q(n1+n3,2)*Q(n2+n5,2)*Q(n4+n6,2)-2.*Q(n3,1)*Q(n1+n2+n5,3)*Q(n4+n6,2)
3546 + Q(n1,1)*Q(n2,1)*Q(n3+n5,2)*Q(n4+n6,2)-Q(n1+n2,2)*Q(n3+n5,2)*Q(n4+n6,2)
3547 - 2.*Q(n2,1)*Q(n1+n3+n5,3)*Q(n4+n6,2)-2.*Q(n1,1)*Q(n2+n3+n5,3)*Q(n4+n6,2)
3548 + 6.*Q(n1+n2+n3+n5,4)*Q(n4+n6,2)+2.*Q(n2,1)*Q(n3,1)*Q(n5,1)*Q(n1+n4+n6,3)
3549 - 2.*Q(n2+n3,2)*Q(n5,1)*Q(n1+n4+n6,3)-2.*Q(n3,1)*Q(n2+n5,2)*Q(n1+n4+n6,3)
3550 - 2.*Q(n2,1)*Q(n3+n5,2)*Q(n1+n4+n6,3)+4.*Q(n2+n3+n5,3)*Q(n1+n4+n6,3)
3551 + 2.*Q(n1,1)*Q(n3,1)*Q(n5,1)*Q(n2+n4+n6,3)-2.*Q(n1+n3,2)*Q(n5,1)*Q(n2+n4+n6,3)
3552 - 2.*Q(n3,1)*Q(n1+n5,2)*Q(n2+n4+n6,3)-2.*Q(n1,1)*Q(n3+n5,2)*Q(n2+n4+n6,3)
3553 + 4.*Q(n1+n3+n5,3)*Q(n2+n4+n6,3)-6.*Q(n3,1)*Q(n5,1)*Q(n1+n2+n4+n6,4)
3554 + 6.*Q(n3+n5,2)*Q(n1+n2+n4+n6,4)+2.*Q(n1,1)*Q(n2,1)*Q(n5,1)*Q(n3+n4+n6,3)
3555 - 2.*Q(n1+n2,2)*Q(n5,1)*Q(n3+n4+n6,3)-2.*Q(n2,1)*Q(n1+n5,2)*Q(n3+n4+n6,3)
3556 - 2.*Q(n1,1)*Q(n2+n5,2)*Q(n3+n4+n6,3)+4.*Q(n1+n2+n5,3)*Q(n3+n4+n6,3)
3557 - 6.*Q(n2,1)*Q(n5,1)*Q(n1+n3+n4+n6,4)+6.*Q(n2+n5,2)*Q(n1+n3+n4+n6,4)
3558 - 6.*Q(n1,1)*Q(n5,1)*Q(n2+n3+n4+n6,4)+6.*Q(n1+n5,2)*Q(n2+n3+n4+n6,4)
3559 + 24.*Q(n5,1)*Q(n1+n2+n3+n4+n6,5)-Q(n1,1)*Q(n2,1)*Q(n3,1)*Q(n4,1)*Q(n5+n6,2)
3560 + Q(n1+n2,2)*Q(n3,1)*Q(n4,1)*Q(n5+n6,2)+Q(n2,1)*Q(n1+n3,2)*Q(n4,1)*Q(n5+n6,2)
3561 + Q(n1,1)*Q(n2+n3,2)*Q(n4,1)*Q(n5+n6,2)-2.*Q(n1+n2+n3,3)*Q(n4,1)*Q(n5+n6,2)
3562 + Q(n2,1)*Q(n3,1)*Q(n1+n4,2)*Q(n5+n6,2)-Q(n2+n3,2)*Q(n1+n4,2)*Q(n5+n6,2)
3563 + Q(n1,1)*Q(n3,1)*Q(n2+n4,2)*Q(n5+n6,2)-Q(n1+n3,2)*Q(n2+n4,2)*Q(n5+n6,2)
3564 - 2.*Q(n3,1)*Q(n1+n2+n4,3)*Q(n5+n6,2)+Q(n1,1)*Q(n2,1)*Q(n3+n4,2)*Q(n5+n6,2)
3565 - Q(n1+n2,2)*Q(n3+n4,2)*Q(n5+n6,2)-2.*Q(n2,1)*Q(n1+n3+n4,3)*Q(n5+n6,2)
3566 - 2.*Q(n1,1)*Q(n2+n3+n4,3)*Q(n5+n6,2)+6.*Q(n1+n2+n3+n4,4)*Q(n5+n6,2)
3567 + 2.*Q(n2,1)*Q(n3,1)*Q(n4,1)*Q(n1+n5+n6,3)-2.*Q(n2+n3,2)*Q(n4,1)*Q(n1+n5+n6,3)
3568 - 2.*Q(n3,1)*Q(n2+n4,2)*Q(n1+n5+n6,3)-2.*Q(n2,1)*Q(n3+n4,2)*Q(n1+n5+n6,3)
3569 + 4.*Q(n2+n3+n4,3)*Q(n1+n5+n6,3)+2.*Q(n1,1)*Q(n3,1)*Q(n4,1)*Q(n2+n5+n6,3)
3570 - 2.*Q(n1+n3,2)*Q(n4,1)*Q(n2+n5+n6,3)-2.*Q(n3,1)*Q(n1+n4,2)*Q(n2+n5+n6,3)
3571 - 2.*Q(n1,1)*Q(n3+n4,2)*Q(n2+n5+n6,3)+4.*Q(n1+n3+n4,3)*Q(n2+n5+n6,3)
3572 - 6.*Q(n3,1)*Q(n4,1)*Q(n1+n2+n5+n6,4)+6.*Q(n3+n4,2)*Q(n1+n2+n5+n6,4)
3573 + 2.*Q(n1,1)*Q(n2,1)*Q(n4,1)*Q(n3+n5+n6,3)-2.*Q(n1+n2,2)*Q(n4,1)*Q(n3+n5+n6,3)
3574 - 2.*Q(n2,1)*Q(n1+n4,2)*Q(n3+n5+n6,3)-2.*Q(n1,1)*Q(n2+n4,2)*Q(n3+n5+n6,3)
3575 + 4.*Q(n1+n2+n4,3)*Q(n3+n5+n6,3)-6.*Q(n2,1)*Q(n4,1)*Q(n1+n3+n5+n6,4)
3576 + 6.*Q(n2+n4,2)*Q(n1+n3+n5+n6,4)-6.*Q(n1,1)*Q(n4,1)*Q(n2+n3+n5+n6,4)
3577 + 6.*Q(n1+n4,2)*Q(n2+n3+n5+n6,4)+24.*Q(n4,1)*Q(n1+n2+n3+n5+n6,5)
3578 + 2.*Q(n1,1)*Q(n2,1)*Q(n3,1)*Q(n4+n5+n6,3)-2.*Q(n1+n2,2)*Q(n3,1)*Q(n4+n5+n6,3)
3579 - 2.*Q(n2,1)*Q(n1+n3,2)*Q(n4+n5+n6,3)-2.*Q(n1,1)*Q(n2+n3,2)*Q(n4+n5+n6,3)
3580 + 4.*Q(n1+n2+n3,3)*Q(n4+n5+n6,3)-6.*Q(n2,1)*Q(n3,1)*Q(n1+n4+n5+n6,4)
3581 + 6.*Q(n2+n3,2)*Q(n1+n4+n5+n6,4)-6.*Q(n1,1)*Q(n3,1)*Q(n2+n4+n5+n6,4)
3582 + 6.*Q(n1+n3,2)*Q(n2+n4+n5+n6,4)+24.*Q(n3,1)*Q(n1+n2+n4+n5+n6,5)
3583 - 6.*Q(n1,1)*Q(n2,1)*Q(n3+n4+n5+n6,4)+6.*Q(n1+n2,2)*Q(n3+n4+n5+n6,4)
3584 + 24.*Q(n2,1)*Q(n1+n3+n4+n5+n6,5)+24.*Q(n1,1)*Q(n2+n3+n4+n5+n6,5)
3585 - 120.*Q(n1+n2+n3+n4+n5+n6,6);
3586
3587 return six;
3588
3589} // TComplex AliFlowAnalysisWithMultiparticleCorrelations::Six(Int_t n1, Int_t n2, Int_t n3, Int_t n4, Int_t n5, Int_t n6)
3590
3591//=======================================================================================================================
3592
3593TComplex AliFlowAnalysisWithMultiparticleCorrelations::Seven(Int_t n1, Int_t n2, Int_t n3, Int_t n4, Int_t n5, Int_t n6, Int_t n7)
3594{
3595 // Generic seven-particle correlation <exp[i(n1*phi1+n2*phi2+n3*phi3+n4*phi4+n5*phi5+n6*phi6+n7*phi7)]>.
3596
68a8e667 3597 Int_t harmonic[7] = {n1,n2,n3,n4,n5,n6,n7};
3598
3599 TComplex seven = Recursion(7,harmonic);
7ecb5af4 3600
3601 return seven;
3602
3603} // end of TComplex AliFlowAnalysisWithMultiparticleCorrelations::Seven(Int_t n1, Int_t n2, Int_t n3, Int_t n4, Int_t n5, Int_t n6, Int_t n7)
3604
3605//=======================================================================================================================
3606
3607TComplex AliFlowAnalysisWithMultiparticleCorrelations::Eight(Int_t n1, Int_t n2, Int_t n3, Int_t n4, Int_t n5, Int_t n6, Int_t n7, Int_t n8)
3608{
3609 // Generic eight-particle correlation <exp[i(n1*phi1+n2*phi2+n3*phi3+n4*phi4+n5*phi5+n6*phi6+n7*phi7+n8*phi8)]>.
3610
68a8e667 3611 Int_t harmonic[8] = {n1,n2,n3,n4,n5,n6,n7,n8};
3612
3613 TComplex eight = Recursion(8,harmonic);
7ecb5af4 3614
3615 return eight;
3616
3617} // end of TComplex AliFlowAnalysisWithMultiparticleCorrelations::Eight(Int_t n1, Int_t n2, Int_t n3, Int_t n4, Int_t n5, Int_t n6, Int_t n7, Int_t n8)
3618
3619//=======================================================================================================================
3620
3621void AliFlowAnalysisWithMultiparticleCorrelations::BookEverythingForWeights()
3622{
3623 // Book all objects for calculations with weights.
3624
3625 // a) Book profile to hold all flags for weights;
9fba36ea 3626 // b) Store histograms holding phi, pt and eta weights.
7ecb5af4 3627
3628 // a) Book profile to hold all flags for weights:
68a8e667 3629 fWeightsFlagsPro = new TProfile("fWeightsFlagsPro","0 = weight not used, 1 = weight used ",6,0,6);
7ecb5af4 3630 fWeightsFlagsPro->SetLabelSize(0.06);
3631 fWeightsFlagsPro->SetStats(kFALSE);
3632 fWeightsFlagsPro->SetFillColor(kGray);
3633 fWeightsFlagsPro->SetLineColor(kBlack);
68a8e667 3634 fWeightsFlagsPro->GetXaxis()->SetBinLabel(1,"RP: w_{#phi}"); fWeightsFlagsPro->Fill(0.5,fUseWeights[0][0]);
3635 fWeightsFlagsPro->GetXaxis()->SetBinLabel(2,"RP: w_{p_{T}}"); fWeightsFlagsPro->Fill(1.5,fUseWeights[0][1]);
3636 fWeightsFlagsPro->GetXaxis()->SetBinLabel(3,"RP: w_{#eta}"); fWeightsFlagsPro->Fill(2.5,fUseWeights[0][2]);
3637 fWeightsFlagsPro->GetXaxis()->SetBinLabel(4,"POI: w_{#phi}"); fWeightsFlagsPro->Fill(3.5,fUseWeights[1][0]);
3638 fWeightsFlagsPro->GetXaxis()->SetBinLabel(5,"POI: w_{p_{T}}"); fWeightsFlagsPro->Fill(4.5,fUseWeights[1][1]);
3639 fWeightsFlagsPro->GetXaxis()->SetBinLabel(6,"POI: w_{#eta}"); fWeightsFlagsPro->Fill(5.5,fUseWeights[1][2]);
7ecb5af4 3640 fWeightsList->Add(fWeightsFlagsPro);
3641
3642 // b) Store histograms holding phi, pt and eta weights:
3643 // REMARK: It is assumed that these histos are accessed from external file "weights.root"
68a8e667 3644 for(Int_t rp=0;rp<2;rp++) // [RP,POI]
3645 {
3646 for(Int_t ppe=0;ppe<3;ppe++) // [phi,pt,eta]
3647 {
3648 if(fWeightsHist[rp][ppe]){fWeightsList->Add(fWeightsHist[rp][ppe]);}
3649 }
3650 }
7ecb5af4 3651
3652} // void AliFlowAnalysisWithMultiparticleCorrelations::BookEverythingForWeights()
3653
3654//=======================================================================================================================
3655
68a8e667 3656Double_t AliFlowAnalysisWithMultiparticleCorrelations::Weight(const Double_t &value, const char *type, const char *variable) // value, [RP,POI], [phi,pt,eta]
3657{
3658 // Determine particle weight.
3659
3660 TString sMethodName = "Double_t AliFlowAnalysisWithMultiparticleCorrelations::Weight(const Double_t &value, const char *type, const char *variable)";
3661
3662 // Basic protection:
3663 if(!(TString(type).EqualTo("RP") || TString(type).EqualTo("POI"))){Fatal(sMethodName.Data(),"!(TString(type).EqualTo...");}
3664 if(!(TString(variable).EqualTo("phi") || TString(variable).EqualTo("pt") || TString(variable).EqualTo("eta"))){Fatal(sMethodName.Data(),"!(TString(variable).EqualTo...");}
3665
3666 Int_t rp = 0; // [RP,POI]
3667 if(TString(type).EqualTo("POI")){rp=1;}
3668
3669 Int_t ppe = 0; // [phi,pt,eta]
3670 if(TString(variable).EqualTo("pt")){ppe=1;}
3671 if(TString(variable).EqualTo("eta")){ppe=2;}
3672
3673 if(!fWeightsHist[rp][ppe]){Fatal(sMethodName.Data(),"!fWeightsHist[rp][ppe]");}
3674
3675 Double_t weight = fWeightsHist[rp][ppe]->GetBinContent(fWeightsHist[rp][ppe]->FindBin(value));
3676
3677 return weight;
3678
3679} // Double_t AliFlowAnalysisWithMultiparticleCorrelations::Weight(const Double_t &value, const char *type, const char *variable)
3680
3681//=======================================================================================================================
3682
3683/*
3684Double_t AliFlowAnalysisWithMultiparticleCorrelations::PhiWeight(const Double_t &dPhi, const char *type)
7ecb5af4 3685{
3686 // Determine phi weight for a given phi.
3687
68a8e667 3688 TString sMethodName = "Double_t AliFlowAnalysisWithMultiparticleCorrelations::PhiWeight(const Double_t &dPhi, const char *type)";
3689
3690 // Basic protection:
3691 if(!(TString(type)::EqualTo("RP") || TString(type)::EqualTo("POI"))){Fatal(sMethodName.Data(),"!(TString(type)::EqualTo...");}
3692
3693 Int_t rp = 0; // RP or POI
3694 if(TString(type)::EqualTo("POI")){rp=1;}
3695
3696 if(!fWeightsHist[rp][0]){Fatal("AliFlowAnalysisWithMultiparticleCorrelations::PhiWeight(const Double_t &dPhi)","fPhiWeightsHist");}
3697
3698
3699
3700
3701
3702
3703
3704
7ecb5af4 3705
3706 Double_t wPhi = fPhiWeightsHist->GetBinContent(fPhiWeightsHist->FindBin(dPhi));
68a8e667 3707
3708
3709 wPhi = 0.;
7ecb5af4 3710
3711 return wPhi;
3712
3713} // Double_t AliFlowAnalysisWithMultiparticleCorrelations::PhiWeight(const Double_t &dPhi)
3714
3715//=======================================================================================================================
3716
68a8e667 3717Double_t AliFlowAnalysisWithMultiparticleCorrelations::PtWeight(const Double_t &dPt, const char *type)
7ecb5af4 3718{
3719 // Determine pt weight for a given pt.
3720
6696a113 3721 if(!fPtWeightsHist){Fatal("AliFlowAnalysisWithMultiparticleCorrelations::PtWeight(const Double_t &dPt)","fPtWeightsHist");}
7ecb5af4 3722
3723 Double_t wPt = fPtWeightsHist->GetBinContent(fPtWeightsHist->FindBin(dPt));
3724
3725 return wPt;
3726
3727} // Double_t AliFlowAnalysisWithMultiparticleCorrelations::PtWeight(const Double_t &dPt)
3728
3729//=======================================================================================================================
3730
68a8e667 3731Double_t AliFlowAnalysisWithMultiparticleCorrelations::EtaWeight(const Double_t &dEta, const char *type)
7ecb5af4 3732{
3733 // Determine eta weight for a given eta.
3734
6696a113 3735 if(!fEtaWeightsHist){Fatal("AliFlowAnalysisWithMultiparticleCorrelations::EtaWeight(const Double_t &dEta)","fEtaWeightsHist");}
7ecb5af4 3736
3737 Double_t wEta = fEtaWeightsHist->GetBinContent(fEtaWeightsHist->FindBin(dEta));
3738
3739 return wEta;
3740
3741} // Double_t AliFlowAnalysisWithMultiparticleCorrelations::EtaWeight(const Double_t &dEta)
3742
68a8e667 3743*/
3744
3745
7ecb5af4 3746//=======================================================================================================================
3747
3748void AliFlowAnalysisWithMultiparticleCorrelations::BookEverythingForBase()
3749{
3750 // Book all base objects.
3751
4ffd61b4 3752 fInternalFlagsPro = new TProfile("fInternalFlagsPro","Internal flags and settings",8,0,8);
7ecb5af4 3753 fInternalFlagsPro->SetLabelSize(0.05);
3754 fInternalFlagsPro->SetStats(kFALSE);
3755 fInternalFlagsPro->SetFillColor(kGray);
3756 fInternalFlagsPro->SetLineColor(kBlack);
3757 fInternalFlagsPro->GetXaxis()->SetBinLabel(1,"fUseInternalFlags"); fInternalFlagsPro->Fill(0.5,fUseInternalFlags);
3758 fInternalFlagsPro->GetXaxis()->SetBinLabel(2,"fMinNoRPs"); fInternalFlagsPro->Fill(1.5,fMinNoRPs);
3759 fInternalFlagsPro->GetXaxis()->SetBinLabel(3,"fMaxNoRPs"); fInternalFlagsPro->Fill(2.5,fMaxNoRPs);
3760 fInternalFlagsPro->GetXaxis()->SetBinLabel(4,"fExactNoRPs"); fInternalFlagsPro->Fill(3.5,fExactNoRPs);
9fba36ea 3761 fInternalFlagsPro->GetXaxis()->SetBinLabel(5,"fPropagateError"); fInternalFlagsPro->Fill(4.5,fPropagateError);
4ffd61b4 3762 fInternalFlagsPro->GetXaxis()->SetBinLabel(6,Form("fAnalysisTag = %s",fAnalysisTag.Data()));
3763 fInternalFlagsPro->GetXaxis()->SetBinLabel(7,"fDumpThePoints"); fInternalFlagsPro->Fill(6.5,fDumpThePoints);
3764 fInternalFlagsPro->GetXaxis()->SetBinLabel(8,"fMaxNoEventsPerFile"); fInternalFlagsPro->Fill(7.5,fMaxNoEventsPerFile);
9fba36ea 3765
7ecb5af4 3766 fHistList->Add(fInternalFlagsPro);
3767
3768} // void AliFlowAnalysisWithMultiparticleCorrelations::BookEverythingForBase()
3769
3770//=======================================================================================================================
3771
3772Bool_t AliFlowAnalysisWithMultiparticleCorrelations::CrossCheckInternalFlags(AliFlowEventSimple *anEvent)
3773{
3774 // Cross-check in this method wether "anEvent" passes internal flags.
3775
dd96bd81 3776 // a) Cross-check min. and max. number of RPs;
3777 // b) Cross-check exact number of RPs.
7ecb5af4 3778
3779 Bool_t bPassesInternalFlags = kTRUE;
3780
3781 // a) Cross-check min. and max. number of RPs:
dd96bd81 3782 if(-44 != fMinNoRPs)
3783 {
3784 fMinNoRPs <= anEvent->GetNumberOfRPs() ? 1 : bPassesInternalFlags = kFALSE;
3785 if(!bPassesInternalFlags){return bPassesInternalFlags;}
3786 }
3787 if(-44 != fMaxNoRPs)
3788 {
3789 anEvent->GetNumberOfRPs() < fMaxNoRPs ? 1 : bPassesInternalFlags = kFALSE;
3790 if(!bPassesInternalFlags){return bPassesInternalFlags;}
3791 }
7ecb5af4 3792
dd96bd81 3793 // b) Cross-check exact number of RPs:
3794 if(-44 != fExactNoRPs)
3795 {
3796 anEvent->GetNumberOfRPs() == fExactNoRPs ? 1 : bPassesInternalFlags = kFALSE;
3797 if(!bPassesInternalFlags){return bPassesInternalFlags;}
3798 }
7ecb5af4 3799
3800 return bPassesInternalFlags;
3801
3802} // Bool_t AliFlowAnalysisWithMultiparticleCorrelations::CrossCheckInternalFlags(AliFlowEventSimple *anEvent)
3803
3804//=======================================================================================================================
37d2f768 3805
68a8e667 3806void AliFlowAnalysisWithMultiparticleCorrelations::DumpPointsForDurham(TGraphErrors *ge)
3807{
3808 // Dump points from TGraphErrors object into Durham database format.
3809
3810 // Remark 1: format is <binCenter> <value> +-<stat.error>
3811 // Remark 2: the default precision is 6 significant digits
3812
3813 TString sMethodName = "AliFlowAnalysisWithMultiparticleCorrelations::DumpPointsForDurham(TGraphErrors *ge)";
3814
3815 if(!ge){Fatal(sMethodName.Data(),"ge is NULL, for one reason or another...");}
3816
3817 ge->Draw("ap");
3818
3819 Int_t nPoints = ge->GetN();
3820 Double_t x = 0.;
3821 //Double_t xErr = 0.;
3822 Double_t y = 0.;
3823 Double_t yErr = 0.;
3824 printf("\nbinCenter value +-stat.error\n");
3825 for(Int_t p=0;p<nPoints;p++)
3826 {
3827 ge->GetPoint(p,x,y);
3828 //xErr = ge->GetErrorX(p);
3829 yErr = ge->GetErrorY(p);
3830 printf("%f %f +-%f\n",x,y,yErr);
3831 } // end of for(Int_t p=0;p<nPoints;p++)
3832 cout<<endl;
3833
3834} // void AliFlowAnalysisWithMultiparticleCorrelations::DumpPointsForDurham(TGraphErrors *ge)
3835
3836//=======================================================================================================================
3837
3838void AliFlowAnalysisWithMultiparticleCorrelations::DumpPointsForDurham(TH1D *h)
3839{
3840 // Dump points from TH1D object into Durham database format.
3841
3842 // Remark 1: format is <binCenter> <value> +-<stat.error>
3843 // Remark 2: the default precision is 6 significant digits
3844
3845 TString sMethodName = "AliFlowAnalysisWithMultiparticleCorrelations::DumpPointsForDurham(TH1D *h)";
3846
3847 if(!h){Fatal(sMethodName.Data(),"h is NULL, for one reason or another...");}
3848
3849 h->Draw();
3850
3851 Int_t nPoints = h->GetXaxis()->GetNbins();
3852 Double_t x = 0.;
3853 Double_t y = 0.;
3854 Double_t yErr = 0.;
3855 printf("\nbinCenter value +-stat.error\n");
3856 for(Int_t p=1;p<=nPoints;p++)
3857 {
3858 x = h->GetBinCenter(p);
3859 y = h->GetBinContent(p);
3860 yErr = h->GetBinError(p);
dd96bd81 3861 //printf("%f %f +-%f\n",x,y,yErr);
68a8e667 3862 printf("%e %e +-%e\n",x,y,yErr);
3863 } // end of for(Int_t p=0;p<nPoints;p++)
3864 cout<<endl;
3865
3866} // void AliFlowAnalysisWithMultiparticleCorrelations::DumpPointsForDurham(TH1D *h)
3867
3868//=======================================================================================================================
3869
3870void AliFlowAnalysisWithMultiparticleCorrelations::DumpPointsForDurham(TH1F *h)
3871{
3872 // Dump points from TH1F object into Durham database format.
3873
3874 // Remark 1: format is <binCenter> <value> +-<stat.error>
3875 // Remark 2: the default precision is 6 significant digits
3876
3877 TString sMethodName = "AliFlowAnalysisWithMultiparticleCorrelations::DumpPointsForDurham(TH1F *h)";
3878
3879 if(!h){Fatal(sMethodName.Data(),"h is NULL, for one reason or another...");}
3880
3881 h->Draw();
3882
3883 Int_t nPoints = h->GetXaxis()->GetNbins();
3884 Double_t x = 0.;
3885 Double_t y = 0.;
3886 Double_t yErr = 0.;
3887 printf("\nbinCenter value +-stat.error\n");
3888 for(Int_t p=1;p<=nPoints;p++)
3889 {
3890 x = h->GetBinCenter(p);
3891 y = h->GetBinContent(p);
3892 yErr = h->GetBinError(p);
3893 printf("%f %f +-%f\n",x,y,yErr);
3894 } // end of for(Int_t p=0;p<nPoints;p++)
3895 cout<<endl;
3896
3897} // void AliFlowAnalysisWithMultiparticleCorrelations::DumpPointsForDurham(TH1F *h)
3898
3899//=======================================================================================================================
3900
3901void AliFlowAnalysisWithMultiparticleCorrelations::InitializeArraysForQcumulants()
3902{
3903 // Initialize all arrays for Q-cumulants.
3904
3905 // ... TBI
3906
3907} // void AliFlowAnalysisWithMultiparticleCorrelations::InitializeArraysForQcumulants()
3908
3909//=======================================================================================================================
3910
3911void AliFlowAnalysisWithMultiparticleCorrelations::BookEverythingForQcumulants()
3912{
3913 // Book all the stuff for Q-cumulants.
3914
3915 // a) Book the profile holding all the flags for Q-cumulants;
3916 // b) Book TH1D *fQcumulantsHist;
3917 // c) Book TH1D *fReferenceFlowHist;
3918 // d) Book TProfile2D *fProductsQCPro.
3919
3920 TString sMethodName = "void AliFlowAnalysisWithMultiparticleCorrelations::BookEverythingForQcumulants()";
3921
3922 // a) Book the profile holding all the flags for Q-cumulants:
3923 fQcumulantsFlagsPro = new TProfile("fQcumulantsFlagsPro","Flags for Q-cumulants",3,0,3);
3924 fQcumulantsFlagsPro->SetTickLength(-0.01,"Y");
3925 fQcumulantsFlagsPro->SetMarkerStyle(25);
3926 fQcumulantsFlagsPro->SetLabelSize(0.03);
3927 fQcumulantsFlagsPro->SetLabelOffset(0.02,"Y");
3928 fQcumulantsFlagsPro->SetStats(kFALSE);
3929 fQcumulantsFlagsPro->SetFillColor(kGray);
3930 fQcumulantsFlagsPro->SetLineColor(kBlack);
3931 fQcumulantsFlagsPro->GetXaxis()->SetBinLabel(1,"fCalculateQcumulants"); fQcumulantsFlagsPro->Fill(0.5,fCalculateQcumulants);
3932 fQcumulantsFlagsPro->GetXaxis()->SetBinLabel(2,"fHarmonicQC"); fQcumulantsFlagsPro->Fill(1.5,fHarmonicQC);
3933 fQcumulantsFlagsPro->GetXaxis()->SetBinLabel(3,"fPropagateErrorQC"); fQcumulantsFlagsPro->Fill(2.5,fPropagateErrorQC);
3934 fQcumulantsList->Add(fQcumulantsFlagsPro);
3935
3936 if(!fCalculateQcumulants){return;} // TBI is this safe enough?
3937
3938 // b) Book TH1D *fQcumulantsHist:
3939 fQcumulantsHist = new TH1D("Q-cumulants",Form("Q-cumulants (n = %d)",fHarmonicQC),4,0.,4.);
3940 fQcumulantsHist->SetStats(kFALSE);
3941 fQcumulantsHist->SetMarkerColor(kBlack);
3942 fQcumulantsHist->SetMarkerStyle(kFullSquare);
3943 fQcumulantsHist->GetXaxis()->SetLabelSize(0.045);
3944 fQcumulantsHist->GetXaxis()->SetLabelOffset(0.01);
3945 for(Int_t qc=1;qc<=4;qc++) // [QC{2},QC{4},QC{6},QC{8}]
3946 {
3947 fQcumulantsHist->GetXaxis()->SetBinLabel(qc,Form("QC{%d}",2*qc));
3948 }
3949 fQcumulantsList->Add(fQcumulantsHist);
3950
3951 // c) Book TH1D *fReferenceFlowHist:
3952 fReferenceFlowHist = new TH1D("Reference Flow","Reference flow from Q-cumulants",4,0.,4.);
3953 fReferenceFlowHist->SetStats(kFALSE);
3954 fReferenceFlowHist->SetMarkerColor(kBlack);
3955 fReferenceFlowHist->SetMarkerStyle(kFullSquare);
3956 fReferenceFlowHist->GetXaxis()->SetLabelSize(0.045);
3957 fReferenceFlowHist->GetXaxis()->SetLabelOffset(0.01);
3958 for(Int_t qc=1;qc<=4;qc++) // [vn{2},vn{4},vn{6},vn{8}]
3959 {
3960 fReferenceFlowHist->GetXaxis()->SetBinLabel(qc,Form("v_{%d}{%d}",fHarmonicQC,2*qc));
3961 }
3962 fQcumulantsList->Add(fReferenceFlowHist);
3963
3964 if(!fPropagateErrorQC){return;} // TBI is this safe enough?
3965
3966 // d) Book TProfile2D *fProductsQCPro:
3967 const Int_t nCorrelations = 4;
3968 Int_t n = fHarmonicQC;
3969 TString sCorrelations[nCorrelations] = {Form("Cos(-%d,%d)",n,n),
3970 Form("Cos(-%d,-%d,%d,%d)",n,n,n,n),
3971 Form("Cos(-%d,-%d,-%d,%d,%d,%d)",n,n,n,n,n,n),
3972 Form("Cos(-%d,-%d,-%d,-%d,%d,%d,%d,%d)",n,n,n,n,n,n,n,n)};
dd96bd81 3973 Int_t nBins2D = (Int_t)TMath::Floor(fDontGoBeyond/2.);
3974 if(fDontGoBeyond > 8){nBins2D = 4;}
3975 if(nBins2D < 1 || nBins2D > 4)
3976 {
3977 cout<<Form("nBins2D = %d",nBins2D)<<endl;
3978 cout<<Form("fDontGoBeyond = %d",fDontGoBeyond)<<endl;
3979 Fatal(sMethodName.Data(),"nBins2D < 1 || nBins2D > 4");
3980 }
68a8e667 3981 fProductsQCPro = new TProfile2D("fProductsQCPro","Products of correlations",nBins2D,0.,nBins2D,nBins2D,0.,nBins2D);
3982 fProductsQCPro->SetStats(kFALSE);
3983 fProductsQCPro->Sumw2();
3984 for(Int_t b=1;b<=nBins2D;b++)
3985 {
3986 fProductsQCPro->GetXaxis()->SetBinLabel(b,sCorrelations[b-1].Data());
3987 fProductsQCPro->GetYaxis()->SetBinLabel(b,sCorrelations[b-1].Data());
3988 } // for(Int_t b=1;b<=nBins2D;b++)
3989 fQcumulantsList->Add(fProductsQCPro);
3990
3991} // end of void AliFlowAnalysisWithMultiparticleCorrelations::BookEverythingForQcumulants()
3992
3993//=======================================================================================================================
3994
3995void AliFlowAnalysisWithMultiparticleCorrelations::CalculateQcumulants()
3996{
3997 // Calculate Q-cumulants.
3998
3999 TString sMethodName = "void AliFlowAnalysisWithMultiparticleCorrelations::CalculateQcumulants()";
4000
9fba36ea 4001 fPropagateError = kTRUE;
68a8e667 4002 Int_t n = fHarmonicQC;
4003 fQcumulantsHist->SetTitle(Form("Q-cumulants (n = %d)",n));
4004
4005 TString sCorrelations[4] = {Form("Cos(-%d,%d)",n,n),
4006 Form("Cos(-%d,-%d,%d,%d)",n,n,n,n),
4007 Form("Cos(-%d,-%d,-%d,%d,%d,%d)",n,n,n,n,n,n),
4008 Form("Cos(-%d,-%d,-%d,-%d,%d,%d,%d,%d)",n,n,n,n,n,n,n,n)};
4009
4010 Int_t nBins[4] = {fCorrelationsPro[0][1]->GetNbinsX(),fCorrelationsPro[0][3]->GetNbinsX(),
4011 fCorrelationsPro[0][5]->GetNbinsX(),fCorrelationsPro[0][7]->GetNbinsX()};
4012
4013 Double_t dCorrelation[4] = {0.};
4014 Double_t dCorrelationErr[4] = {0.};
4015
4016 for(Int_t c=0;c<4;c++) // [<<2>>,<<4>>,<<6>>,<<8>>]
4017 {
4018 if(2*(c+1)>fDontGoBeyond){break;}
4019 for(Int_t b=1;b<=nBins[c];b++)
4020 {
4021 if(sCorrelations[c].EqualTo(fCorrelationsPro[0][2*c+1]->GetXaxis()->GetBinLabel(b)))
4022 {
4023 dCorrelation[c] = fCorrelationsPro[0][2*c+1]->GetBinContent(b);
4024 dCorrelationErr[c] = fCorrelationsPro[0][2*c+1]->GetBinError(b);
4025 break;
4026 }
4027 } // for(Int_t b=1;b<=nBins[c];b++)
4028 } // for(Int_t c=0;c<4;c++) // [<<2>>,<<4>>,<<6>>,<<8>>]
4029
4030 // Correlations:
4031 Double_t two = dCorrelation[0]; // <<2>>
4032 Double_t four = dCorrelation[1]; // <<4>>
4033 Double_t six = dCorrelation[2]; // <<6>>
4034 Double_t eight = dCorrelation[3]; // <<8>>
4035
4036 // Q-cumulants:
4037 Double_t qc2 = 0.; // QC{2}
4038 Double_t qc4 = 0.; // QC{4}
4039 Double_t qc6 = 0.; // QC{6}
4040 Double_t qc8 = 0.; // QC{8}
4041 if(TMath::Abs(two) > 0. && !(fDontGoBeyond < 2)){qc2 = two;}
4042 if(TMath::Abs(four) > 0. && !(fDontGoBeyond < 4)){qc4 = four-2.*pow(two,2.);}
4043 if(TMath::Abs(six) > 0. && !(fDontGoBeyond < 6)){qc6 = six-9.*two*four+12.*pow(two,3.);}
4044 if(TMath::Abs(eight) > 0. && !(fDontGoBeyond < 8)){qc8 = eight-16.*two*six-18.*pow(four,2.)+144.*pow(two,2.)*four-144.*pow(two,4.);}
4045
4046 // Store the results for Q-cumulants:
4047 if(TMath::Abs(qc2)>0.)
4048 {
4049 fQcumulantsHist->SetBinContent(1,qc2);
4050 }
4051 if(TMath::Abs(qc4)>0.)
4052 {
4053 fQcumulantsHist->SetBinContent(2,qc4);
4054 }
4055 if(TMath::Abs(qc6)>0.)
4056 {
4057 fQcumulantsHist->SetBinContent(3,qc6);
4058 }
4059 if(TMath::Abs(qc8)>0.)
4060 {
4061 fQcumulantsHist->SetBinContent(4,qc8);
4062 }
4063
4064 if(!fPropagateErrorQC)
4065 {
4066 fQcumulantsHist->SetBinError(1,0.);
4067 fQcumulantsHist->SetBinError(2,0.);
4068 fQcumulantsHist->SetBinError(3,0.);
4069 fQcumulantsHist->SetBinError(4,0.);
4070 return;
4071 } // if(!fPropagateErrorQC)
4072
4073 // Statistical errors of average 2-, 4-, 6- and 8-particle azimuthal correlations:
4074 Double_t twoError = dCorrelationErr[0]; // statistical error of <2>
4075 Double_t fourError = dCorrelationErr[1]; // statistical error of <4>
4076 Double_t sixError = dCorrelationErr[2]; // statistical error of <6>
4077 Double_t eightError = dCorrelationErr[3]; // statistical error of <8>
4078
4079 // Covariances multiplied by a prefactor depending on weights:
4080 Double_t wCov24 = 0.; // Cov(<2>,<4>) * prefactor(w_<2>,w_<4>)
4081 Double_t wCov26 = 0.; // Cov(<2>,<6>) * prefactor(w_<2>,w_<6>)
4082 Double_t wCov28 = 0.; // Cov(<2>,<8>) * prefactor(w_<2>,w_<8>)
4083 Double_t wCov46 = 0.; // Cov(<4>,<6>) * prefactor(w_<4>,w_<6>)
4084 Double_t wCov48 = 0.; // Cov(<4>,<8>) * prefactor(w_<4>,w_<8>)
4085 Double_t wCov68 = 0.; // Cov(<6>,<8>) * prefactor(w_<6>,w_<8>)
4086 if(!(fDontGoBeyond < 4)){wCov24 = Covariance(sCorrelations[0].Data(),sCorrelations[1].Data(),fProductsQCPro);} // Cov(<2>,<4>) * prefactor(w_<2>,w_<4>)
4087 if(!(fDontGoBeyond < 6)){wCov26 = Covariance(sCorrelations[0].Data(),sCorrelations[2].Data(),fProductsQCPro);} // Cov(<2>,<6>) * prefactor(w_<2>,w_<6>)
4088 if(!(fDontGoBeyond < 8)){wCov28 = Covariance(sCorrelations[0].Data(),sCorrelations[3].Data(),fProductsQCPro);} // Cov(<2>,<8>) * prefactor(w_<2>,w_<8>)
4089 if(!(fDontGoBeyond < 6)){wCov46 = Covariance(sCorrelations[1].Data(),sCorrelations[2].Data(),fProductsQCPro);} // Cov(<4>,<6>) * prefactor(w_<4>,w_<6>)
4090 if(!(fDontGoBeyond < 8)){wCov48 = Covariance(sCorrelations[1].Data(),sCorrelations[3].Data(),fProductsQCPro);} // Cov(<4>,<8>) * prefactor(w_<4>,w_<8>)
4091 if(!(fDontGoBeyond < 8)){wCov68 = Covariance(sCorrelations[2].Data(),sCorrelations[3].Data(),fProductsQCPro);} // Cov(<6>,<8>) * prefactor(w_<6>,w_<8>)
4092
4093 // Statistical errors of Q-cumulants:
4094 Double_t qc2Error = 0.;
4095 Double_t qc4Error = 0.;
4096 Double_t qc6Error = 0.;
4097 Double_t qc8Error = 0.;
4098 // Squared statistical errors of Q-cumulants:
4099 //Double_t qc2ErrorSquared = 0.;
4100 Double_t qc4ErrorSquared = 0.;
4101 Double_t qc6ErrorSquared = 0.;
4102 Double_t qc8ErrorSquared = 0.;
4103 // Statistical error of QC{2}:
4104 if(!(fDontGoBeyond < 2)){qc2Error = twoError;}
4105 // Statistical error of QC{4}:
4106 qc4ErrorSquared = 16.*pow(two,2.)*pow(twoError,2)+pow(fourError,2.)
4107 - 8.*two*wCov24;
4108 if(qc4ErrorSquared > 0. && !(fDontGoBeyond < 4))
4109 {
4110 qc4Error = pow(qc4ErrorSquared,0.5);
9fba36ea 4111 } else{Warning(sMethodName.Data(),"Statistical error of QC{4} is imaginary !!!!"); fPropagateError = kFALSE;}
68a8e667 4112
4113 // Statistical error of QC{6}:
4114 qc6ErrorSquared = 81.*pow(4.*pow(two,2.)-four,2.)*pow(twoError,2.)
4115 + 81.*pow(two,2.)*pow(fourError,2.)
4116 + pow(sixError,2.)
4117 - 162.*two*(4.*pow(two,2.)-four)*wCov24
4118 + 18.*(4.*pow(two,2.)-four)*wCov26
4119 - 18.*two*wCov46;
4120 if(qc6ErrorSquared > 0. && !(fDontGoBeyond < 6))
4121 {
4122 qc6Error = pow(qc6ErrorSquared,0.5);
9fba36ea 4123 } else{Warning(sMethodName.Data(),"Statistical error of QC{6} is imaginary !!!!"); fPropagateError = kFALSE;}
68a8e667 4124
4125 // Statistical error of QC{8}:
4126 qc8ErrorSquared = 256.*pow(36.*pow(two,3.)-18.*four*two+six,2.)*pow(twoError,2.)
4127 + 1296.*pow(4.*pow(two,2.)-four,2.)*pow(fourError,2.)
4128 + 256.*pow(two,2.)*pow(sixError,2.)
4129 + pow(eightError,2.)
4130 - 1152.*(36.*pow(two,3.)-18.*four*two+six)*(4.*pow(two,2.)-four)*wCov24
4131 + 512.*two*(36.*pow(two,3.)-18.*four*two+six)*wCov26
4132 - 32.*(36.*pow(two,3.)-18.*four*two+six)*wCov28
4133 - 1152.*two*(4.*pow(two,2.)-four)*wCov46
4134 + 72.*(4.*pow(two,2.)-four)*wCov48
4135 - 32.*two*wCov68;
4136 if(qc8ErrorSquared > 0. && !(fDontGoBeyond < 8))
4137 {
4138 qc8Error = pow(qc8ErrorSquared,0.5);
9fba36ea 4139 } else{Warning(sMethodName.Data(),"Statistical error of QC{8} is imaginary !!!!"); fPropagateError = kFALSE;}
4140
4141 if(!fPropagateError){fPropagateError = kTRUE; return;}
68a8e667 4142
4143 // Store the statistical errors for Q-cumulants:
4144 if(TMath::Abs(qc2)>0.)
4145 {
4146 fQcumulantsHist->SetBinError(1,qc2Error);
4147 }
4148 if(TMath::Abs(qc4)>0.)
4149 {
4150 fQcumulantsHist->SetBinError(2,qc4Error);
4151 }
4152 if(TMath::Abs(qc6)>0.)
4153 {
4154 fQcumulantsHist->SetBinError(3,qc6Error);
4155 }
4156 if(TMath::Abs(qc8)>0.)
4157 {
4158 fQcumulantsHist->SetBinError(4,qc8Error);
4159 }
4160
4161} // void AliFlowAnalysisWithMultiparticleCorrelations::CalculateQcumulants()
4162
4163//=======================================================================================================================
4164
4165void AliFlowAnalysisWithMultiparticleCorrelations::CalculateReferenceFlow()
4166{
4167 // Calculate reference flow from Q-cumulants.
4168
4169 TString sMethodName = "void AliFlowAnalysisWithMultiparticleCorrelations::CalculateReferenceFlow()";
4170
4171 Int_t n = fHarmonicQC;
4172
4173 // Reference flow estimates:
4174 Double_t v2 = 0.; // v{2}
4175 Double_t v4 = 0.; // v{4}
4176 Double_t v6 = 0.; // v{6}
4177 Double_t v8 = 0.; // v{8}
4178
4179 // Reference flow's statistical errors:
4180 Double_t v2Error = 0.; // v{2} stat. error
4181 Double_t v4Error = 0.; // v{4} stat. error
4182 Double_t v6Error = 0.; // v{6} stat. error
4183 Double_t v8Error = 0.; // v{8} stat. error
4184
4185 // Q-cumulants:
4186 Double_t qc2 = fQcumulantsHist->GetBinContent(1); // QC{2}
4187 Double_t qc4 = fQcumulantsHist->GetBinContent(2); // QC{4}
4188 Double_t qc6 = fQcumulantsHist->GetBinContent(3); // QC{6}
4189 Double_t qc8 = fQcumulantsHist->GetBinContent(4); // QC{8}
4190
4191 // Q-cumulants's statistical errors:
4192 Double_t qc2Error = fQcumulantsHist->GetBinError(1); // QC{2} stat. error
4193 Double_t qc4Error = fQcumulantsHist->GetBinError(2); // QC{4} stat. error
4194 Double_t qc6Error = fQcumulantsHist->GetBinError(3); // QC{6} stat. error
4195 Double_t qc8Error = fQcumulantsHist->GetBinError(4); // QC{8} stat. error
4196
4197 // Calculate reference flow estimates from Q-cumulants:
4198 if(qc2>=0.){v2 = pow(qc2,0.5);}
4199 if(qc4<=0.){v4 = pow(-1.*qc4,1./4.);}
4200 if(qc6>=0.){v6 = pow((1./4.)*qc6,1./6.);}
4201 if(qc8<=0.){v8 = pow((-1./33.)*qc8,1./8.);}
4202
4203 // Calculate stat. error for reference flow estimates from stat. error of Q-cumulants:
4204 if(qc2>0. && qc2Error>0.){v2Error = (1./2.)*pow(qc2,-0.5)*qc2Error;}
4205 if(qc4<0. && qc4Error>0.){v4Error = (1./4.)*pow(-qc4,-3./4.)*qc4Error;}
4206 if(qc6>0. && qc6Error>0.){v6Error = (1./6.)*pow(2.,-1./3.)*pow(qc6,-5./6.)*qc6Error;}
4207 if(qc8<0. && qc8Error>0.){v8Error = (1./8.)*pow(33.,-1./8.)*pow(-qc8,-7./8.)*qc8Error;}
4208
4209 // Print warnings for the 'wrong sign' cumulants:
4210 if(TMath::Abs(v2)<1.e-44){Warning(sMethodName.Data(),"Wrong sign QC{2}, couldn't calculate v{2} !!!!");}
4211 if(TMath::Abs(v4)<1.e-44){Warning(sMethodName.Data(),"Wrong sign QC{4}, couldn't calculate v{4} !!!!");}
4212 if(TMath::Abs(v6)<1.e-44){Warning(sMethodName.Data(),"Wrong sign QC{6}, couldn't calculate v{6} !!!!");}
4213 if(TMath::Abs(v8)<1.e-44){Warning(sMethodName.Data(),"Wrong sign QC{8}, couldn't calculate v{8} !!!!");}
4214
4215 // Store the results and statistical errors of reference flow estimates:
4216 for(Int_t qc=1;qc<=4;qc++) // [vn{2},vn{4},vn{6},vn{8}]
4217 {
4218 fReferenceFlowHist->GetXaxis()->SetBinLabel(qc,Form("v_{%d}{%d}",n,2*qc));
4219 }
4220 fReferenceFlowHist->SetBinContent(1,v2);
4221 fReferenceFlowHist->SetBinError(1,v2Error);
4222 fReferenceFlowHist->SetBinContent(2,v4);
4223 fReferenceFlowHist->SetBinError(2,v4Error);
4224 fReferenceFlowHist->SetBinContent(3,v6);
4225 fReferenceFlowHist->SetBinError(3,v6Error);
4226 fReferenceFlowHist->SetBinContent(4,v8);
4227 fReferenceFlowHist->SetBinError(4,v8Error);
4228
4229 // Final printout:
4230 cout<<endl;
4231 cout<<"*************************************"<<endl;
4232 cout<<"*************************************"<<endl;
4233 cout<<" flow estimates from Q-cumulants"<<endl;
4234 TString sWhichWeights = "no weights";
4235 if(fUseWeights[0][0]){sWhichWeights = "phi weights";}
4236 else if(fUseWeights[0][1]){sWhichWeights = "pt weights";}
4237 else if(fUseWeights[0][2]){sWhichWeights = "eta weights";}
4238 cout<<Form(" (MPC class, RPs, %s)",sWhichWeights.Data())<<endl;
4239 cout<<endl;
4240 for(Int_t co=0;co<4;co++) // cumulant order
4241 {
4242 cout<<Form(" v_%d{%d} = %.8f +/- %.8f",fHarmonicQC,2*(co+1),fReferenceFlowHist->GetBinContent(co+1),fReferenceFlowHist->GetBinError(co+1))<<endl;
4243 }
4244 cout<<endl;
4245 Int_t nEvts = 0;
4246 Double_t dAvM = 0.;
4247 if(fMultDistributionsHist[0])
4248 {
4249 nEvts = (Int_t)fMultDistributionsHist[0]->GetEntries();
4250 dAvM = fMultDistributionsHist[0]->GetMean();
4251 } else{Warning(sMethodName.Data(),"fMultDistributionsHist[0] is NULL !!!!");}
4252 cout<<Form(" nEvts = %d, <M> = %.2f",nEvts,dAvM)<<endl;
4253 cout<<"*************************************"<<endl;
4254 cout<<"*************************************"<<endl;
4255 cout<<endl;
4256
4257} // void AliFlowAnalysisWithMultiparticleCorrelations::CalculateReferenceFlow()
4258
4259//=======================================================================================================================
4260
4261Double_t AliFlowAnalysisWithMultiparticleCorrelations::Covariance(const char *x, const char *y, TProfile2D *profile2D, Bool_t bUnbiasedEstimator)
4262{
4263 // Calculate covariance (multiplied by a weight dependent factor).
4264
4265 // Remark: wCov = Cov(<x>,<y>) * (sum_{i=1}^{N} w_{<x>}_i w_{<y>}_i )/[(sum_{i=1}^{N} w_{<x>}_i) * (sum_{j=1}^{N} w_{<y>}_j)],
4266 // where Cov(<x>,<y>) is biased or unbiased estimator (specified via bUnbiasedEstimator) for the covariance.
4267 // An unbiased estimator is given for instance in Eq. (C.12) on page 131 of my thesis.
4268
4269 Double_t wCov = 0.; // return value
4270
4271 TString sMethodName = "void AliFlowAnalysisWithMultiparticleCorrelations::Covariance(const char *x, const char *y, TProfile2D *profile2D, Bool_t bBiasedEstimator)";
4272 if(!profile2D){Fatal(sMethodName.Data(),"Sorry, 'profile2D' is on holidays.");}
4273
4274 // Basic protection:
4275 if(!(TString(x).BeginsWith("Cos") || TString(x).BeginsWith("Sin")))
4276 {
4277 cout<<Form("And the fatal x is... '%s'. Congratulations!!",x)<<endl;
4278 Fatal(sMethodName.Data(),"!(TString(x).BeginsWith(...");
4279 }
4280 if(!(TString(y).BeginsWith("Cos") || TString(y).BeginsWith("Sin")))
4281 {
4282 cout<<Form("And the fatal y is... '%s'. Congratulations!!",y)<<endl;
4283 Fatal(sMethodName.Data(),"!(TString(y).BeginsWith(...");
4284 }
4285
4286 // Determine 'cs' (cosine or sinus) indices for x and y:
4287 Int_t csx = 0; if(TString(x).BeginsWith("Sin")){csx = 1;}
4288 Int_t csy = 0; if(TString(y).BeginsWith("Sin")){csy = 1;}
4289
4290 // Determine 'c' (order of correlator) indices for x and y:
4291 Int_t cx = -1;
4292 for(Int_t t=0;t<=TString(x).Length();t++)
4293 {
4294 if(TString(x[t]).EqualTo(",") || TString(x[t]).EqualTo(")")) // TBI this is just ugly
4295 {
4296 cx++;
4297 if(cx>=8){Fatal(sMethodName.Data(),"cx>=8");} // not supporting corr. beyond 8p
4298 } // if(TString(x[t]).EqualTo(",") || TString(x[t]).EqualTo(")")) // TBI this is just ugly
4299 } // for(Int_t t=0;t<=TString(x).Length();t++)
4300 Int_t cy = -1;
4301 for(Int_t t=0;t<=TString(y).Length();t++)
4302 {
4303 if(TString(y[t]).EqualTo(",") || TString(y[t]).EqualTo(")")) // TBI this is just ugly
4304 {
4305 cy++;
4306 if(cy>=8){Fatal(sMethodName.Data(),"cy>=8");} // not supporting corr. beyond 8p
4307 } // if(TString(y[t]).EqualTo(",") || TString(y[t]).EqualTo(")")) // TBI this is just ugly
4308 } // for(Int_t t=0;t<=TString(y).Length();t++)
4309
4310 // Correlations corresponding to x and y:
4311 // x:
4312 Double_t dx = 0.; // <<x>>
4313 Double_t wx = 0.; // \sum w_x
4314 Int_t nbx = fCorrelationsPro[csx][cx]->GetNbinsX();
4315 for(Int_t b=1;b<=nbx;b++)
4316 {
4317 TString sBinLabel = fCorrelationsPro[csx][cx]->GetXaxis()->GetBinLabel(b);
4318 if(sBinLabel.EqualTo(x))
4319 {
4320 //cout<<Form("b = %d, binLabel = %s",b,sBinLabel.Data())<<endl;
4321 dx = fCorrelationsPro[csx][cx]->GetBinContent(b);
4322 wx = fCorrelationsPro[csx][cx]->GetBinEntries(b);
4323 break;
4324 } // if(sBinLabel.EqualTo(x))
4325 if(sBinLabel.EqualTo("")){break;}
4326 } // for(Int_t b=1;b<=nbx;b++)
9fba36ea 4327 if(TMath::Abs(dx)<1.e-44)
4328 {
4329 Warning(sMethodName.Data(),"TMath::Abs(dx)<1.e-44, %s",x);
4330 fPropagateError = kFALSE;
4331 return wCov;
4332 }
4333 if(TMath::Abs(wx)<1.e-44)
4334 {
4335 Warning(sMethodName.Data(),"TMath::Abs(wx)<1.e-44, %s",x);
4336 fPropagateError = kFALSE;
4337 return wCov;
4338 }
68a8e667 4339
4340 // y:
9fba36ea 4341 Double_t dy = 0.; // <<y>>
68a8e667 4342 Double_t wy = 0.; // \sum w_y
4343 Int_t nby = fCorrelationsPro[csy][cy]->GetNbinsX();
4344 for(Int_t b=1;b<=nby;b++)
4345 {
4346 TString sBinLabel = fCorrelationsPro[csy][cy]->GetXaxis()->GetBinLabel(b);
4347 if(sBinLabel.EqualTo(y))
4348 {
4349 //cout<<Form("b = %d, binLabel = %s",b,sBinLabel.Data())<<endl;
4350 dy = fCorrelationsPro[csy][cy]->GetBinContent(b);
4351 wy = fCorrelationsPro[csy][cy]->GetBinEntries(b);
4352 break;
4353 } // if(sBinLabel.EqualTo(y))
4354 if(sBinLabel.EqualTo("")){break;}
4355 } // for(Int_t b=1;b<=nby;b++)
9fba36ea 4356 if(TMath::Abs(dy)<1.e-44)
4357 {
4358 Warning(sMethodName.Data(),"TMath::Abs(dy)<1.e-44, %s",y);
4359 fPropagateError = kFALSE;
4360 return wCov;
4361 }
4362 if(TMath::Abs(wy)<1.e-44)
4363 {
4364 Warning(sMethodName.Data(),"TMath::Abs(wy)<1.e-44, %s",y);
4365 fPropagateError = kFALSE;
4366 return wCov;
4367 }
68a8e667 4368
4369 // Product:
4370 Double_t dxy = 0.; // <<xy>>
4371 Double_t wxy = 0.; // \sum w_x*w_y
4372 // x:
4373 Int_t nBinsX = profile2D->GetNbinsX();
4374 Int_t gbx = 0; // generic bin for x
4375 for(Int_t b=1;b<=nBinsX;b++)
4376 {
4377 TString sBinLabel = profile2D->GetXaxis()->GetBinLabel(b);
4378 if(sBinLabel.EqualTo(x))
4379 {
4380 gbx = b; break;
4381 }
4382 } // for(Int_t b=1;b<=nBins2D;b++)
4383 if(0==gbx){Fatal(sMethodName.Data(),"0==gbx, %s",x);}
4384 // y:
4385 Int_t nBinsY = profile2D->GetNbinsY();
4386 Int_t gby = 0; // generic bin for y
4387 for(Int_t b=1;b<=nBinsY;b++)
4388 {
4389 TString sBinLabel = profile2D->GetYaxis()->GetBinLabel(b);
4390 if(sBinLabel.EqualTo(y))
4391 {
4392 gby = b; break;
4393 }
4394 } // for(Int_t b=1;b<=nBinsY;b++)
4395 if(0==gby){Fatal(sMethodName.Data(),"0==gby, %s",y);}
4396
4397 if(gbx>gby)
4398 {
4399 dxy = profile2D->GetBinContent(profile2D->GetBin(gbx,gby));
4400 wxy = profile2D->GetBinEntries(profile2D->GetBin(gbx,gby));
4401 }
4402 else if(gbx<gby)
4403 {
4404 dxy = profile2D->GetBinContent(profile2D->GetBin(gby,gbx));
4405 wxy = profile2D->GetBinEntries(profile2D->GetBin(gby,gbx));
4406 } else{Fatal(sMethodName.Data(),"gbx==gby, %s, %s",x,y);}
9fba36ea 4407 if(TMath::Abs(dxy)<1.e-44)
4408 {
4409 Warning(sMethodName.Data(),"TMath::Abs(dxy)<1.e-44, %s, %s",x,y);
4410 fPropagateError = kFALSE;
4411 return wCov;
4412 }
4413 if(TMath::Abs(wxy)<1.e-44)
4414 {
4415 Warning(sMethodName.Data(),"TMath::Abs(wxy)<1.e-44, %s, %s",x,y);
4416 fPropagateError = kFALSE;
4417 return wCov;
4418 }
68a8e667 4419
4420 // Finally:
4421 if(bUnbiasedEstimator)
4422 {
4423 Double_t num = dxy-dx*dy; // numerator of Eq. (C.12) on page 131 of my thesis
4424 Double_t den = 1.-wxy/(wx*wy); // denominator of Eq. (C.12) on page 131 of my thesis
4425 Double_t pre = wxy/(wx*wy); // prefactor
9fba36ea 4426 if(TMath::Abs(den)<1.e-44)
4427 {
4428 Warning(sMethodName.Data(),"TMath::Abs(den)<1.e-44, %s, %s",x,y);
4429 fPropagateError = kFALSE;
4430 return wCov;
4431 }
68a8e667 4432 wCov = pre*num/den;
9fba36ea 4433 if(TMath::Abs(wCov)<1.e-44)
4434 {
4435 Warning(sMethodName.Data(),"TMath::Abs(wCov)<1.e-44, %s, %s",x,y);
4436 fPropagateError = kFALSE;
4437 return wCov;
4438 }
68a8e667 4439 } else
4440 {
4441 // TBI check if this is a correct formula for the biased estimator
4442 Double_t num = dxy-dx*dy; // numerator of Eq. (C.12) on page 131 of my thesis
4443 Double_t den = 1.;
4444 Double_t pre = wxy/(wx*wy); // prefactor
9fba36ea 4445 if(TMath::Abs(den)<1.e-44)
4446 {
4447 Warning(sMethodName.Data(),"TMath::Abs(den)<1.e-44, %s, %s",x,y);
4448 fPropagateError = kFALSE;
4449 return wCov;
4450 }
68a8e667 4451 wCov = pre*num/den;
9fba36ea 4452 if(TMath::Abs(wCov)<1.e-44)
4453 {
4454 Warning(sMethodName.Data(),"TMath::Abs(wCov)<1.e-44, %s, %s",x,y);
4455 fPropagateError = kFALSE;
4456 return wCov;
4457 }
68a8e667 4458 }
4459
4460 return wCov;
4461
03823be7 4462} // Double_t AliFlowAnalysisWithMultiparticleCorrelations::Covariance(const char *x, const char *y, TProfile2D *profile2D, Bool_t bUnbiasedEstimator = kFALSE)
68a8e667 4463
4464//=======================================================================================================================
4465
4466/*
4467TComplex AliFlowAnalysisWithMultiparticleCorrelations::Recursion(Int_t n, Int_t* harmonic, Int_t* mult)
4468{
4469 // Calculate multi-particle correlators by using recursion originally developed by
4470 // Kristjan Gulbrandsen (gulbrand@nbi.dk).
4471
4472 TComplex c = Q(harmonic[n-1], mult[n-1]);
4473 if (n == 1) return c;
4474 c *= Recursion(n-1, harmonic, mult);
4475 if (mult[n-1]>1) return c;
4476 for (Int_t i=0; i<(n-1); i++) {
4477 harmonic[i] += harmonic[n-1];
4478 mult[i]++;
4479 c -= (mult[i]-1.)*Recursion(n-1, harmonic, mult);
4480 mult[i]--;
4481 harmonic[i] -= harmonic[n-1];
4482 }
4483
4484 return c;
4485
4486} // TComplex AliFlowAnalysisWithMultiparticleCorrelations::Recursion(Int_t n, Int_t* harmonic, Int_t* mult)
4487*/
4488
4489//=======================================================================================================================
4490
4491TComplex AliFlowAnalysisWithMultiparticleCorrelations::Recursion(Int_t n, Int_t* harmonic, Int_t mult, Int_t skip)
4492{
4493 // Calculate multi-particle correlators by using recursion (an improved faster version) originally developed by
4494 // Kristjan Gulbrandsen (gulbrand@nbi.dk).
4495
4496 Int_t nm1 = n-1;
4497 TComplex c(Q(harmonic[nm1], mult));
4498 if (nm1 == 0) return c;
4499 c *= Recursion(nm1, harmonic);
4500 if (nm1 == skip) return c;
4501
4502 Int_t multp1 = mult+1;
4503 Int_t nm2 = n-2;
4504 Int_t counter1 = 0;
4505 Int_t hhold = harmonic[counter1];
4506 harmonic[counter1] = harmonic[nm2];
4507 harmonic[nm2] = hhold + harmonic[nm1];
4508 TComplex c2(Recursion(nm1, harmonic, multp1, nm2));
4509 Int_t counter2 = n-3;
4510 while (counter2 >= skip) {
4511 harmonic[nm2] = harmonic[counter1];
4512 harmonic[counter1] = hhold;
4513 ++counter1;
4514 hhold = harmonic[counter1];
4515 harmonic[counter1] = harmonic[nm2];
4516 harmonic[nm2] = hhold + harmonic[nm1];
4517 c2 += Recursion(nm1, harmonic, multp1, counter2);
4518 --counter2;
4519 }
4520 harmonic[nm2] = harmonic[counter1];
4521 harmonic[counter1] = hhold;
4522
4523 if (mult == 1) return c-c2;
4524 return c-Double_t(mult)*c2;
4525
4526} // TComplex AliFlowAnalysisWithMultiparticleCorrelations::Recursion(Int_t n, Int_t* harmonic, Int_t mult, Int_t skip)
4527
4528//=======================================================================================================================
4529
4530TComplex AliFlowAnalysisWithMultiparticleCorrelations::OneDiff(Int_t n1)
4531{
4532 // Generic differential one-particle correlation <exp[i(n1*psi1)]>.
4533 // (psi labels POI, phi labels RPs)
4534
4535 TComplex one = p(n1,1);
4536
4537 return one;
4538
4539} // TComplex AliFlowAnalysisWithMultiparticleCorrelations::OneDiff(Int_t n1)
4540
4541//=======================================================================================================================
4542
4543TComplex AliFlowAnalysisWithMultiparticleCorrelations::TwoDiff(Int_t n1, Int_t n2)
4544{
4545 // Generic differential two-particle correlation <exp[i(n1*psi1+n2*phi2)]>.
4546 // (psi labels POI, phi labels RPs)
4547
4548 TComplex two = p(n1,1)*Q(n2,1)-q(n1+n2,2);
4549
4550 return two;
4551
4552} // TComplex AliFlowAnalysisWithMultiparticleCorrelations::TwoDiff(Int_t n1, Int_t n2)
4553
4554//=======================================================================================================================
4555
4556TComplex AliFlowAnalysisWithMultiparticleCorrelations::ThreeDiff(Int_t n1, Int_t n2, Int_t n3)
4557{
4558 // Generic differential three-particle correlation <exp[i(n1*psi1+n2*phi2+n3*phi3)]>.
4559 // (psi labels POI, phi labels RPs)
4560
4561 TComplex three = p(n1,1)*Q(n2,1)*Q(n3,1)-q(n1+n2,2)*Q(n3,1)-q(n1+n3,2)*Q(n2,1)
4562 - p(n1,1)*Q(n2+n3,2)+2.*q(n1+n2+n3,3);
4563
4564 return three;
4565
4566} // TComplex AliFlowAnalysisWithMultiparticleCorrelations::ThreeDiff(Int_t n1, Int_t n2, Int_t n3)
4567
4568//=======================================================================================================================
4569
4570TComplex AliFlowAnalysisWithMultiparticleCorrelations::FourDiff(Int_t n1, Int_t n2, Int_t n3, Int_t n4)
4571{
4572 // Generic differential four-particle correlation <exp[i(n1*psi1+n2*phi2+n3*phi3+n4*phi4)]>.
4573 // (psi labels POI, phi labels RPs)
4574
4575 TComplex four = p(n1,1)*Q(n2,1)*Q(n3,1)*Q(n4,1)-q(n1+n2,2)*Q(n3,1)*Q(n4,1)-Q(n2,1)*q(n1+n3,2)*Q(n4,1)
4576 - p(n1,1)*Q(n2+n3,2)*Q(n4,1)+2.*q(n1+n2+n3,3)*Q(n4,1)-Q(n2,1)*Q(n3,1)*q(n1+n4,2)
4577 + Q(n2+n3,2)*q(n1+n4,2)-p(n1,1)*Q(n3,1)*Q(n2+n4,2)+q(n1+n3,2)*Q(n2+n4,2)
4578 + 2.*Q(n3,1)*q(n1+n2+n4,3)-p(n1,1)*Q(n2,1)*Q(n3+n4,2)+q(n1+n2,2)*Q(n3+n4,2)
4579 + 2.*Q(n2,1)*q(n1+n3+n4,3)+2.*p(n1,1)*Q(n2+n3+n4,3)-6.*q(n1+n2+n3+n4,4);
4580
4581 return four;
4582
4583} // TComplex AliFlowAnalysisWithMultiparticleCorrelations::FourDiff(Int_t n1, Int_t n2, Int_t n3, Int_t n4)
4584
4585//=======================================================================================================================
4586
4587void AliFlowAnalysisWithMultiparticleCorrelations::SetDiffHarmonics(Int_t order, Int_t *harmonics)
4588{
4589 // Set harmonics for all differential correlators.
4590
4591 TString sMethodName = "void AliFlowAnalysisWithMultiparticleCorrelations::SetDiffHarmonics(Int_t order, Int_t *harmonics)";
4592
4593 // Basic protection:
4594 if(order<=0||order>4){Fatal(sMethodName.Data(),"order<=0||order>4");}
4595 if(!harmonics){Fatal(sMethodName.Data(),"!harmonics");}
4596
4597 for(Int_t o=0;o<order;o++)
4598 {
4599 fDiffHarmonics[order-1][o] = harmonics[o];
4600 }
4601
4602 fCalculateDiffCorrelations = kTRUE;
4603
4604} // void AliFlowAnalysisWithMultiparticleCorrelations::SetDiffHarmonics(Int_t order, Int_t *harmonics)
4605
4606//=======================================================================================================================
4607
4608void AliFlowAnalysisWithMultiparticleCorrelations::SetWeightsHist(TH1D* const hist, const char *type, const char *variable)
4609{
4610 // Pass histogram holding weights from an external file to the corresponding data member.
4611
4612 TString sMethodName = "void AliFlowAnalysisWithMultiparticleCorrelations::SetWeightsHist(TH1D* const hist, const char *type, const char *variable)";
4613
4614 // Basic protection:
4615 if(!hist){Fatal(sMethodName.Data(),"hist");}
4616 if(!(TString(type).EqualTo("RP") || TString(type).EqualTo("POI"))){Fatal(sMethodName.Data(),"!(TString(type).EqualTo... type = %s ",type);}
4617 if(!(TString(variable).EqualTo("phi") || TString(variable).EqualTo("pt") || TString(variable).EqualTo("eta"))){Fatal(sMethodName.Data(),"!(TString(variable).EqualTo... variable = %s ",variable);}
4618
4619 Int_t rp = 0; // [RP,POI]
4620 if(TString(type).EqualTo("POI")){rp=1;}
4621
4622 Int_t ppe = 0; // [phi,pt,eta]
4623 if(TString(variable).EqualTo("pt")){ppe=1;}
4624 if(TString(variable).EqualTo("eta")){ppe=2;}
4625
4626 // Finally:
4627 hist->SetDirectory(0);
4628 fWeightsHist[rp][ppe] = (TH1D*)hist->Clone();
4629 if(!fWeightsHist[rp][ppe]){Fatal(sMethodName.Data(),"fWeightsHist[%d][%d]",rp,ppe);}
4630
4631 // Cosmetics:
4632 TString sType[2] = {"RP","POI"};
4633 TString sVariable[3] = {"phi","pt","eta"};
4634 fWeightsHist[rp][ppe]->SetName(Form("%s weights (%s)",sVariable[ppe].Data(),sType[rp].Data()));
791b0161 4635 //fWeightsHist[rp][ppe]->SetTitle(Form("%s weights (%s)",sVariable[ppe].Data(),sType[rp].Data()));
68a8e667 4636
4637 // Flag:
4638 fUseWeights[rp][ppe] = kTRUE;
4639
4640} // void AliFlowAnalysisWithMultiparticleCorrelations::SetWeightsHist(TH1D* const hwh, const char *type, const char *variable)
4641
4642//=======================================================================================================================
4643
4644void AliFlowAnalysisWithMultiparticleCorrelations::InitializeArraysForWeights()
4645{
4646 // Initialize all arrays for weights.
4647
4648 for(Int_t rp=0;rp<2;rp++) // [RP,POI]
4649 {
4650 for(Int_t ppe=0;ppe<3;ppe++) // [phi,pt,eta]
4651 {
4652 fUseWeights[rp][ppe] = kFALSE;
4653 fWeightsHist[rp][ppe] = NULL;
4654 }
4655 }
4656
4657} // void AliFlowAnalysisWithMultiparticleCorrelations::InitializeArraysForWeights()
4658
4659//=======================================================================================================================
4660
5a516e0a 4661void AliFlowAnalysisWithMultiparticleCorrelations::SetnBins(const char *type, const char *variable, Int_t nBins)
645e447d 4662{
4663 // Set number of bins for histograms fKinematicsHist[2][3].
4664
5a516e0a 4665 TString sMethodName = "void AliFlowAnalysisWithMultiparticleCorrelations::SetnBins(const char *type, const char *variable, Int_t nBins)";
645e447d 4666
4667 // Basic protection:
4668 if(!(TString(type).EqualTo("RP") || TString(type).EqualTo("POI")))
4669 {
4670 cout<<"Well, it would be better for you to use RP or POI here..."<<endl;
4671 Fatal(sMethodName.Data(),"!(TString(type).EqualTo... type = %s ",type);
4672 }
4673 if(!(TString(variable).EqualTo("phi") || TString(variable).EqualTo("pt") || TString(variable).EqualTo("eta")))
4674 {
4675 cout<<"phi, pt or eta, please!"<<endl;
4676 Fatal(sMethodName.Data(),"!(TString(variable).EqualTo... variable = %s ",variable);
4677 }
4678
4679 Int_t rp = 0; // [RP,POI]
4680 if(TString(type).EqualTo("POI")){rp=1;}
4681
4682 Int_t ppe = 0; // [phi,pt,eta]
4683 if(TString(variable).EqualTo("pt")){ppe=1;}
4684 if(TString(variable).EqualTo("eta")){ppe=2;}
4685
4686 fnBins[rp][ppe] = nBins;
4687
5a516e0a 4688} // void AliFlowAnalysisWithMultiparticleCorrelations::SetnBins(const char *type, const char *variable, Int_t nBins)
645e447d 4689
4690//=======================================================================================================================
4691
5a516e0a 4692void AliFlowAnalysisWithMultiparticleCorrelations::SetMin(const char *type, const char *variable, Double_t min)
645e447d 4693{
4694 // Set min bin range for histograms fKinematicsHist[2][3].
4695
5a516e0a 4696 TString sMethodName = "void AliFlowAnalysisWithMultiparticleCorrelations::SetMin(const char *type, const char *variable, Double_t min)";
645e447d 4697
4698 // Basic protection:
4699 if(!(TString(type).EqualTo("RP") || TString(type).EqualTo("POI")))
4700 {
4701 cout<<"Well, it would be better for you to use RP or POI here..."<<endl;
4702 Fatal(sMethodName.Data(),"!(TString(type).EqualTo... type = %s ",type);
4703 }
4704 if(!(TString(variable).EqualTo("phi") || TString(variable).EqualTo("pt") || TString(variable).EqualTo("eta")))
4705 {
4706 cout<<"phi, pt or eta, please!"<<endl;
4707 Fatal(sMethodName.Data(),"!(TString(variable).EqualTo... variable = %s ",variable);
4708 }
4709
4710 Int_t rp = 0; // [RP,POI]
4711 if(TString(type).EqualTo("POI")){rp=1;}
4712
4713 Int_t ppe = 0; // [phi,pt,eta]
4714 if(TString(variable).EqualTo("pt")){ppe=1;}
4715 if(TString(variable).EqualTo("eta")){ppe=2;}
4716
4717 fMin[rp][ppe] = min;
4718
5a516e0a 4719} // void AliFlowAnalysisWithMultiparticleCorrelations::SetMin(const char *type, const char *variable, Double_t min)
645e447d 4720
4721//=======================================================================================================================
4722
5a516e0a 4723void AliFlowAnalysisWithMultiparticleCorrelations::SetMax(const char *type, const char *variable, Double_t max)
645e447d 4724{
4725 // Set max bin range for histograms fKinematicsHist[2][3].
4726
5a516e0a 4727 TString sMethodName = "void AliFlowAnalysisWithMultiparticleCorrelations::SetMax(const char *type, const char *variable, Double_t max)";
645e447d 4728
4729 // Basic protection:
4730 if(!(TString(type).EqualTo("RP") || TString(type).EqualTo("POI")))
4731 {
4732 cout<<"Well, it would be better for you to use RP or POI here..."<<endl;
4733 Fatal(sMethodName.Data(),"!(TString(type).EqualTo... type = %s ",type);
4734 }
4735 if(!(TString(variable).EqualTo("phi") || TString(variable).EqualTo("pt") || TString(variable).EqualTo("eta")))
4736 {
4737 cout<<"phi, pt or eta, please!"<<endl;
4738 Fatal(sMethodName.Data(),"!(TString(variable).EqualTo... variable = %s ",variable);
4739 }
4740
4741 Int_t rp = 0; // [RP,POI]
4742 if(TString(type).EqualTo("POI")){rp=1;}
4743
4744 Int_t ppe = 0; // [phi,pt,eta]
4745 if(TString(variable).EqualTo("pt")){ppe=1;}
4746 if(TString(variable).EqualTo("eta")){ppe=2;}
4747
4748 fMax[rp][ppe] = max;
4749
5a516e0a 4750} // void AliFlowAnalysisWithMultiparticleCorrelations::SetMax(const char *type, const char *variable, Double_t min)
645e447d 4751
4752//=======================================================================================================================
4753
5a516e0a 4754void AliFlowAnalysisWithMultiparticleCorrelations::SetnBinsMult(const char *type, Int_t nBinsMult)
645e447d 4755{
4756 // Set number of bins for histograms fMultDistributionsHist[3].
4757
5a516e0a 4758 TString sMethodName = "void AliFlowAnalysisWithMultiparticleCorrelations::SetnBinsMult(const char *type, Int_t nBinsMult)";
645e447d 4759
4760 // Basic protection:
4761 if(!(TString(type).EqualTo("RP") || TString(type).EqualTo("POI") || TString(type).EqualTo("REF")))
4762 {
4763 cout<<"Well, it would be better for you to use RP, POI or REF here..."<<endl;
4764 Fatal(sMethodName.Data(),"!(TString(type).EqualTo... type = %s ",type);
4765 }
4766
4767 Int_t rpr = 0; // [RP,POI,REF]
4768 if(TString(type).EqualTo("POI")){rpr=1;}
4769 else if(TString(type).EqualTo("REF")){rpr=2;}
4770
4771 fnBinsMult[rpr] = nBinsMult;
4772
5a516e0a 4773} // void AliFlowAnalysisWithMultiparticleCorrelations::SetnBinsMult(const char *type, Int_t nBinsMult)
645e447d 4774
4775//=======================================================================================================================
4776
5a516e0a 4777void AliFlowAnalysisWithMultiparticleCorrelations::SetMinMult(const char *type, Double_t minMult)
645e447d 4778{
4779 // Set min bin range for histograms fMultDistributionsHist[3].
4780
5a516e0a 4781 TString sMethodName = "void AliFlowAnalysisWithMultiparticleCorrelations::SetMinMult(const char *type, Double_t minMult)";
645e447d 4782
4783 // Basic protection:
4784 if(!(TString(type).EqualTo("RP") || TString(type).EqualTo("POI") || TString(type).EqualTo("REF")))
4785 {
4786 cout<<"Well, it would be better for you to use RP, POI or REF here..."<<endl;
4787 Fatal(sMethodName.Data(),"!(TString(type).EqualTo... type = %s ",type);
4788 }
4789
4790 Int_t rpr = 0; // [RP,POI,REF]
4791 if(TString(type).EqualTo("POI")){rpr=1;}
4792 else if(TString(type).EqualTo("REF")){rpr=2;}
4793
4794 fMinMult[rpr] = minMult;
4795
5a516e0a 4796} // void AliFlowAnalysisWithMultiparticleCorrelations::SetMinMult(const char *type, Double_t minMult)
645e447d 4797
4798//=======================================================================================================================
4799
5a516e0a 4800void AliFlowAnalysisWithMultiparticleCorrelations::SetMaxMult(const char *type, Double_t maxMult)
645e447d 4801{
4802 // Set max bin range for histograms fMultDistributionsHist[3].
4803
5a516e0a 4804 TString sMethodName = "void AliFlowAnalysisWithMultiparticleCorrelations::SetMaxMult(const char *type, Double_t maxMult)";
645e447d 4805
4806 // Basic protection:
4807 if(!(TString(type).EqualTo("RP") || TString(type).EqualTo("POI") || TString(type).EqualTo("REF")))
4808 {
4809 cout<<"Well, it would be better for you to use RP, POI or REF here..."<<endl;
4810 Fatal(sMethodName.Data(),"!(TString(type).EqualTo... type = %s ",type);
4811 }
4812
4813 Int_t rpr = 0; // [RP,POI,REF]
4814 if(TString(type).EqualTo("POI")){rpr=1;}
4815 else if(TString(type).EqualTo("REF")){rpr=2;}
4816
4817 fMaxMult[rpr] = maxMult;
4818
5a516e0a 4819} // void AliFlowAnalysisWithMultiparticleCorrelations::SetMaxMult(const char *type, Double_t minMult)
645e447d 4820
4821//=======================================================================================================================
4822
4ffd61b4 4823void AliFlowAnalysisWithMultiparticleCorrelations::DumpThePoints(AliFlowEventSimple *anEvent)
4824{
4825 // Dump the points into the external file.
4826
4827 // Dumping format:
4828 // Event <eventNo> Multiplicity <multRP>
4829 // phi pt eta
4830
4831 TString sMethodName = "void AliFlowAnalysisWithMultiparticleCorrelations::DumpThePoints(AliFlowEventSimple *anEvent)";
4832
4833 // Basic protection:
4834 if(!anEvent){Fatal(sMethodName.Data(),"if(!anEvent)");}
4835 if(!fMultDistributionsHist[0]){Fatal(sMethodName.Data(),"if(!fMultDistributionsHist[0])");}
4836 if(fMaxNoEventsPerFile<=0){Fatal(sMethodName.Data(),"if(fMaxNoEventsPerFile<=0)");}
4837
4838 // Determine event number and multiplicity:
4839 Int_t eventNo = (Int_t) fMultDistributionsHist[0]->GetEntries(); // TBI this is a little bit shaky...
4840 Int_t multRP = (Int_t) anEvent->GetNumberOfRPs(); // TBI shall I promote this variable into data member?
4841
4842 // Determine external file name:
4843 Int_t fileCounter = (Int_t)((eventNo-1)/fMaxNoEventsPerFile);
4844 TString filename = Form("%s_%d.dat",fAnalysisTag.Data(),fileCounter);
4845
4846 // Open external file and dump:
4847 ofstream myfile;
4848 myfile.open(filename.Data(),ios::app);
4849 myfile << Form("Event %d Multiplicity %d\n",eventNo,multRP);
4850 Int_t nTracks = (Int_t) anEvent->NumberOfTracks();
4851 Double_t dPhi = 0., dPt = 0., dEta = 0.;
4852 for(Int_t t=0;t<nTracks;t++) // loop over all tracks
4853 {
4854 AliFlowTrackSimple *pTrack = anEvent->GetTrack(t);
4855 if(!pTrack){printf("\n AAAARGH: pTrack is NULL in MPC::DumpThePoints(AliFlowEventSimple *anEvent) !!!!"); continue;}
4856 if(pTrack->InRPSelection())
4857 {
4858 dPhi = pTrack->Phi();
4859 dPt = pTrack->Pt();
4860 dEta = pTrack->Eta();
4861 myfile<<Form("%f %f %f\n",dPhi,dPt,dEta);
4862 //cout<<Form("%f %f %f",dPhi,dPt,dEta)<<endl;
4863 }
4864 } // for(Int_t t=0;t<nTracks;t++) // loop over all tracks
4865 myfile<<"\n";
4866 myfile.close();
4867
4868} // void AliFlowAnalysisWithMultiparticleCorrelations::DumpThePoints(AliFlowEventSimple *anEvent)
4869
4870//=======================================================================================================================
4871
cf7fdeb1 4872TH1D *AliFlowAnalysisWithMultiparticleCorrelations::GetHistogramWithWeights(const char *filePath, const char *listName, const char *type, const char *variable, const char *production)
4ffd61b4 4873{
4874 // Access from external ROOT file the desired histogram with weights.
4875
4876 // a) Return value;
4877 // b) Method name;
4878 // c) Basic protection for arguments;
4879 // d) Check if the external ROOT file exists at specified path;
4880 // e) Access the external ROOT file and fetch the desired histogram with weights;
4881 // f) Close the external ROOT file.
4882
4883 // a) Return value:
4884 TH1D *hist = NULL;
4885
4886 // b) Method name:
cf7fdeb1 4887 TString sMethodName = "Double_t AliFlowAnalysisWithMultiparticleCorrelations::GetHistogramWithWeights(const char *filePath, const char *listName, const char *type, const char *variable, const char *production)";
4ffd61b4 4888
4889 // c) Basic protection for arguments:
4890 if(!(TString(type).EqualTo("RP") || TString(type).EqualTo("POI"))){Fatal(sMethodName.Data(),"!(TString(type).EqualTo...");}
4891 if(!(TString(variable).EqualTo("phi") || TString(variable).EqualTo("pt") || TString(variable).EqualTo("eta"))){Fatal(sMethodName.Data(),"!(TString(variable).EqualTo...");}
cf7fdeb1 4892 if(!(TString(production).EqualTo("data") || TString(production).BeginsWith("LHC"))){Fatal(sMethodName.Data(),"!(TString(production).EqualTo...");}
4ffd61b4 4893
4894 // d) Check if the external ROOT file exists at specified path:
4895 if(gSystem->AccessPathName(filePath,kFileExists))
4896 {
4897 Fatal(sMethodName.Data(),"if(gSystem->AccessPathName(filePath,kFileExists)), filePath = %s",filePath);
4898 }
4899
4900 // e) Access the external ROOT file and fetch the desired histogram with weights:
4901 TFile *weightsFile = TFile::Open(filePath,"READ");
4902 TList *weightsFileLOK = weightsFile->GetListOfKeys();
4903 if(!weightsFileLOK || weightsFileLOK->GetEntries() != 1) // TBI get rid of the 2nd condition at some point...
4904 {
4905 //printf("\n => if(!weightsFileLOK || weightsFileLOK->GetEntries() != 1)\n\n");
4906 Fatal(sMethodName.Data(),"if(!weightsFileLOK || weightsFileLOK->GetEntries() != 1)");
4907 }
4908 // Access TDirectoryFile "weightsMPCanalysis":
4909 TDirectoryFile *directoryFile = dynamic_cast<TDirectoryFile*>(weightsFile->Get("weightsMPCanalysis"));
4910 if(!directoryFile)
4911 {
4912 //printf("\n => if(!directoryFile)\n\n");
4913 Fatal(sMethodName.Data(),"if(!directoryFile)");
4914 }
4915 // Access the specified list:
4916 TList *list = dynamic_cast<TList*>(directoryFile->Get(listName));
4917 if(!list)
4918 {
791b0161 4919 cout<<Form("listName = %s",listName)<<endl;
4920 Warning(sMethodName.Data(),"if(!list)");
4921 return NULL;
4ffd61b4 4922 }
4923 // Finally, access the desired histogram:
cf7fdeb1 4924 hist = dynamic_cast<TH1D*>(list->FindObject(Form("%s,%s,%s",type,variable,production)));
4ffd61b4 4925 if(!hist)
4926 {
4927 //printf("\n => if(!hist)\n\n");
4928 Warning(sMethodName.Data(),"if(!hist)");
4929 return NULL;
4930 } else { hist->SetDirectory(0); }
4931
4932 // f) Close the external ROOT file:
4933 weightsFile->Close(); delete weightsFile;
4934
4935 return hist;
4936
cf7fdeb1 4937} // TH1D *AliFlowAnalysisWithMultiparticleCorrelations::GetHistogramWithWeights(const char *filePath, const char *listName, const char *type, const char *variable, const char *production)
4ffd61b4 4938
4939
4940
4941
4942
4943
4944
4945
4946
4947
4948
4949
4950
4951
4952
4953
4954
4955
68a8e667 4956
4957
4958
37d2f768 4959