]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGLF/FORWARD/analysis2/corrs/ForwardOADBGui.C
Major refactoring of the code.
[u/mrichter/AliRoot.git] / PWGLF / FORWARD / analysis2 / corrs / ForwardOADBGui.C
1
2 #ifndef __CINT__
3 #include "AliOADBForward.h"
4 #include <TGListBox.h>
5 #include <TGNumberEntry.h>
6 #include <TGTextEntry.h>
7 #include <TGComboBox.h>
8 #include <TGFrame.h>
9 #include <TGFileDialog.h>
10 #include <TGButtonGroup.h>
11 #include <TGButton.h>
12 #include <TGLabel.h>
13 #include <TGMsgBox.h>
14 #include <TSystem.h>
15 #include <TError.h>
16 #include <TTimer.h>
17 #include <TCanvas.h>
18 #include <TTree.h>
19 #include <TGListView.h>
20 #include <TDatime.h>
21 #include <TParameter.h>
22 #include <TPaveText.h>
23 #include <TBrowser.h>
24
25 namespace {
26   void 
27   ForwardOADBGUIErrorHandler(Int_t lvl, Bool_t doAbort, 
28                              const char* location, 
29                              const char* msg)
30   {
31     if (!doAbort && lvl >= kWarning) {
32       EMsgBoxIcon msgIcon = kMBIconAsterisk;
33       // if (lvl >= kInfo)    msgIcon = kMBIconAsterisk;
34       if (lvl >= kWarning) msgIcon = kMBIconExclamation;
35       if (lvl >= kError)   msgIcon = kMBIconStop;
36       
37       new TGMsgBox(gClient->GetRoot(), gClient->GetRoot(), 
38                    location, msg, msgIcon);
39     }
40     DefaultErrorHandler(lvl, doAbort, location, msg);
41   }
42 }
43 #else 
44 class AliOADBForward;
45 class AliOADBForward::Entry;
46 #if 0
47 class TGFrame;
48 class TGLVEntry;
49 class TGHorizontalFrame;
50 class TGTextButton;
51 class TGTextEntry;
52 class TGVerticalFrame;
53 class TGLabel;
54 class TGComboBox;
55 class TGMainFrame;
56 class TGListView;
57 class TGLVContainer;
58 class TGHButtonGroup;
59 class TGLayoutHints;
60 class TGNumberEntry;
61 #endif
62 #endif
63
64 struct ForwardOADBDialog
65 {
66   ForwardOADBDialog(TGMainFrame* p)
67     : fFrame(gClient->GetRoot(), p, 200, 40, kVerticalFrame),
68       fHints(kLHintsExpandX,30,30,30,30),
69       fLabel(&fFrame, ""), 
70       // fProgress(&fFrame, 100), 
71       fIsShown(false),
72       fIncrement(0,false)
73   {
74     fFrame.AddFrame(&fLabel, &fHints );
75     // fFrame.AddFrame(&fProgress, &fHints);
76     fFrame.SetWindowName("Please wait ...");
77     // fProgress.SetRange(0,1);
78     fIncrement.Connect("Timeout()","ForwardOADBDialog",this,"HandleIncr()");
79   }
80   void HandleIncr()
81   {
82     Float_t dp = 0.1;
83     // Float_t p  = fProgress.GetPosition();
84     // Info("HandleIncr", "Handing increment (%f)", p);
85     // if (p+dp >= 1) fProgress.SetPosition(0);
86     // fProgress.Increment(dp);
87     // fFrame.GetClient()->NeedRedraw(&fFrame);
88   }
89   void Show(const char* msg)
90   {
91     fLabel.SetText(msg);
92     // fProgress.SetPosition(0);
93     fFrame.MapSubwindows();
94     Int_t width  = fFrame.GetDefaultWidth();
95     Int_t height = fFrame.GetDefaultHeight();
96     fFrame.Resize(width, height);
97     fFrame.SetWMSize(width, height);
98     fFrame.SetWMSizeHints(width, height, width, height, 0, 0);
99     fFrame.MapRaised();
100     fIsShown = true;
101     // fIncrement.Start(0,false);
102     fFrame.GetClient()->WaitForUnmap(&fFrame);    
103   }
104   void Hide() 
105   {
106     if (!fIsShown) return;
107     // fIncrement.Stop();
108     fFrame.UnmapWindow();
109   }
110   TGTransientFrame fFrame;
111   TGLayoutHints    fHints;
112   TGLabel          fLabel;
113   //TGHProgressBar   fProgress;
114   Bool_t           fIsShown;
115   TTimer           fIncrement;
116 };
117     
118 struct ForwardOADBGUI
119 {
120   enum { 
121     kLabelWidth = 200
122   };
123   ForwardOADBGUI()
124     : fMain(gClient->GetRoot(), 10, 10, kVerticalFrame),
125       fOpenFrame(&fMain),
126       fFileText(&fOpenFrame, "fmd_corrections.root"),
127       fFileSelect(&fOpenFrame, "Browse"), 
128       fTablesText(&fOpenFrame, "*"),
129       fOpenButton(&fOpenFrame, "Open"),
130       fCloseButton(&fOpenFrame, "Close"),
131       fSelectFrame(&fMain), 
132       fTableFrame(&fSelectFrame), 
133       fTableLabel(&fTableFrame, "Table: "), 
134       fTableSelect(&fTableFrame),
135       fRunFrame(&fSelectFrame), 
136       fRunLabel(&fRunFrame, "Run: "), 
137       fRunInput(&fRunFrame, 0, 0, -1, 
138                 TGNumberFormat::kNESReal,
139                 TGNumberFormat::kNEANonNegative,
140                 TGNumberFormat::kNELLimitMin, 0),
141     fRunMode(&fRunFrame),
142     fSysFrame(&fSelectFrame), 
143     fSysLabel(&fSysFrame, "System: "), 
144     fSysSelect(&fSysFrame),
145     fSNNFrame(&fSelectFrame), 
146     fSNNLabel(&fSNNFrame, "sqrt(sNN) [GeV]: "), 
147     fSNNInput(&fSNNFrame, 0, 0, -1, TGNumberFormat::kNESReal,
148               TGNumberFormat::kNEANonNegative,
149               TGNumberFormat::kNELLimitMin, 0),
150     fFldFrame(&fSelectFrame), 
151     fFldLabel(&fFldFrame, "L3 field [kG]: "), 
152     fFldSelect(&fFldFrame),
153     fOtherFrame(&fSelectFrame),
154     fMCButton(&fOtherFrame, "MC"),
155     fSatButton(&fOtherFrame, "Satellite"),
156     fOptionsFrame(&fSelectFrame), 
157     fOptionsLabel(&fOptionsFrame, "Draw/Print options:"),
158     fOptionsText(&fOptionsFrame, ""),
159     fCommandFrame(&fSelectFrame), 
160     fQueryButton(&fCommandFrame, "Query"),
161     fListButton(&fCommandFrame, "List table"),
162     fPrintButton(&fCommandFrame, "Print entry"),
163     fDrawButton(&fCommandFrame, "Draw entry"),
164     fPDFButton(&fCommandFrame, "Summarize entry"),
165     fList(&fMain, 800, 400), 
166     fListContainer(&fList),
167     fFrameHints(kLHintsExpandX, 0, 0, 2, 0),
168     fLabelHints(kLHintsNoHints, 4, 2, 0, 0),
169     fEntryHints(kLHintsExpandX|kLHintsExpandY, 2, 4, 0, 0),
170     fButtonHints(kLHintsExpandX, 2, 2, 0, 0),
171     fListHints(kLHintsExpandX|kLHintsExpandY, 2, 2, 4, 2),
172     fMsg(&fMain),
173     fDB(0),
174     fEntry(0)
175   {
176     fMain.Connect("CloseWindow()", "ForwardOADBGUI", this, "HandleKill()");
177     fMain.DontCallClose();
178
179     fFileSelect.Connect("Clicked()", "ForwardOADBGUI", this, "HandleBrowse()");
180     fOpenButton.Connect("Clicked()", "ForwardOADBGUI", this, "HandleOpen()");
181     fCloseButton.Connect("Clicked()", "ForwardOADBGUI", this, "HandleClose()");
182     fMain.AddFrame(&fOpenFrame, &fFrameHints);
183     fOpenFrame.AddFrame(&fFileText, &fEntryHints);
184     fOpenFrame.AddFrame(&fFileSelect, &fEntryHints);
185     fOpenFrame.AddFrame(&fTablesText, &fEntryHints);
186     fOpenFrame.AddFrame(&fOpenButton, &fEntryHints);
187     fOpenFrame.AddFrame(&fCloseButton, &fEntryHints);
188
189     fMain.AddFrame(&fSelectFrame, &fFrameHints);
190
191     fTableLabel.SetWidth(kLabelWidth); fTableLabel.SetMinWidth(kLabelWidth);
192     fTableSelect.SetHeight(22);
193     fTableSelect.Connect("Selected(Int_t)","ForwardOADBGUI",this,
194                          "HandleTable(Int_t)");
195     fSelectFrame.AddFrame(&fTableFrame, &fFrameHints);
196     fTableFrame.AddFrame(&fTableLabel, &fLabelHints);
197     fTableFrame.AddFrame(&fTableSelect, &fEntryHints);
198     
199     fRunLabel.SetWidth(kLabelWidth); fRunLabel.SetMinWidth(kLabelWidth);
200     fRunMode.AddEntry("default", 0);
201     fRunMode.AddEntry("Exact",  1);
202     fRunMode.AddEntry("Newest", 2);
203     fRunMode.AddEntry("Near",   3);
204     fRunMode.AddEntry("Older",  4);
205     fRunMode.AddEntry("Newer",  5);
206     fRunMode.SetHeight(22);
207     fSelectFrame.AddFrame(&fRunFrame, &fFrameHints);
208     fRunFrame.AddFrame(&fRunLabel, &fLabelHints);
209     fRunFrame.AddFrame(&fRunInput, &fEntryHints);
210     fRunFrame.AddFrame(&fRunMode, &fEntryHints);
211
212     fSysLabel.SetWidth(kLabelWidth); fSysLabel.SetMinWidth(kLabelWidth);
213     fSysSelect.AddEntry("- select -", 0);
214     fSysSelect.AddEntry("p-p",   1);
215     fSysSelect.AddEntry("Pb-Pb ",2);
216     fSysSelect.AddEntry("p-Pb",  3);
217     fSysSelect.SetHeight(22);
218     fSelectFrame.AddFrame(&fSysFrame, &fFrameHints);
219     fSysFrame.AddFrame(&fSysLabel, &fLabelHints);
220     fSysFrame.AddFrame(&fSysSelect, &fEntryHints);
221
222     fSNNLabel.SetWidth(kLabelWidth); fSNNLabel.SetMinWidth(kLabelWidth);
223     fSNNInput.SetHeight(22);
224     fSelectFrame.AddFrame(&fSNNFrame, &fFrameHints);
225     fSNNFrame.AddFrame(&fSNNLabel, &fLabelHints);
226     fSNNFrame.AddFrame(&fSNNInput, &fEntryHints);
227
228     fFldLabel.SetWidth(kLabelWidth); fFldLabel.SetMinWidth(kLabelWidth);
229     fFldSelect.AddEntry("- select -", 999);
230     fFldSelect.AddEntry("-5", -5);
231     fFldSelect.AddEntry("0 ",  0);
232     fFldSelect.AddEntry("+5", +5);
233     fFldSelect.SetHeight(22);
234     fSelectFrame.AddFrame(&fFldFrame, &fFrameHints);
235     fFldFrame.AddFrame(&fFldLabel, &fLabelHints);
236     fFldFrame.AddFrame(&fFldSelect, &fEntryHints);
237
238     fSelectFrame.AddFrame(&fOtherFrame, &fFrameHints);
239     fOtherFrame.SetLayoutHints(&fButtonHints);
240     fMCButton.AllowStayDown(true);
241     fSatButton.AllowStayDown(true);
242     // fOtherFrame.AddFrame(&fMCButton, &fEntryHints);
243     // fOtherFrame.AddFrame(&fSatButton, &fEntryHints);
244     // new TGCheckButton(&fOtherFrame, "MC:");
245     // new TGCheckButton(&fOtherFrame, "Satellite:");
246
247     fOptionsLabel.SetWidth(2*kLabelWidth);
248     fSelectFrame.AddFrame(&fOptionsFrame, &fFrameHints);
249     fOptionsFrame.AddFrame(&fOptionsLabel, &fLabelHints);
250     fOptionsFrame.AddFrame(&fOptionsText, &fEntryHints);
251
252     fQueryButton.Connect("Clicked()", "ForwardOADBGUI", this, "HandleQuery()");
253     fListButton.Connect("Clicked()", "ForwardOADBGUI", this, "HandleList()");
254     fDrawButton.Connect("Clicked()", "ForwardOADBGUI", this, "HandleDraw()");
255     fPDFButton.Connect("Clicked()", "ForwardOADBGUI", this, "HandlePDF()");
256     fPrintButton.Connect("Clicked()", "ForwardOADBGUI", this, "HandlePrint()");
257     fSelectFrame.AddFrame(&fCommandFrame, &fFrameHints);
258     fCommandFrame.SetLayoutHints(&fButtonHints);
259     
260     // fList          = new TGListView(&fMain, 800, 400);
261     // fListContainer = new TGLVContainer(fList);
262     fListContainer.SetColHeaders("Entry", 
263                                  "Run", 
264                                  "System", 
265                                  "sqrt(sNN)", 
266                                  "L3 Field", 
267                                  "Type", 
268                                  "IP",
269                                  "Date",
270                                  "Author",
271                                  "AliROOT",
272                                  "Data");
273     fList.SetViewMode(kLVDetails);
274     fList.Connect("Clicked(TGLVEntry*,Int_t)", 
275                    "ForwardOADBGUI", this, "HandleItem(TGLVEntry*,Int_t)");
276     fList.Connect("DoubleClicked(TGLVEntry*,Int_t)", 
277                    "ForwardOADBGUI", this, "HandleItem(TGLVEntry*,Int_t)");
278     fListContainer.Connect("Clicked(TGFrame*,Int_t)",
279                             "ForwardOADBGUI", this, 
280                             "HandleItem(TGFrame*,Int_t)");
281     fList.SetMinWidth(400);
282     fList.SetMinHeight(200);
283     fMain.AddFrame(&fList, &fListHints);
284     
285 #ifndef __CINT__
286     ::SetErrorHandler(ForwardOADBGUIErrorHandler);
287 #endif
288     HandleEnable();
289
290     fMain.SetMinWidth(600);
291     fMain.SetMinHeight(480);
292     fMain.MapSubwindows();    
293     fMain.Resize(600, 480); // fMain.GetDefaultSize());
294     fMain.MapWindow();
295   }
296   ~ForwardOADBGUI()
297   {
298     HandleClose();
299 #ifndef __CINT__
300     ::SetErrorHandler(::DefaultErrorHandler);
301 #endif
302     Info("~ForwardOADBGUI", "Closing");
303   }
304   void UseDB(AliOADBForward* db)
305   {
306     if (!db) return;
307
308     if (fDB) HandleClose();
309     fEntry = 0;
310     fDB = db;
311
312     TString lt;
313     const TMap& tables = fDB->GetTables();
314     TIter next(&tables);
315     TObject* key = 0;
316     // Int_t    i   = 0;
317     while ((key = next())) {
318       AliOADBForward::Table* t = fDB->FindTable(key->GetName());
319       
320       lt.Append(Form("%s/%s", t->GetName(), t->fTree->GetTitle()));
321     }
322     fTablesText.SetText(lt);
323     HandleEnable();    
324   }
325   void HandleKill()
326   {
327     // fMain.DontCallClose();
328     fMain.DeleteWindow();
329     Printf("Starting timer");
330     // TTimer* t = new TTimer(Form("delete (ForwardOADBGUI*)%p", this), 100);
331     // t->Start(100, true);
332   }
333   void HandleDBEntry(AliOADBForward::Entry* e)
334   {
335     Info("HandleDBEntry", "Selected entry %p", e);
336     Bool_t en = (e != 0);
337     fDrawButton.SetEnabled(en);
338     fPrintButton.SetEnabled(en);
339     fPDFButton.SetEnabled(en);
340     
341     fEntry = e;
342   }
343   void HandleEnable()
344   {
345     Bool_t enabled = fDB ? true : false;
346     Bool_t hasTable = fTableSelect.GetSelected() != 0;
347
348     fTableSelect.SetEnabled(enabled);
349     fRunMode.SetEnabled(enabled);
350     fSysSelect.SetEnabled(enabled);
351     fFldSelect.SetEnabled(enabled);
352     fMCButton.SetEnabled(enabled);
353     fSatButton.SetEnabled(enabled);
354     fQueryButton.SetEnabled(enabled && hasTable);
355     fListButton.SetEnabled(enabled && hasTable);
356     fPrintButton.SetEnabled(enabled && hasTable);
357     fDrawButton.SetEnabled(enabled && hasTable);
358     fPDFButton.SetEnabled(enabled && hasTable);
359     fOpenButton.SetEnabled(!enabled);
360     fCloseButton.SetEnabled(enabled);
361     HandleDBEntry(0);
362
363     Int_t tsel = 0;
364     if (!enabled) {
365       fTableSelect.RemoveAll();
366       fTableSelect.AddEntry("- select -", 0);
367     }
368     else {
369       const TMap& tables = fDB->GetTables();
370       TIter next(&tables);
371       TObject* key = 0;
372       Int_t    i   = 0;
373       while ((key = next())) {
374         fTableSelect.AddEntry(key->GetName(), ++i);
375       }    
376       if (tables.GetEntries() == 1) tsel = 1;
377     }
378     fTableSelect.Select(tsel, true);
379     fSysSelect.Select(0, true);
380     fFldSelect.Select(999, true);
381     fRunMode.Select(0, true);
382
383     fMain.Layout();
384   }
385   void HandleClose()
386   {
387     if (fDB) { 
388       delete fDB;
389       fDB = 0;
390     }
391     HandleEnable();
392   }
393   void HandleOpen()
394   {
395     if (fDB) HandleClose();
396     fDB = new AliOADBForward;
397     Info("HandleOpen", "Opening DB file %s for tables %s", 
398          fFileText.GetText(), fTablesText.GetText());
399     TString fn(fFileText.GetText());
400     TString tn(fTablesText.GetText());
401     if (!fDB->Open(fn, tn, false, true, true)) { 
402       Error("HandleOpen", "Failed to open database");
403       delete fDB;
404       fDB = 0;
405     }
406     // else 
407     // fDB->Print();
408     HandleEnable();
409   }
410   void HandleBrowse()
411   {
412     TGFileInfo fi;
413     TString iniDir(gSystem->ExpandPathName("$(OADB_PATH)"));
414     if (iniDir.IsNull()) 
415       iniDir = gSystem->ExpandPathName("$(ALICE_ROOT)/OADB");
416     iniDir.Append("/PWGLF/FORWARD/CORRECTIONS/data");
417     char* ini = new char[iniDir.Length()+1];
418     for (int i = 0; i < iniDir.Length(); i++) ini[i] = iniDir[i];
419     ini[iniDir.Length()] = '\0';
420     Printf("Initial directory: %s (%s)", iniDir.Data(), ini);
421     fi.fIniDir = ini;
422     new TGFileDialog(gClient->GetRoot(), &fMain, kFDOpen, &fi);
423
424     TString nf = fi.fFilename; // 
425     // nf = gSystem->ConcatFileName(fi.fIniDir, fi.fFilename);
426     Info("HandleBrowse", "New file: %s", nf.Data());
427     fFileText.SetText(nf);
428   }
429   void HandleEntry(Int_t i, AliOADBForward::Entry* e) 
430   {
431     TGLVEntry* lve = new TGLVEntry(&fListContainer, Form("%d", i), "");
432     if (i < 0) lve->SetUserData(e);
433     lve->SetUniqueID(i);
434     TDatime dt(e->fTimestamp);
435     lve->SetSubnames(Form("%lu", e->fRunNo), 
436                      (e->fSys == 1 ? "p-p" : 
437                       e->fSys == 2 ? "Pb-Pb" : "p-Pb"),
438                      Form("%4huGeV",e->fSNN), 
439                      Form("%+2hdkG", e->fField), 
440                      (e->fMC ? "MC" : "Real"),
441                      (e->fSatellite ? "Satellite" : "Nominal"), 
442                      dt.AsSQLString(),
443                      e->fAuthor, Form("%lu", e->fAliROOTRevision),
444                      (e->fData ? e->fData->GetName() : "null"));
445     fListContainer.AddItem(lve);
446   }
447   void HandleList()
448   {
449     if (!fDB) return;
450     TString table;
451     SelectedTable(table);
452
453     if (table.IsNull()) {
454       // Error("HandleList", "No table selected");
455       return;
456     }
457     HandleDBEntry(0);
458     AliOADBForward::Table* t= fDB->FindTable(table);
459     if (!t) {
460       Error("HandleList", "No table named %s in DB", table.Data());
461       return;
462     }
463     // HandleQuery();
464     t->Print(fOptionsText.GetText());
465     // if (!fListContainer) return;
466     
467     fListContainer.RemoveAll();
468     TTree* tree = t->fTree;
469     Int_t  n    = tree->GetEntries();
470     for (Int_t i = 0; i < n; i++) { 
471       tree->GetEntry(i);
472       AliOADBForward::Entry* e = t->fEntry;
473       HandleEntry(i, e);
474     }
475     fList.AdjustHeaders();
476     fMain.Layout();
477   }
478   void SelectedTable(TString& ret) const
479   {
480     ret = "";
481     TGLBEntry* e = fTableSelect.GetSelectedEntry();
482     if (!e) {
483       Error("SelectedTable", "No table selected");
484       return ;
485     }
486     ret = e->GetTitle();
487   }
488   void HandleTable(Int_t id)
489   {
490     Info("HandleTable", "Id=%d", id);
491     fListButton.SetEnabled(id != 0);
492     fQueryButton.SetEnabled(id != 0);
493     fListContainer.RemoveAll();
494     fList.AdjustHeaders();
495     fMain.Layout();
496     // fPrintButton.SetEnabled(enabled);
497     // fDrawButton.SetEnabled(enabled);
498     // fPDFButton.SetEnabled(enabled);
499   }
500   void HandleItem(TGFrame* lve, Int_t btn)
501   {
502     Info("HandleItem", "frame=%p", lve);
503     HandleItem(static_cast<TGLVEntry*>(lve), btn);
504   }
505   void HandleItem(TGLVEntry* lve, Int_t)
506   {
507     Info("HandleItem", "entry=%p", lve);
508     if (!lve) {
509       Warning("HandleItem", "No item");
510       return;
511     }
512     void* data = lve->GetUserData();
513     AliOADBForward::Entry* e = 0;
514     if (data) { 
515       e = reinterpret_cast<AliOADBForward::Entry*>(data);
516     }
517     else { 
518       TString tab;
519       SelectedTable(tab);
520       if (tab.IsNull()) return;
521       
522       AliOADBForward::Table* t = fDB->FindTable(tab);
523       // Info("HandleItem", "Fetching item %d from table", lve->GetUniqueID());
524       t->fTree->GetEntry(lve->GetUniqueID());
525       e = t->fEntry;
526     }
527     if (!e) {
528       Warning("HandleItem", "No entry");
529       return;
530     }
531     // if (!gPad) TCanvas::MakeDefCanvas();
532     e->Print();
533     HandleDBEntry(e);
534     // e->fData->Draw();
535   }
536   void HandlePrint() 
537   {
538     // TObject* o = HandleQuery();
539     // if (!o) return;
540     if (!fEntry) { 
541       Warning("HandlePrint", "No entry selected");
542       return;
543     }
544     fEntry->fData->Print(fOptionsText.GetText()); 
545   }
546   void HandleDraw()
547   {
548     if (!fEntry) { 
549       Warning("HandleDraw", "No entry selected");
550       return;
551     }
552
553     TObject* o = fEntry->fData;
554     Info("HandleDraw", "Will draw object of type %s", o->ClassName());
555     TString msg;
556     if (o->IsA()->InheritsFrom(TParameter<Double_t>::Class())) { 
557       TParameter<Double_t>* pd = static_cast<TParameter<Double_t>*>(o);
558       msg = Form("%f", pd->GetVal());
559     }
560     if (o->IsA()->InheritsFrom(TParameter<Float_t>::Class())) { 
561       TParameter<Float_t>* pf = static_cast<TParameter<Float_t>*>(o);
562       msg = Form("%f", pf->GetVal());
563     }
564     if (!msg.IsNull()) {
565       if (!gPad) TCanvas::MakeDefCanvas();
566       
567       TPaveText* t = new TPaveText(.1, .1, .9, .9);
568       t->AddText(msg);
569       t->Draw();
570       return;
571     }
572     CorrDraw(o, false);
573     // o->Draw(fOptionsText.GetText()); 
574   }
575   void HandlePDF()
576   {
577     if (!fEntry) { 
578       Warning("HandlePrint", "No entry selected");
579       return;
580     }
581
582
583     TObject* o = fEntry->fData;
584     gROOT->SetBatch(true);
585     CorrDraw(o, true);
586     gROOT->SetBatch(false);
587     // fEntry->fData->SaveAs(out, fOptionsText.GetText()); 
588
589   }
590   void LoadCorrDraw()
591   {
592     const char* opt = "++g";
593     const char* fwd = "$ALICE_ROOT/PWGLF/FORWARD/analysis2";
594     gSystem->AddIncludePath(Form("-I$ALICE_ROOT/include -I%s -I%s/scripts",
595                                  fwd, fwd));
596     Info("CorrDraw", "Loading SummaryDrawer.C%s", opt);
597     gROOT->LoadMacro(Form("%s/scripts/SummaryDrawer.C%s", fwd, opt));
598     // gROOT->ProcessLine(".Class SummaryDrawer");
599     Info("CorrDraw", "Loading CorrDrawer.C%s", opt);
600     gROOT->LoadMacro(Form("%s/corrs/CorrDrawer.C%s", fwd, opt));
601     // gROOT->ProcessLine(".Class SummaryDrawer");
602     // gROOT->ProcessLine(".Class CorrDrawer");
603     CloseMsg();
604   }    
605   void CorrDraw(const TObject* o, Bool_t summarize)
606   {
607     if (!gROOT->GetClass("CorrDrawer")) { 
608       TTimer* t = new TTimer(Form("((ForwardOADBGUI*)%p)->LoadCorrDraw()",this),
609                              0, kTRUE);
610       t->Start(100, true);
611       MakeMsg("Compiling drawer");
612     }
613     o->Print();
614     if (summarize) {
615       TTimer* t = new TTimer(Form("((ForwardOADBGUI*)%p)"
616                                   "->DoCorrDraw((TObject*)%p,1)",this, o), 
617                              0, kTRUE);
618       t->Start(100, true);
619       MakeMsg("Drawing to PDF");
620     }
621     else 
622       DoCorrDraw(o, false);
623   }
624   void DoCorrDraw(const TObject* o, Bool_t summarize) 
625   {
626     TString cmd(Form("CorrDrawer cd; cd.Summarize((const %s*)%p,%d);",
627                      o->ClassName(), o, summarize));
628     gROOT->ProcessLine(cmd);
629     CloseMsg();
630   }  
631   void MakeFileName(TString& out) const
632   {
633     if (!fEntry) return;
634     
635     SelectedTable(out);
636     if (out.IsNull()) return;
637     
638     out.Append(Form("_run%09lu", fEntry->fRunNo));
639     out.Append(Form("_%s", (fEntry->fSys == 1 ? "pp" : 
640                             fEntry->fSys == 2 ? "PbPb" :
641                             fEntry->fSys == 3 ? "pPb" : "XX")));
642     out.Append(Form("_%04huGeV", fEntry->fSNN));
643     out.Append(Form("_%c%hukG", fEntry->fField >= 0 ? 'p' : 'm', 
644                     TMath::Abs(fEntry->fField)));
645     out.Append(Form("_%s", fEntry->fMC ? "mc" : "real"));
646     out.Append(Form("_%s", fEntry->fSatellite ? "sat" : "nom"));
647     out.Append(".pdf");
648   }
649   TObject* HandleQuery()
650   {
651     ULong_t  run   = fRunInput.GetHexNumber();
652     Short_t  mode  = fRunMode.GetSelected();
653     Short_t  sys   = fSysSelect.GetSelected();
654     UShort_t sNN   = fSNNInput.GetIntNumber();
655     Short_t  fld   = fFldSelect.GetSelected();
656     Bool_t   mc    = fMCButton.IsDown();
657     Bool_t   sat   = fSatButton.IsDown();
658     TString  tab;
659     SelectedTable(tab);
660     
661     Info("HandleQuery", "tab=%s runNo=%lu mode=%d sys=%d "
662          "sNN=%d fld=%d mc=%d sat=%d", 
663          tab.Data(), run, mode, sys, sNN, fld, mc, sat);
664
665     if (tab.IsNull()) {
666       // Error("HandleQuery", "No table selected");
667       return 0;
668     }
669     AliOADBForward::ERunSelectMode qmode = AliOADBForward::kDefault;
670     switch (mode) { 
671     case 0: qmode = AliOADBForward::kDefault; break;
672     case 1: qmode = AliOADBForward::kExact; break;
673     case 2: qmode = AliOADBForward::kNewest; break;
674     case 3: qmode = AliOADBForward::kNear; break;
675     case 4: qmode = AliOADBForward::kOlder; break;
676     case 5: qmode = AliOADBForward::kNewer; break;
677     }
678
679     Info("HandleQuery", "tab=%s runNo=%lu mode=%d sys=%d "
680          "sNN=%d fld=%d mc=%d sat=%d", 
681          tab.Data(), run, qmode, sys, sNN, fld, mc, sat);
682
683     AliOADBForward::Entry* e = fDB->Get(tab, run, qmode, sys, sNN, 
684                                         fld, mc, sat);
685     if (!e) return 0;
686     // if (drawNotPrint) e->Inspect();
687     // else              e->Print(fOptionsText.GetText());
688     e->Print();
689     // if (fListContainer) { 
690     fListContainer.RemoveAll();
691     HandleEntry(-1, e);
692     // }
693     if (!e->fData) return 0;
694     HandleDBEntry(e);
695
696     fList.AdjustHeaders();
697     fMain.Layout();
698
699     return e->fData;
700   }
701   TGMainFrame* GetMain() { return &fMain; }
702   void MakeMsg(const char* what) 
703   { 
704     fMsg.Show(what);
705   }
706   void CloseMsg()
707   {
708     Info("CloseMsg", "Closing message window");
709     fMsg.Hide();
710   }
711   TGMainFrame       fMain;
712   TGHorizontalFrame fOpenFrame;
713   TGTextEntry       fFileText;
714   TGTextButton      fFileSelect;
715   TGTextEntry       fTablesText;
716   TGTextButton      fOpenButton;
717   TGTextButton      fCloseButton;
718   TGVerticalFrame   fSelectFrame;
719   TGHorizontalFrame fTableFrame;
720   TGLabel           fTableLabel;
721   TGComboBox        fTableSelect;
722   TGHorizontalFrame fRunFrame;
723   TGLabel           fRunLabel;
724   TGNumberEntry     fRunInput;
725   TGComboBox        fRunMode;
726   TGHorizontalFrame fSysFrame;
727   TGLabel           fSysLabel;
728   TGComboBox        fSysSelect;
729   TGHorizontalFrame fSNNFrame;
730   TGLabel           fSNNLabel;
731   TGNumberEntry     fSNNInput;
732   TGHorizontalFrame fFldFrame;
733   TGLabel           fFldLabel;
734   TGComboBox        fFldSelect;
735   TGHButtonGroup    fOtherFrame;
736   TGTextButton      fMCButton;
737   TGTextButton      fSatButton;
738   TGHorizontalFrame fOptionsFrame;
739   TGLabel           fOptionsLabel;
740   TGTextEntry       fOptionsText;
741   TGHButtonGroup    fCommandFrame;
742   TGTextButton      fQueryButton;  
743   TGTextButton      fListButton;
744   TGTextButton      fPrintButton;
745   TGTextButton      fDrawButton;
746   TGTextButton      fPDFButton;
747   TGListView        fList;
748   TGLVContainer     fListContainer;
749   TGLayoutHints     fFrameHints;
750   TGLayoutHints     fLabelHints;
751   TGLayoutHints     fEntryHints; 
752   TGLayoutHints     fButtonHints;
753   TGLayoutHints     fListHints;
754   ForwardOADBDialog fMsg;
755   AliOADBForward*   fDB;
756   AliOADBForward::Entry* fEntry;
757   // TCanvas*          fDataCanvas;
758   // TCanvas*          fEntryCanvas;
759 };
760
761
762 TGMainFrame* ForwardOADBGui(AliOADBForward* db=0)
763 {
764   const char* fwd = "$ALICE_ROOT/PWGLF/FORWARD/analysis2";
765   if (!gROOT->GetClass("AliOADBForward")) 
766     // gSystem->Load("libGui");
767     gROOT->Macro(Form("%s/scripts/LoadLibs.C", fwd));
768   
769   // gSystem->AddIncludePath(Form("-I%s", fwd));
770   // gROOT->LoadMacro(Form("%s/corrs/ForwardOADBGUI.C", fwd));
771
772   new TBrowser;
773   // new TGClient();
774   ForwardOADBGUI* gui = new ForwardOADBGUI();
775   if (db) gui->UseDB(db);
776   return gui->GetMain();
777 }
778   
779 //
780 // EOF
781 //
782