]> git.uio.no Git - u/mrichter/AliRoot.git/blame - ANALYSIS/macros/PhysSelQA/AliPSQAVisualization.cxx
end-of-line normalization
[u/mrichter/AliRoot.git] / ANALYSIS / macros / PhysSelQA / AliPSQAVisualization.cxx
CommitLineData
a65a7e70 1/////////////////////////////////////
2// Created by: Kevin McDermott //
3// email: kmcderm3@nd.edu //
4// CERN Summer Student 2012 //
5// University of Notre Dame du Lac //
6// //
7// Revision: 1.0 //
8// Created on: August 6, 2012 //
9/////////////////////////////////////
10
11#include "AliPSQAVisualization.h"
12
13ClassImp(AliPSQAVisualization)
14
15AliPSQAVisualization::AliPSQAVisualization(): // Default constructor
16TObject(),
17fRunNumbers(0),
18fFillNumbers(0),
19fRawRunNumbers(0),
20fRawFillNumbers(0),
21fNRuns(0),
22fNRawRuns(0),
23fFillSeparationLine(0x0)
24{
25 // Initialize some private data members from AliPSQAV
26 fInDirectory = "";
27 fROOTInput = "";
28 fRunFillFile = "";
29 fSavePDFs = kFALSE;
30 fOutDirectory = "";
31 fOutPDFName = "";
32 fOutEPSName = "";
33 fDrawOverPlot = kFALSE;
34 fOverPlotTitle = "";
35 fMaximum = -1000;
36 fMinimum = 1000;
37 fScaleAuto = kFALSE;
38 fUseColorArray = kFALSE;
39 fMultMax = 0;
40 fDivMin = 0;
41 InitializeColorArray("");
42 InitializeSelectedPlots("");
43}
44
45//________________________________________________________________________________________________
46AliPSQAVisualization::~AliPSQAVisualization(){
47 delete[] fCanvas;
48 delete[] fDrawPlot;
49 delete[] fFillSeparationLine;
50 delete[] fSelectedPlots;
51 delete[] fColors;
52 delete fOverLegend;
53}
54
55//________________________________________________________________________________________________
56void AliPSQAVisualization::InitializeColorArray(const Char_t * listOfColors){ // Function to custom set color array used for plots, not essential
57 Color_t colors; //color enums from list
58 ifstream input_data_col; //text file object
59 input_data_col.open(listOfColors, ios::in ); //open the text file
60 Int_t Ncol = 0; //number of color names to be used
61
62 while ( input_data_col >> colors ) { // count number of color names
63 Ncol++;
64 }
65
66 fNColors = Ncol; // Set private data member to total color names to be used
67 input_data_col.close(); // reset the file
68
69 fColors = new Color_t [fNColors]; // initialize private data member with number of trig names
70 input_data_col.open(listOfColors, ios::in );
71 for (Int_t icol = 0; icol < fNColors; icol++){
72 input_data_col >> fColors[icol];
73 }
74
75 input_data_col.close();
76}
77
78//________________________________________________________________________________________________
79void AliPSQAVisualization::InitializeSelectedPlots(const Char_t * listOfPlots){
80 TString plotnames; //plot names from list
81 ifstream input_data_pn; //text file object
82 if(!listOfPlots) cout << "No list of plots" << endl;
83 input_data_pn.open(listOfPlots, ios::in ); //open the text file
84 Int_t Npn = 0; //number of plot names to be used
85
86 while ( input_data_pn >> plotnames ) { // count number of plot names
87 Npn++;
88 }
89
90 cout << "Number of initalized plots = " << Npn << endl;
91
92 fNSelectedPlots = Npn; // Set private data member to total plot names to be used
93 input_data_pn.close(); // reset the file
94 //cout << "Number of selected plots = " << fNSelectedPlots << endl;
95 fSelectedPlots = new TString [fNSelectedPlots]; // initialize private data member with number of trig names
96 input_data_pn.open(listOfPlots, ios::in );
97 for (Int_t iplot = 0; iplot < fNSelectedPlots; iplot++){
98 input_data_pn >> fSelectedPlots[iplot];
99 //cout << "Plots to process :" << fSelectedPlots[iplot] << endl;
100 }
101
102 input_data_pn.close();
103}
104
105//________________________________________________________________________________________________
106void AliPSQAVisualization::PostProcessQA(){
107
108 if(!fROOTInput) cout << "No .root file found" << endl;
109
110 //cout << "Sto morendo qua? 1" << endl;
111 gStyle->SetOptStat(0);
112 gStyle->SetPalette(1);
113 gStyle->SetFillColor(10);
114 gStyle->SetOptStat(0);
115 gStyle->SetOptTitle(1);
116 // do not use scientific notation for run number
117 TGaxis::SetMaxDigits(6);
118 //cout << "Sto morendo qua? 2" << endl;
119 ConvertTGraphErrorsToTH1Ds(); // Convert all plots to TH1D's from specified plot list
120 //cout << "Sto morendo qua? 3" << endl;
121 fCanvas = new TCanvas[fNSelectedPlots]; // Allocate memory for the canvases to draw PostProcessing
122
123 if ((fDrawOverPlot) || (fSaveOverPlotPDF) || (fSaveOverPlotEPS)){
124 fOverLegend = new TLegend(0.55,0.625,.75,.85);
125 if (fScaleAuto){
126 ScaleMinAndMax();
127 }
128 }
129
130 if ((fSavePDFs) || (fSaveOverPlotPDF) || (fSaveOverPlotEPS)){
131 FileStat_t dummy_filestat;
132 if (gSystem->GetPathInfo(fOutDirectory.Data(), dummy_filestat) == 1) { // cache directory does not exist
133 MakeDir(fOutDirectory);
134 }
135 }
136
137 // *************************************** LOOP ON PLOTS ***************************************
138
139 for (Int_t iplot = 0; iplot < fNSelectedPlots; iplot++){ // Loop over the number of plots to be made pretty and drawn
140 DrawSelected(iplot); // Draw the Selected plots, decide later whether to have them open/save them
141
142 DrawSameTriggerOnSameCA(iplot);
143 cout << "Draw selected - OK " << endl;
144
145 if (fSavePDFs){ // Write the canvas to the PDF file if kTRUE
146 SavePDFs(iplot);
147 SaveToPDFSeparately(iplot);
148 }
149
150 if (!fDrawSelected){ // Close the canvas if you do not want to see the plot
151 fCanvas[iplot].Close();
152 }
153
154 if ( (fDrawOverPlot) || (fSaveOverPlotPDF) || (fSaveOverPlotEPS) ) { // Set points and draw overplot if any are true
155 if (fUseColorArray){
156 DrawOverPlotCA(iplot);
157 }
158 else{
159 DrawOverPlotNoCA(iplot);
160 }
161 }
162 else if( (!fDrawOverPlot) && ( (fSaveOverPlotPDF) || (fSaveOverPlotEPS) ) ) { // Set the points to save to and/or pdf/eps but then close it outside the loop
163 if (fUseColorArray){
164 DrawOverPlotCA(iplot);
165 }
166 else{
167 DrawOverPlotNoCA(iplot);
168 }
169 }
170
171 } // end loop on plots
172
173 if (fSaveOverPlotPDF){ // Save the overplot to pdf
174 SaveOverPlotPDF();
175 }
176 if (fSaveOverPlotEPS){ // Save the overplot to eps
177 SaveOverPlotEPS();
178 }
179 if (!fDrawOverPlot){ // Close if you do not want to see it
180 fOverCanvas.Close();
181 }
182}
183
184//________________________________________________________________________________________________
185Int_t AliPSQAVisualization::MatchGoodRunToFillNumber(Int_t runnumber){
186
187 Int_t fill = -1;
188
189 for(Int_t irun = 0; irun < fNRawRuns; irun++){
190 if(runnumber == fRawRunNumbers[irun]){
191 fill = fRawFillNumbers[irun];
192 // cout << runnumber << " matched to fill " << fill << endl;
193 }
194 }
195 // cout << "Matching completed" << endl;
196 return fill;
197}
198
199//________________________________________________________________________________________________
200Int_t AliPSQAVisualization::MatchGoodRunToStats(Int_t runnumber){
201
202 Int_t Stats = -1;
203
204 for(Int_t irun = 0; irun < fNRawRuns; irun++){
205 if(runnumber == fRawRunNumbers[irun]){
206 Stats = fRawRunStats[irun];
207 // cout << runnumber << " matched to fill " << fill << endl;
208 }
209 }
210
211 // cout << "Matching completed" << endl;
212 return Stats;
213}
214
215//________________________________________________________________________________________________
216void AliPSQAVisualization::ConvertTGraphErrorsToTH1Ds(){
217
218 cout << "********************** C O N V E R T I N G TGRAPHS T O T H 1 D" << endl;
219
220 fRootFile = TFile::Open(Form("%s",fROOTInput.Data()));
221 cout << "Opening file " << fROOTInput.Data() << endl;
222
223 fDrawPlot = new TH1D[fNSelectedPlots]; // Array of TH1D's to be converted
224 fNDiffFills = new Int_t[fNSelectedPlots];
225 fFillSeparationLine = new TLine*[fNSelectedPlots];
226
227 for (Int_t iplot = 0; iplot < fNSelectedPlots; iplot++){
228 // Variables from the old TGraphErrors needed to draw TH1Fs
229 // Uncomment if seg fault returns TGraph::GetX (this=0x0), as last printout will say which graph is not correct
230 // cout << fInDirectory.Data() << "/" << fROOTInput.Data() << ": " << fSelectedPlots[iplot].Data() << endl;
231 fNDiffFills[iplot] = 0;
232
233 // cout << "Problem is here? " << fSelectedPlots[iplot].Data() << endl;
234 TGraphErrors * TGEplot = (TGraphErrors*) fRootFile->Get(fSelectedPlots[iplot].Data());
235 if(!TGEplot) {
236 // cout << "Missing plot @ step " << iplot << "plot is -> " << fSelectedPlots[iplot].Data() << endl;
237 continue;
238 }
239
240 Double_t * TGEx = TGEplot->GetX(); // needed to properly index the x-axis (run numbers)
241 Double_t * TGEy = TGEplot->GetY(); // array of double_t's, qaval
242 Int_t TGEnpoints = TGEplot->GetN(); // number of points used in the TGE
243 Double_t * TGEey = TGEplot->GetEY(); // array of double_t's corresponding to the errors in the TGE
244 TString TGEname = TGEplot->GetName();
245 TString TGEtitle = TGEplot->GetTitle();
246
247 // TGEx = new Double_t[TGEnpoints];
248
249 fNRuns = TGEnpoints;
250 fRunNumbers = new Int_t[fNRuns];
251 fFillNumbers = new Int_t[fNRuns];
252 fBinArray = new Int_t[fNRuns];
253
254 for (Int_t irun=0; irun<TGEnpoints; irun++){
255 fRunNumbers[irun] = TGEx[irun];
256 fFillNumbers[irun] = MatchGoodRunToFillNumber(fRunNumbers[irun]);
257 cout << "Run number [" << irun << "] - " << fRunNumbers[irun] << " - " << fFillNumbers[irun] << endl;
258 fBinArray[irun] = irun;
259 }
260
261 // make tlines to identify different
262
263 // Parameters for the to be drawn TH1D
264 TString TH1Dname = TGEname.Data();
265 TH1Dname += "_TH1D";
266 TString TH1Dtitle = TGEtitle.Data();
267 TH1Dtitle += " TH1D";
268 // See Below for the strange numbering of bins
269
270 Int_t TH1Dxnbin = TGEnpoints;
271 Int_t TH1Dxlow = 1;
272 Int_t TH1Dxhigh = TH1Dxnbin + 1;
273 // Declare the new plot to be drawn as a TH1D
274
275 fDrawPlot[iplot].SetBins(TH1Dxnbin, TH1Dxlow, TH1Dxhigh); // start with bin label 1, up through bin number +1 (TH1D bin numbering has strange conventions, as zero bin is the underflow bin)
276
277 fDrawPlot[iplot].SetNameTitle(TH1Dname.Data(),TH1Dtitle.Data());
278 fDrawPlot[iplot].GetXaxis()->SetTitle("Run Number");
279 TString TH1Dytitle = SetDrawSelectedYTitle(TGEtitle);
280 fDrawPlot[iplot].SetYTitle(TH1Dytitle.Data());
281
282 cout << "==================== TEST ============= " << endl;
283 cout << "-------------------- iplot = " << iplot << endl;
284
285 for (Int_t ibin = 1; ibin < TH1Dxnbin+1; ibin++){ // everything shifted off by one because tgraph starts at zero, th1f starts bins at 1
286 fDrawPlot[iplot].SetBinContent(fDrawPlot[iplot].FindBin(ibin),TGEy[ibin-1]); // y[i-1] is the bin in plot
287 fDrawPlot[iplot].SetBinError(fDrawPlot[iplot].FindBin(ibin),TGEey[ibin-1]);
288
289 if(ibin< TH1Dxnbin){
290 if(fFillNumbers[ibin]!=fFillNumbers[ibin-1]){
291 cout << "New fill @ " << ibin << endl;
292 cout << "Run @ "<< ibin-1 << " = " << fRunNumbers[ibin-1] <<" corresponding to fill " << fFillNumbers[ibin-1] << "; Crosscheck on bin array = " << fBinArray[ibin-1] << endl;
293 cout << "Run @ "<< ibin << " = " << fRunNumbers[ibin] <<" corresponding to fill " << fFillNumbers[ibin] << endl;
294 fNDiffFills[iplot]++;
295 cout << "****************************************" << endl;
296 }
297 }
298
299 Int_t TH1Dx = Int_t(TGEx[ibin-1]); // x[i-1] = actual bin label in plot
300 TString TH1DxBinLabel = Form("%i",TH1Dx);
301
302 cout << "TH1DxBinLabel = " << TH1DxBinLabel << endl;
303
304 fDrawPlot[iplot].GetXaxis()->SetBinLabel(fDrawPlot[iplot].FindBin(ibin), TH1DxBinLabel.Data());
305 fDrawPlot[iplot].GetXaxis()->SetTitleSize(.05); // default = 4%, made it 5%
306
307 } // end of loop on bins
308
309 fFillSeparationLine[iplot] = new TLine[fNDiffFills[iplot]];
310
311 TLine * newline = new TLine[fNDiffFills[iplot]];
312
313 cout << "Number of different fills = " << fNDiffFills[iplot] << " for iplot index = " << iplot << endl;
314 cout << "==================== END TEST ============= " << endl;
315
316 //looping again on the bins of the TGE -> filling the TLines
317
318 Int_t fillindex = 0;
319 for (Int_t ibin = 1; ibin < TH1Dxnbin+1; ibin++){
320
321 if(ibin<TH1Dxnbin){
322 if(fFillNumbers[ibin]!=fFillNumbers[ibin-1]){
323 //newline[fillindex].SetX1((0.5*(fFillNumbers[ibin-1]+fFillNumbers[ibin])));
324 //newline[fillindex].SetX2((0.5*(fFillNumbers[ibin-1]+fFillNumbers[ibin])));
325 // newline[fillindex].SetX1((0.5*((ibin-1)+ibin)));
326 // newline[fillindex].SetX2((0.5*((ibin-1)+ibin)));
327 newline[fillindex].SetX1(ibin+1);
328 newline[fillindex].SetX2(ibin+1);
329 newline[fillindex].SetY1(0.);
330 newline[fillindex].SetY2(1.);
331 cout << "setting line @ = " << ((0.5*((ibin-1)+ibin))) << endl;
332
333 fFillSeparationLine[iplot][fillindex] = newline[fillindex];
334
335 fillindex++;
336 } // end if on checking different run numbers
337 }// end if
338 }// endl loop on bins
339
340
341 //
342 // adding some drawing options
343 //
344 fDrawPlot[iplot].SetMarkerStyle(20);
345 fDrawPlot[iplot].SetMarkerSize(1.4);
346 fDrawPlot[iplot].SetMarkerColor(kBlue);
347 fDrawPlot[iplot].SetLineColor(kBlue);
348 fDrawPlot[iplot].GetYaxis()->SetRangeUser(-0.001,1.05);
349 fDrawPlot[iplot].GetXaxis()->LabelsOption("V");
350 } // end loop on plots
351
352 cout << "********************** E N D C O N V E R T I N G TGRAPHS T O T H 1 D" << endl;
353
354}
355
356//________________________________________________________________________________________________
357TString AliPSQAVisualization::SetDrawSelectedYTitle(TString TGEtitle){
358
359 Ssiz_t start = 0;
360 Ssiz_t first_o = TGEtitle.First('o'); // o in over, lowercase o that appears first is the over
361 Ssiz_t first_f = TGEtitle.First('f');
362
363 TString label[2];
364 label[0] = TString(TGEtitle( start , first_o - start - 1)); // Shift one over from the 'h'
365 label[1] = TString(TGEtitle( first_o + 4, first_f - first_o - 4 )); //Shift five over from the 'O'
366
367 // Make this substitution to make legend smaller
368
369 if (label[1].Contains("Trigger class")){
370 label[1].ReplaceAll("Trigger class","All");
371 }
372
373 TString yTH1Dtitle = label[0];
374 yTH1Dtitle += " / ";
375 yTH1Dtitle += label[1];
376
377 return yTH1Dtitle;
378}
379
380//________________________________________________________________________________________________
381void AliPSQAVisualization::ScaleMinAndMax(){ // Get maximum and minimum value of traghs to set bounds for overplot
382 Double_t tmp_max; // max values from tgraphs
383 Double_t tmp_min; // min values from tgraphs
384
385 for (Int_t iplot = 0; iplot < fNSelectedPlots; iplot++){ // Loop over the number of plots to be made
386 // Set maximum
387 tmp_max = fDrawPlot[iplot].GetMaximum();
388 if (tmp_max > fMaximum){
389 fMaximum = tmp_max;
390 }
391 // Set minimum
392 tmp_min = fDrawPlot[iplot].GetMinimum();
393 if (tmp_max < fMinimum){
394 fMinimum = tmp_min;
395 }
396 }
397
398 // Set the min to be lower and max to be higher so that all points can be seen
399 fMaximum *= fMultMax;
400 fMinimum /= fDivMin;
401}
402
403//________________________________________________________________________________________________
404void AliPSQAVisualization::MakeDir(TString dir){ // have to pass a private data member, kinda ugly, but otherwise use sentinel values or copy this function three times... taken from AliPSQA
405 TString mkDir = "mkdir -p ";
406 mkDir += dir.Data();
407 gSystem->Exec(mkDir); // mkdir for the cache/output
408}
409
410//________________________________________________________________________________________________
411void AliPSQAVisualization::ImportRunAndFillInfo(const Char_t * listOfRunsAndFills){
412
413 Int_t run_num; //run number from list
414 ifstream input_runsandfill; //text file object
415 input_runsandfill.open(listOfRunsAndFills,ios::in ); //open the text file
416
417 Int_t NRuns = 0; //number of runs to be processed
418 while(input_runsandfill >> run_num) { // count number of runs
419 NRuns++;
420 }
421 input_runsandfill.close();
422 cout << "In total there are " << NRuns << " runs in file " << endl;
423
424 fNRawRuns = NRuns/3;
425 fRawFillNumbers = new Int_t[fNRawRuns];
426 fRawRunNumbers = new Int_t[fNRawRuns];
427 fRawRunStats = new Int_t[fNRawRuns];
428
429 input_runsandfill.open(listOfRunsAndFills,ios::in );
430
431 for(Int_t irun = 0; irun < fNRawRuns; irun++){
432 input_runsandfill >> fRawRunNumbers[irun] >> fRawFillNumbers[irun] >> fRawRunStats[irun];
433 cout << irun << " - " << fRawRunNumbers[irun] << " - " << fRawFillNumbers[irun] << " - stats = " << fRawRunStats[irun] << endl;
434 }
435 cout << "DONE " << endl;
436 input_runsandfill.close();
437 cout << "DONE DONE" << endl;
438}
439
440//________________________________________________________________________________________________
441void AliPSQAVisualization::DrawSelected(Int_t iplot){
442 fCanvas[iplot].cd(); // write to this canvas first
443 fCanvas[iplot].SetBottomMargin(0.15); // default 0.15
444 fCanvas[iplot].SetRightMargin(0.02);
445 /*
446 cout << ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> " << endl;
447 cout << "iplot = " << iplot << endl;
448 cout << "Number of different fills for this plot " << fNDiffFills[iplot] << endl;
449 cout << "Plot name " << fSelectedPlots[iplot] << endl;
450 cout << " " << endl;
451 // here run check
452 */
453 fDrawPlot[iplot].GetXaxis()->SetTitleOffset(1.6);
454
455 fDrawPlot[iplot].Draw("E P X0"); // draw the new plot to canvas
456
457 cout << "Drawing " << fSelectedPlots[iplot] << endl;
458
459 TLine * line = new TLine[fNDiffFills[iplot]];
460 for (Int_t lineIndex = 0; lineIndex < fNDiffFills[iplot]; lineIndex++){
461 // cout << "Index pf plots that are processed = (" << iplot << "," << lineIndex << ")" << endl;
462 // cout << "Copying line " << lineIndex << endl;
463 line[lineIndex] = fFillSeparationLine[iplot][lineIndex];
464 // cout << "Copied - drawing line " << lineIndex << endl;
465 line[lineIndex].Draw("same");
466 // cout << "Drawn line " << lineIndex << endl;
467 // cout << "*****************" << endl;
468 }// endl loop on bins
469 // cout << "COMPLETED " << endl;
470
471}
472//________________________________________________________________________________________________
473void AliPSQAVisualization::DrawSameTriggerOnSameCA(Int_t iplot){
474
475 Bool_t containsstring = kFALSE;
476
477 containsstring = fSelectedPlots[iplot].Contains("kINT7",TString::kExact);
478
479 if(containsstring) cout << iplot << " - Sting " << fSelectedPlots[iplot] << " - contains string: yes " << endl;
480 else cout << iplot << " - Sting " << fSelectedPlots[iplot] << " - contains string: no " << endl;
481}
482
483
484//________________________________________________________________________________________________
485void AliPSQAVisualization::DrawOverPlotCA(Int_t iplot){
486 if (iplot == 0){
487 fOverCanvas.cd();
488 fDrawPlot[iplot].SetMarkerColor(fColors[iplot]); // iplot == 0 for Color_t == white...
489 fDrawPlot[iplot].SetMarkerStyle(Style_t(iplot+20)); // 20 = big circle, afterwards, useful styles, otherwise too small
490 fDrawPlot[iplot].SetLineColor(fColors[iplot]);
491 fDrawPlot[iplot].SetTitle(fOverPlotTitle);
492 fOverLegend->AddEntry(&fDrawPlot[iplot],fDrawPlot[iplot].GetYaxis()->GetTitle(),"lep");
493 fDrawPlot[iplot].GetYaxis()->SetTitle("");
494 fDrawPlot[iplot].GetYaxis()->SetRangeUser(fMinimum, fMaximum);
495 // adding fill lines
496
497 // end adding fill lines
498 fDrawPlot[iplot].Draw("E P X0");
499 }
500 else if (iplot == (fNSelectedPlots - 1) ){
501 fOverCanvas.cd();
502 fDrawPlot[iplot].SetMarkerColor(fColors[iplot]);
503 fDrawPlot[iplot].SetMarkerStyle(Style_t(iplot+20)); // 20 = big circle, afterwards, useful styles, otherwise too small
504 fDrawPlot[iplot].SetLineColor(fColors[iplot]);
505 fDrawPlot[iplot].SetTitle(fOverPlotTitle);
506 fOverLegend->AddEntry(&fDrawPlot[iplot],fDrawPlot[iplot].GetYaxis()->GetTitle(),"lep");
507 fDrawPlot[iplot].GetYaxis()->SetTitle("");
508 fDrawPlot[iplot].Draw("E P X0 SAME");
509 // fOverLegend->Draw();
510 }
511 else{
512 fOverCanvas.cd();
513 fDrawPlot[iplot].SetMarkerColor(fColors[iplot]);
514 fDrawPlot[iplot].SetMarkerStyle(Style_t(iplot+20)); // 20 = big circle, afterwards, useful styles, otherwise too small
515 fDrawPlot[iplot].SetLineColor(fColors[iplot]);
516 fDrawPlot[iplot].SetTitle(fOverPlotTitle);
517 fOverLegend->AddEntry(&fDrawPlot[iplot],fDrawPlot[iplot].GetYaxis()->GetTitle(),"lep");
518 fDrawPlot[iplot].GetYaxis()->SetTitle("");
519 fDrawPlot[iplot].Draw("E P X0 SAME");
520 }
521}
522
523//________________________________________________________________________________________________
524void AliPSQAVisualization::DrawOverPlotNoCA(Int_t iplot){
525 if (iplot == 0){
526 fOverCanvas.cd();
527 fDrawPlot[iplot].SetMarkerColor(Color_t(iplot+1)); // iplot == 0 for Color_t == white...
528 fDrawPlot[iplot].SetMarkerStyle(Style_t(iplot+20)); // 20 = big circle, afterwards, useful styles, otherwise too small
529 fDrawPlot[iplot].SetLineColor(Color_t(iplot+1));
530 fDrawPlot[iplot].SetTitle(fOverPlotTitle);
531 fOverLegend->AddEntry(&fDrawPlot[iplot],fDrawPlot[iplot].GetYaxis()->GetTitle(),"lep");
532 fDrawPlot[iplot].GetYaxis()->SetTitle("");
533 fDrawPlot[iplot].GetYaxis()->SetRangeUser(fMinimum, fMaximum);
534 fDrawPlot[iplot].Draw("E P X0");
535 }
536 else if (iplot == (fNSelectedPlots - 1) ){
537 fOverCanvas.cd();
538 fDrawPlot[iplot].SetMarkerColor(Color_t(iplot+1));
539 fDrawPlot[iplot].SetMarkerStyle(Style_t(iplot+20)); // 20 = big circle, afterwards, useful styles, otherwise too small
540 fDrawPlot[iplot].SetLineColor(Color_t(iplot+1));
541 fDrawPlot[iplot].SetTitle(fOverPlotTitle);
542 fOverLegend->AddEntry(&fDrawPlot[iplot],fDrawPlot[iplot].GetYaxis()->GetTitle(),"lep");
543 fDrawPlot[iplot].GetYaxis()->SetTitle("");
544 fDrawPlot[iplot].Draw("E P X0 SAME");
545 fOverLegend->Draw();
546 }
547 else{
548 fOverCanvas.cd();
549 fDrawPlot[iplot].SetMarkerColor(Color_t(iplot+1));
550 fDrawPlot[iplot].SetMarkerStyle(Style_t(iplot+20)); // 20 = big circle, afterwards, useful styles, otherwise too small
551 fDrawPlot[iplot].SetLineColor(Color_t(iplot+1));
552 fDrawPlot[iplot].SetTitle(fOverPlotTitle);
553 fOverLegend->AddEntry(&fDrawPlot[iplot],fDrawPlot[iplot].GetYaxis()->GetTitle(),"lep");
554 fDrawPlot[iplot].GetYaxis()->SetTitle("");
555 fDrawPlot[iplot].Draw("P SAME");
556 }
557}
558
559//________________________________________________________________________________________________
560void AliPSQAVisualization::SaveToPDFSeparately(Int_t iplot){
561 cout << "Saving: " << fOutDirectory << "/" << fSelectedPlots[iplot] <<".pdf"<<endl;
562 fCanvas[iplot].SaveAs(Form("%s/%s.pdf",fOutDirectory.Data(),fSelectedPlots[iplot].Data()));
563}
564
565//________________________________________________________________________________________________
566void AliPSQAVisualization::SavePDFs(Int_t iplot){
567 if ( iplot == 0 ){ // Open the PDF file if to be saved and save the first plot
568 fCanvas[iplot].Print(Form("%s/%s(",fOutDirectory.Data(),fOutPDFName.Data()),"pdf");
569 }
570 else if ( (iplot == (fNSelectedPlots - 1)) && (!fSaveOverPlotPDF) ){ // Close the PDF and save the last plot
571 fCanvas[iplot].Print(Form("%s/%s)",fOutDirectory.Data(),fOutPDFName.Data()),"pdf");
572 fCanvas[iplot].SaveAs(Form("%s/%s_%d.pdf",fOutDirectory.Data(),fOutPDFName.Data(),iplot));
573 }
574 else{ // Save the PDF with the inbetween plots
575 fCanvas[iplot].Print(Form("%s/%s",fOutDirectory.Data(),fOutPDFName.Data()),"pdf");
576 }
577}
578
579//________________________________________________________________________________________________
580void AliPSQAVisualization::SaveOverPlotPDF(){
581 fOverCanvas.cd();
582 if (fSavePDFs){
583 fOverCanvas.Print(Form("%s/%s)",fOutDirectory.Data(),fOutPDFName.Data()),"pdf");
584 }
585 else{
586 fOverCanvas.Print(Form("%s/%s",fOutDirectory.Data(),fOutPDFName.Data()),"pdf");
587 }
588}
589
590//________________________________________________________________________________________________
591void AliPSQAVisualization::SaveOverPlotEPS(){
592 fOverCanvas.cd();
593 fOverCanvas.Print(Form("%s/%s",fOutDirectory.Data(),fOutEPSName.Data()),"eps");
594}
595
596//________________________________________________________________________________________________
597
598