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