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