Major overhaul of the QA code.
[u/mrichter/AliRoot.git] / PWG2 / FORWARD / analysis2 / qa / QABase.h
1 /**
2  * @file   QABase.h
3  * @author Christian Holm Christensen <cholm@nbi.dk>
4  * @date   Thu Nov 17 11:58:11 2011
5  * 
6  * @brief  Base class for QA active classes
7  * 
8  * @ingroup pwg2_forward_qa_scripts
9  * 
10  */
11 #ifndef QABASE_H
12 #define QABASE_H
13 #ifndef __CINT__
14 # include <TTree.h>
15 # include <TFile.h>
16 # include <TError.h>
17 # include <TCanvas.h>
18 # include <TSystem.h>
19 # include <fstream>
20 # include <TLatex.h>
21 # include <TStyle.h>
22 # include "QARing.h"
23 #else
24 class TTree;
25 class TFile;
26 class QARing;
27 class Global;
28 class TCanvas;
29 #endif
30
31 /**
32  * Base class for active QA classes.  This manages the I/O files, like
33  * the tree file, the LaTeX file, and the storage file 
34  * 
35  * @ingroup pwg2_forward_qa_scripts
36  */
37 struct QABase 
38 {
39   /** 
40    * Constructor
41    * 
42    * @param single  If true, only process one file. 
43    */
44   QABase(Bool_t single=false) 
45     : fFMD1i(0),
46       fFMD2i(0),
47       fFMD2o(0),
48       fFMD3i(0),
49       fFMD3o(0),
50       fGlobal(0),
51       fTree(0), 
52       fOutput(0), 
53       fStore(0),
54       fTeX(0), 
55       fTeXName(""),
56       fToDelete(""),
57       fCanvas(0), 
58       fSingle(single)
59   {}
60   /** 
61    * Copy constructor 
62    * 
63    * @param o Object to copy from 
64    */
65   QABase(const QABase& o)
66     : fFMD1i(o.fFMD1i),
67       fFMD2i(o.fFMD2i),
68       fFMD2o(o.fFMD2o),
69       fFMD3i(o.fFMD3i),
70       fFMD3o(o.fFMD3o),
71       fGlobal(o.fGlobal),
72       fTree(o.fTree), 
73       fOutput(o.fOutput),
74       fStore(o.fStore),
75       fTeX(o.fTeX), 
76       fTeXName(o.fTeXName),
77       fToDelete(o.fToDelete),
78       fCanvas(o.fCanvas),
79       fSingle(o.fSingle)
80   {}
81   /** 
82    * Assignment operator
83    * 
84    * @return Reference to this object
85    */
86   QABase& operator=(const QABase&) { return *this; }
87   /** 
88    * Desctructor 
89    */
90   virtual ~QABase()
91   {
92     if (fFMD1i)  { delete fFMD1i; }
93     if (fFMD2i)  { delete fFMD2i; }
94     if (fFMD2o)  { delete fFMD2o; }
95     if (fFMD3i)  { delete fFMD3i; }
96     if (fFMD3o)  { delete fFMD3o; }
97     if (fGlobal) { delete fGlobal; } 
98     if (fTree)   { delete fTree; } 
99     if (fOutput) { delete fOutput; }
100     if (fStore)  { delete fStore; }
101     if (fTeX)    { fTeX->close(); fTeX = 0; }
102   }
103   /** 
104    * The name of the TTree output file
105    * 
106    * @return Output file name 
107    */
108   const char* OutputName() const { return "forward_trend.root"; }
109   /** 
110    * Initialize 
111    * 
112    * @param read If true initialise for reading tree file
113    *
114    * @return True on success
115    */
116   Bool_t Init(bool read=false)
117   {
118     fToDelete = "";
119     if (!fSingle) { 
120       fOutput = new TFile(OutputName(), (read ? "READ" : "RECREATE"));
121       if (!fOutput) { 
122         Error("Init", "Failed to open output file");
123         return false;
124       }
125       if (read) fTree   = static_cast<TTree*>(fOutput->Get("T"));
126       else      fTree   = new TTree("T", "T");
127     }
128     if (read) fGlobal = Global::SetBranch(fTree);
129     else      fGlobal = Global::MakeBranch(fTree);
130       
131     fFMD1i->Init(fTree, read);
132     fFMD2i->Init(fTree, read);
133     fFMD2o->Init(fTree, read);
134     fFMD3i->Init(fTree, read);
135     fFMD3o->Init(fTree, read);
136
137     return true;
138   }
139   /** 
140    * Make a canvas, LaTeX file, and storage file 
141    * 
142    * @param title Title of canvas and files
143    */
144   void MakeCanvas(const char* title)
145   {
146     fTeX = new std::ofstream(Form("%s.tex", fTeXName.Data()));
147     
148     *fTeX << "\\documentclass[landscape,a4paper,12pt]{article}\n"
149           << "\\usepackage[margin=2cm,a4paper]{geometry}\n"
150           << "\\usepackage{graphicx}\n"
151           << "\\title{{\\Huge\\bf " << title << "}}\n"
152           << "\\author{{\\LARGE FMD Team}}\n"
153           << "\\date{{\\Large \\today}}\n"
154           << "\\begin{document}\n"
155           << "\\thispagestyle{empty}\n"
156           << "\\maketitle" << std::endl;
157
158     gStyle->SetPalette(1);
159     gStyle->SetOptFit(0);
160     gStyle->SetOptStat(0);
161     gStyle->SetOptTitle(1);
162     gStyle->SetTitleW(.4);
163     gStyle->SetTitleH(.1);
164     // gStyle->SetTitleColor(0);
165     gStyle->SetTitleStyle(0);
166     gStyle->SetTitleBorderSize(0);
167     gStyle->SetTitleX(.6);
168
169     fCanvas = new TCanvas("qa", title, 900, 700);
170     fCanvas->SetFillColor(0);
171     fCanvas->SetBorderSize(0);
172     fCanvas->SetLeftMargin(0.15);
173     fCanvas->SetRightMargin(0.02);
174     fCanvas->SetTopMargin(0.10);
175     fCanvas->SetBottomMargin(0.10);
176
177     fStore = TFile::Open(Form("%s.root", fTeXName.Data()), "RECREATE");
178     if (!fStore) 
179       Warning("MakeCanvas", "Failed to make store %s.root", fTeXName.Data());
180     
181     fToDelete = "";
182   }
183   /** 
184    * Put a title on the canvas.  Also clears page in LaTeX file
185    * 
186    * @param title Title
187    */
188   void CanvasTitle(const char* title)
189   {
190     if (!fCanvas) return;
191
192     fCanvas->cd();
193     fCanvas->Clear();
194     fCanvas->SetBorderSize(0);
195     fCanvas->SetLeftMargin(0.15);
196     fCanvas->SetRightMargin(0.02);
197     fCanvas->SetTopMargin(0.10);
198     fCanvas->SetBottomMargin(0.10);
199
200     *fTeX << "\\clearpage\n"
201           << "%% -----------------------------------------------------"
202           << std::endl;
203
204     // Put title on top 
205     TLatex* topText = new TLatex(.5, .99, title);
206     topText->SetTextAlign(23);
207     topText->SetTextSize(.038);
208     topText->SetTextFont(42);
209     topText->SetTextColor(kBlue+3);
210     topText->SetNDC();
211     topText->Draw();
212   }
213   /** 
214    * Print the canvas to PNG and include it into LaTeX file
215    * 
216    * @param pngName Base name of PNG
217    * @param runNo   Run number to append
218    */
219   void PrintCanvas(const char* pngName, UInt_t runNo)
220   {
221     TString s(Form("%s_%09d", pngName, runNo));
222     PrintCanvas(s.Data());
223   }
224   /** 
225    * Print the canvas to PNG and include it into LaTeX file.  Stores
226    * canvas in storage file 
227    * 
228    * @param pngName Base name of PNG
229    */
230   void PrintCanvas(const char* pngName)
231   {
232     fCanvas->SaveAs(Form("%s.png", pngName));
233     *fTeX << "\\begin{center}\n"
234           << "\\includegraphics[keepaspectratio,height=\\textheight]{"
235           << pngName << "}\n" 
236           << "\\end{center}" << std::endl;
237     fToDelete.Append(Form(" %s.png", pngName));
238     TDirectory* d = gDirectory;
239     fStore->cd();
240     fCanvas->Write();
241     d->cd();
242   }
243   /** 
244    * Close the LaTeX and storage files. Runs PDFLaTeX on LaTeX
245    * file. Makes sure that the files are group writable.
246    * 
247    * @param deletePNGs  If true, delete intermident PNG files 
248    */
249   void Close(bool deletePNGs=true)
250   {
251     if (fTeX) {
252       *fTeX << "\\end{document}\n"
253             << "%% EOF" << std::endl;
254       fTeX->close();
255       fTeX = 0;
256       
257       const char* base = fTeXName.Data();
258       gSystem->Exec(Form("pdflatex %s.tex > /dev/null 2>&1", base));
259       TString cmd(Form("rm -f %s.log %s.aux %s.tex %s", 
260                        base, base, base, 
261                        deletePNGs ? fToDelete.Data() : ""));
262       gSystem->Exec(cmd.Data());
263       gSystem->Exec(Form("chmod g+rw %s.pdf %s", base, 
264                          deletePNGs ? "" : fToDelete.Data()));
265       Info("Close", "PDF file %s.pdf generated", base);
266     }
267     if (fStore) {
268       fStore->Write();
269       fStore->Close();
270       gSystem->Exec(Form("chmod g+rw %s.root", fTeXName.Data()));
271     }
272   }
273
274   // --- Members -----------------------------------------------------
275   QARing*        fFMD1i;        // Pointer to ring object
276   QARing*        fFMD2i;        // Pointer to ring object
277   QARing*        fFMD2o;        // Pointer to ring object
278   QARing*        fFMD3i;        // Pointer to ring object
279   QARing*        fFMD3o;        // Pointer to ring object
280   Global*        fGlobal;       // Pointer to global run object
281   TTree*         fTree;         // Pointer to tree object
282   TFile*         fOutput;       // Pointer to tree file 
283   TFile*         fStore;        // Pointer to storage file
284   std::ofstream* fTeX;          // pointer to LaTeX stream
285   TString        fTeXName;      // Base name of LaTeX file 
286   TString        fToDelete;     // List of files to possibly delete
287   TCanvas*       fCanvas;       // Pointer to canvas object
288   Bool_t         fSingle;       // Whether we're processing one run only
289 };
290
291 #endif
292
293
294 // Local Variables:
295 //  mode: C++
296 // End: