]> git.uio.no Git - u/mrichter/AliRoot.git/blob - MUON/AliMUONMchViewApplication.cxx
Using the correct prototype for SetQA method
[u/mrichter/AliRoot.git] / MUON / AliMUONMchViewApplication.cxx
1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 *                                                                        *
4 * Author: The ALICE Off-line Project.                                    *
5 * Contributors are mentioned in the code where appropriate.              *
6 *                                                                        *
7 * Permission to use, copy, modify and distribute this software and its   *
8 * documentation strictly for non-commercial purposes is hereby granted   *
9 * without fee, provided that the above copyright notice appears in all   *
10 * copies and that both the copyright notice and this permission notice   *
11 * appear in the supporting documentation. The authors make no claims     *
12 * about the suitability of this software for any purpose. It is          *
13 * provided "as is" without express or implied warranty.                  *
14 **************************************************************************/
15
16 // $Id$
17
18 #include "AliMUONMchViewApplication.h"
19
20 #include "AliCDBManager.h"
21 #include "AliCodeTimer.h"
22 #include "AliLog.h"
23 #include "AliMUONPainterDataSourceFrame.h"
24 #include "AliMUONPainterEnv.h"
25 #include "AliMUONPainterHelper.h"
26 #include "AliMUONPainterMasterFrame.h"
27 #include "AliMUONPainterRegistry.h"
28 #include "AliMUONTrackerDataCompareDialog.h"
29 #include "AliMUONTrackerDataWrapper.h"
30 #include "AliMUONVTrackerData.h"
31 #include "AliMUONVTrackerDataMaker.h"
32 #include <Riostream.h>
33 #include <TCanvas.h>
34 #include <TEnv.h>
35 #include <TFile.h>
36 #include <TGClient.h>
37 #include <TGFileDialog.h>
38 #include <TGMenu.h>
39 #include <TGTab.h>
40 #include <TGTextView.h>
41 #include <TGrid.h>
42 #include <TKey.h>
43 #include <TList.h>
44 #include <TRegexp.h>
45 #include <TString.h>
46 #include <TSystem.h>
47
48 /// \class AliMUONMchViewApplication
49 ///
50 /// Main class for the mchview program
51 ///
52 ///\author Laurent Aphecetche, Subatech
53
54 /// \cond CLASSIMP
55 ClassImp(AliMUONMchViewApplication)
56 /// \endcond CLASSIMP
57
58 const Int_t AliMUONMchViewApplication::fgkFILESAVEAS(1);
59 const Int_t AliMUONMchViewApplication::fgkFILEOPEN(2);
60 const Int_t AliMUONMchViewApplication::fgkFILEEXIT(3);
61 const Int_t AliMUONMchViewApplication::fgkFILEPRINTAS(4);
62 const Int_t AliMUONMchViewApplication::fgkABOUT(5);
63 const Int_t AliMUONMchViewApplication::fgkCOMPAREDATA(6);
64
65 const char* AliMUONMchViewApplication::fgkFileTypes[] = { 
66   "ROOT files",    "*.root", 
67   "All files",     "*", 
68   0,               0 }; 
69
70 //______________________________________________________________________________
71 AliMUONMchViewApplication::AliMUONMchViewApplication(const char* name,
72                                                      int* argc, char** argv,
73                                                      UInt_t w, UInt_t h,
74                                                      UInt_t ox, UInt_t oy) 
75 : TRint(name,argc,argv),
76   fMainFrame(0x0),
77   fPainterMasterFrame(0x0)
78 {
79
80   /// ctor
81   /// (w,h) is the size in pixel (if 0,0 it will be computed as 70%,90% of display size)
82   /// (ox,oy) is the offset from the top-left of the display
83
84   if (!w | !h)
85   {
86     w = (UInt_t)(gClient->GetDisplayWidth()*0.7);
87     h = (UInt_t)(gClient->GetDisplayHeight()*0.9); 
88   }
89
90   fMainFrame = new TGMainFrame(gClient->GetRoot(),w,h);
91   
92   CreateMenuBar(w);
93
94   const Int_t kbs = 2;
95   
96 //  h -= 60; // menubar
97   
98   TGTab* tabs = new TGTab(fMainFrame,w,h);
99   
100   TGCompositeFrame* t = tabs->AddTab("Painter Master Frame");
101
102   fPainterMasterFrame =
103     new AliMUONPainterMasterFrame(t,t->GetWidth()-kbs*2,t->GetHeight()-kbs*2);
104   
105   t->AddFrame(fPainterMasterFrame, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY,kbs,kbs,kbs,kbs));
106
107   t = tabs->AddTab("Data Sources");
108   
109   AliMUONPainterDataSourceFrame* dsf = 
110     new AliMUONPainterDataSourceFrame(t,t->GetWidth()-kbs*2,t->GetHeight()-kbs*2);
111   
112   t->AddFrame(dsf,new TGLayoutHints(kLHintsExpandX | kLHintsExpandY,kbs,kbs,kbs,kbs));
113   
114   fMainFrame->AddFrame(tabs,new TGLayoutHints(kLHintsExpandX | kLHintsExpandY,0,0,0,0));
115
116   fMainFrame->SetWindowName("mchview - Visualization of MUON Tracker detector");
117
118   fMainFrame->MapSubwindows();
119   fMainFrame->Resize();
120   
121   fPainterMasterFrame->Update();
122   
123   fMainFrame->MapWindow();
124   
125   fMainFrame->Connect("CloseWindow()","AliMUONMchViewApplication",this,"Terminate()");
126
127   fMainFrame->MoveResize(ox,oy, w, h); 
128   fMainFrame->SetWMPosition(ox, oy);
129   fMainFrame->SetWMSizeHints(w,h,w,h,0,0);
130   
131   cout << "***************************************************" << endl;
132   cout << "   Welcome to mchview" << endl;
133   cout << "   " << FullVersion() << endl;
134   cout << "***************************************************" << endl;
135
136 }
137
138 //______________________________________________________________________________
139 AliMUONMchViewApplication::~AliMUONMchViewApplication()
140 {
141   /// dtor
142 }
143
144 //______________________________________________________________________________
145 void
146 AliMUONMchViewApplication::CompareData()
147 {
148   /// Launch compare data dialog
149   TGTransientFrame* t = new AliMUONTrackerDataCompareDialog(gClient->GetRoot(),
150                                                             gClient->GetRoot(),
151                                                             400,400);
152
153   t->MapSubwindows();
154   t->Resize();
155   t->MapWindow();
156   t->CenterOnParent();
157   
158   // set names
159   
160   t->SetWindowName("mchview compare data tool");
161   t->SetIconName("mchview compare data tool");
162   
163   t->MapRaised();
164   
165 }
166
167 //______________________________________________________________________________
168 void
169 AliMUONMchViewApplication::CreateMenuBar(UInt_t w)
170 {
171   /// Create the application menu bar
172   
173   TGPopupMenu* file = new TGPopupMenu(gClient->GetRoot());
174   
175   file->AddEntry("&Open...",fgkFILEOPEN);
176   file->AddEntry("&Save As...",fgkFILESAVEAS);
177   file->AddEntry("&Print As...",fgkFILEPRINTAS);
178   file->AddEntry("&Exit",fgkFILEEXIT);
179   
180   TGMenuBar* bar = new TGMenuBar(fMainFrame,w);
181   
182   TGPopupMenu* tools = new TGPopupMenu(gClient->GetRoot());
183   tools->AddEntry("&Compare data",fgkCOMPAREDATA);
184   
185   TGPopupMenu* about = new TGPopupMenu(gClient->GetRoot());  
186   about->AddEntry(FullVersion(),fgkABOUT);
187
188   file->Connect("Activated(Int_t)","AliMUONMchViewApplication",this,"HandleMenu(Int_t)");
189   about->Connect("Activated(Int_t)","AliMUONMchViewApplication",this,"HandleMenu(Int_t)");
190   tools->Connect("Activated(Int_t)","AliMUONMchViewApplication",this,"HandleMenu(Int_t)");
191   
192   bar->AddPopup("&File",file,new TGLayoutHints(kLHintsLeft|kLHintsTop));
193   bar->AddPopup("&Tools",tools,new TGLayoutHints(kLHintsLeft|kLHintsTop));
194   bar->AddPopup("&About",about,new TGLayoutHints(kLHintsRight|kLHintsTop));
195   
196   fMainFrame->AddFrame(bar,new TGLayoutHints(kLHintsLeft|kLHintsExpandX));
197   
198   AliMUONPainterRegistry::Instance()->SetMenuBar(bar);
199 }
200
201 //______________________________________________________________________________
202 void
203 AliMUONMchViewApplication::HandleMenu(Int_t i)
204 {
205   /// Handle the click of one menu item
206
207   switch (i)
208     {
209     case fgkFILEEXIT:
210       Terminate(1);
211       break;
212     case fgkFILEOPEN:
213       Open();
214       break;
215     case fgkFILESAVEAS:
216       Save();
217       break;
218     case fgkFILEPRINTAS:
219       PrintAs();
220       break;
221     case fgkABOUT:
222       ReleaseNotes();
223       break;
224     case fgkCOMPAREDATA:
225       CompareData();
226       break;
227     default:
228       break;
229     }
230 }
231
232 //______________________________________________________________________________
233 void
234 AliMUONMchViewApplication::Open()
235 {
236   /// Open file dialog
237   
238   TGFileInfo fileInfo;
239   
240   fileInfo.fFileTypes = fgkFileTypes;
241   
242   delete[] fileInfo.fIniDir;
243   
244   AliMUONPainterEnv* env = AliMUONPainterHelper::Instance()->Env();
245   
246   fileInfo.fIniDir = StrDup(env->String("LastOpenDir","."));
247   
248   new TGFileDialog(gClient->GetRoot(),gClient->GetRoot(),
249                    kFDOpen,&fileInfo);
250
251   env->Set("LastOpenDir",fileInfo.fIniDir);
252   env->Save();  
253     
254   Open(gSystem->ExpandPathName(Form("%s",fileInfo.fFilename)));
255 }  
256
257 //______________________________________________________________________________
258 void
259 AliMUONMchViewApplication::Open(const char* filename)
260 {
261   /// Open a given file containing saved VTrackerDataMaker objects
262   
263   TString sfilename(gSystem->ExpandPathName(filename));
264   
265   if ( sfilename.Contains(TRegexp("^alien")) )
266   {
267     // insure we've initialized the grid...
268     if (!gGrid)
269     {
270       TGrid::Connect("alien://");
271     }
272   }
273   
274   TFile* f = TFile::Open(filename);
275   
276         ReadDir(*f);
277         
278         delete f;
279 }
280
281 //______________________________________________________________________________
282 void
283 AliMUONMchViewApplication::ReadDir(TDirectory& dir)
284 {
285   /// Read the given directory and import VTrackerData objects found
286   
287   TList* keys = dir.GetListOfKeys();
288   TIter next(keys);
289   
290   TKey* k;
291   
292   while ( ( k = static_cast<TKey*>(next()) ) )
293   {
294     TObject* object = k->ReadObj();
295
296                 if ( object->InheritsFrom("TDirectory") )
297                 {
298                         TDirectory* d = static_cast<TDirectory*>(object);
299                         ReadDir(*d);
300                         continue;
301                 }
302                 
303     if ( object->InheritsFrom("AliMUONVTrackerDataMaker") )
304     {
305       AliMUONVTrackerDataMaker* maker = dynamic_cast<AliMUONVTrackerDataMaker*>(object);
306       if ( maker ) 
307       {
308         AliMUONPainterRegistry::Instance()->Register(maker);
309       }
310     }
311     
312     if ( object->InheritsFrom("AliMUONVTrackerData") )
313     {
314       // this is for backward compatibility. Early versions of mchview 
315       // wrote VTrackerData objects, and not VTrackerDataMaker ones.
316       
317       AliMUONVTrackerData* data = dynamic_cast<AliMUONVTrackerData*>(object);
318       if ( data ) 
319       {
320         AliMUONVTrackerDataMaker* maker = new AliMUONTrackerDataWrapper(data);
321         AliMUONPainterRegistry::Instance()->Register(maker);
322       }
323     }
324   }
325   
326
327
328 //______________________________________________________________________________
329 void
330 AliMUONMchViewApplication::PrintAs()
331 {
332   /// Print as...
333   
334   TGFileInfo fileInfo;
335   
336   new TGFileDialog(gClient->GetRoot(),gClient->GetRoot(),
337                    kFDSave,&fileInfo);
338   
339   fPainterMasterFrame->SaveAs(gSystem->ExpandPathName(Form("%s",fileInfo.fFilename)));
340 }
341
342 //______________________________________________________________________________
343 void
344 AliMUONMchViewApplication::ReleaseNotes()
345 {
346   /// Display release notes
347   
348   UInt_t width = 600;
349   UInt_t height = 400;
350   
351   TGTransientFrame* t = new TGTransientFrame(gClient->GetRoot(),gClient->GetRoot(),width,height);
352   
353   TGTextView* rn = new TGTextView(t);
354
355   rn->AddLine("0.9%");
356   rn->AddLine("");
357   rn->AddLine("New features");
358   rn->AddLine("");
359   rn->AddLine("- Can now read and display HV values from OCDB");
360   rn->AddLine("- New program option --geometry to force geometry of the window");
361   rn->AddLine("- Added possibility, in painters' context menu, to include or exclude part of the detector");
362   rn->AddLine("  (which will be used later on to communicate with LC2 which parts should be read out or not)");
363   rn->AddLine("");
364   rn->AddLine("Improvement");
365   rn->AddLine("");
366   rn->AddLine("- When displaying Gains, the quality information is now decoded");
367   rn->AddLine("");
368   
369   rn->AddLine("0.94");
370   rn->AddLine("");
371   rn->AddLine("New features");
372   rn->AddLine("");
373   rn->AddLine("Can now read ASCII calibration files produced by the DA");
374   rn->AddLine("");
375   
376   rn->AddLine("0.93");
377   rn->AddLine("");
378   rn->AddLine("New features");
379   rn->AddLine("");
380   rn->AddLine("- Adding a Lock button under the color slider to lock the range shown");
381   rn->AddLine("  when switching between views");
382   rn->AddLine("- Default display now shows bending plane (instead of cathode 0 before)");
383   rn->AddLine("- If pad is responder and there's some histo for that pad, ");
384   rn->AddLine("  clicking on it will display an histo");
385   rn->AddLine("- Right-click on a painter will now display several histogram options");
386   rn->AddLine("  (e.g. raw charge as before, but also simple distributions of mean");
387   rn->AddLine("  and sigma");
388   rn->AddLine("- In the Data Sources Tab, each data source can now be removed and saved");
389   rn->AddLine("- There's a new Tool menu which allow to produce a TrackerData from two others");
390   rn->AddLine("  in order to compare data.");
391   rn->AddLine("  - The --use option can now reference alien files");
392   rn->AddLine("");    
393   rn->AddLine("Bug fixes");
394   rn->AddLine("");    
395   rn->AddLine("- Can now read Capacitances from OCDB");
396     
397   rn->Resize(width,height);
398   
399   t->AddFrame(rn, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY));
400   
401   t->MapSubwindows();
402   t->Resize();
403   t->MapWindow();
404   t->CenterOnParent();
405     
406   // set names
407   
408   t->SetWindowName("mchview release notes");
409   t->SetIconName("mchview release notes");
410   
411 //  t->SetMWMHints(kMWMDecorAll | kMWMDecorResizeH  | kMWMDecorMaximize |
412 //              kMWMDecorMinimize | kMWMDecorMenu,
413 //              kMWMFuncAll  | kMWMFuncResize    | kMWMFuncMaximize |
414 //              kMWMFuncMinimize,
415 //              kMWMInputModeless);
416   
417   t->MapRaised();
418 //  gClient->WaitFor(t);
419 }
420
421 //______________________________________________________________________________
422 void
423 AliMUONMchViewApplication::Save()
424 {
425   /// Open "Save VTrackerData objects to file" dialog
426   
427   TGFileInfo fileInfo;
428   
429   new TGFileDialog(gClient->GetRoot(),gClient->GetRoot(),
430                    kFDSave,&fileInfo);
431   
432   Save(gSystem->ExpandPathName(Form("%s",fileInfo.fFilename)));
433 }  
434
435 //______________________________________________________________________________
436 void
437 AliMUONMchViewApplication::Save(const char* filename)
438 {
439   /// Save VTrackerDataMaker objects into file of given name
440   
441   AliMUONPainterRegistry* reg = AliMUONPainterRegistry::Instance();
442
443   TFile f(filename,"RECREATE");
444   
445   for ( Int_t i = 0; i < reg->NumberOfDataMakers(); ++i )
446   {
447     AliMUONVTrackerDataMaker* maker = reg->DataMaker(i);
448     maker->Write();
449   }
450   
451   f.Close();
452 }