]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGLF/FORWARD/analysis2/corrs/ForwardOADBGui.C
f040909f48b23bdd1f57ca73166052bc0f95b3c1
[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" : 
438                       e->fSys == 3 ? "p-Pb" : "?"),
439                      Form("%4huGeV",e->fSNN), 
440                      Form("%+2hdkG", e->fField), 
441                      (e->fMC ? "MC" : "Real"),
442                      (e->fSatellite ? "Satellite" : "Nominal"), 
443                      dt.AsSQLString(),
444                      e->fAuthor, Form("%lu", e->fAliROOTRevision),
445                      (e->fData ? e->fData->GetName() : "null"));
446     fListContainer.AddItem(lve);
447   }
448   void HandleList()
449   {
450     if (!fDB) return;
451     TString table;
452     SelectedTable(table);
453
454     if (table.IsNull()) {
455       // Error("HandleList", "No table selected");
456       return;
457     }
458     HandleDBEntry(0);
459     AliOADBForward::Table* t= fDB->FindTable(table);
460     if (!t) {
461       Error("HandleList", "No table named %s in DB", table.Data());
462       return;
463     }
464     // HandleQuery();
465     t->Print(fOptionsText.GetText());
466     // if (!fListContainer) return;
467     
468     fListContainer.RemoveAll();
469     TTree* tree = t->fTree;
470     Int_t  n    = tree->GetEntries();
471     for (Int_t i = 0; i < n; i++) { 
472       tree->GetEntry(i);
473       AliOADBForward::Entry* e = t->fEntry;
474       HandleEntry(i, e);
475     }
476     fList.AdjustHeaders();
477     fMain.Layout();
478   }
479   void SelectedTable(TString& ret) const
480   {
481     ret = "";
482     TGLBEntry* e = fTableSelect.GetSelectedEntry();
483     if (!e) {
484       Error("SelectedTable", "No table selected");
485       return ;
486     }
487     ret = e->GetTitle();
488   }
489   void HandleTable(Int_t id)
490   {
491     Info("HandleTable", "Id=%d", id);
492     fListButton.SetEnabled(id != 0);
493     fQueryButton.SetEnabled(id != 0);
494     fListContainer.RemoveAll();
495     fList.AdjustHeaders();
496     fMain.Layout();
497     // fPrintButton.SetEnabled(enabled);
498     // fDrawButton.SetEnabled(enabled);
499     // fPDFButton.SetEnabled(enabled);
500   }
501   void HandleItem(TGFrame* lve, Int_t btn)
502   {
503     Info("HandleItem", "frame=%p", lve);
504     HandleItem(static_cast<TGLVEntry*>(lve), btn);
505   }
506   void HandleItem(TGLVEntry* lve, Int_t)
507   {
508     Info("HandleItem", "entry=%p", lve);
509     if (!lve) {
510       Warning("HandleItem", "No item");
511       return;
512     }
513     void* data = lve->GetUserData();
514     AliOADBForward::Entry* e = 0;
515     if (data) { 
516       e = reinterpret_cast<AliOADBForward::Entry*>(data);
517     }
518     else { 
519       TString tab;
520       SelectedTable(tab);
521       if (tab.IsNull()) return;
522       
523       AliOADBForward::Table* t = fDB->FindTable(tab);
524       // Info("HandleItem", "Fetching item %d from table", lve->GetUniqueID());
525       t->fTree->GetEntry(lve->GetUniqueID());
526       e = t->fEntry;
527     }
528     if (!e) {
529       Warning("HandleItem", "No entry");
530       return;
531     }
532     // if (!gPad) TCanvas::MakeDefCanvas();
533     e->Print();
534     HandleDBEntry(e);
535     // e->fData->Draw();
536   }
537   void HandlePrint() 
538   {
539     // TObject* o = HandleQuery();
540     // if (!o) return;
541     if (!fEntry) { 
542       Warning("HandlePrint", "No entry selected");
543       return;
544     }
545     fEntry->fData->Print(fOptionsText.GetText()); 
546   }
547   void HandleDraw()
548   {
549     if (!fEntry) { 
550       Warning("HandleDraw", "No entry selected");
551       return;
552     }
553
554     TObject* o = fEntry->fData;
555     Info("HandleDraw", "Will draw object of type %s", o->ClassName());
556     TString msg;
557     if (o->IsA()->InheritsFrom(TParameter<Double_t>::Class())) { 
558       TParameter<Double_t>* pd = static_cast<TParameter<Double_t>*>(o);
559       msg = Form("%f", pd->GetVal());
560     }
561     if (o->IsA()->InheritsFrom(TParameter<Float_t>::Class())) { 
562       TParameter<Float_t>* pf = static_cast<TParameter<Float_t>*>(o);
563       msg = Form("%f", pf->GetVal());
564     }
565     if (!msg.IsNull()) {
566       if (!gPad) TCanvas::MakeDefCanvas();
567       
568       TPaveText* t = new TPaveText(.1, .1, .9, .9);
569       t->AddText(msg);
570       t->Draw();
571       return;
572     }
573     CorrDraw(o, false);
574     // o->Draw(fOptionsText.GetText()); 
575   }
576   void HandlePDF()
577   {
578     if (!fEntry) { 
579       Warning("HandlePrint", "No entry selected");
580       return;
581     }
582
583
584     TObject* o = fEntry->fData;
585     gROOT->SetBatch(true);
586     CorrDraw(o, true);
587     gROOT->SetBatch(false);
588     // fEntry->fData->SaveAs(out, fOptionsText.GetText()); 
589
590   }
591   void LoadCorrDraw()
592   {
593     const char* opt = "++g";
594     const char* fwd = "$ALICE_ROOT/PWGLF/FORWARD/analysis2";
595     gSystem->AddIncludePath(Form("-I$ALICE_ROOT/include -I%s -I%s/scripts",
596                                  fwd, fwd));
597     Info("CorrDraw", "Loading SummaryDrawer.C%s", opt);
598     gROOT->LoadMacro(Form("%s/scripts/SummaryDrawer.C%s", fwd, opt));
599     // gROOT->ProcessLine(".Class SummaryDrawer");
600     Info("CorrDraw", "Loading CorrDrawer.C%s", opt);
601     gROOT->LoadMacro(Form("%s/corrs/CorrDrawer.C%s", fwd, opt));
602     // gROOT->ProcessLine(".Class SummaryDrawer");
603     // gROOT->ProcessLine(".Class CorrDrawer");
604     CloseMsg();
605   }    
606   void CorrDraw(const TObject* o, Bool_t summarize)
607   {
608     if (!gROOT->GetClass("CorrDrawer")) { 
609       TTimer* t = new TTimer(Form("((ForwardOADBGUI*)%p)->LoadCorrDraw()",this),
610                              0, kTRUE);
611       t->Start(100, true);
612       MakeMsg("Compiling drawer");
613     }
614     o->Print();
615     if (summarize) {
616       TTimer* t = new TTimer(Form("((ForwardOADBGUI*)%p)"
617                                   "->DoCorrDraw((TObject*)%p,1)",this, o), 
618                              0, kTRUE);
619       t->Start(100, true);
620       MakeMsg("Drawing to PDF");
621     }
622     else 
623       DoCorrDraw(o, false);
624   }
625   void DoCorrDraw(const TObject* o, Bool_t summarize) 
626   {
627     TString cmd(Form("CorrDrawer cd; cd.Summarize((const %s*)%p,%d);",
628                      o->ClassName(), o, summarize));
629     gROOT->ProcessLine(cmd);
630     CloseMsg();
631   }  
632   void MakeFileName(TString& out) const
633   {
634     if (!fEntry) return;
635     
636     SelectedTable(out);
637     if (out.IsNull()) return;
638     
639     out.Append(Form("_run%09lu", fEntry->fRunNo));
640     out.Append(Form("_%s", (fEntry->fSys == 1 ? "pp" : 
641                             fEntry->fSys == 2 ? "PbPb" :
642                             fEntry->fSys == 3 ? "pPb" : "XX")));
643     out.Append(Form("_%04huGeV", fEntry->fSNN));
644     out.Append(Form("_%c%hukG", fEntry->fField >= 0 ? 'p' : 'm', 
645                     TMath::Abs(fEntry->fField)));
646     out.Append(Form("_%s", fEntry->fMC ? "mc" : "real"));
647     out.Append(Form("_%s", fEntry->fSatellite ? "sat" : "nom"));
648     out.Append(".pdf");
649   }
650   TObject* HandleQuery()
651   {
652     ULong_t  run   = fRunInput.GetHexNumber();
653     Short_t  mode  = fRunMode.GetSelected();
654     Short_t  sys   = fSysSelect.GetSelected();
655     UShort_t sNN   = fSNNInput.GetIntNumber();
656     Short_t  fld   = fFldSelect.GetSelected();
657     Bool_t   mc    = fMCButton.IsDown();
658     Bool_t   sat   = fSatButton.IsDown();
659     TString  tab;
660     SelectedTable(tab);
661     
662     Info("HandleQuery", "tab=%s runNo=%lu mode=%d sys=%d "
663          "sNN=%d fld=%d mc=%d sat=%d", 
664          tab.Data(), run, mode, sys, sNN, fld, mc, sat);
665
666     if (tab.IsNull()) {
667       // Error("HandleQuery", "No table selected");
668       return 0;
669     }
670     AliOADBForward::ERunSelectMode qmode = AliOADBForward::kDefault;
671     switch (mode) { 
672     case 0: qmode = AliOADBForward::kDefault; break;
673     case 1: qmode = AliOADBForward::kExact; break;
674     case 2: qmode = AliOADBForward::kNewest; break;
675     case 3: qmode = AliOADBForward::kNear; break;
676     case 4: qmode = AliOADBForward::kOlder; break;
677     case 5: qmode = AliOADBForward::kNewer; break;
678     }
679
680     Info("HandleQuery", "tab=%s runNo=%lu mode=%d sys=%d "
681          "sNN=%d fld=%d mc=%d sat=%d", 
682          tab.Data(), run, qmode, sys, sNN, fld, mc, sat);
683
684     AliOADBForward::Entry* e = fDB->Get(tab, run, qmode, sys, sNN, 
685                                         fld, mc, sat);
686     if (!e) return 0;
687     // if (drawNotPrint) e->Inspect();
688     // else              e->Print(fOptionsText.GetText());
689     e->Print();
690     // if (fListContainer) { 
691     fListContainer.RemoveAll();
692     HandleEntry(-1, e);
693     // }
694     if (!e->fData) return 0;
695     HandleDBEntry(e);
696
697     fList.AdjustHeaders();
698     fMain.Layout();
699
700     return e->fData;
701   }
702   TGMainFrame* GetMain() { return &fMain; }
703   void MakeMsg(const char* what) 
704   { 
705     fMsg.Show(what);
706   }
707   void CloseMsg()
708   {
709     Info("CloseMsg", "Closing message window");
710     fMsg.Hide();
711   }
712   TGMainFrame       fMain;
713   TGHorizontalFrame fOpenFrame;
714   TGTextEntry       fFileText;
715   TGTextButton      fFileSelect;
716   TGTextEntry       fTablesText;
717   TGTextButton      fOpenButton;
718   TGTextButton      fCloseButton;
719   TGVerticalFrame   fSelectFrame;
720   TGHorizontalFrame fTableFrame;
721   TGLabel           fTableLabel;
722   TGComboBox        fTableSelect;
723   TGHorizontalFrame fRunFrame;
724   TGLabel           fRunLabel;
725   TGNumberEntry     fRunInput;
726   TGComboBox        fRunMode;
727   TGHorizontalFrame fSysFrame;
728   TGLabel           fSysLabel;
729   TGComboBox        fSysSelect;
730   TGHorizontalFrame fSNNFrame;
731   TGLabel           fSNNLabel;
732   TGNumberEntry     fSNNInput;
733   TGHorizontalFrame fFldFrame;
734   TGLabel           fFldLabel;
735   TGComboBox        fFldSelect;
736   TGHButtonGroup    fOtherFrame;
737   TGTextButton      fMCButton;
738   TGTextButton      fSatButton;
739   TGHorizontalFrame fOptionsFrame;
740   TGLabel           fOptionsLabel;
741   TGTextEntry       fOptionsText;
742   TGHButtonGroup    fCommandFrame;
743   TGTextButton      fQueryButton;  
744   TGTextButton      fListButton;
745   TGTextButton      fPrintButton;
746   TGTextButton      fDrawButton;
747   TGTextButton      fPDFButton;
748   TGListView        fList;
749   TGLVContainer     fListContainer;
750   TGLayoutHints     fFrameHints;
751   TGLayoutHints     fLabelHints;
752   TGLayoutHints     fEntryHints; 
753   TGLayoutHints     fButtonHints;
754   TGLayoutHints     fListHints;
755   ForwardOADBDialog fMsg;
756   AliOADBForward*   fDB;
757   AliOADBForward::Entry* fEntry;
758   // TCanvas*          fDataCanvas;
759   // TCanvas*          fEntryCanvas;
760 };
761
762
763 TGMainFrame* ForwardOADBGui(AliOADBForward* db=0)
764 {
765   const char* fwd = "$ALICE_ROOT/PWGLF/FORWARD/analysis2";
766   if (!gROOT->GetClass("AliOADBForward")) 
767     // gSystem->Load("libGui");
768     gROOT->Macro(Form("%s/scripts/LoadLibs.C", fwd));
769   
770   // gSystem->AddIncludePath(Form("-I%s", fwd));
771   // gROOT->LoadMacro(Form("%s/corrs/ForwardOADBGUI.C", fwd));
772
773   new TBrowser;
774   // new TGClient();
775   ForwardOADBGUI* gui = new ForwardOADBGUI();
776   if (db) gui->UseDB(db);
777   return gui->GetMain();
778 }
779   
780 //
781 // EOF
782 //
783