5b18850aaa338ab0845676b9eddcd46e40b4b5a0
[u/mrichter/AliRoot.git] / OADB / macros / spectraOADBGUI.C
1 //
2 // Author: Michele Floris APR2011
3 // Derived by root's the statusBar.C tutorial
4 // This macro allows to browse the OADB of the spectra
5
6
7 #include <TApplication.h>
8 #include <TGClient.h>
9 #include <TGButton.h>
10 #include <TGFrame.h>
11 #include <TFrame.h>
12 #include <TRootEmbeddedCanvas.h>
13 #include <TGStatusBar.h>
14 #include <TGComboBox.h>
15 #include <TCanvas.h>
16 #include <TF1.h>
17 #include <TRandom.h>
18 #include <TGraph.h>
19 #include <TAxis.h>
20 #include <AliOADBPWG2Spectra.h>
21 #include "TSystem.h"
22 #include "AliOADBContainer.h"
23 #include <TGTextEntry.h>
24 #include "TFile.h"
25 #include <iostream>
26 #include "TH1D.h"
27 #include "TInterpreter.h"
28
29 using namespace std;
30
31
32 class MyMainFrame : public TGMainFrame {
33
34 private:
35   TRootEmbeddedCanvas  *fEcan; // embedded canvas
36   TGStatusBar          *fStatusBar;// status bar
37   TGComboBox           *fComboDetector;//detectors
38   TGComboBox           *fComboParticle;//particle
39   TGComboBox           *fComboCharge;//charge
40   TGComboBox           *fComboPID;//PID
41   TGComboBox           *fComboContainer;//container
42   TGTextEntry          *fRunNumber; // run number 
43   TGComboBox           *fComboCentr; // centr tag
44   TGTextEntry          *fTextCentrBin; // centrality bin
45   TGTextEntry          *fTextDrawOpt; // draw opt
46   TGTextEntry          *fTextSaveName; // save name
47   AliOADBPWG2Spectra   *fOADBSpectra; // spectra OADB
48   AliOADBContainer     *fOADBContainer; // OADB container
49    
50   static const char * fkContainers[];
51   static const Int_t fkNContainers ;
52   static const char * fkCentrTags[];
53   static const Int_t fkNCentrTags ;
54
55 public:
56   MyMainFrame(const TGWindow *p, UInt_t w, UInt_t h);
57   virtual ~MyMainFrame();
58   void DoExit();
59   void DoDraw();
60   void DoRatio();
61   void DoLegend();
62   void DoLoad();
63   void DoClear();
64   void DoPrint();
65   void DoSelectedDetector(Int_t id);
66   void SetStatusText(const char *txt, Int_t pi);
67   void EventInfo(Int_t event, Int_t px, Int_t py, TObject *selected);
68    
69   ClassDef(MyMainFrame, 0)
70 };
71
72 const char * MyMainFrame::fkContainers[] = {"Corrected", "Raw"};
73 const Int_t MyMainFrame::fkNContainers = 2;
74 const char * MyMainFrame::fkCentrTags[] = {"MB", "Ntracks", "SPD2"};
75 const Int_t MyMainFrame::fkNCentrTags = 3;
76
77 void MyMainFrame::DoSelectedDetector(Int_t id) {
78   // Change the analysis type based on the detector
79   cout << "ID " << id << endl;
80   if (id == AliOADBPWG2Spectra::kTOFTPC) {
81     fComboPID->Select(AliOADBPWG2Spectra::kNSigma);
82   }
83   else {
84     fComboPID->Select(AliOADBPWG2Spectra::kGaussFit);
85   }
86
87 }
88
89 void MyMainFrame::DoPrint()
90 {
91   // print to file
92   TCanvas *c1 = fEcan->GetCanvas();
93   c1->Print(fTextSaveName->GetText());
94 }
95 void MyMainFrame::DoClear()
96 {
97   // clear canvas
98   TCanvas *c1 = fEcan->GetCanvas();
99   c1->Clear();
100   c1->Update();
101   c1->Modified();
102   c1->Update(); 
103
104 }
105
106 void MyMainFrame::DoLoad()
107 {
108   // Load file
109   cout << "Getting " << fkContainers[fComboContainer->GetSelected()] << endl;
110   cout << fRunNumber->GetText() << endl;
111   
112   TString fileName = AliOADBPWG2Spectra::GetOADBPWG2SpectraFileName();
113   TFile * f = new TFile (fileName);
114   fOADBContainer = (AliOADBContainer*) f->Get(fkContainers[fComboContainer->GetSelected()]);
115   f->Close();
116   fOADBSpectra = (AliOADBPWG2Spectra*) fOADBContainer->GetObject(atoi(fRunNumber->GetText() ));
117   if(!fOADBSpectra) fOADBContainer->List();
118   fOADBSpectra->Print();
119 }
120
121 void MyMainFrame::DoLegend()
122 {
123   // legend
124   gInterpreter->ProcessLine("NewLegend(\"\", \"lpf\",0,1,0);");
125   TCanvas *c1 = fEcan->GetCanvas();
126   c1->Update();
127   c1->Modified();
128   c1->Update(); 
129 }
130 void MyMainFrame::DoRatio() {
131   // Divide 2 histos on canvas
132   gInterpreter->ProcessLine("Divide2HistosOnCanvas();");
133 }
134
135
136 void MyMainFrame::DoDraw()
137 {
138    // Draw something in the canvas
139
140    Printf("Slot DoDraw()");
141    cout << "DET " << fComboDetector->GetSelected() << endl;
142    if(!fOADBSpectra) {
143      cout << "spectra not loaded" << endl;
144      DoLoad();
145      if(!fOADBSpectra)      {
146        cout << "ERROR: Cannot load spectra" << endl;       
147        return;
148      }
149    }
150
151    TCanvas *c1 = fEcan->GetCanvas();
152    c1->cd();
153    TH1D * h = 0;
154    if(strcmp(fkCentrTags[fComboCentr->GetSelected()],"")){
155        h = fOADBSpectra->GetHisto(fComboDetector->GetSelected(), 
156                                   fComboPID->GetSelected(), 
157                                   fComboParticle->GetSelected(), 
158                                   fComboCharge->GetSelected(), 
159                                   fkCentrTags[fComboCentr->GetSelected()],
160                                   atoi(fTextCentrBin->GetText()));
161
162      }
163      else {
164        h = fOADBSpectra->GetHisto(fComboDetector->GetSelected(), 
165                                   fComboPID->GetSelected(), 
166                                   fComboParticle->GetSelected(), 
167                                   fComboCharge->GetSelected());
168
169      }
170    // Draw the selected histogram
171
172    if(!h) {
173      cout << "Cannot get pointer to histo" << endl;
174      
175      cout << fkCentrTags[fComboCentr->GetSelected()] << " " << 
176    
177      fOADBSpectra->GetHistoName(fComboDetector->GetSelected(), 
178                                 fComboPID->GetSelected(), 
179                                 fComboParticle->GetSelected(), 
180                                 fComboCharge->GetSelected(), 
181                                 fkCentrTags[fComboCentr->GetSelected()],
182                                 atoi(fTextCentrBin->GetText()))
183         << endl;
184
185      return;
186    }
187    TString opt = fTextDrawOpt->GetText();
188    if(opt=="auto") {
189      c1->GetListOfPrimitives()->Print();
190      if (c1->GetListOfPrimitives()->GetEntries()>0) opt = "same";
191      else opt = "";
192    }
193    
194    h->SetXTitle("p_{T} (GeV/c)");
195    //   h->SetXTitle("dN/dp_{T}");
196    h->Draw(opt);
197    
198    // TCanvas::Update() draws the frame, after which it can be changed
199    c1->Update();
200    c1->Modified();
201    c1->Update();
202 }
203
204 void MyMainFrame::DoExit()
205 {
206    printf("Exit application...");
207    gApplication->Terminate(0);
208 }
209
210 void MyMainFrame::SetStatusText(const char *txt, Int_t pi)
211 {
212    // Set text in status bar.
213    fStatusBar->SetText(txt,pi);
214 }
215
216 void MyMainFrame::EventInfo(Int_t event, Int_t px, Int_t py, TObject *selected)
217 {
218 //  Writes the event status in the status bar parts
219
220    const char *text0, *text1, *text3;
221    char text2[50];
222    text0 = selected->GetTitle();
223    SetStatusText(text0,0);
224    text1 = selected->GetName();
225    SetStatusText(text1,1);
226    if (event == kKeyPress)
227       sprintf(text2, "%c", (char) px);
228    else
229       sprintf(text2, "%d,%d", px, py);
230    SetStatusText(text2,2);
231    text3 = selected->GetObjectInfo(px,py);
232    SetStatusText(text3,3);
233 }
234
235 MyMainFrame::MyMainFrame(const TGWindow *p, UInt_t w, UInt_t h) :
236   TGMainFrame(p, w, h), fOADBContainer(0), fOADBSpectra(0)
237 {
238   // Create a horizontal frame (canvas and status bar on the left, buttons on the right)
239    TGHorizontalFrame *hframeMain = new TGHorizontalFrame(this, 200, 40);
240
241    // Create a vertical frame for the canvas and for the status bar
242    TGVerticalFrame *vframeCanvas = new TGVerticalFrame(this, 200, 40);
243
244    // Create the embedded canvas
245    fEcan = new TRootEmbeddedCanvas(0,this,500,400);
246    Int_t wid = fEcan->GetCanvasWindowId();
247    TCanvas *myc = new TCanvas("MyCanvas", 10,10,wid);
248    cout << myc << endl;
249    
250    fEcan->AdoptCanvas(myc);
251    myc->Connect("ProcessedEvent(Int_t,Int_t,Int_t,TObject*)","MyMainFrame",this, 
252                "EventInfo(Int_t,Int_t,Int_t,TObject*)");
253
254    vframeCanvas->AddFrame(fEcan, new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX  | kLHintsExpandY,0,0,1,1));
255    // status bar
256    Int_t parts[] = {45, 15, 10, 30};
257    fStatusBar = new TGStatusBar(this, 50, 10, kVerticalFrame);
258    fStatusBar->SetParts(parts, 4);
259    fStatusBar->Draw3DCorner(kFALSE);
260    vframeCanvas->AddFrame(fStatusBar, new TGLayoutHints(kLHintsExpandX, 0, 0, 10, 0));
261    
262    hframeMain->AddFrame(vframeCanvas, new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX  | kLHintsExpandY, 2, 2, 2, 2));
263
264    // Create a vertical frame containing  buttons and controls
265    TGVerticalFrame *vframeButtons = new TGVerticalFrame(this, 200, 40);
266   
267    // Container
268    fComboContainer = new TGComboBox(vframeButtons);
269    vframeButtons->AddFrame(fComboContainer, new TGLayoutHints(kLHintsCenterX, 5, 5, 3, 4));
270    for(Int_t icont = 0; icont < fkNContainers; icont++){
271      fComboContainer->AddEntry(fkContainers[icont],icont);
272    }
273    fComboContainer->Select(0);
274    fComboContainer->Resize(120,20);
275    fRunNumber = new TGTextEntry (vframeButtons, "116562");
276    vframeButtons->AddFrame(fRunNumber, new TGLayoutHints(kLHintsCenterX, 5, 5, 3, 4));
277    
278
279    TGTextButton *load = new TGTextButton(vframeButtons, "&Load");
280    load->Connect("Clicked()", "MyMainFrame", this, "DoLoad()");
281    vframeButtons->AddFrame(load, new TGLayoutHints(kLHintsCenterX, 5, 5, 3, 4));
282
283    // Combos
284    fComboDetector = new TGComboBox(vframeButtons);
285    vframeButtons->AddFrame(fComboDetector, new TGLayoutHints(kLHintsCenterX, 5, 5, 3, 4));   
286    for(Int_t idet = 0; idet < AliOADBPWG2Spectra::kNDetectors; idet++){
287      fComboDetector->AddEntry(AliOADBPWG2Spectra::GetDetectorName(idet),idet);
288    }
289    fComboDetector->Resize(120,20);
290    fComboDetector->Select(1);
291    fComboDetector->Connect("Selected(Int_t)", "MyMainFrame", this, "DoSelectedDetector(Int_t)");
292
293    fComboPID = new TGComboBox(vframeButtons);
294    vframeButtons->AddFrame(fComboPID, new TGLayoutHints(kLHintsCenterX, 5, 5, 3, 4));   
295    for(Int_t idet = 0; idet < AliOADBPWG2Spectra::kNPIDTypes; idet++){
296      fComboPID->AddEntry(AliOADBPWG2Spectra::GetPIDName(idet),idet);
297    }
298    fComboPID->Resize(120,20);
299    fComboPID->Select(0);
300
301    fComboCharge = new TGComboBox(vframeButtons);
302    vframeButtons->AddFrame(fComboCharge, new TGLayoutHints(kLHintsCenterX, 5, 5, 3, 4));   
303    for(Int_t idet = 0; idet < AliOADBPWG2Spectra::kNCharge; idet++){
304      fComboCharge->AddEntry(AliOADBPWG2Spectra::GetChargeName(idet),idet);
305    }
306    fComboCharge->Resize(120,20);
307    fComboCharge->Select(0);
308
309    fComboParticle = new TGComboBox(vframeButtons);
310    vframeButtons->AddFrame(fComboParticle, new TGLayoutHints(kLHintsCenterX, 5, 5, 3, 4));   
311    for(Int_t idet = 0; idet < AliOADBPWG2Spectra::kNParticle; idet++){
312      fComboParticle->AddEntry(AliOADBPWG2Spectra::GetParticleName(idet),idet);
313    }
314    fComboParticle->Resize(120,20);
315    fComboParticle->Select(0);
316
317    fComboCentr = new TGComboBox(vframeButtons);
318    vframeButtons->AddFrame(fComboCentr, new TGLayoutHints(kLHintsCenterX, 5, 5, 3, 4));   
319    for(Int_t icentr = 0; icentr < fkNCentrTags; icentr++){
320      fComboCentr->AddEntry(fkCentrTags[icentr],icentr);
321    }
322    fComboCentr->Resize(120,20);
323    fComboCentr->Select(0);
324
325    // Text fields
326    fRunNumber; // run number 
327    fTextCentrBin = new TGTextEntry (vframeButtons, "1");
328    fTextCentrBin->Resize(120,20);
329    vframeButtons->AddFrame(fTextCentrBin, new TGLayoutHints(kLHintsCenterX, 5, 5, 3, 4));   
330    fTextDrawOpt = new TGTextEntry (vframeButtons, "auto");
331    vframeButtons->AddFrame(fTextDrawOpt, new TGLayoutHints(kLHintsCenterX, 5, 5, 3, 4));   
332    fTextDrawOpt->Resize(120,20);
333    fTextSaveName = new TGTextEntry (vframeButtons, "spectra.png");
334    vframeButtons->AddFrame(fTextSaveName, new TGLayoutHints(kLHintsCenterX, 5, 5, 3, 4));   
335    fTextSaveName->Resize(120,20);
336
337    // buttons
338    TGTextButton *draw = new TGTextButton(vframeButtons, "&Draw");
339    draw->Connect("Clicked()", "MyMainFrame", this, "DoDraw()");
340    vframeButtons->AddFrame(draw, new TGLayoutHints(kLHintsCenterX, 5, 5, 3, 4));
341    TGTextButton *legend = new TGTextButton(vframeButtons, "&Legend");
342    legend->Connect("Clicked()", "MyMainFrame", this, "DoLegend()");
343    vframeButtons->AddFrame(legend, new TGLayoutHints(kLHintsCenterX, 5, 5, 3, 4));
344    TGTextButton *ratio = new TGTextButton(vframeButtons, "&Ratio");
345    ratio->Connect("Clicked()", "MyMainFrame", this, "DoRatio()");
346    vframeButtons->AddFrame(ratio, new TGLayoutHints(kLHintsCenterX, 5, 5, 3, 4));
347    TGTextButton *clear = new TGTextButton(vframeButtons, "&Clear");
348    clear->Connect("Clicked()", "MyMainFrame", this, "DoClear()");
349    vframeButtons->AddFrame(clear, new TGLayoutHints(kLHintsCenterX, 5, 5, 3, 4));
350    TGTextButton *print = new TGTextButton(vframeButtons, "&Print");
351    print->Connect("Clicked()", "MyMainFrame", this, "DoPrint()");
352    vframeButtons->AddFrame(print, new TGLayoutHints(kLHintsCenterX, 5, 5, 3, 4));
353    TGTextButton *exit = new TGTextButton(vframeButtons, "&Exit ");
354    exit->Connect("Pressed()", "MyMainFrame", this, "DoExit()");
355    vframeButtons->AddFrame(exit, new TGLayoutHints(kLHintsCenterX, 5, 5, 3, 4));
356
357
358
359
360    hframeMain->AddFrame(vframeButtons, new TGLayoutHints(kLHintsRight, 2, 2, 2, 2));
361
362    AddFrame(hframeMain,new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX  | kLHintsExpandY, 2, 2, 2, 2));
363
364    // Set a name to the main frame   
365    SetWindowName("Spectra OADB Browser");
366    MapSubwindows();
367
368    // Initialize the layout algorithm via Resize()
369    Resize(GetDefaultSize());
370
371    // Map main frame
372    MapWindow();
373 }
374
375
376 MyMainFrame::~MyMainFrame()
377 {
378    // Clean up main frame...
379    Cleanup();
380    delete fEcan;
381 }
382
383
384 void spectraOADBGUI()
385 {
386   // Popup the GUI...
387   
388   new MyMainFrame(gClient->GetRoot(), 200, 200);
389 }