]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWGCF/FLOW/macros/compareFlowResults.C
Merge branch 'feature-movesplit'
[u/mrichter/AliRoot.git] / PWGCF / FLOW / macros / compareFlowResults.C
CommitLineData
5c09ff70 1// Macro compareFlowResults.C is used to show a set of predefined plots with results
2// of flow analysis. It's usage is very simple: If you have output root file of flow
3// analysis <outputFileName> in directory <dir>, simply copy the macro in <dir> and
4// execute it. Remarks:
5// 1.) Make sure that the 'TString analysisType' bellow is the same as the one which
6// was used in the analysis which have produced the <outputFileName>;
7// 2.) Abbreviations used here are: RF = Reference Flow, RP = Reference Particles,
8// POI = Particles Of Interest;
9// 3.) To modify cosmetics of each plot change default settings in function which
10// have produced that plot. Example: If you want to modify marker colors in
11// the plot for reference flow, modify array Int_t methodMarkerColor[nMethods]
12// in the function PlotReferenceFlow().
13
14// Set name of the output file of flow analysis to be accessed:
15TString outputFileName = "AnalysisResults.root";
38584010 16//TString outputFileName = "outputCentrality4.root";
60694576 17
18// Set here which plots will be shown by default:
5c09ff70 19// Results:
60694576 20Bool_t plotReferenceFlow = kTRUE; // reference flow
21Bool_t plotIntFlowPOI = kTRUE; // integrated flow of POIs
22Bool_t plotDiffFlowPtPOI = kTRUE; // differential flow v(pt) for POIs
23Bool_t plotDiffFlowEtaPOI = kTRUE; // differential flow v(eta) for POIs
24Bool_t plotIntFlowRP = kTRUE; // integrated flow of RPs
25Bool_t plotDiffFlowPtRP = kTRUE; // differential flow v(pt) for RPs
26Bool_t plotDiffFlowEtaRP = kTRUE; // differential flow v(eta) for RPs
5c09ff70 27// Results relative to MC:
cacbf284 28Bool_t plotReferenceFlowRelativeToMC = kTRUE; // plot (v{MC}-v{method})/v{MC} for reference flow
29Bool_t plotIntFlowRelativeToMCPOI = kTRUE; // plot (v{MC}-v{method})/v{MC} for integrated flow of POIs
30Bool_t plotDiffFlowPtRelativeToMCPOI = kTRUE; // plot (v{MC}-v{method})/v{MC} as a function of pt for POIs
31Bool_t plotDiffFlowEtaRelativeToMCPOI = kTRUE; // plot (v{MC}-v{method})/v{MC} as a function of eta for POIs
32Bool_t plotIntFlowRelativeToMCRP = kTRUE; // plot (v{MC}-v{method})/v{MC} for integrated flow of RPs
33Bool_t plotDiffFlowPtRelativeToMCRP = kTRUE; // plot (v{MC}-v{method})/v{MC} as a function of pt for RPs
34Bool_t plotDiffFlowEtaRelativeToMCRP = kTRUE; // plot (v{MC}-v{method})/v{MC} as a function of eta for RPs
60694576 35// Set here if the legends will be shown on the plots:
36Bool_t showLegend = kTRUE;
37Bool_t showLegendDiffFlow = kTRUE;
38// Some quick settings:
39Bool_t showOnlyReferenceFlow = kFALSE;
21116a0c 40Bool_t showResultsRelativeToMC = kFALSE;
60694576 41Bool_t showOnlyPlotsForPOIs = kFALSE;
42Bool_t showOnlyPlotsForRPs = kFALSE;
21116a0c 43// Set here if you want to rebin pt bins to reduce the statistical errors in the plots for differential flow vs pt:
44Bool_t rebinInPt = kTRUE;
45const Int_t nPtIntervals = 3;
46Double_t ptInterval[nPtIntervals+1] = {0.,2.,5.,10.}; // in GeV
38584010 47Int_t nMergedBins[nPtIntervals] = {1,2,5}; // for instance in 2nd pt interval (2-5 GeV) 5 pt bins will be merged into 1
48// Set here if you want to use default values for harmonic, pt and eta binning:
49Bool_t useDefaultValues = kTRUE;
50TString methodForSettings = "QC"; // alternatively set here method from whose output files harmonic, pt and eta binning will be accessed
5c09ff70 51// Set here if you want to show error mesh:
52Bool_t showErrorMesh = kTRUE;
53Bool_t showErrorMeshDiffFlow = kTRUE;
54// Set here if both the error mesh and markers will be shown for specified method in the plots for differential flow:
55Bool_t showBothErrorMeshAndMarkers = kFALSE;
60694576 56
5c09ff70 57// Do not touch this unless you are looking for a trouble:
60694576 58const Int_t nMethods = 12;
59TString method[nMethods] = {"MCEP","SP","GFC","QC","FQD","LYZ1SUM","LYZ1PROD","LYZ2SUM","LYZ2PROD","LYZEP","MH","NL"};
60TList *list[nMethods] = {NULL}; // lists holding histograms for each flow analysis method
61
62enum libModes{mLocal,mLocalSource};
63
5c09ff70 64//void compareFlowResults(TString analysisType="",Int_t analysisMode=mLocalSource)
65void compareFlowResults(TString analysisType="ESD",Int_t analysisMode=mLocal)
60694576 66{
5c09ff70 67 // 1. analysisType: "ESD", "AOD", "MC", "ESDMCkineESD", "ESDMCkineMC", "MK", for analysis 'on the fly' use simply "";
60694576 68 // 2. analysisMode: if analysisMode = mLocal -> analyze data on your computer using aliroot
69 // if analysisMode = mLocalSource -> analyze data on your computer using root + source files
70
71 // Load needed libraries:
72 LoadLibrariesCFR(analysisMode);
73
74 // Access common output file:
5c09ff70 75 TFile *outputFile = AccessOutputFile(outputFileName);
60694576 76
77 // Access from common output file the TDirectoryFile's for each flow analysis method
78 // and from them the lists holding histograms with final results:
79 GetListsWithHistograms(outputFile,analysisType);
80
81 // Global settings which will affect all plots:
82 GlobalSettings();
5c09ff70 83
60694576 84 // Calling the functions to produce the final plots:
85 if(plotReferenceFlow) PlotReferenceFlow();
86 if(!showOnlyReferenceFlow)
87 {
88 if(!showOnlyPlotsForRPs)
dec3fab6 89 {
60694576 90 if(plotIntFlowPOI) PlotIntFlowPOI();
91 if(plotDiffFlowPtPOI) PlotDiffFlowPtPOI();
92 if(plotDiffFlowEtaPOI) PlotDiffFlowEtaPOI();
9d3cbee7 93 }
60694576 94 if(!showOnlyPlotsForPOIs)
95 {
96 if(plotIntFlowRP) PlotIntFlowRP();
97 if(plotDiffFlowPtRP) PlotDiffFlowPtRP();
98 if(plotDiffFlowEtaRP) PlotDiffFlowEtaRP();
9d3cbee7 99 }
60694576 100 if(showResultsRelativeToMC)
077816b6 101 {
60694576 102 if(plotReferenceFlowRelativeToMC) PlotReferenceFlowRelativeToMC();
103 if(!showOnlyPlotsForRPs)
077816b6 104 {
60694576 105 if(plotIntFlowRelativeToMCPOI) PlotIntFlowRelativeToMCPOI();
106 if(plotDiffFlowPtRelativeToMCPOI) PlotDiffFlowPtRelativeToMCPOI();
107 if(plotDiffFlowEtaRelativeToMCPOI) PlotDiffFlowEtaRelativeToMCPOI();
077816b6 108 }
60694576 109 if(!showOnlyPlotsForPOIs)
077816b6 110 {
60694576 111 if(plotIntFlowRelativeToMCRP) PlotIntFlowRelativeToMCRP();
112 if(plotDiffFlowPtRelativeToMCRP) PlotDiffFlowPtRelativeToMCRP();
113 if(plotDiffFlowEtaRelativeToMCRP) PlotDiffFlowEtaRelativeToMCRP();
077816b6 114 }
905bed86 115 }
1fca9c90 116 }
1fca9c90 117
60694576 118} // end of void newCompare(TString analysisType="",Int_t analysisMode=mLocal)
119
120// ===========================================================================================
121
122void PlotReferenceFlow()
123{
124 // Make a plot which compares the results for reference flow.
125
126 // Settings for methods:
127 const Int_t nMethods = 13;
128 TString method[nMethods] = {"MCEP","SP","2,GFC","2,QC","4,GFC","4,QC","6,GFC","6,QC","8,GFC","8,QC","FQD","LYZ1SUM","LYZ1PROD"};
129 Int_t methodMarkerStyle[nMethods] = {21,21,21,21,21,21,21,21,21,21,21,21,21}; // see available marker styles in TAttMarker
130 Int_t methodMarkerColor[nMethods] = {kBlack,kBlack,kBlack,kBlack,kBlack,kBlack,kBlack,kBlack,kBlack,kBlack,kBlack,kBlack,kBlack};
131 // Settings for error mesh:
132 TString methodUsedToMakeErrorMesh = "MCEP";
133 Int_t meshStyle = 1001;
134 Int_t meshColor = kGray;
1fca9c90 135
60694576 136 Plot(nMethods,method,methodMarkerStyle,methodMarkerColor,
137 methodUsedToMakeErrorMesh,meshStyle,meshColor,"RF");
138
139} // end of void PlotReferenceFlow()
140
141// ===========================================================================================
142
143void PlotIntFlowPOI()
144{
145 // Make a plot which compares the results for reference flow.
146
147 // Settings for methods:
148 const Int_t nMethods = 10;
149 TString method[nMethods] = {"MCEP","SP","2,GFC","2,QC","4,GFC","4,QC","6,GFC","8,GFC","LYZ2SUM","LYZ2PROD"};
150 Int_t methodMarkerStyle[nMethods] = {21,21,21,21,21,21,21,21,21,21}; // see available marker styles in TAttMarker
151 Int_t methodMarkerColor[nMethods] = {kRed-3,kRed-3,kRed-3,kRed-3,kRed-3,kRed-3,kRed-3,kRed-3,kRed-3,kRed-3};
152 // Settings for error mesh:
153 TString methodUsedToMakeErrorMesh = "MCEP";
154 Int_t meshStyle = 1001;
155 Int_t meshColor = kRed-10;
1fca9c90 156
60694576 157 Plot(nMethods,method,methodMarkerStyle,methodMarkerColor,
158 methodUsedToMakeErrorMesh,meshStyle,meshColor,"POI");
159
160} // end of void PlotIntFlowPOI()
161
162// ===========================================================================================
163
164void PlotIntFlowRP()
165{
166 // Make a plot which compares the results for reference flow.
167
168 // Settings for methods:
169 const Int_t nMethods = 10;
170 TString method[nMethods] = {"MCEP","SP","2,GFC","2,QC","4,GFC","4,QC","6,GFC","8,GFC","LYZ2SUM","LYZ2PROD"};
171 Int_t methodMarkerStyle[nMethods] = {21,21,21,21,21,21,21,21,21,21}; // see available marker styles in TAttMarker
172 Int_t methodMarkerColor[nMethods] = {kBlue-3,kBlue-3,kBlue-3,kBlue-3,kBlue-3,kBlue-3,kBlue-3,kBlue-3,kBlue-3,kBlue-3};
173 // Settings for error mesh:
174 TString methodUsedToMakeErrorMesh = "MCEP";
175 Int_t meshStyle = 1001;
176 Int_t meshColor = kBlue-10;
177
178 Plot(nMethods,method,methodMarkerStyle,methodMarkerColor,
179 methodUsedToMakeErrorMesh,meshStyle,meshColor,"RP");
180
181} // end of void PlotIntFlowRP()
182
183// ===========================================================================================
184
185void PlotDiffFlowPtPOI()
186{
187 // Make a plot which compares the results for differential flow of POIs vs pt.
188
189 // Settings for methods:
190 const Int_t nMethods = 10;
191 TString method[nMethods] = {"MCEP","SP","2,GFC","2,QC","4,GFC","4,QC","6,GFC","8,GFC","LYZ2SUM","LYZ2PROD"};
192 Int_t methodMarkerStyle[nMethods] = {20,3,21,21,20,20,25,24,22,22}; // see available marker styles in TAttMarker
193 Int_t methodMarkerColor[nMethods] = {kRed,kViolet-6,kAzure-7,kOrange-7,kAzure+3,kOrange+3,kAzure-7,kAzure+3,kYellow+3,kGreen+3};
194 // Settings for error mesh:
195 TString methodUsedToMakeErrorMesh = "MCEP";
196 Int_t meshStyle = 1001;
197 Int_t meshColor = kRed-10;
198
199 PlotDiffFlow(nMethods,method,methodMarkerStyle,methodMarkerColor,
200 methodUsedToMakeErrorMesh,meshStyle,meshColor,"Pt","POI");
201
202} // end of void PlotDiffFlowPtPOI()
203
204// ===========================================================================================
205
206void PlotDiffFlowEtaPOI()
207{
208 // Make a plot which compares the results for differential flow of POIs vs eta.
209
210 // Settings for methods:
211 const Int_t nMethods = 10;
212 TString method[nMethods] = {"MCEP","SP","2,GFC","2,QC","4,GFC","4,QC","6,GFC","8,GFC","LYZ2SUM","LYZ2PROD"};
213 Int_t methodMarkerStyle[nMethods] = {20,3,21,21,20,20,25,24,22,22}; // see available marker styles in TAttMarker
214 Int_t methodMarkerColor[nMethods] = {kRed,kViolet-6,kAzure-7,kOrange-7,kAzure+3,kOrange+3,kAzure-7,kAzure+3,kYellow+3,kGreen+3};
215 // Settings for error mesh:
216 TString methodUsedToMakeErrorMesh = "MCEP";
217 Int_t meshStyle = 1001;
218 Int_t meshColor = kRed-10;
219
220 PlotDiffFlow(nMethods,method,methodMarkerStyle,methodMarkerColor,
221 methodUsedToMakeErrorMesh,meshStyle,meshColor,"Eta","POI");
222
223} // end of void PlotDiffFlowEtaPOI()
224
225// ===========================================================================================
226
227void PlotDiffFlowPtRP()
228{
229 // Make a plot which compares the results for differential flow of RPs vs pt.
21116a0c 230
60694576 231 // Settings for methods:
232 const Int_t nMethods = 10;
233 TString method[nMethods] = {"MCEP","SP","2,GFC","2,QC","4,GFC","4,QC","6,GFC","8,GFC","LYZ2SUM","LYZ2PROD"};
234 Int_t methodMarkerStyle[nMethods] = {20,3,21,21,20,20,25,24,22,22}; // see available marker styles in TAttMarker
cacbf284 235 Int_t methodMarkerColor[nMethods] = {kBlue,kViolet-6,kAzure-7,kOrange-7,kAzure+3,kOrange+3,kAzure-7,kAzure+3,kYellow+3,kGreen+3};
60694576 236 // Settings for error mesh:
237 TString methodUsedToMakeErrorMesh = "MCEP";
238 Int_t meshStyle = 1001;
239 Int_t meshColor = kBlue-10;
240
241 PlotDiffFlow(nMethods,method,methodMarkerStyle,methodMarkerColor,
242 methodUsedToMakeErrorMesh,meshStyle,meshColor,"Pt","RP");
243
244} // end of void PlotDiffFlowPtRP()
245
246// ===========================================================================================
247
248void PlotDiffFlowEtaRP()
249{
250 // Make a plot which compares the results for differential flow of RPs vs eta.
251
252 // Settings for methods:
253 const Int_t nMethods = 10;
254 TString method[nMethods] = {"MCEP","SP","2,GFC","2,QC","4,GFC","4,QC","6,GFC","8,GFC","LYZ2SUM","LYZ2PROD"};
255 Int_t methodMarkerStyle[nMethods] = {20,3,21,21,20,20,25,24,22,22}; // see available marker styles in TAttMarker
cacbf284 256 Int_t methodMarkerColor[nMethods] = {kBlue,kViolet-6,kAzure-7,kOrange-7,kAzure+3,kOrange+3,kAzure-7,kAzure+3,kYellow+3,kGreen+3};
60694576 257 // Settings for error mesh:
258 TString methodUsedToMakeErrorMesh = "MCEP";
259 Int_t meshStyle = 1001;
260 Int_t meshColor = kBlue-10;
261
262 PlotDiffFlow(nMethods,method,methodMarkerStyle,methodMarkerColor,
263 methodUsedToMakeErrorMesh,meshStyle,meshColor,"Eta","RP");
264
265} // end of void PlotDiffFlowEtaRP()
266
267// ===========================================================================================
268
269void PlotReferenceFlowRelativeToMC()
270{
cacbf284 271 // Make a plot (v{MC}-v{method})/v{MC} for reference flow.
60694576 272
273 // Settings for methods:
274 const Int_t nMethods = 12;
275 TString method[nMethods] = {"SP","2,GFC","2,QC","4,GFC","4,QC","6,GFC","6,QC","8,GFC","8,QC","FQD","LYZ1SUM","LYZ1PROD"};
276 Int_t methodMarkerStyle[nMethods] = {21,21,21,21,21,21,21,21,21,21,21,21}; // see available marker styles in TAttMarker
277 Int_t methodMarkerColor[nMethods] = {kBlack,kBlack,kBlack,kBlack,kBlack,kBlack,kBlack,kBlack,kBlack,kBlack,kBlack,kBlack};
da24213b 278
60694576 279 PlotRelativeToMC(nMethods,method,methodMarkerStyle,methodMarkerColor,"RF");
a88e5ac2 280
60694576 281} // end of void PlotReferenceFlowRelativeToMC()
077816b6 282
60694576 283// ===========================================================================================
1fca9c90 284
60694576 285void PlotIntFlowRelativeToMCPOI()
286{
cacbf284 287 // Make a plot (v{MC}-v{method})/v{MC} for integrated flow of POIs.
e83922f2 288
60694576 289 // Settings for methods:
290 const Int_t nMethods = 9;
291 TString method[nMethods] = {"SP","2,GFC","2,QC","4,GFC","4,QC","6,GFC","8,GFC","LYZ2SUM","LYZ2PROD"};
292 Int_t methodMarkerStyle[nMethods] = {21,21,21,21,21,21,21,21,21}; // see available marker styles in TAttMarker
293 Int_t methodMarkerColor[nMethods] = {kRed-3,kRed-3,kRed-3,kRed-3,kRed-3,kRed-3,kRed-3,kRed-3,kRed-3};
251b57f2 294
60694576 295 PlotRelativeToMC(nMethods,method,methodMarkerStyle,methodMarkerColor,"POI");
077816b6 296
60694576 297} // end of void PlotIntFlowRelativeToMCPOI()
298
299// ===========================================================================================
300
301void PlotIntFlowRelativeToMCRP()
302{
cacbf284 303 // Make a plot (v{MC}-v{method})/v{MC} for integrated flow of RPs.
694e0378 304
60694576 305 // Settings for methods:
306 const Int_t nMethods = 9;
307 TString method[nMethods] = {"SP","2,GFC","2,QC","4,GFC","4,QC","6,GFC","8,GFC","LYZ2SUM","LYZ2PROD"};
308 Int_t methodMarkerStyle[nMethods] = {21,21,21,21,21,21,21,21,21}; // see available marker styles in TAttMarker
309 Int_t methodMarkerColor[nMethods] = {kBlue-3,kBlue-3,kBlue-3,kBlue-3,kBlue-3,kBlue-3,kBlue-3,kBlue-3,kBlue-3};
e83922f2 310
60694576 311 PlotRelativeToMC(nMethods,method,methodMarkerStyle,methodMarkerColor,"RP");
312
313} // end of void PlotIntFlowRelativeToMCRP()
314
315// ===========================================================================================
316
317void PlotDiffFlowPtRelativeToMCPOI()
318{
cacbf284 319 // Make a plot (v{MC}-v{method})/v{MC} for differential flow of POIs vs pt.
60694576 320
321 // Settings for methods:
322 const Int_t nMethods = 9;
323 TString method[nMethods] = {"SP","2,GFC","2,QC","4,GFC","4,QC","6,GFC","8,GFC","LYZ2SUM","LYZ2PROD"};
324 Int_t methodMarkerStyle[nMethods] = {3,21,21,20,20,25,24,22,22}; // see available marker styles in TAttMarker
325 Int_t methodMarkerColor[nMethods] = {kViolet-6,kAzure-7,kOrange-7,kAzure+3,kOrange+3,kAzure-7,kAzure+3,kYellow+3,kGreen+3};
1fca9c90 326
60694576 327 PlotDiffFlowRelativeToMC(nMethods,method,methodMarkerStyle,methodMarkerColor,"Pt","POI");
328
329} // end of void PlotDiffFlowPtRelativeToMCPOI()
330
331// ===========================================================================================
251b57f2 332
60694576 333void PlotDiffFlowEtaRelativeToMCPOI()
334{
cacbf284 335 // Make a plot (v{MC}-v{method})/v{MC} for differential flow of POIs vs eta.
1fca9c90 336
60694576 337 // Settings for methods:
338 const Int_t nMethods = 9;
339 TString method[nMethods] = {"SP","2,GFC","2,QC","4,GFC","4,QC","6,GFC","8,GFC","LYZ2SUM","LYZ2PROD"};
340 Int_t methodMarkerStyle[nMethods] = {3,21,21,20,20,25,24,22,22}; // see available marker styles in TAttMarker
341 Int_t methodMarkerColor[nMethods] = {kViolet-6,kAzure-7,kOrange-7,kAzure+3,kOrange+3,kAzure-7,kAzure+3,kYellow+3,kGreen+3};
077816b6 342
60694576 343 PlotDiffFlowRelativeToMC(nMethods,method,methodMarkerStyle,methodMarkerColor,"Eta","POI");
344
345} // end of void PlotDiffFlowEtaRelativeToMCPOI()
346
347// ===========================================================================================
077816b6 348
60694576 349void PlotDiffFlowPtRelativeToMCRP()
350{
cacbf284 351 // Make a plot (v{MC}-v{method})/v{MC} for differential flow of RPs vs pt.
077816b6 352
60694576 353 // Settings for methods:
354 const Int_t nMethods = 9;
355 TString method[nMethods] = {"SP","2,GFC","2,QC","4,GFC","4,QC","6,GFC","8,GFC","LYZ2SUM","LYZ2PROD"};
356 Int_t methodMarkerStyle[nMethods] = {3,21,21,20,20,25,24,22,22}; // see available marker styles in TAttMarker
357 Int_t methodMarkerColor[nMethods] = {kViolet-6,kAzure-7,kOrange-7,kAzure+3,kOrange+3,kAzure-7,kAzure+3,kYellow+3,kGreen+3};
077816b6 358
60694576 359 PlotDiffFlowRelativeToMC(nMethods,method,methodMarkerStyle,methodMarkerColor,"Pt","RP");
360
361} // end of void PlotDiffFlowPtRelativeToMCRP()
362
363// ===========================================================================================
364
365void PlotDiffFlowEtaRelativeToMCRP()
366{
cacbf284 367 // Make a plot (v{MC}-v{method})/v{MC} for differential flow of RPs vs eta.
60694576 368
369 // Settings for methods:
370 const Int_t nMethods = 9;
371 TString method[nMethods] = {"SP","2,GFC","2,QC","4,GFC","4,QC","6,GFC","8,GFC","LYZ2SUM","LYZ2PROD"};
372 Int_t methodMarkerStyle[nMethods] = {3,21,21,20,20,25,24,22,22}; // see available marker styles in TAttMarker
373 Int_t methodMarkerColor[nMethods] = {kViolet-6,kAzure-7,kOrange-7,kAzure+3,kOrange+3,kAzure-7,kAzure+3,kYellow+3,kGreen+3};
077816b6 374
60694576 375 PlotDiffFlowRelativeToMC(nMethods,method,methodMarkerStyle,methodMarkerColor,"Eta","RP");
376
377} // end of void PlotDiffFlowPtRelativeToMCRP()
378
379// ===========================================================================================
380
381TGraph* GetErrorMesh(Int_t nPts, Double_t result, Double_t error, Int_t meshStyle, Int_t meshColor)
382{
383 // Make an error mesh from the specified method.
077816b6 384
60694576 385 TGraph *g = new TGraph(nPts);
386 g->SetPoint(1,0,result+error);
387 g->SetPoint(2,nPts+1,result+error);
388 g->SetPoint(3,nPts+1,result-error);
389 g->SetPoint(4,0,result-error);
390 g->SetPoint(5,0,result-error);
391 g->SetFillStyle(meshStyle);
392 g->SetFillColor(meshColor);
e83922f2 393
60694576 394 return g;
e83922f2 395
60694576 396} // end of GetErrorMesh(Int_t nPoints, Double_t result,Double_t error)
e83922f2 397
60694576 398// ===========================================================================================
9d3cbee7 399
60694576 400TGraphErrors* GetGraphErrors(Double_t x, Double_t result, Double_t error, Int_t markerStyle, Int_t markerColor)
401{
402 // From the result and error for each method make TGraphErrors.
1fca9c90 403
60694576 404 TGraphErrors *ge = NULL;
9d3cbee7 405
60694576 406 ge = new TGraphErrors(1);
407 ge->SetPoint(0,x,result);
408 ge->SetPointError(0,0,error);
409 ge->SetMarkerStyle(markerStyle);
410 ge->SetMarkerColor(markerColor);
411
412 return ge;
413
414} // end of TGraphErrors* GetGraphErrors(Double_t x, Double_t result, Double_t error, Int_t markerStyle, Int_t markerColor)
415
416// ===========================================================================================
1fca9c90 417
60694576 418void PlotDiffFlow(Int_t nMethods, TString *method, Int_t *methodMarkerStyle, Int_t *methodMarkerColor,
419 TString methodUsedToMakeErrorMesh, Int_t meshStyle, Int_t meshColor, TString ptEta, TString rpPoi)
420{
421 // Make plot for differential flow.
1fca9c90 422
60694576 423 TCanvas *c = NULL;
424 Int_t sizeX = 1000; // canvas size in pixels along x
425 Int_t sizeY = 600; // canvas size in pixels along y
426 TString title = Form("Differential Flow vs %s (%s)",ptEta.Data(),rpPoi.Data());
427 if(!showLegendDiffFlow) sizeX = 0.75*sizeX;
428 c = new TCanvas(title.Data(),title.Data(),sizeX,sizeY);
429 if(showLegendDiffFlow)
1fca9c90 430 {
60694576 431 c->Divide(2,1);
432 c->cd(1)->SetPad(0.0,0.0,0.75,1.0);
433 }
434 // Style histogram:
435 StyleHistDiffFlow(ptEta.Data(),rpPoi.Data())->Draw();
436 // Error mesh:
21116a0c 437 TGraph *errorMesh = GetErrorMeshDiffFlow(methodUsedToMakeErrorMesh.Data(),rpPoi.Data(),ptEta.Data());
5c09ff70 438 if(errorMesh && showErrorMeshDiffFlow)
60694576 439 {
440 errorMesh->SetFillStyle(meshStyle);
441 errorMesh->SetFillColor(meshColor);
442 errorMesh->Draw("lfsame");
443 }
444 // Results of methods:
445 for(Int_t b=0;b<nMethods;b++)
446 {
cacbf284 447 if(method[b]==methodUsedToMakeErrorMesh && !showBothErrorMeshAndMarkers) continue;
60694576 448 TH1D *hist = GetResultHistogram(method[b].Data(),rpPoi.Data(),ptEta.Data());
449 if(hist)
7d02d77f 450 {
21116a0c 451 if(rebinInPt && ptEta == "Pt"){hist = RebinInPt(hist);}
60694576 452 hist->SetMarkerStyle(methodMarkerStyle[b]);
453 hist->SetMarkerColor(methodMarkerColor[b]);
21116a0c 454 hist->Draw("e1psamex0");
7d02d77f 455 }
60694576 456 }
457 if(showLegendDiffFlow)
458 {
459 c->cd(2)->SetPad(0.73,0.0,0.97,1.0);
460 DefaultTextInLegend()->Draw();
461 LegendDiffFlow(nMethods,method,methodMarkerStyle,methodMarkerColor,
462 methodUsedToMakeErrorMesh,meshStyle,meshColor,ptEta,rpPoi)->Draw();
1fca9c90 463 }
60694576 464} // end of void PlotDiffFlow(...)
465
466// ===========================================================================================
467
468void PlotDiffFlowRelativeToMC(Int_t nMethods, TString *method, Int_t *methodMarkerStyle,
469 Int_t *methodMarkerColor, TString ptEta, TString rpPoi)
470{
471 // Make plot for differential flow.
ab1e86e9 472
473 TString title = Form("Differential Flow vs %s (%s) relative to MCEP",ptEta.Data(),rpPoi.Data());
474 // MCEP:
475 TH1D *mcep = GetResultHistogram("MCEP",rpPoi.Data(),ptEta.Data()); // MCEP result and error:
476 if(!mcep)
477 {
478 cout<<"WARNING: MCEP histogram not available in making the plot for "<<title.Data()<<" !!!!"<<endl;
479 return;
480 }
60694576 481 TCanvas *c = NULL;
482 Int_t sizeX = 1000; // canvas size in pixels along x
483 Int_t sizeY = 600; // canvas size in pixels along y
60694576 484 if(!showLegendDiffFlow) sizeX = 0.75*sizeX;
485 c = new TCanvas(title.Data(),title.Data(),sizeX,sizeY);
486 if(showLegendDiffFlow)
1fca9c90 487 {
60694576 488 c->Divide(2,1);
489 c->cd(1)->SetPad(0.0,0.0,0.75,1.0);
490 }
491 // Style histogram:
38584010 492 Int_t n = 2; // default harmonic
493 if(!useDefaultValues){n = GetHarmonic(methodForSettings);}
60694576 494 TH1D *styleHist = StyleHistDiffFlow(ptEta.Data(),rpPoi.Data());
495 styleHist->GetYaxis()->SetTitle(Form("(v_{%d}\{MCEP\}-v_{%d}\{method\})/v_{%d}\{MCEP\}",n,n,n));
496 styleHist->SetTitle(Form("Differential Flow #font[72]{vs} %s (%s) relative to MCEP",ptEta.Data(),rpPoi.Data()));
497 styleHist->SetMinimum(-10.); // to be improved
498 styleHist->SetMaximum(10.); // to be improved
499 styleHist->SetTitle(title.Data());
500 styleHist->Draw();
501 // Methods:
60694576 502 for(Int_t nm=0;nm<nMethods;nm++)
503 {
504 TH1D *hist = NULL;
505 if(GetResultHistogram(method[nm].Data(),rpPoi.Data(),ptEta.Data()))
1fca9c90 506 {
60694576 507 hist = (TH1D*)(GetResultHistogram(method[nm].Data(),rpPoi.Data(),ptEta.Data())->Clone());
508 }
509 if(hist)
1fca9c90 510 {
60694576 511 Int_t nBins = hist->GetNbinsX();
512 for(Int_t b=1;b<=nBins;b++)
513 {
514 Double_t mcepResult = mcep->GetBinContent(b);
515 Double_t mcepError = mcep->GetBinError(b);
516 if((TMath::Abs(mcepResult) > 1.e-44) && (TMath::Abs(mcepError) > 1.e-44))
7d02d77f 517 {
60694576 518 Double_t result = hist->GetBinContent(b);
519 Double_t error = hist->GetBinError(b);
520 //if((TMath::Abs(result)>1.e-44) && TMath::Abs(error)>1.e-44))
521 if(TMath::Abs(result)>1.e-44)
522 {
523 error = pow(pow(error/mcepResult,2.)+pow(result*mcepError/pow(mcepResult,2.),2.),0.5); // Do not switch with the next line!
524 result = (mcepResult-result)/mcepResult;
525 hist->SetBinContent(b,result);
526 hist->SetBinError(b,error);
527 } else // end of if((TMath::Abs(result)>1.e-44) && TMath::Abs(error)>1.e-44))
528 {
529 hist->SetBinContent(b,0.);
530 hist->SetBinError(b,0.);
531 }
532 } else // end of if(TMath::Abs(mcepResult) > 1.e-44 && TMath::Abs(mcepError) > 1.e-44)
533 {
534 hist->SetBinContent(b,0.);
535 hist->SetBinError(b,0.);
536 }
537 } // end of for(b=1;b<=nBins;b++)
538 hist->SetMarkerStyle(methodMarkerStyle[nm]);
539 hist->SetMarkerColor(methodMarkerColor[nm]);
540 hist->Draw("e1psame");
541 } // end of if(hist)
542 } // end of for(Int_t nm=0;nm<nMethods;nm++)
543 if(showLegendDiffFlow)
544 {
545 c->cd(2)->SetPad(0.73,0.0,0.97,1.0);
546 DefaultTextInLegend()->Draw();
547 LegendDiffFlow(nMethods,method,methodMarkerStyle,methodMarkerColor,"",-1,-1,ptEta,rpPoi)->Draw();
548 }
549} // end of void PlotDiffFlowRelativeToMC(...)
7d02d77f 550
60694576 551// ===========================================================================================
7d02d77f 552
60694576 553TGraph* GetErrorMeshDiffFlow(TString methodUsedToMakeErrorMesh, TString rpPoi, TString ptEta)
554{
555 // Error mesh for differential flow.
556
557 TH1D *hist = GetResultHistogram(methodUsedToMakeErrorMesh.Data(),rpPoi.Data(),ptEta.Data());
558
21116a0c 559 // Rebin higher pt bins:
560 if(hist && rebinInPt && ptEta == "Pt")
561 {
562 hist = RebinInPt(hist);
563 }
564
565 // Make a mesh:
38584010 566 TGraph *errorMesh = NULL;
60694576 567 if(hist)
1fca9c90 568 {
60694576 569 Int_t nBins = hist->GetNbinsX();
21116a0c 570 Double_t value = 0.;
571 Double_t error = 0.;
60694576 572 // Counting the non-empty bins:
21116a0c 573 Int_t nNonEmptyBins = 0;
60694576 574 for(Int_t i=1;i<nBins+1;i++)
7d02d77f 575 {
21116a0c 576 value = hist->GetBinContent(i);
577 error = hist->GetBinError(i);
578 if(TMath::Abs(value)>0.0 && error>0.0)
7d02d77f 579 {
60694576 580 nNonEmptyBins++;
7d02d77f 581 }
21116a0c 582 } // end of for(Int_t i=1;i<nBins+1;i++)
583 // Error mesh:
38584010 584 errorMesh = new TGraph(2*nNonEmptyBins+1);
21116a0c 585 Int_t count = 0;
586 Double_t binCenter = 0.;
60694576 587 for(Int_t i=1;i<nBins+1;i++)
588 {
60694576 589 value = hist->GetBinContent(i);
21116a0c 590 error = hist->GetBinError(i);
591 // Setting up the the mesh:
592 if(TMath::Abs(value)>0.0 && error>0.0)
7d02d77f 593 {
21116a0c 594 binCenter = hist->GetBinCenter(i);
595 errorMesh->SetPoint(count,binCenter,value+error);
596 errorMesh->SetPoint(2*nNonEmptyBins-(count+1),binCenter,value-error);
597 count++;
598 }
599 } // end of for(Int_t i=1;i<nBins+1;i++)
60694576 600 // Closing the mesh area:
21116a0c 601 Double_t xStart = 0.;
602 Double_t yStart = 0.;
603 errorMesh->GetPoint(0,xStart,yStart);
604 errorMesh->SetPoint(2*nNonEmptyBins,xStart,yStart);
60694576 605 } // end if(hist)
606
607 return errorMesh;
608
609} // end of TGraph* GetErrorMeshDiffFlow(TString methodUsedToMakeErrorMesh, TString ptEta, TString rpPoi)
610
611// ===========================================================================================
7d02d77f 612
38584010 613Int_t GetHarmonic(TString method)
614{
615 // Get harmonic used in analysis from the output file of specified method.
616 Int_t n = -44; // harmonic
617
618 AliFlowCommonHist *commonHist = NULL;
619 for(Int_t l=0;l<nMethods;l++)
620 {
621 TString temp = "";
622 if(list[l])
623 {
624 temp = TString(list[l]->GetName());
625 }
626 if(temp.Contains(method.Data()))
627 {
628 commonHist = dynamic_cast<AliFlowCommonHist*> list[l]->FindObject(Form("AliFlowCommonHist%s",method.Data()));
629 if(commonHist && commonHist->GetHarmonic())
630 {
631 n = commonHist->GetHarmonic()->GetBinContent(1);
632 } else
633 {
634 cout<<endl;
635 cout<<" WARNING: commonHist && commonHist->GetHarmonic() is NULL !!!!"<<endl;
636 cout<<endl;
637 }
638 }
639 } // end of for(Int_t l=0;l<nMethods;l++)
640
641 if(n==-44)
642 {
643 cout<<endl;
644 cout<<" WARNING: Couldn't access harmonic from common control histogram of specified method."<<endl;
645 cout<< "Try with another method in 'TString methodForSettings'."<<endl;
646 cout<<endl;
647 }
648
649 return n;
650
651} // end of Int_t GetHarmonic(TString method)
652
653// ===========================================================================================
654
21116a0c 655TH1D* RebinInPt(TH1D *hist)
656{
657 // Rebin original histograms.
658
659 if(!hist)
660 {
661 cout<<endl;
662 cout<<" WARNING: hist is NULL in RebinInPt() !!!!"<<endl;
663 cout<<endl;
664 exit(0);
665 }
666
667 Double_t binWidthOld = hist->GetXaxis()->GetBinWidth(4);
668 Int_t nBinsOld = hist->GetXaxis()->GetNbins();
669 for(Int_t b=1;b<=nBinsOld;b++)
670 {
671 if(TMath::Abs(hist->GetXaxis()->GetBinWidth(b)-binWidthOld)>1.e-44)
672 {
673 cout<<endl;
674 cout<<Form(" WARNING: %s have bins of unequal width !!!!",hist->GetName())<<endl;
675 cout<<" Do not trust rebinning for high pt." <<endl;
676 cout<<endl;
677 }
678 } // end of for(Int_t b=1;b<=nBinsOld;b++)
679 if(binWidthOld<1.e-44)
680 {
681 cout<<endl;
682 cout<<Form(" WARNING: in %s bin width is 0 !!!!",hist->GetName())<<endl;
683 cout<<" Cannot do rebinning in pt." <<endl;
684 cout<<endl;
685 exit(0);
686 }
687
688 // Book rebinned histogram:
689 Int_t nBinsNew = 0;
690 for(Int_t i=0;i<nPtIntervals;i++)
691 {
692 Double_t xMin = TMath::Nint(ptInterval[i]/binWidthOld)*binWidthOld;
693 Double_t xMax = TMath::Nint(ptInterval[i+1]/binWidthOld)*binWidthOld;
694 Int_t nBins = TMath::Nint((xMax-xMin)/binWidthOld);
695 if(nBins <= 0)
696 {
697 cout<<endl;
698 cout<<Form(" WARNING: nBins <=0 when rebinning %s !!!!",hist->GetName())<<endl;
699 cout<<" Check entries in array ptInterval." <<endl;
700 cout<<endl;
701 exit(0);
702 }
703 if(nBins % nMergedBins[i] == 0)
704 {
705 nBinsNew += nBins/nMergedBins[i];
706 } else
707 {
708 nBinsNew += (nBins/nMergedBins[i] + 1);
709 }
710 } // end of for(Int_t i=0;i<nPtIntervals;i++)
711 const Int_t nBinsRebinned = nBinsNew;
712 Double_t binEdges[nBinsRebinned+1] = {0.};
713 Int_t counterForRebinnedBins = 0;
714 for(Int_t i=0;i<nPtIntervals;i++)
715 {
716 Double_t xMin = TMath::Nint(ptInterval[i]/binWidthOld)*binWidthOld;
717 Double_t xMax = TMath::Nint(ptInterval[i+1]/binWidthOld)*binWidthOld;
718 Int_t nBins = TMath::Nint((xMax-xMin)/binWidthOld);
719 if(nBins % nMergedBins[i] == 0)
720 {
721 nBins = nBins/nMergedBins[i];
722 } else
723 {
724 nBins = (nBins/nMergedBins[i] + 1);
725 }
726 for(Int_t b=0;b<nBins;b++)
727 {
728 binEdges[counterForRebinnedBins] = xMin + b*binWidthOld*nMergedBins[i];
729 counterForRebinnedBins++;
730 }
731 } // end of for(Int_t i=0;i<nPtIntervals;i++)
732 // Last bin edge:
733 binEdges[counterForRebinnedBins] = hist->GetXaxis()->GetXmax();
734
735 TH1D *temp = new TH1D("","",nBinsRebinned,binEdges); // rebinned histogram
736 for(Int_t br=0;br<nBinsRebinned;br++) // bins in rebinned histogram
737 {
738 Double_t value = 0.;
739 Double_t error = 0.;
740 Double_t dSum1 = 0.; // sum value_i/(error_i)^2
741 Double_t dSum2 = 0.; // sum 1/(error_i)^2
742 Int_t startingBin = hist->FindBin(binEdges[br]);
743 Int_t endingBin = hist->FindBin(binEdges[br+1]);
744 for(Int_t bo=startingBin;bo<endingBin;bo++) // bins in original histogram
745 {
746 value = hist->GetBinContent(bo);
747 error = hist->GetBinError(bo);
748 if(error>0.)
749 {
750 dSum1+=value/(error*error);
751 dSum2+=1./(error*error);
752 }
753 }
754 if(dSum2>0.)
755 {
756 temp->SetBinContent(br+1,dSum1/dSum2);
757 temp->SetBinError(br+1,pow(1./dSum2,0.5));
758 }
759 } // end of for(Int_t b=1;b<=nBinsOld;b++)
760
761 return temp;
762
763} // end of RebinInPt()
764
765// ===========================================================================================
766
60694576 767TH1D* StyleHistDiffFlow(TString ptEta, TString rpPoi)
768{
769 // Style histogram for differential flow.
38584010 770
771 Int_t n = 2; // default harmonic
772 if(!useDefaultValues){n = GetHarmonic(methodForSettings);}
60694576 773 TH1D *styleHistDiffFlow = NULL;
774 if(ptEta == "Pt")
775 {
776 Int_t iNbinsPt = AliFlowCommonConstants::GetMaster()->GetNbinsPt();
777 Double_t dPtMin = AliFlowCommonConstants::GetMaster()->GetPtMin();
778 Double_t dPtMax = AliFlowCommonConstants::GetMaster()->GetPtMax();
38584010 779 if(!useDefaultValues)
780 {
781 AliFlowCommonHist *commonHist = NULL;
782 for(Int_t l=0;l<nMethods;l++)
783 {
784 TString temp = "";
785 if(list[l])
786 {
787 temp = TString(list[l]->GetName());
788 }
789 if(temp.Contains(methodForSettings.Data()))
790 {
791 commonHist = dynamic_cast<AliFlowCommonHist*> list[l]->FindObject(Form("AliFlowCommonHist%s",methodForSettings.Data()));
792 if(commonHist && commonHist->GetHistPtRP() && rpPoi == "RP")
793 {
794 iNbinsPt = commonHist->GetHistPtRP()->GetNbinsX();
795 dPtMin = commonHist->GetHistPtRP()->GetXaxis()->GetXmin();
796 dPtMax = commonHist->GetHistPtRP()->GetXaxis()->GetXmax();
797 } else if(commonHist && commonHist->GetHistPtPOI() && rpPoi == "POI")
798 {
799 iNbinsPt = commonHist->GetHistPtPOI()->GetNbinsX();
800 dPtMin = commonHist->GetHistPtPOI()->GetXaxis()->GetXmin();
801 dPtMax = commonHist->GetHistPtPOI()->GetXaxis()->GetXmax();
802 }
803 else
804 {
805 cout<<endl;
806 cout<<" WARNING: Coudn't access common control histogram for pt yield !!!!"<<endl;
807 cout<<endl;
808 }
809 }
810 } // end of for(Int_t l=0;l<nMethods;l++)
811 } // end of if(!useDefaultValues)
60694576 812 styleHistDiffFlow = new TH1D("","styleHistDiffFlow",iNbinsPt,dPtMin,dPtMax);
813 styleHistDiffFlow->SetTitle(Form("Differential Flow #font[72]{vs} p_{t} (%s)",rpPoi.Data()));
814 styleHistDiffFlow->SetXTitle("p_{t} [GeV]");
815 styleHistDiffFlow->SetYTitle(Form("v_{%d}",n));
816 }
817 else if(ptEta == "Eta")
818 {
819 Int_t iNbinsEta = AliFlowCommonConstants::GetMaster()->GetNbinsEta();
820 Double_t dEtaMin = AliFlowCommonConstants::GetMaster()->GetEtaMin();
821 Double_t dEtaMax = AliFlowCommonConstants::GetMaster()->GetEtaMax();
38584010 822 if(!useDefaultValues)
823 {
824 AliFlowCommonHist *commonHist = NULL;
825 for(Int_t l=0;l<nMethods;l++)
826 {
827 TString temp = "";
828 if(list[l])
829 {
830 temp = TString(list[l]->GetName());
831 }
832 if(temp.Contains(methodForSettings.Data()))
833 {
834 commonHist = dynamic_cast<AliFlowCommonHist*> list[l]->FindObject(Form("AliFlowCommonHist%s",methodForSettings.Data()));
835 if(commonHist && commonHist->GetHistEtaRP() && rpPoi == "RP")
836 {
837 iNbinsEta = commonHist->GetHistEtaRP()->GetNbinsX();
838 dEtaMin = commonHist->GetHistEtaRP()->GetXaxis()->GetXmin();
839 dEtaMax = commonHist->GetHistEtaRP()->GetXaxis()->GetXmax();
840 } else if(commonHist && commonHist->GetHistEtaPOI() && rpPoi == "POI")
841 {
842 iNbinsEta = commonHist->GetHistEtaPOI()->GetNbinsX();
843 dEtaMin = commonHist->GetHistEtaPOI()->GetXaxis()->GetXmin();
844 dEtaMax = commonHist->GetHistEtaPOI()->GetXaxis()->GetXmax();
845 }
846 else
847 {
848 cout<<endl;
849 cout<<" WARNING: Coudn't access common control histogram for eta distribution !!!!"<<endl;
850 cout<<endl;
851 }
852 }
853 } // end of for(Int_t l=0;l<nMethods;l++)
854 } // end of if(!useDefaultValues)
60694576 855 styleHistDiffFlow = new TH1D("","",iNbinsEta,dEtaMin,dEtaMax);
856 styleHistDiffFlow->SetTitle(Form("Differential Flow #font[72]{vs} #eta (%s)",rpPoi.Data()));
857 styleHistDiffFlow->SetXTitle("#eta");
858 styleHistDiffFlow->SetYTitle(Form("v_{%d}",n));
859 }
860 if(styleHistDiffFlow)
1fca9c90 861 {
60694576 862 styleHistDiffFlow->SetMinimum(-0.25); // to be improved - implement algorithm for this
863 styleHistDiffFlow->SetMaximum(1.); // to be improved - implement algorithm for this
864 //styleHistDiffFlow->GetYaxis()->SetLabelSize(0.05);
865 //styleHistDiffFlow->GetYaxis()->SetTitleSize(0.06);
866 //styleHistDiffFlow->GetYaxis()->SetTitleOffset(0.55);
867 //styleHistDiffFlow->GetXaxis()->SetLabelSize(0.05);
868 //styleHistDiffFlow->GetXaxis()->SetTitleSize(0.06);
869 //styleHistDiffFlow->GetXaxis()->SetTitleOffset(0.6);
870 //styleHistDiffFlow->GetXaxis()->SetLabelOffset(0.02);
871 }
872
873 return styleHistDiffFlow;
7d02d77f 874
60694576 875} // end of TH1D* StyleHistDiffFlow(TString ptEta, TString rpPoi)
876
877// ===========================================================================================
878
879void Plot(const Int_t nMethods,TString *method,Int_t *methodMarkerStyle,Int_t *methodMarkerColor,
880 TString methodUsedToMakeErrorMesh,Int_t meshStyle,Int_t meshColor,TString rfRpPoi)
881{
882 // Make a plot for reference and integrated flow.
883
884 TString title = "";
885 if(rfRpPoi == "RF")
886 {
887 title = "Reference Flow";
888 } else if(rfRpPoi == "POI")
7d02d77f 889 {
60694576 890 title = "Integrated Flow (POI)";
891 } else if(rfRpPoi == "RP")
892 {
893 title = "Integrated Flow (RP)";
894 }
895
896 Double_t x = 0.; // determines position of the marker on x axis
897 Double_t results[nMethods] = {0.};
898 Double_t errors[nMethods] = {0.};
899 TGraphErrors *ge[nMethods] = {NULL};
900 TGraph *errorMesh = NULL;
901 for(Int_t b=0;b<nMethods;b++)
902 {
903 x = b+0.5;
904 TH1D *hist = NULL;
905 hist = GetResultHistogram(method[b].Data(),rfRpPoi.Data());
906 if(hist)
907 {
908 results[b] = hist->GetBinContent(1);
909 errors[b] = hist->GetBinError(1);
910 if(TMath::Abs(results[b])>1.e-44)
911 {
912 ge[b] = GetGraphErrors(x,results[b],errors[b],methodMarkerStyle[b],methodMarkerColor[b]);
7d02d77f 913 }
60694576 914 if(strcmp(method[b].Data(),methodUsedToMakeErrorMesh.Data()) == 0)
915 {
916 errorMesh = GetErrorMesh(nMethods+1,results[b],errors[b],meshStyle,meshColor);
917 }
918 } else
7d02d77f 919 {
60694576 920 //cout<<"WARNING: For a method "<<method[b].Data()<<" couldn't get the histogram with result"<<endl;
921 //cout<<" for "<<title.Data()<<" !!!! "<<endl;
922 }
923 } // end of for(Int_t b=0;b<nMethods;b++)
924
925 // Final drawing:
926 TCanvas *c = NULL;
927 // Settings for canvas:
928 Int_t sizeX = 1000; // canvas size in pixels along x
929 Int_t sizeY = 600; // canvas size in pixels along y
930 if(!showLegend) sizeX = 0.75*sizeX;
931 c = new TCanvas(title.Data(),title.Data(),sizeX,sizeY);
932 if(showLegend)
9d3cbee7 933 {
60694576 934 c->Divide(2,1);
935 c->cd(1)->SetPad(0.0,0.0,0.75,1.0);
70288839 936 }
60694576 937 StyleHist(title,nMethods,method,results,errors)->Draw();
5c09ff70 938 if(errorMesh && showErrorMesh){errorMesh->Draw("lfsame");}
60694576 939 for(Int_t b=0;b<nMethods;b++)
905bed86 940 {
60694576 941 if(ge[b])ge[b]->Draw("psame");
905bed86 942 }
60694576 943 if(showLegend)
9d3cbee7 944 {
60694576 945 c->cd(2)->SetPad(0.73,0.0,0.97,1.0);
946 DefaultTextInLegend()->Draw();
947 Legend(nMethods,method,rfRpPoi)->Draw();
9d3cbee7 948 }
60694576 949
950 return;
951
952} // end of Plot(...)
70288839 953
60694576 954// ===========================================================================================
955
956void PlotRelativeToMC(const Int_t nMethods, TString *method, Int_t *methodMarkerStyle,
957 Int_t *methodMarkerColor, TString rfRpPoi)
958{
cacbf284 959 // Make a plot (v{MC}-v{method})/v{MC} for reference and integrated flow.
60694576 960
961 TString title = "";
962 if(rfRpPoi == "RF")
947cc449 963 {
60694576 964 title = "Reference Flow relative to MCEP";
965 } else if(rfRpPoi == "POI")
966 {
967 title = "Integrated Flow (POI) relative to MCEP";
968 } else if(rfRpPoi == "RP")
969 {
970 title = "Integrated Flow (RP) relative to MCEP";
971 }
972
973 Double_t x = 0.; // determines position of the marker on x axis
974 Double_t results[nMethods] = {0.};
975 Double_t errors[nMethods] = {0.};
976 // MCEP result and error:
977 TH1D *mcep = GetResultHistogram("MCEP","RF");
ab1e86e9 978 Double_t mcepResult = 0.;
979 Double_t mcepError = 0.;
980 if(mcep)
981 {
982 mcepResult = mcep->GetBinContent(1);
983 mcepError = mcep->GetBinError(1);
984 } else
985 {
986 cout<<"WARNING: MCEP histogram not available in making the plot for "<<title.Data()<<" !!!!"<<endl;
987 return;
988 }
60694576 989 if(TMath::Abs(mcepResult) < 1.e-44 || TMath::Abs(mcepError) < 1.e-44)
990 {
991 cout<<"WARNING: Result or error for v{MCEP} is zero in making the plot for "<<title.Data()<<" !!!!"<<endl;
992 return;
947cc449 993 }
60694576 994 TGraphErrors *ge[nMethods] = {NULL};
995 for(Int_t b=0;b<nMethods;b++)
9d3cbee7 996 {
60694576 997 x = b+0.5;
998 TH1D *hist = NULL;
999 hist = GetResultHistogram(method[b].Data(),rfRpPoi.Data());
1000 if(hist)
1001 {
1002 results[b] = hist->GetBinContent(1);
1003 errors[b] = hist->GetBinError(1);
1004 if(TMath::Abs(results[b])>1.e-44)
1005 {
1006 errors[b] = pow(pow(errors[b]/mcepResult,2.)+pow(results[b]*mcepError/pow(mcepResult,2.),2.),0.5); // Do not switch with the next line!
1007 results[b] = (mcepResult-results[b])/mcepResult;
1008 ge[b] = GetGraphErrors(x,results[b],errors[b],methodMarkerStyle[b],methodMarkerColor[b]);
1009 }
1010 } else
1011 {
1012 //cout<<"WARNING: For a method "<<method[b].Data()<<" couldn't get the histogram with result"<<endl;
1013 //cout<<" for "<<title.Data()<<" !!!! "<<endl;
1014 }
1015 } // end of for(Int_t b=0;b<nMethods;b++)
1016
1017 // Final drawing:
1018 TCanvas *c = NULL;
1019 // Settings for canvas:
1020 Int_t sizeX = 1000; // canvas size in pixels along x
1021 Int_t sizeY = 600; // canvas size in pixels along y
1022 if(!showLegend) sizeX = 0.75*sizeX;
1023 c = new TCanvas(title.Data(),title.Data(),sizeX,sizeY);
1024 if(showLegend)
1025 {
1026 c->Divide(2,1);
1027 c->cd(1)->SetPad(0.0,0.0,0.75,1.0);
9d3cbee7 1028 }
60694576 1029 // Style histogram:
38584010 1030 Int_t n = 2; // default harmonic
1031 if(!useDefaultValues){n = GetHarmonic(methodForSettings);}
60694576 1032 TH1D *styleHist = StyleHist(title,nMethods,method,results,errors);
1033 styleHist->GetYaxis()->SetTitleOffset(1.25);
1034 styleHist->GetYaxis()->SetTitleSize(0.03);
1035 styleHist->GetYaxis()->SetLabelSize(0.03);
1036 styleHist->GetYaxis()->SetTitle(Form("(v_{%d}\{MCEP\}-v_{%d}\{method\})/v_{%d}\{MCEP\}",n,n,n));
1037 styleHist->Draw();
1038 // Methods:
1039 for(Int_t b=0;b<nMethods;b++)
e83922f2 1040 {
60694576 1041 if(ge[b])ge[b]->Draw("psame");
e83922f2 1042 }
60694576 1043 if(showLegend)
e83922f2 1044 {
60694576 1045 c->cd(2)->SetPad(0.73,0.0,0.97,1.0);
1046 DefaultTextInLegend()->Draw();
1047 Legend(nMethods,method,rfRpPoi)->Draw();
1048 }
1fca9c90 1049
60694576 1050 return;
1fca9c90 1051
60694576 1052} // end of void PlotRelativeToMC(...)
1fca9c90 1053
60694576 1054// ===========================================================================================
1fca9c90 1055
60694576 1056TPaveText* DefaultTextInLegend()
1057{
1058 // Determine the default text in legend.
1fca9c90 1059
60694576 1060 TPaveText *textDefault = new TPaveText(0.05,0.77,0.95,0.90,"NDC");
1061 textDefault->SetTextFont(72);
1062 textDefault->SetTextSize(0.08);
1063 textDefault->AddText("Average Multiplicity");
1064 textDefault->AddText("and");
1065 textDefault->AddText("Number of Events");
1066 textDefault->SetFillStyle(0); // white instead of default grey
e83922f2 1067
60694576 1068 return textDefault;
1fca9c90 1069
60694576 1070} // end of TPaveText* DefaultTextInLegend()
1fca9c90 1071
60694576 1072// ===========================================================================================
1fca9c90 1073
60694576 1074TPaveText* Legend(Int_t nMethods, TString *method, TString rfRpPoi)
1075{
1076 // Make a legend.
688877b8 1077
60694576 1078 TPaveText *legend = new TPaveText(0.05,0.12,0.95,0.70,"NDC");
1079 legend->SetTextFont(72);
1080 legend->SetTextSize(0.06);
1081 legend->SetFillStyle(0); // white instead of default grey
1082 const Int_t nLegendEntries = 11;
1083 TString legendEntries[nLegendEntries] = {"MCEP ...... ","SP ........ ","GFC ....... ",
1084 "QC{2} ..... ","QC{4} ..... ","QC{6} ..... ",
1085 "QC{8} ..... ","FQD ....... ","LYZ{sum} .. ",
1086 "LYZ{prod} . ","LYZEP ..... "};
1087 TString temp = "";
1088 Int_t gfcCounter = 0; // represent "2,GFC", "4,GFC", "6,GFC" and "8,GFC" with the same entry GFC
1089 for(Int_t b=0;b<nMethods;b++)
1090 {
1091 for(Int_t le=0;le<nLegendEntries;le++)
688877b8 1092 {
60694576 1093 if(legendEntries[le].Contains(method[b].Data())) // this is either MCEP, FQD, SP or LYZEP
1094 {
1095 temp = legendEntries[le]+GetAvMultiplicityAndNoOfEvents(method[b].Data(),rfRpPoi);
1096 legend->AddText(temp.Data());
1097 }
1098 else if(method[b].Contains("GFC") && gfcCounter == 0 && legendEntries[le].Contains("GFC")) // GFC
688877b8 1099 {
60694576 1100 temp = legendEntries[le]+GetAvMultiplicityAndNoOfEvents(method[b].Data(),rfRpPoi);
1101 legend->AddText(temp.Data());
1102 gfcCounter++;
1103 }
1104 else if(method[b].Contains("QC") && legendEntries[le].Contains("QC")) // QC
1105 {
1106 for(Int_t o=1;o<=4;o++) // QC order
688877b8 1107 {
60694576 1108 if(method[b].Contains(Form("%d",2*o)) && legendEntries[le].Contains(Form("%d",2*o)))
1109 {
1110 temp = legendEntries[le]+GetAvMultiplicityAndNoOfEvents(method[b].Data(),rfRpPoi);
1111 legend->AddText(temp.Data());
1112 }
1113 } // end of for(Int o=1;o<=4;o++) // QC order
1114 }
1115 else if((method[b].Contains("LYZ1SUM")||method[b].Contains("LYZ2SUM")) && legendEntries[le].Contains("LYZ{sum}"))
1116 {
1117 temp = legendEntries[le]+GetAvMultiplicityAndNoOfEvents(method[b].Data(),rfRpPoi);
1118 legend->AddText(temp.Data());
1119 }
1120 else if((method[b].Contains("LYZ1PROD")||method[b].Contains("LYZ2PROD")) && legendEntries[le].Contains("LYZ{prod}"))
1121 {
1122 temp = legendEntries[le]+GetAvMultiplicityAndNoOfEvents(method[b].Data(),rfRpPoi);
1123 legend->AddText(temp.Data());
1124 }
1125 } // end of for(Int_t le=0;le<nLegendEntries;le++)
1126 } // end of for(Int_t b=0;b<nMethods;b++)
1127
1128 return legend;
1129
1130} // end of TPaveText* Legend(Int_t nMethods, TString *method, TString rfRpPoi)
1131// ===========================================================================================
1132
1133TLegend* LegendDiffFlow(Int_t nMethods, TString *method, Int_t *methodMarkerStyle, Int_t *methodMarkerColor,
1134 TString methodUsedToMakeErrorMesh, Int_t meshStyle, Int_t meshColor, TString ptEta, TString rpPoi)
1135{
1136 // Make a legend for differential flow.
1137
1138 TLegend *legend = new TLegend(0.0,0.12,0.99,0.70);
1139 legend->SetMargin(0.15);
1140 legend->SetTextFont(72);
1141 legend->SetTextSize(0.06);
1142 legend->SetFillStyle(0); // white instead of default grey
1143 const Int_t nLegendEntries = 14;
1144 TString legendEntries[nLegendEntries] = {"MCEP ...... ","SP ........ ","GFC{2} .... ","QC{2} ..... ",
1145 "GFC{4} .... ","QC{4} ..... ","GFC{6} .... ","QC{6} ..... ",
1146 "GFC{8} .... ","QC{8} ..... ","FQD ....... ","LYZ{sum} .. ",
1147 "LYZ{prod} . ","LYZEP ..... "};
1148
1149 TH1D *hist = NULL;
1150 TString temp = "";
1151 for(Int_t b=0;b<nMethods;b++)
1152 {
1153 for(Int_t le=0;le<nLegendEntries;le++)
1154 {
1155 if(legendEntries[le].Contains(method[b].Data())) // this is either MCEP, FQD, SP or LYZEP
1156 {
1157 temp = legendEntries[le]+GetAvMultiplicityAndNoOfEvents(method[b].Data(),rpPoi);
1158 hist = GetResultHistogram(method[b].Data(),rpPoi.Data(),ptEta.Data());
1159 if(hist)
688877b8 1160 {
60694576 1161 hist->SetMarkerStyle(methodMarkerStyle[b]);
1162 hist->SetMarkerColor(methodMarkerColor[b]);
1163 if(methodUsedToMakeErrorMesh == method[b].Data())
1164 {
1165 hist->SetFillStyle(meshStyle);
1166 hist->SetFillColor(meshColor);
1167 legend->AddEntry(hist,temp.Data(),"f");
1168 } else
1169 {
1170 legend->AddEntry(hist,temp.Data(),"p");
1171 }
1172 } // end of if(hist)
1173 }
1174 else if(method[b].Contains("GFC") && legendEntries[le].Contains("GFC")) // GFC
1175 {
1176 for(Int_t o=1;o<=4;o++) // GFC order
688877b8 1177 {
60694576 1178 if(method[b].Contains(Form("%d",2*o)) && legendEntries[le].Contains(Form("%d",2*o)))
1179 {
1180 temp = legendEntries[le]+GetAvMultiplicityAndNoOfEvents(method[b].Data(),rpPoi);
1181 hist = GetResultHistogram(method[b].Data(),rpPoi.Data(),ptEta.Data());
1182 if(hist)
1183 {
1184 hist->SetMarkerStyle(methodMarkerStyle[b]);
1185 hist->SetMarkerColor(methodMarkerColor[b]);
1186 if(methodUsedToMakeErrorMesh == method[b].Data())
1187 {
1188 hist->SetFillStyle(meshStyle);
1189 hist->SetFillColor(meshColor);
1190 legend->AddEntry(hist,temp.Data(),"f");
1191 } else
1192 {
1193 legend->AddEntry(hist,temp.Data(),"p");
1194 }
1195 } // end of if(hist)
1196 }
688877b8 1197 }
60694576 1198 }
1199 else if(method[b].Contains("QC") && legendEntries[le].Contains("QC")) // QC
1200 {
1201 for(Int_t o=1;o<=4;o++) // QC order
688877b8 1202 {
60694576 1203 if(method[b].Contains(Form("%d",2*o)) && legendEntries[le].Contains(Form("%d",2*o)))
1204 {
1205 temp = legendEntries[le]+GetAvMultiplicityAndNoOfEvents(method[b].Data(),rpPoi);
1206 hist = GetResultHistogram(method[b].Data(),rpPoi.Data(),ptEta.Data());
1207 if(hist)
1208 {
1209 hist->SetMarkerStyle(methodMarkerStyle[b]);
1210 hist->SetMarkerColor(methodMarkerColor[b]);
1211 if(methodUsedToMakeErrorMesh == method[b].Data())
1212 {
1213 hist->SetFillStyle(meshStyle);
1214 hist->SetFillColor(meshColor);
1215 legend->AddEntry(hist,temp.Data(),"f");
1216 } else
1217 {
1218 legend->AddEntry(hist,temp.Data(),"p");
1219 }
1220 } // end of if(hist)
1221 }
1222 } // end of for(Int o=1;o<=4;o++) // QC order
1223 }
1224 else if((method[b].Contains("LYZ1SUM")||method[b].Contains("LYZ2SUM")) && legendEntries[le].Contains("LYZ{sum}"))
1225 {
1226 temp = legendEntries[le]+GetAvMultiplicityAndNoOfEvents(method[b].Data(),rpPoi);
1227 hist = GetResultHistogram(method[b].Data(),rpPoi.Data(),ptEta.Data());
1228 if(hist)
688877b8 1229 {
60694576 1230 hist->SetMarkerStyle(methodMarkerStyle[b]);
1231 hist->SetMarkerColor(methodMarkerColor[b]);
1232 if(methodUsedToMakeErrorMesh == method[b].Data())
1233 {
1234 hist->SetFillStyle(meshStyle);
1235 hist->SetFillColor(meshColor);
1236 legend->AddEntry(hist,temp.Data(),"f");
1237 } else
1238 {
1239 legend->AddEntry(hist,temp.Data(),"p");
1240 }
1241 } // end of if(hist)
1242 }
1243 else if((method[b].Contains("LYZ1PROD")||method[b].Contains("LYZ2PROD")) && legendEntries[le].Contains("LYZ{prod}"))
1244 {
1245 temp = legendEntries[le]+GetAvMultiplicityAndNoOfEvents(method[b].Data(),rpPoi);
1246 hist = GetResultHistogram(method[b].Data(),rpPoi.Data(),ptEta.Data());
1247 if(hist)
688877b8 1248 {
60694576 1249 hist->SetMarkerStyle(methodMarkerStyle[b]);
1250 hist->SetMarkerColor(methodMarkerColor[b]);
1251 if(methodUsedToMakeErrorMesh == method[b].Data())
1252 {
1253 hist->SetFillStyle(meshStyle);
1254 hist->SetFillColor(meshColor);
1255 legend->AddEntry(hist,temp.Data(),"f");
1256 } else
1257 {
1258 legend->AddEntry(hist,temp.Data(),"p");
1259 }
1260 } // end of if(hist)
1261 }
1262 } // end of for(Int_t le=0;le<nLegendEntries;le++)
1263 } // end of for(Int_t b=0;b<nMethods;b++)
1264
1265 return legend;
1266
1267} // end of TLegend* Legend(...)
1268
1269// ===========================================================================================
1270
1271TString GetAvMultiplicityAndNoOfEvents(TString method, TString rfRpPoi)
1272{
1273 // Get average multiplicity and number of events for specified method and return it as "M = <AvM>, N = <N>".
1274
1275 TString MN = ""; // string to hold "M = <AvM>, N = <N>"
1276 Long_t N = 0; // number of events
1277 Double_t M = 0.; // average multiplicity
1278
1279 TH1F *hist = GetControlHistogram(method,rfRpPoi);
1280 if(hist)
1281 {
1282 N = hist->GetEntries();
1283 M = hist->GetMean();
1284 MN.Append("M = ");
1285 MN+=(Long_t)M;
1286 MN.Append(", N = ");
1287 MN+=N;
1288 } else
1289 {
1290 MN.Append("n/a");
1291 }
1292
1293 return MN;
1294
1295} // end of TString GetAvMultiplicityAndNoOfEvents(TString *method, TString rfRpPoi)
1296
1297// ===========================================================================================
1298
1299TH1F* GetControlHistogram(TString method, TString rfRpPoi)
1300{
1301 // Get the control histogram for specified method holding the average multiplicity and number of events.
1302
1303 AliFlowCommonHist *commonHist = NULL;
1304 TString methodName = method.Data();
1305 Int_t cumulantOrder = 0;
1306 if(method.Contains("GFC"))
1307 {
1308 TString methodNameTemp1 = method;
1309 TString methodNameTemp2 = method;
1310 methodName = methodNameTemp1.Remove(0,2);
1311 cumulantOrder = methodNameTemp2.Remove(1,4).Atoi();
1312 } else if(method.Contains("QC"))
1313 {
1314 TString methodNameTemp1 = method;
1315 TString methodNameTemp2 = method;
1316 methodName = methodNameTemp1.Remove(0,2);
1317 cumulantOrder = methodNameTemp2.Remove(1,3).Atoi();
1318 }
1319
1320 // Get for specified methodName (and cumulantOrder, if needed) the common control histogram:
1321 // (to be improved - this can certainly be implemented better, but some redesign of the flow code is first in order)
1322 for(Int_t l=0;l<nMethods;l++)
1323 {
1324 TString temp = "";
1325 if(list[l])
1326 {
1327 temp = TString(list[l]->GetName());
1328 }
1329 if(temp.Contains(methodName.Data()))
1330 {
1331 // Access from the common list the needed common result histogram:
1332 if(!(methodName.Contains("QC")))
1333 {
1334 commonHist = dynamic_cast<AliFlowCommonHist*> list[l]->FindObject(Form("AliFlowCommonHist%s",methodName.Data()));
1335 }
1336 else if(methodName=="QC")
1337 {
1338 if(cumulantOrder==2)
947cc449 1339 {
60694576 1340 commonHist = dynamic_cast<AliFlowCommonHist*> list[l]->FindObject("AliFlowCommonHist2ndOrderQC");
1341 }
1342 else if(cumulantOrder==4)
688877b8 1343 {
60694576 1344 commonHist = dynamic_cast<AliFlowCommonHist*> list[l]->FindObject("AliFlowCommonHist4thOrderQC");
688877b8 1345 }
60694576 1346 else if(cumulantOrder==6)
688877b8 1347 {
60694576 1348 commonHist = dynamic_cast<AliFlowCommonHist*> list[l]->FindObject("AliFlowCommonHist6thOrderQC");
947cc449 1349 }
60694576 1350 else if(cumulantOrder==8)
947cc449 1351 {
60694576 1352 commonHist = dynamic_cast<AliFlowCommonHist*> list[l]->FindObject("AliFlowCommonHist8thOrderQC");
688877b8 1353 }
60694576 1354 else
688877b8 1355 {
60694576 1356 cout<<"WARNING: You have specified cumulant order to be "<<cumulantOrder<<" !!!!"<<endl;
1357 cout<<" There are no results for this cumulant order. "<<endl;
688877b8 1358 }
60694576 1359 } // end of else if(methodName=="QC")
1360 } // end of if(temp.Contains(methodName.Data()))
1361 } // end of for(Int_t l=0;l<nMethods;l++)
688877b8 1362
60694576 1363 if(!commonHist)
1364 {
1365 //cout<<"WARNING: For a method "<<method.Data()<<" couldn't access the common hist result !!!!"<<endl;
1366 //cout<<" File absent? Or perhaps a typo in the method's name?"<<endl;
1367 if(methodName.Contains("QC"))
688877b8 1368 {
60694576 1369 //cout<<" Or impossible cumulant order? Otherwise.... :'( "<<endl;
688877b8 1370 }
60694576 1371 }
688877b8 1372
60694576 1373 // Finally, from commonHist access the required histogram:
1374 TH1F *hist = NULL;
1375 if(commonHist)
1376 {
1377 if(rfRpPoi == "RF" || rfRpPoi == "RP")
688877b8 1378 {
60694576 1379 hist = commonHist->GetHistMultRP();
1380 } else if(rfRpPoi == "POI")
1381 {
1382 hist = commonHist->GetHistMultPOI();
1383 } else
1384 {
1385 cout<<"WARNING: Impossible TString rfRpPoi in GetControlHistogram() !!!!"<<endl;
1386 exit(0);
1387 }
1388 }
688877b8 1389
60694576 1390 return hist;
e83922f2 1391
60694576 1392} // end of TH1D* GetControlHistogram(TString method, TString rfRpPoi)
1fca9c90 1393
60694576 1394// ===========================================================================================
1395
1396TH1D* StyleHist(TString title, Int_t nMethods, TString *method, Double_t *results, Double_t *errors)
1397{
1398 // Make style histogram.
1399 TH1D *styleHist = new TH1D("",title.Data(),nMethods,0,nMethods);
38584010 1400 Int_t n = 2; // default harmonic
1401 if(!useDefaultValues){n = GetHarmonic(methodForSettings);}
60694576 1402 Double_t styleHistMin = 44.;
1403 Double_t styleHistMax = -44.;
1404 for(Int_t b=0;b<nMethods;b++)
1405 {
1406 // Form bin labels from method's names:
1407 styleHist->GetXaxis()->SetBinLabel(b+1,Form("v_{%d}\{%s\}",n,method[b].Data()));
1408 if(method[b].Contains("LYZ1SUM") || method[b].Contains("LYZ2SUM"))
e83922f2 1409 {
60694576 1410 styleHist->GetXaxis()->SetBinLabel(b+1,Form("v_{%d}\{LYZ,sum\}",n));
e83922f2 1411 }
60694576 1412 if(method[b].Contains("LYZ1PROD") || method[b].Contains("LYZ2PROD"))
e83922f2 1413 {
60694576 1414 styleHist->GetXaxis()->SetBinLabel(b+1,Form("v_{%d}\{LYZ,prod\}",n));
e83922f2 1415 }
60694576 1416 // Establish min and max values for style histograms:
1417 if(TMath::Abs(results[b])>1.e-44)
e83922f2 1418 {
60694576 1419 if(styleHistMin > results[b]-errors[b]) styleHistMin = results[b]-errors[b]; // min value
1420 if(styleHistMax < results[b]+errors[b]) styleHistMax = results[b]+errors[b]; // max value
e83922f2 1421 }
60694576 1422 }
1fca9c90 1423
60694576 1424 styleHist->SetMinimum(0.99*styleHistMin);
1425 styleHist->SetMaximum(1.01*styleHistMax);
1426 /*
1427 styleHist->GetYaxis()->SetNdivisions(5,5,0);
1428 styleHist->GetYaxis()->SetLabelSize(0.05);
1429 styleHist->GetXaxis()->SetLabelSize(0.07);
1430 styleHist->GetXaxis()->SetLabelOffset(0.01);
1431 */
1432
1433 return styleHist;
1fca9c90 1434
60694576 1435} // end of TH1D* StyleHist(TString *title, Int_t nMethods, TString *method, Double_t *results, Double_t *errors)
688877b8 1436
60694576 1437// ===========================================================================================
1fca9c90 1438
60694576 1439TFile* AccessOutputFile(TString outputFileName)
1440{
1441 // Access the common output file.
1442
1443 TFile *outputFile = NULL;
1444 if(!(gSystem->AccessPathName(Form("%s%s%s",gSystem->pwd(),"/",outputFileName.Data()),kFileExists)))
e83922f2 1445 {
60694576 1446 outputFile = TFile::Open(outputFileName.Data(),"READ");
1447 } else
1448 {
1449 cout<<endl;
1450 cout<<"WARNING: Couldn't find the file "<<outputFileName.Data()<<" in "<<endl;
1451 cout<<" directory "<<gSystem->pwd()<<" !!!!"<<endl;
1452 cout<<endl;
1453 exit(0);
1454 }
e83922f2 1455
60694576 1456 return outputFile;
1fca9c90 1457
60694576 1458} // end of TFile* AccessOutputFile(TString outputFileName)
1459
1460// ===========================================================================================
1fca9c90 1461
60694576 1462void GetListsWithHistograms(TFile *outputFile, TString analysisType)
1463{
1464 // Access from common output file the TDirectoryFile's for each flow analysis method
5c09ff70 1465 // and from them the TList's holding histograms with final results:
e83922f2 1466
60694576 1467 TString fileName[nMethods];
1468 TDirectoryFile *dirFile[nMethods] = {NULL};
1469 TString listName[nMethods];
5c09ff70 1470 Int_t failureCounter = 0;
60694576 1471 for(Int_t i=0;i<nMethods;i++)
1472 {
1473 // Form a file name for each method:
1474 fileName[i]+="output";
1475 fileName[i]+=method[i].Data();
1476 fileName[i]+="analysis";
1477 fileName[i]+=analysisType.Data();
1478 // Access this file:
1479 dirFile[i] = (TDirectoryFile*)outputFile->FindObjectAny(fileName[i].Data());
1480 // Form a list name for each method:
60694576 1481 if(dirFile[i])
1482 {
5c09ff70 1483 TList* listTemp = dirFile[i]->GetListOfKeys();
1484 if(listTemp && listTemp->GetEntries() == 1)
60694576 1485 {
5c09ff70 1486 listName[i] = listTemp->At(0)->GetName(); // to be improved - implemented better (use dynamic_cast instead)
60694576 1487 dirFile[i]->GetObject(listName[i].Data(),list[i]);
1488 } else
1489 {
5c09ff70 1490 cout<<" WARNING: Accessing TList from TDirectoryFile failed for method "<<method[i].Data()<<" !!!!"<<endl;
1491 cout<<" Did you actually use "<<method[i].Data()<<" in the analysis?"<<endl;
1492 cout<<endl;
1493 }
60694576 1494 } else
1495 {
5c09ff70 1496 cout<<" WARNING: Couldn't find a TDirectoryFile "<<fileName[i].Data()<<".root !!!!"<<endl;
1497 failureCounter++;
1498 }
60694576 1499 } // end of for(Int_t i=0;i<nMethods;i++)
e83922f2 1500
60694576 1501 // If no files were found most probably the 'TString analysisType' was specified wrongly:
5c09ff70 1502 if(failureCounter == nMethods)
60694576 1503 {
1504 cout<<endl;
1505 cout<<"Did you specify 'TString analysisType' correctly? Can be \"\", \"ESD\", \"AOD\", etc."<<endl;
1506 cout<<endl;
1507 exit(0);
1508 }
1509
1510} // end of void GetListsWithHistograms(TFile *outputFile, TString analysisType)
e83922f2 1511
60694576 1512// ===========================================================================================
1fca9c90 1513
60694576 1514TH1D* GetResultHistogram(TString method, TString rfRpPoi, TString ptEta="")
1515{
1516 // Get the specified histogram holding result.
e83922f2 1517
60694576 1518 AliFlowCommonHistResults *commonHistRes = NULL;
1519 TString methodName = method.Data();
1520 Int_t cumulantOrder = 0;
1521 if(method.Contains("GFC"))
1522 {
1523 TString methodNameTemp1 = method;
1524 TString methodNameTemp2 = method;
1525 methodName = methodNameTemp1.Remove(0,2);
1526 cumulantOrder = methodNameTemp2.Remove(1,4).Atoi();
1527 } else if(method.Contains("QC"))
1528 {
1529 TString methodNameTemp1 = method;
1530 TString methodNameTemp2 = method;
1531 methodName = methodNameTemp1.Remove(0,2);
1532 cumulantOrder = methodNameTemp2.Remove(1,3).Atoi();
1533 }
1534 // Get for specified methodName (and cumulantOrder, if needed) the common hist result:
1535 // (to be improved - this can certainly be implemented better, but some redesign of the flow code is first in order)
1536 for(Int_t l=0;l<nMethods;l++)
1537 {
1538 TString temp = "";
1539 if(list[l])
e83922f2 1540 {
60694576 1541 temp = TString(list[l]->GetName());
e83922f2 1542 }
60694576 1543 if(temp.Contains(methodName.Data()))
e83922f2 1544 {
60694576 1545 // Access from the common list the needed common result histogram:
1546 if(!(methodName.Contains("GFC") || methodName.Contains("QC")))
1547 {
1548 commonHistRes = dynamic_cast<AliFlowCommonHistResults*> list[l]->FindObject(Form("AliFlowCommonHistResults%s",methodName.Data()));
1549 }
1550 else if(methodName=="GFC")
1551 {
1552 if(cumulantOrder==2)
1553 {
1554 commonHistRes = dynamic_cast<AliFlowCommonHistResults*> list[l]->FindObject("AliFlowCommonHistResults2ndOrderGFC");
1555 }
1556 else if(cumulantOrder==4)
1557 {
1558 commonHistRes = dynamic_cast<AliFlowCommonHistResults*> list[l]->FindObject("AliFlowCommonHistResults4thOrderGFC");
1559 }
1560 else if(cumulantOrder==6)
1561 {
1562 commonHistRes = dynamic_cast<AliFlowCommonHistResults*> list[l]->FindObject("AliFlowCommonHistResults6thOrderGFC");
1563 }
1564 else if(cumulantOrder==8)
1565 {
1566 commonHistRes = dynamic_cast<AliFlowCommonHistResults*> list[l]->FindObject("AliFlowCommonHistResults8thOrderGFC");
1567 }
1568 else
1569 {
1570 cout<<"WARNING: You have specified cumulant order to be "<<cumulantOrder<<" !!!!"<<endl;
1571 cout<<" That is really not funny.... "<<endl;
1572 }
1573 } // end of else if(methodName=="GFC")
1574 else if(methodName=="QC")
1575 {
1576 if(cumulantOrder==2)
1577 {
1578 commonHistRes = dynamic_cast<AliFlowCommonHistResults*> list[l]->FindObject("AliFlowCommonHistResults2ndOrderQC");
1579 }
1580 else if(cumulantOrder==4)
1581 {
1582 commonHistRes = dynamic_cast<AliFlowCommonHistResults*> list[l]->FindObject("AliFlowCommonHistResults4thOrderQC");
1583 }
1584 else if(cumulantOrder==6)
1585 {
1586 commonHistRes = dynamic_cast<AliFlowCommonHistResults*> list[l]->FindObject("AliFlowCommonHistResults6thOrderQC");
1587 }
1588 else if(cumulantOrder==8)
1589 {
1590 commonHistRes = dynamic_cast<AliFlowCommonHistResults*> list[l]->FindObject("AliFlowCommonHistResults8thOrderQC");
1591 }
1592 else
1593 {
1594 cout<<"WARNING: You have specified cumulant order to be "<<cumulantOrder<<" !!!!"<<endl;
1595 cout<<" There are no results for this cumulant order. "<<endl;
1596 }
1597 } // end of else if(methodName=="QC")
1598 } // end of if(temp.Contains(methodName.Data()))
1599 } // end of for(Int_t l=0;l<nMethods;l++)
1fca9c90 1600
60694576 1601 if(!commonHistRes)
1602 {
1603 //cout<<"WARNING: For a method "<<method.Data()<<" couldn't access the common hist result !!!!"<<endl;
1604 //cout<<" File absent? Or perhaps a typo in the method's name?"<<endl;
1605 if(methodName.Contains("GFC") || methodName.Contains("QC"))
e83922f2 1606 {
60694576 1607 //cout<<" Or impossible cumulant order? Otherwise.... :'( "<<endl;
e83922f2 1608 }
60694576 1609 }
1610
1fca9c90 1611
60694576 1612 // Finally, from commonHistRes access the required histogram:
1613 TH1D *hist = NULL;
1614 if(commonHistRes)
1615 {
1616 if(rfRpPoi == "RF")
e83922f2 1617 {
60694576 1618 hist = commonHistRes->GetHistIntFlow();
1619 } else if(rfRpPoi == "RP")
1620 {
1621 if(ptEta == "")
1622 {
1623 hist = commonHistRes->GetHistIntFlowRP();
1624 } else if(ptEta == "Pt")
1625 {
1626 hist = commonHistRes->GetHistDiffFlowPtRP();
1627 } else if(ptEta == "Eta")
1628 {
1629 hist = commonHistRes->GetHistDiffFlowEtaRP();
1630 }
1631 } else if(rfRpPoi == "POI")
1632 {
1633 if(ptEta == "")
1634 {
1635 hist = commonHistRes->GetHistIntFlowPOI();
1636 } else if(ptEta == "Pt")
1637 {
1638 hist = commonHistRes->GetHistDiffFlowPtPOI();
1639 } else if(ptEta == "Eta")
1640 {
1641 hist = commonHistRes->GetHistDiffFlowEtaPOI();
1642 }
1643 }
1644 }
21116a0c 1645
60694576 1646 return hist;
1fca9c90 1647
60694576 1648} // end of TH1D* GetResultHistogram(TString method, TString rfRpPoi, TString ptEta="")
1649
1650// ===========================================================================================
1651
1652void GlobalSettings()
1653{
1654 // Settings which will affect all plots.
947cc449 1655
60694576 1656 gROOT->SetStyle("Plain"); // default color is white instead of gray
1657 gStyle->SetOptStat(0); // remove stat. box from all histos
5c09ff70 1658 TGaxis::SetMaxDigits(4); // prefer exp notation for 5 and more significant digits
947cc449 1659
60694576 1660} // end of void GlobalSettings()
b25cc698 1661
60694576 1662// ===========================================================================================
1663
1664void LoadLibrariesCFR(const libModes analysisMode) {
b25cc698 1665
1666 //--------------------------------------
1667 // Load the needed libraries most of them already loaded by aliroot
1668 //--------------------------------------
ad87ae62 1669 //gSystem->Load("libTree");
5d040cf3 1670 gSystem->Load("libGeom");
1671 gSystem->Load("libVMC");
1672 gSystem->Load("libXMLIO");
1673 gSystem->Load("libPhysics");
b25cc698 1674
1675 //----------------------------------------------------------
1676 // >>>>>>>>>>> Local mode <<<<<<<<<<<<<<
1677 //----------------------------------------------------------
60694576 1678 if (analysisMode==mLocal) {
b25cc698 1679 //--------------------------------------------------------
1680 // If you want to use already compiled libraries
1681 // in the aliroot distribution
1682 //--------------------------------------------------------
60694576 1683
1684 //==================================================================================
1685 //load needed libraries:
1686 gSystem->AddIncludePath("-I$ROOTSYS/include");
1687 //gSystem->Load("libTree");
1688
1689 // for AliRoot
1690 gSystem->AddIncludePath("-I$ALICE_ROOT/include");
1691 gSystem->Load("libANALYSIS");
2e311896 1692 gSystem->Load("libPWGflowBase");
1693 //cerr<<"libPWGflowBase loaded ..."<<endl;
60694576 1694
b25cc698 1695 }
1696
60694576 1697 else if (analysisMode==mLocalSource) {
1698
b25cc698 1699 // In root inline compile
60694576 1700
1701 // Constants
2e311896 1702 gROOT->LoadMacro("BaseAliFlowCommonConstants.cxx+");
1703 gROOT->LoadMacro("BaseAliFlowLYZConstants.cxx+");
d90df6c3 1704
1705 // Flow event
2e311896 1706 gROOT->LoadMacro("BaseAliFlowVector.cxx+");
1707 gROOT->LoadMacro("BaseAliFlowTrackSimple.cxx+");
1708 gROOT->LoadMacro("BaseAliFlowTrackSimpleCuts.cxx+");
1709 gROOT->LoadMacro("BaseAliFlowEventSimple.cxx+");
b25cc698 1710
1711 // Output histosgrams
2e311896 1712 gROOT->LoadMacro("BaseAliFlowCommonHist.cxx+");
1713 gROOT->LoadMacro("BaseAliFlowCommonHistResults.cxx+");
1714 gROOT->LoadMacro("BaseAliFlowLYZHist1.cxx+");
1715 gROOT->LoadMacro("BaseAliFlowLYZHist2.cxx+");
60694576 1716
b25cc698 1717 cout << "finished loading macros!" << endl;
1718
1719 }
1720
60694576 1721} // end of void LoadLibrariesCFR(const libModes analysisMode)
b25cc698 1722