]> git.uio.no Git - u/mrichter/AliRoot.git/blob - MUON/AliMUONPainterDataSourceFrame.cxx
New classes to get a much improved performance in the computation of
[u/mrichter/AliRoot.git] / MUON / AliMUONPainterDataSourceFrame.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 <cstdlib>
19 #include "AliMUONPainterDataSourceFrame.h"
20
21 #include "AliLog.h"
22 #include "AliMUONPainterDataSourceItem.h"
23 #include "AliMUONPainterEnv.h"
24 #include "AliMUONPainterHelper.h"
25 #include "AliMUONPainterDataRegistry.h"
26 #include "AliMUONRecoParam.h"
27 #include "AliMUONTrackerACFDataMaker.h"
28 #include "AliMUONTrackerDataMaker.h"
29 #include "AliMUONTrackerOCDBDataMaker.h"
30 #include "AliRawReader.h"
31 #include <TGButton.h>
32 #include <TGComboBox.h>
33 #include <TGFileDialog.h>
34 #include <TGNumberEntry.h>
35 #include <TGTextEntry.h>
36 #include <TGrid.h>
37 #include <TObjArray.h>
38 #include <TObjString.h>
39 #include <TRegexp.h>
40 #include <TString.h>
41 #include <TSystem.h>
42
43 ///\class AliMUONPainterDataSourceFrame
44 ///
45 /// A complete frame to select and display various data sources to 
46 /// be displayed : either raw data or OCDB data. 
47 /// Later on we might add digits and clusters for instance.
48 ///
49 ///\author Laurent Aphecetche, Subatech
50
51 const char* AliMUONPainterDataSourceFrame::fgkNumberOfDataSourcesKey = "NumberOfDataSources";
52 const char* AliMUONPainterDataSourceFrame::fgkDataSourceURIKey = "DataSourceURI.%d";
53
54 ///\cond CLASSIMP
55 ClassImp(AliMUONPainterDataSourceFrame)
56 ///\endcond
57
58 //_____________________________________________________________________________
59 AliMUONPainterDataSourceFrame::AliMUONPainterDataSourceFrame(const TGWindow* p, UInt_t w, UInt_t h)
60 : TGCompositeFrame(p,w,h,kVerticalFrame),
61   fRecentSourceSelector(new TGGroupFrame(this,"Recent sources",kHorizontalFrame)),
62   fRawSelector(new TGGroupFrame(this,"Raw file URI",kHorizontalFrame)),
63   fRawSelector2(new TGCompositeFrame(fRawSelector,w,h,kVerticalFrame)),
64   fRawSelector21(new TGCompositeFrame(fRawSelector2,w,h,kHorizontalFrame)),
65   fRawSelector22(new TGCompositeFrame(fRawSelector2,w,h,kHorizontalFrame)),
66   fRawSelector23(new TGCompositeFrame(fRawSelector2,w,h,kHorizontalFrame)),
67   fCalibrateNoGain(new TGCheckButton(fRawSelector22,"Ped subraction")),
68   fCalibrateGainConstantCapa(new TGCheckButton(fRawSelector22,"Ped subraction + gain (capa cste)")),
69   fCalibrateGain(new TGCheckButton(fRawSelector22,"Full calib (Ped subraction + gain with capa)")),
70   fHistogramButton(new TGCheckButton(fRawSelector23,"Histogram")),
71   fHistoMin(new TGNumberEntry(fRawSelector23,0)),
72   fHistoMax(new TGNumberEntry(fRawSelector23,4096)),
73   fRawOCDBPath(new TGTextEntry(fRawSelector22,"")),
74   fOCDBSelector(new TGGroupFrame(this,"OCDB Path",kHorizontalFrame)),
75   fDataReaders(new TGGroupFrame(this,"Data sources")),
76   fFilePath(new TGTextEntry(fRawSelector21,"")),
77   fOCDBPath(new TGTextEntry(fOCDBSelector,"")),
78   fRunSelector(new TGNumberEntry(fOCDBSelector,0)),
79   fOCDBTypes(new TGComboBox(fOCDBSelector)),
80   fRecentSources(new TGComboBox(fRecentSourceSelector)),
81   fItems(new TObjArray),
82   fACFSelector(new TGGroupFrame(this,"ASCII Calib File",kHorizontalFrame)),
83   fACFPath(new TGTextEntry(fACFSelector,"")),
84   fACFTypes(new TGComboBox(fACFSelector))
85 {
86   /// Ctor
87   
88     AliMUONPainterDataRegistry* reg = AliMUONPainterDataRegistry::Instance();
89     
90     reg->Connect("DataMakerWasRegistered(AliMUONVTrackerDataMaker*)",
91                  "AliMUONPainterDataSourceFrame",
92                  this,
93                  "DataMakerWasRegistered(AliMUONVTrackerDataMaker*)");
94     
95     reg->Connect("DataMakerWasUnregistered(AliMUONVTrackerDataMaker*)",
96                  "AliMUONPainterDataSourceFrame",
97                  this,
98                  "DataMakerWasUnregistered(AliMUONVTrackerDataMaker*)");
99     
100     fItems->SetOwner(kFALSE);
101     
102     /// Recent source selection
103     
104     AliMUONPainterEnv* env = AliMUONPainterHelper::Instance()->Env();
105     
106     Int_t nsources = env->Integer(fgkNumberOfDataSourcesKey);
107     
108     for ( Int_t i = 0; i < nsources; ++i )
109     {
110       AddRecentSource(env->String(Form(fgkDataSourceURIKey,i)));
111     }
112
113     fRecentSources->Resize(100,20);
114     
115     TGButton* createRecentButton = new TGTextButton(fRecentSourceSelector,"Create data source");
116     createRecentButton->Connect("Clicked()",
117                                 "AliMUONPainterDataSourceFrame",
118                                 this,
119                                 "OpenRecentSource()");
120     
121     fRecentSourceSelector->AddFrame(fRecentSources,new TGLayoutHints(kLHintsExpandX | kLHintsTop,5,5,5,5));
122     fRecentSourceSelector->AddFrame(createRecentButton,new TGLayoutHints(kLHintsTop,5,5,5,5));
123                      
124     /// Raw file selection
125     
126     TGButton* openButton = new TGPictureButton(fRawSelector21,
127                                            gClient->GetPicture("fileopen.xpm"));
128     openButton->SetToolTipText("Click to open file dialog");
129                                         
130     fRawSelector2->AddFrame(fRawSelector21, new TGLayoutHints(kLHintsExpandX,5,5,5,5));
131     fRawSelector2->AddFrame(fRawSelector22, new TGLayoutHints(kLHintsExpandX,5,5,5,5));
132     fRawSelector2->AddFrame(fRawSelector23, new TGLayoutHints(kLHintsExpandX,5,5,5,5));
133
134     fRawSelector21->AddFrame(openButton,new TGLayoutHints(kLHintsTop,5,5,5,5));
135     fRawSelector21->AddFrame(fFilePath, new TGLayoutHints(kLHintsExpandX | kLHintsTop,5,5,5,5));
136
137     fRawSelector22->AddFrame(fCalibrateNoGain, new TGLayoutHints(kLHintsTop,5,5,5,5));
138     fRawSelector22->AddFrame(fCalibrateGainConstantCapa, new TGLayoutHints(kLHintsTop,5,5,5,5));
139     fRawSelector22->AddFrame(fCalibrateGain, new TGLayoutHints(kLHintsTop,5,5,5,5));
140     fRawSelector22->AddFrame(fRawOCDBPath, new TGLayoutHints(kLHintsExpandX | kLHintsTop,5,5,5,5));
141     fRawOCDBPath->SetEnabled(kFALSE);
142     
143     fRawSelector23->AddFrame(fHistogramButton,new TGLayoutHints(kLHintsTop,5,5,5,5));
144     
145     fHistogramButton->Connect("Clicked()","AliMUONPainterDataSourceFrame",this,"HistogramButtonClicked()");
146     
147     fHistoMin->SetState(kFALSE);
148     fHistoMax->SetState(kFALSE);
149     
150     fRawSelector23->AddFrame(fHistoMin,new TGLayoutHints(kLHintsTop,5,5,5,5));
151     fRawSelector23->AddFrame(fHistoMax,new TGLayoutHints(kLHintsTop,5,5,5,5));
152     
153     TGButton* createRawButton = new TGTextButton(fRawSelector,"Create data source");
154     
155     fRawSelector->AddFrame(fRawSelector2, new TGLayoutHints(kLHintsExpandX | kLHintsTop,5,5,5,5));
156     fRawSelector->AddFrame(createRawButton, new TGLayoutHints(kLHintsCenterY,5,5,5,5));
157         
158     fCalibrateNoGain->Connect("Clicked()","AliMUONPainterDataSourceFrame",this,"CalibrateButtonClicked()");
159     fCalibrateGainConstantCapa->Connect("Clicked()","AliMUONPainterDataSourceFrame",this,"CalibrateButtonClicked()");
160     fCalibrateGain->Connect("Clicked()","AliMUONPainterDataSourceFrame",this,"CalibrateButtonClicked()");
161
162     openButton->Connect("Clicked()",
163                         "AliMUONPainterDataSourceFrame",
164                         this,
165                         "OpenFileDialog()");
166
167     createRawButton->Connect("Clicked()",
168                         "AliMUONPainterDataSourceFrame",
169                         this,
170                         "CreateRawDataSource()");
171     
172     /// OCDB selection
173     
174     fOCDBTypes->AddEntry("Pedestals",0);
175     fOCDBTypes->AddEntry("Gains",1);
176     fOCDBTypes->AddEntry("Capacitances",2);
177     fOCDBTypes->AddEntry("HV",3);
178     fOCDBTypes->Select(0);
179     fOCDBTypes->Resize(100,20);
180     
181     TGButton* createOCDBButton = new TGTextButton(fOCDBSelector,"Create data source");
182     createOCDBButton->Connect("Clicked()",
183                              "AliMUONPainterDataSourceFrame",
184                              this,
185                              "CreateOCDBDataSource()");
186
187   const char* ocdbToolTip = "Use URL style for either alien or local OCDB (foo://bar). For example :\n"
188   "alien://folder=/alice/data.../OCDB\n"
189   "or\nlocal:///home/user/aliroot (mind the 3 slashes there !)";
190   
191   fRawOCDBPath->SetToolTipText(ocdbToolTip);
192   fOCDBPath->SetToolTipText(ocdbToolTip);
193   
194     fOCDBSelector->AddFrame(fOCDBPath,new TGLayoutHints(kLHintsExpandX | kLHintsTop,5,5,5,5));    
195     fOCDBSelector->AddFrame(fRunSelector,new TGLayoutHints(kLHintsTop,5,5,5,5));
196     fOCDBSelector->AddFrame(fOCDBTypes,new TGLayoutHints(kLHintsExpandX | kLHintsTop,5,5,5,5));
197     fOCDBSelector->AddFrame(createOCDBButton,new TGLayoutHints(kLHintsTop,5,5,5,5));
198     
199     
200     /// ASCII calibration file selection
201     
202     TGButton* openButtonACF = new TGPictureButton(fACFSelector,
203                                                   gClient->GetPicture("fileopen.xpm"));
204     openButtonACF->SetToolTipText("Click to open file dialog");
205     
206     fACFTypes->AddEntry("Pedestals",0);
207     fACFTypes->AddEntry("Gains",1);
208     fACFTypes->AddEntry("Capacitances",2);
209     fACFTypes->Select(0);
210     fACFTypes->Resize(100,20);
211     
212     fACFSelector->AddFrame(openButtonACF,new TGLayoutHints(kLHintsTop,5,5,5,5));                                      
213     fACFSelector->AddFrame(fACFPath, new TGLayoutHints(kLHintsExpandX | kLHintsTop,5,5,5,5));
214     fACFSelector->AddFrame(fACFTypes,new TGLayoutHints(kLHintsExpandX | kLHintsTop,5,5,5,5));
215
216     TGButton* createACFButton = new TGTextButton(fACFSelector,"Create data source");
217     createACFButton->Connect("Clicked()",
218                               "AliMUONPainterDataSourceFrame",
219                               this,                              
220                              "CreateACFDataSource()");
221     
222     openButtonACF->Connect("Clicked()",
223                            "AliMUONPainterDataSourceFrame",
224                            this,
225                            "OpenFileDialogACF()");
226     
227     fACFSelector->AddFrame(createACFButton,new TGLayoutHints(kLHintsTop,5,5,5,5));
228
229     AddFrame(fRecentSourceSelector,new TGLayoutHints(kLHintsExpandX,10,10,10,10));
230
231     AddFrame(fRawSelector,new TGLayoutHints(kLHintsExpandX,10,10,10,10));
232
233     AddFrame(fOCDBSelector,new TGLayoutHints(kLHintsExpandX,10,10,10,10));
234
235     AddFrame(fACFSelector,new TGLayoutHints(kLHintsExpandX,10,10,10,10));
236     
237     AddFrame(fDataReaders, new TGLayoutHints(kLHintsExpandX,10,10,10,10));
238     
239 }
240
241 //_____________________________________________________________________________
242 AliMUONPainterDataSourceFrame::~AliMUONPainterDataSourceFrame()
243 {
244   /// dtor
245   
246   delete fItems;
247 }
248
249 //_____________________________________________________________________________
250 void
251 AliMUONPainterDataSourceFrame::AddRecentSource(const char* name)
252 {  
253   /// Add a source to the list of recently used sources
254   
255   TGListBox* lb = fRecentSources->GetListBox();
256   
257   for ( Int_t i = 0; i < lb->GetNumberOfEntries(); ++i ) 
258   {
259     TGTextLBEntry* t = (TGTextLBEntry*)lb->GetEntry(i);
260     TString s(t->GetText()->GetString());
261     if ( s == name ) 
262     {
263       return;
264     }
265   }
266   
267   fRecentSources->AddEntry(name,lb->GetNumberOfEntries());
268   fRecentSources->MapSubwindows();
269   fRecentSources->Layout();
270 }
271
272 //_____________________________________________________________________________
273 void
274 AliMUONPainterDataSourceFrame::CalibrateButtonClicked()
275 {
276   /// Calibrate button was clicked.
277   
278   if ( fCalibrateNoGain->IsOn() ||
279        fCalibrateGainConstantCapa->IsOn() ||
280        fCalibrateGain->IsOn() ) 
281   {
282     fRawOCDBPath->SetEnabled(kTRUE);
283     fRawOCDBPath->SetFocus();
284   }
285   else
286   {
287     fRawOCDBPath->SetEnabled(kFALSE);
288   }
289 }
290
291 //_____________________________________________________________________________
292 void
293 AliMUONPainterDataSourceFrame::HistogramButtonClicked()
294 {
295   /// Histogram button was clicked.
296   
297   if ( fHistogramButton->IsOn() )
298   {
299     fHistoMin->SetState(kTRUE);
300     fHistoMax->SetState(kTRUE);
301   }
302   else
303   {
304     fHistoMin->SetState(kFALSE);
305     fHistoMax->SetState(kFALSE);
306   }
307 }
308
309 //_____________________________________________________________________________
310 void
311 AliMUONPainterDataSourceFrame::CreateACFDataSource()
312 {
313   /// Create an ACF data source (using information from the widgets)
314   
315   TString acfPath = fACFPath->GetText();
316   TGTextLBEntry* t = static_cast<TGTextLBEntry*>(fACFTypes->GetSelectedEntry());
317   TString type = t->GetText()->GetString();
318   
319   CreateACFDataSource(acfPath,type);
320   
321   fACFPath->SetText("");
322 }
323
324
325 //_____________________________________________________________________________
326 void
327 AliMUONPainterDataSourceFrame::CreateOCDBDataSource()
328 {
329   /// Create an OCDB data source (using information from the widgets)
330   
331   TString cdbPath = fOCDBPath->GetText();
332   Int_t runNumber = fRunSelector->GetIntNumber();
333   TGTextLBEntry* t = static_cast<TGTextLBEntry*>(fOCDBTypes->GetSelectedEntry());
334   TString type = t->GetText()->GetString();
335   
336   CreateOCDBDataSource(cdbPath,runNumber,type);
337   
338   fOCDBPath->SetText("");
339   fRunSelector->SetNumber(0);  
340 }
341
342 //_____________________________________________________________________________
343 void
344 AliMUONPainterDataSourceFrame::CreateACFDataSource(const TString& uri)
345 {
346   /// Create an ACF data source, given it's URI
347   
348   TObjArray* a = uri.Tokenize(";");
349   TString acfPath = static_cast<TObjString*>(a->At(1))->String();
350   TString type = static_cast<TObjString*>(a->At(2))->String();
351   
352   CreateACFDataSource(acfPath,type);
353   
354   delete a;
355 }
356
357
358 //_____________________________________________________________________________
359 void
360 AliMUONPainterDataSourceFrame::CreateOCDBDataSource(const TString& uri)
361 {
362   /// Create an OCDB data source, given it's URI
363   
364   TObjArray* a = uri.Tokenize(";");
365   TString cdbPath = static_cast<TObjString*>(a->At(1))->String();
366   TString srun = static_cast<TObjString*>(a->At(2))->String();
367   TString type = static_cast<TObjString*>(a->At(3))->String();
368   
369   CreateOCDBDataSource(cdbPath,atoi(srun.Data()),type);
370   
371   delete a;
372 }
373
374 //_____________________________________________________________________________
375 void
376 AliMUONPainterDataSourceFrame::CreateACFDataSource(const TString& acfPath, const TString& type)
377 {
378   /// Create an ACF data source for a given (path,type) 
379
380   AliMUONVTrackerDataMaker* reader = new AliMUONTrackerACFDataMaker(acfPath.Data(),
381                                                                     type.Data());
382   
383   if ( reader->IsValid() ) 
384   {
385     AliMUONPainterDataRegistry::Instance()->Register(reader);
386     
387     AliMUONPainterEnv* env = AliMUONPainterHelper::Instance()->Env();
388     
389     Int_t n = env->Integer(fgkNumberOfDataSourcesKey);
390     
391     env->Set(fgkNumberOfDataSourcesKey,n+1);
392     
393     TString ds(Form("ACF;%s;%s",acfPath.Data(),type.Data()));
394     
395     env->Set(Form(fgkDataSourceURIKey,n),ds.Data());
396     
397     env->Save();
398     
399     AddRecentSource(ds.Data());
400   }
401   
402 }
403
404 //_____________________________________________________________________________
405 void
406 AliMUONPainterDataSourceFrame::CreateOCDBDataSource(const TString& cdbPath,
407                                                     Int_t runNumber,
408                                                     const TString& type)
409 {
410   /// Create an OCDB data source for a given (path,runnumber,type) triplet
411   
412   AliMUONVTrackerDataMaker* reader = new AliMUONTrackerOCDBDataMaker(cdbPath.Data(),
413                                                                        runNumber,
414                                                                        type.Data());
415   
416   if ( reader->IsValid() ) 
417   {
418     AliMUONPainterDataRegistry::Instance()->Register(reader);
419     
420     AliMUONPainterEnv* env = AliMUONPainterHelper::Instance()->Env();
421     
422     Int_t n = env->Integer(fgkNumberOfDataSourcesKey);
423     
424     env->Set(fgkNumberOfDataSourcesKey,n+1);
425     
426     TString ds(Form("OCDB;%s;%d;%s",cdbPath.Data(),runNumber,type.Data()));
427     
428     env->Set(Form(fgkDataSourceURIKey,n),ds.Data());
429     
430     env->Save();
431     
432     AddRecentSource(ds.Data());
433   }
434 }
435
436 //_____________________________________________________________________________
437 void 
438 AliMUONPainterDataSourceFrame::CreateRawDataSource()
439 {
440   /// Create a new raw data source (using info from the widgets)
441   
442   TString uri(gSystem->ExpandPathName(fFilePath->GetText()));
443
444   TString name("RAW");
445   Bool_t fromMemory(kFALSE);
446   
447   if ( uri.Contains(TRegexp("^mem")) )
448   {
449     fromMemory = kTRUE;
450   }
451   else
452   {
453     if ( gSystem->AccessPathName(uri.Data()) )
454     {
455       AliError(Form("File %s does not exist",uri.Data()));
456       fFilePath->SetText("");
457       return;
458     }
459   }
460
461   TString calibMode("");
462   
463   if ( fCalibrateGain->IsOn() ) 
464   {
465     calibMode = "GAIN";
466     name = "CALC";
467   }
468   
469   if ( fCalibrateGainConstantCapa->IsOn() ) 
470   {
471     calibMode = "GAINCONSTANTCAPA";
472     name = "CALG";
473   }
474   
475   if ( fCalibrateNoGain->IsOn() ) 
476   {
477     calibMode = "NOGAIN";
478     name = "CALZ";
479   }
480   
481   uri = Form("%s%s%s;%s;%s;%s;%s;%s",
482              ( fHistogramButton->IsOn() ? "H":""),
483              ( fromMemory ? "M" : ""),
484              name.Data(),uri.Data(),
485              ( strlen(fRawOCDBPath->GetText()) > 0 ? fRawOCDBPath->GetText() : " "),
486              ( calibMode.Length() > 0 ? calibMode.Data() : " "),
487              Form("%e",fHistoMin->GetNumber()),
488              Form("%e",fHistoMax->GetNumber()));
489   
490   if ( CreateRawDataSource(uri) )
491   {
492     fFilePath->SetText("");
493     fRawOCDBPath->SetText("");
494   }
495 }
496
497 //_____________________________________________________________________________
498 Bool_t 
499 AliMUONPainterDataSourceFrame::CreateRawDataSource(const TString& uri)
500 {
501   /// Create a new raw data source, given its URI
502   
503   TString filename;
504   TString ocdbPath;
505   TString calibMode;
506   TString sxmin("0.0");
507   TString sxmax("4096.0");
508   
509   TObjArray* a = uri.Tokenize(";");
510   
511   filename = static_cast<TObjString*>(a->At(1))->String();
512   
513   if ( a->GetLast() > 1 ) 
514   {
515     ocdbPath = static_cast<TObjString*>(a->At(2))->String();
516     if ( ocdbPath == " " ) ocdbPath = "";
517   }
518
519   if ( a->GetLast() > 2 ) 
520   {
521     calibMode = static_cast<TObjString*>(a->At(3))->String();
522     if ( calibMode == " " ) calibMode = "";
523   }
524
525   if ( a->GetLast() > 3 ) 
526   {
527     sxmin = static_cast<TObjString*>(a->At(4))->String();
528   }
529
530   if ( a->GetLast() > 4 ) 
531   {
532     sxmax = static_cast<TObjString*>(a->At(5))->String();
533   }
534   
535   AliRawReader* rawReader = 0x0;
536
537   if ( filename.Contains(TRegexp("^alien")) )
538   {
539     // insure we've initialized the grid...
540     if (!gGrid)
541     {
542       TGrid::Connect("alien://");
543     }
544   }
545   
546   rawReader = AliRawReader::Create(filename.Data());
547
548   if (!rawReader)
549   {
550     AliError(Form("Could not open file %s",filename.Data()));
551     fFilePath->SetText("");
552     return kFALSE;
553   }
554   
555   /// Basic test to see if the file is correct
556   Bool_t ok = rawReader->NextEvent();
557   if (!ok)
558   {
559     AliError(Form("File %s does not seem to be a raw data file",filename.Data()));
560     fFilePath->SetText("");
561     return kFALSE;
562   }
563   
564   rawReader->RewindEvents();
565   
566   AliMUONVTrackerDataMaker* reader(0x0);
567   Bool_t histogram(kFALSE);
568   
569   if ( uri.Contains(TRegexp("^H")) ) histogram = kTRUE;
570
571   if ( ocdbPath.Length() > 0 ) 
572   {
573     AliMUONRecoParam* recoParam = AliMUONRecoParam::GetCosmicParam();
574     
575     // FIXME: where to get the reco params from in reality ?
576     
577     reader = new AliMUONTrackerDataMaker(recoParam,
578                                          rawReader,
579                                          ocdbPath.Data(),
580                                          calibMode.Data(),
581                                          histogram,
582                                          sxmin.Atof(),
583                                          sxmax.Atof());
584   }
585   else
586   {
587     reader = new AliMUONTrackerDataMaker(rawReader,histogram);
588   }
589   
590   reader->SetSource(filename.Data());
591   
592   AliMUONPainterDataRegistry::Instance()->Register(reader);
593   
594   AliMUONPainterEnv* env = AliMUONPainterHelper::Instance()->Env();
595   
596   Int_t n = env->Integer(fgkNumberOfDataSourcesKey);
597   
598   env->Set(fgkNumberOfDataSourcesKey,n+1);
599   
600   env->Set(Form(fgkDataSourceURIKey,n),uri.Data());
601   
602   AddRecentSource(uri.Data());
603   
604   env->Save();
605
606   return kTRUE;
607 }
608
609 //_____________________________________________________________________________
610 void 
611 AliMUONPainterDataSourceFrame::DataMakerWasRegistered(AliMUONVTrackerDataMaker* reader)
612 {
613   /// Update ourselves as a new data reader was created
614   
615   AliMUONPainterDataSourceItem* item = new AliMUONPainterDataSourceItem(fDataReaders,100,20,reader);
616       
617   item->Connect("StartRunning()",
618                 "AliMUONPainterDataSourceFrame",
619                 this,
620                 "StartRunning()");
621
622   item->Connect("StopRunning()",
623                 "AliMUONPainterDataSourceFrame",
624                 this,
625                 "StopRunning()");
626   
627   fDataReaders->AddFrame(item);
628   
629   fItems->Add(item);
630
631   fDataReaders->MapSubwindows();
632   fDataReaders->Resize();
633 }
634
635 //_____________________________________________________________________________
636 void 
637 AliMUONPainterDataSourceFrame::DataMakerWasUnregistered(AliMUONVTrackerDataMaker* maker)
638 {
639   /// Update ourselves as a data reader was deleted
640   
641   AliMUONPainterDataSourceItem* theItem(0x0);
642   
643   TIter next(fItems);
644   AliMUONPainterDataSourceItem* item;
645   
646   while ( ( item = static_cast<AliMUONPainterDataSourceItem*>(next()) ) && !theItem )
647   {
648     if ( item->DataMaker() == maker ) 
649     {
650       theItem = item;
651     }
652   }
653   
654   if  (!theItem) return;
655   
656   fDataReaders->RemoveFrame(theItem);
657   fItems->Remove(theItem);
658   theItem->DestroyWindow();
659   delete theItem;
660   
661   fDataReaders->MapSubwindows();
662   fDataReaders->Resize();
663
664 }
665
666 //_____________________________________________________________________________
667 void
668 AliMUONPainterDataSourceFrame::OpenFileDialog()
669 {
670   /// Open a file dialog to select a file to be read
671   
672   TGFileInfo fileInfo;
673   
674   const char* fileTypes[] = { 
675     "ROOT files","*.root",
676     "DATE files","*.raw",
677     "All files","*",
678     0,0 };
679   
680   fileInfo.fFileTypes = fileTypes;
681   delete[] fileInfo.fIniDir;
682
683   AliMUONPainterEnv* env = AliMUONPainterHelper::Instance()->Env();
684   
685   fileInfo.fIniDir = StrDup(env->String("LastOpenDir","."));
686   
687   new TGFileDialog(gClient->GetRoot(),gClient->GetRoot(),
688                    kFDOpen,&fileInfo);
689   
690   fFilePath->SetText(gSystem->ExpandPathName(Form("%s",fileInfo.fFilename)));
691   
692   env->Set("LastOpenDir",fileInfo.fIniDir);
693   env->Save();  
694 }
695
696
697 //_____________________________________________________________________________
698 void
699 AliMUONPainterDataSourceFrame::OpenFileDialogACF()
700 {
701   /// Open a file dialog to select an ASCII calibration file to be read
702   
703   TGFileInfo fileInfo;
704   
705   const char* fileTypes[] = { 
706     "All files","*",
707     0,0 };
708   
709   fileInfo.fFileTypes = fileTypes;
710   delete[] fileInfo.fIniDir;
711   
712   AliMUONPainterEnv* env = AliMUONPainterHelper::Instance()->Env();
713   
714   fileInfo.fIniDir = StrDup(env->String("LastOpenDirACF","."));
715   
716   new TGFileDialog(gClient->GetRoot(),gClient->GetRoot(),
717                    kFDOpen,&fileInfo);
718   
719   fACFPath->SetText(gSystem->ExpandPathName(Form("%s",fileInfo.fFilename)));
720   
721   env->Set("LastOpenDirACF",fileInfo.fIniDir);
722   env->Save();  
723 }
724
725
726 //_____________________________________________________________________________
727 void
728 AliMUONPainterDataSourceFrame::OpenRecentSource()
729 {
730   /// Open one source from the recently used ones
731   
732   TGTextLBEntry* t = (TGTextLBEntry*)fRecentSources->GetSelectedEntry();
733
734   TString uri(t->GetText()->GetString());
735   
736   if ( uri.Contains(TRegexp("^RAW")) || uri.Contains(TRegexp("^HRAW")) || 
737        uri.Contains(TRegexp("^CAL")) || uri.Contains(TRegexp("^HCAL")) ||
738        uri.Contains(TRegexp("^MEM")) )
739   {
740     CreateRawDataSource(uri);
741   }
742   else if ( uri.Contains(TRegexp("^OCDB")) )
743   {
744     CreateOCDBDataSource(uri);
745   }
746   else if ( uri.Contains(TRegexp("^ACF")) )
747   {
748     CreateACFDataSource(uri);
749   }
750   
751   fRecentSources->Select(-1);
752 }
753
754 //_____________________________________________________________________________
755 void
756 AliMUONPainterDataSourceFrame::StartRunning()
757 {
758   /// One data source starts running. Disable the Run button of the other ones
759   
760   AliMUONPainterDataSourceItem* item = reinterpret_cast<AliMUONPainterDataSourceItem*> (gTQSender);
761   
762   AliInfo("");
763   
764   TIter next(fItems);
765   AliMUONPainterDataSourceItem* o;
766   while ( ( o = static_cast<AliMUONPainterDataSourceItem*>(next()) ) )
767   {
768     if ( o != item ) 
769     {
770       o->DisableRun();
771     }
772   }
773 }  
774
775 //_____________________________________________________________________________
776 void
777 AliMUONPainterDataSourceFrame::StopRunning()
778 {
779   /// One data source stops running. Enable the Run button of all items
780   
781   TIter next(fItems);
782   AliMUONPainterDataSourceItem* o;
783   while ( ( o = static_cast<AliMUONPainterDataSourceItem*>(next()) ) )
784   {
785     o->EnableRun();
786   }
787 }
788