]> git.uio.no Git - u/mrichter/AliRoot.git/blob - MUON/AliMUONPainterDataSourceFrame.cxx
mchview version 0.93
[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 "AliMUONPainterDataSourceFrame.h"
19
20
21 #include "AliLog.h"
22 #include "AliMUONPainterDataSourceItem.h"
23 #include "AliMUONPainterEnv.h"
24 #include "AliMUONPainterHelper.h"
25 #include "AliMUONPainterRegistry.h"
26 #include "AliMUONTrackerCalibratedDataMaker.h"
27 #include "AliMUONTrackerOCDBDataMaker.h"
28 #include "AliMUONTrackerRawDataMaker.h"
29 #include "AliRawReaderDate.h"
30 #include "AliRawReaderRoot.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 {
83   /// Ctor
84   
85     AliMUONPainterRegistry* reg = AliMUONPainterRegistry::Instance();
86     
87     reg->Connect("DataMakerWasRegistered(AliMUONVTrackerDataMaker*)",
88                  "AliMUONPainterDataSourceFrame",
89                  this,
90                  "DataMakerWasRegistered(AliMUONVTrackerDataMaker*)");
91     
92     reg->Connect("DataMakerWasUnregistered(AliMUONVTrackerDataMaker*)",
93                  "AliMUONPainterDataSourceFrame",
94                  this,
95                  "DataMakerWasUnregistered(AliMUONVTrackerDataMaker*)");
96     
97     fItems->SetOwner(kFALSE);
98     
99     /// Recent source selection
100     
101     AliMUONPainterEnv* env = AliMUONPainterHelper::Instance()->Env();
102     
103     Int_t nsources = env->Integer(fgkNumberOfDataSourcesKey);
104     
105     for ( Int_t i = 0; i < nsources; ++i )
106     {
107       AddRecentSource(env->String(Form(fgkDataSourceURIKey,i)));
108     }
109
110     fRecentSources->Resize(100,20);
111     
112     TGButton* createRecentButton = new TGTextButton(fRecentSourceSelector,"Create data source");
113     createRecentButton->Connect("Clicked()",
114                                 "AliMUONPainterDataSourceFrame",
115                                 this,
116                                 "OpenRecentSource()");
117     
118     fRecentSourceSelector->AddFrame(fRecentSources,new TGLayoutHints(kLHintsExpandX | kLHintsTop,5,5,5,5));
119     fRecentSourceSelector->AddFrame(createRecentButton,new TGLayoutHints(kLHintsTop,5,5,5,5));
120                                     
121     /// Raw file selection
122     
123     TGButton* openButton = new TGPictureButton(fRawSelector21,
124                                            gClient->GetPicture("fileopen.xpm"));
125     openButton->SetToolTipText("Click to open file dialog");
126                                         
127     fRawSelector2->AddFrame(fRawSelector21, new TGLayoutHints(kLHintsExpandX,5,5,5,5));
128     fRawSelector2->AddFrame(fRawSelector22, new TGLayoutHints(kLHintsExpandX,5,5,5,5));
129     fRawSelector2->AddFrame(fRawSelector23, new TGLayoutHints(kLHintsExpandX,5,5,5,5));
130
131     fRawSelector21->AddFrame(openButton,new TGLayoutHints(kLHintsTop,5,5,5,5));
132     fRawSelector21->AddFrame(fFilePath, new TGLayoutHints(kLHintsExpandX | kLHintsTop,5,5,5,5));
133
134     fRawSelector22->AddFrame(fCalibrateNoGain, new TGLayoutHints(kLHintsTop,5,5,5,5));
135     fRawSelector22->AddFrame(fCalibrateGainConstantCapa, new TGLayoutHints(kLHintsTop,5,5,5,5));
136     fRawSelector22->AddFrame(fCalibrateGain, new TGLayoutHints(kLHintsTop,5,5,5,5));
137     fRawSelector22->AddFrame(fRawOCDBPath, new TGLayoutHints(kLHintsExpandX | kLHintsTop,5,5,5,5));
138     fRawOCDBPath->SetEnabled(kFALSE);
139     
140     fRawSelector23->AddFrame(fHistogramButton,new TGLayoutHints(kLHintsTop,5,5,5,5));
141     
142     fHistogramButton->Connect("Clicked()","AliMUONPainterDataSourceFrame",this,"HistogramButtonClicked()");
143     
144     fHistoMin->SetState(kFALSE);
145     fHistoMax->SetState(kFALSE);
146     
147     fRawSelector23->AddFrame(fHistoMin,new TGLayoutHints(kLHintsTop,5,5,5,5));
148     fRawSelector23->AddFrame(fHistoMax,new TGLayoutHints(kLHintsTop,5,5,5,5));
149     
150     TGButton* createRawButton = new TGTextButton(fRawSelector,"Create data source");
151     
152     fRawSelector->AddFrame(fRawSelector2, new TGLayoutHints(kLHintsExpandX | kLHintsTop,5,5,5,5));
153     fRawSelector->AddFrame(createRawButton, new TGLayoutHints(kLHintsCenterY,5,5,5,5));
154         
155     fCalibrateNoGain->Connect("Clicked()","AliMUONPainterDataSourceFrame",this,"CalibrateButtonClicked()");
156     fCalibrateGainConstantCapa->Connect("Clicked()","AliMUONPainterDataSourceFrame",this,"CalibrateButtonClicked()");
157     fCalibrateGain->Connect("Clicked()","AliMUONPainterDataSourceFrame",this,"CalibrateButtonClicked()");
158
159     openButton->Connect("Clicked()",
160                         "AliMUONPainterDataSourceFrame",
161                         this,
162                         "OpenFileDialog()");
163
164     createRawButton->Connect("Clicked()",
165                         "AliMUONPainterDataSourceFrame",
166                         this,
167                         "CreateRawDataSource()");
168     
169     /// OCDB selection
170     
171     fOCDBTypes->AddEntry("Pedestals",0);
172     fOCDBTypes->AddEntry("Gains",1);
173     fOCDBTypes->AddEntry("Capacitances",2);
174     fOCDBTypes->Select(0);
175     fOCDBTypes->Resize(100,20);
176     
177     TGButton* createOCDBButton = new TGTextButton(fOCDBSelector,"Create data source");
178     createOCDBButton->Connect("Clicked()",
179                              "AliMUONPainterDataSourceFrame",
180                              this,
181                              "CreateOCDBDataSource()");
182     
183     
184     fOCDBSelector->AddFrame(fOCDBPath,new TGLayoutHints(kLHintsExpandX | kLHintsTop,5,5,5,5));    
185     fOCDBSelector->AddFrame(fRunSelector,new TGLayoutHints(kLHintsTop,5,5,5,5));
186     fOCDBSelector->AddFrame(fOCDBTypes,new TGLayoutHints(kLHintsExpandX | kLHintsTop,5,5,5,5));
187     fOCDBSelector->AddFrame(createOCDBButton,new TGLayoutHints(kLHintsTop,5,5,5,5));
188
189     AddFrame(fRecentSourceSelector,new TGLayoutHints(kLHintsExpandX,10,10,10,10));
190
191     AddFrame(fRawSelector,new TGLayoutHints(kLHintsExpandX,10,10,10,10));
192
193     AddFrame(fOCDBSelector,new TGLayoutHints(kLHintsExpandX,10,10,10,10));
194
195     AddFrame(fDataReaders, new TGLayoutHints(kLHintsExpandX,10,10,10,10));
196     
197 }
198
199 //_____________________________________________________________________________
200 AliMUONPainterDataSourceFrame::~AliMUONPainterDataSourceFrame()
201 {
202   /// dtor
203   
204   delete fItems;
205 }
206
207 //_____________________________________________________________________________
208 void
209 AliMUONPainterDataSourceFrame::AddRecentSource(const char* name)
210 {  
211   /// Add a source to the list of recently used sources
212   
213   TGListBox* lb = fRecentSources->GetListBox();
214   
215   for ( Int_t i = 0; i < lb->GetNumberOfEntries(); ++i ) 
216   {
217     TGTextLBEntry* t = (TGTextLBEntry*)lb->GetEntry(i);
218     TString s(t->GetText()->GetString());
219     if ( s == name ) 
220     {
221       return;
222     }
223   }
224   
225   fRecentSources->AddEntry(name,lb->GetNumberOfEntries());
226   fRecentSources->MapSubwindows();
227   fRecentSources->Layout();
228 }
229
230 //_____________________________________________________________________________
231 void
232 AliMUONPainterDataSourceFrame::CalibrateButtonClicked()
233 {
234   /// Calibrate button was clicked.
235   
236   if ( fCalibrateNoGain->IsOn() ||
237        fCalibrateGainConstantCapa->IsOn() ||
238        fCalibrateGain->IsOn() ) 
239   {
240     fRawOCDBPath->SetEnabled(kTRUE);
241     fRawOCDBPath->SetFocus();
242   }
243   else
244   {
245     fRawOCDBPath->SetEnabled(kFALSE);
246   }
247 }
248
249 //_____________________________________________________________________________
250 void
251 AliMUONPainterDataSourceFrame::HistogramButtonClicked()
252 {
253   /// Histogram button was clicked.
254   
255   if ( fHistogramButton->IsOn() )
256   {
257     fHistoMin->SetState(kTRUE);
258     fHistoMax->SetState(kTRUE);
259   }
260   else
261   {
262     fHistoMin->SetState(kFALSE);
263     fHistoMax->SetState(kFALSE);
264   }
265 }
266
267 //_____________________________________________________________________________
268 void
269 AliMUONPainterDataSourceFrame::CreateOCDBDataSource()
270 {
271   /// Create an OCDB data source (using information from the widgets)
272   
273   TString cdbPath = fOCDBPath->GetText();
274   Int_t runNumber = fRunSelector->GetIntNumber();
275   TGTextLBEntry* t = static_cast<TGTextLBEntry*>(fOCDBTypes->GetSelectedEntry());
276   TString type = t->GetText()->GetString();
277   
278   CreateOCDBDataSource(cdbPath,runNumber,type);
279   
280   fOCDBPath->SetText("");
281   fRunSelector->SetNumber(0);  
282 }
283
284 //_____________________________________________________________________________
285 void
286 AliMUONPainterDataSourceFrame::CreateOCDBDataSource(const TString& uri)
287 {
288   /// Create an OCDB data source, given it's URI
289   
290   TObjArray* a = uri.Tokenize(";");
291   TString cdbPath = static_cast<TObjString*>(a->At(1))->String();
292   TString srun = static_cast<TObjString*>(a->At(2))->String();
293   TString type = static_cast<TObjString*>(a->At(3))->String();
294   
295   CreateOCDBDataSource(cdbPath,atoi(srun.Data()),type);
296   
297   delete a;
298 }
299
300 //_____________________________________________________________________________
301 void
302 AliMUONPainterDataSourceFrame::CreateOCDBDataSource(const TString& cdbPath,
303                                                     Int_t runNumber,
304                                                     const TString& type)
305 {
306   /// Create an OCDB data source for a given (path,runnumber,type) triplet
307   
308   AliMUONVTrackerDataMaker* reader = new AliMUONTrackerOCDBDataMaker(cdbPath.Data(),
309                                                                        runNumber,
310                                                                        type.Data());
311   
312   if ( reader->IsValid() ) 
313   {
314     AliMUONPainterRegistry::Instance()->Register(reader);
315     
316     AliMUONPainterEnv* env = AliMUONPainterHelper::Instance()->Env();
317     
318     Int_t n = env->Integer(fgkNumberOfDataSourcesKey);
319     
320     env->Set(fgkNumberOfDataSourcesKey,n+1);
321     
322     TString ds(Form("OCDB;%s;%d;%s",cdbPath.Data(),runNumber,type.Data()));
323     
324     env->Set(Form(fgkDataSourceURIKey,n),ds.Data());
325     
326     env->Save();
327     
328     AddRecentSource(ds.Data());
329   }
330 }
331
332 //_____________________________________________________________________________
333 void 
334 AliMUONPainterDataSourceFrame::CreateRawDataSource()
335 {
336   /// Create a new raw data source (using info from the widgets)
337   
338   TString uri(gSystem->ExpandPathName(fFilePath->GetText()));
339   
340   if ( gSystem->AccessPathName(uri.Data()) )
341   {
342     AliError(Form("File %s does not exist",uri.Data()));
343     fFilePath->SetText("");
344     return;
345   }
346
347   TString calibMode("");
348   TString name("RAW");
349   
350   if ( fCalibrateGain->IsOn() ) 
351   {
352     calibMode = "GAIN";
353     name = "CALC";
354   }
355   
356   if ( fCalibrateGainConstantCapa->IsOn() ) 
357   {
358     calibMode = "GAINCONSTANTCAPA";
359     name = "CALG";
360   }
361   
362   if ( fCalibrateNoGain->IsOn() ) 
363   {
364     calibMode = "NOGAIN";
365     name = "CALZ";
366   }
367   
368   uri = Form("%s%s;%s;%s;%s;%s;%s",
369              ( fHistogramButton->IsOn() ? "H":""),
370              name.Data(),uri.Data(),
371              ( strlen(fRawOCDBPath->GetText()) > 0 ? fRawOCDBPath->GetText() : " "),
372              ( calibMode.Length() > 0 ? calibMode.Data() : " "),
373              Form("%e",fHistoMin->GetNumber()),
374              Form("%e",fHistoMax->GetNumber()));
375   
376   if ( CreateRawDataSource(uri) )
377   {
378     fFilePath->SetText("");
379     fRawOCDBPath->SetText("");
380   }
381 }
382
383 //_____________________________________________________________________________
384 Bool_t 
385 AliMUONPainterDataSourceFrame::CreateRawDataSource(const TString& uri)
386 {
387   /// Create a new raw data source, given its URI
388   
389   TString filename;
390   TString ocdbPath;
391   TString calibMode;
392   TString sxmin("0.0");
393   TString sxmax("4096.0");
394   
395   TObjArray* a = uri.Tokenize(";");
396   
397   filename = static_cast<TObjString*>(a->At(1))->String();
398   
399   if ( a->GetLast() > 1 ) 
400   {
401     ocdbPath = static_cast<TObjString*>(a->At(2))->String();
402     if ( ocdbPath == " " ) ocdbPath = "";
403   }
404
405   if ( a->GetLast() > 2 ) 
406   {
407     calibMode = static_cast<TObjString*>(a->At(3))->String();
408     if ( calibMode == " " ) calibMode = "";
409   }
410
411   if ( a->GetLast() > 3 ) 
412   {
413     sxmin = static_cast<TObjString*>(a->At(4))->String();
414   }
415
416   if ( a->GetLast() > 4 ) 
417   {
418     sxmax = static_cast<TObjString*>(a->At(5))->String();
419   }
420   
421   AliRawReader* rawReader = 0x0;
422
423   if ( filename.Contains(TRegexp(".root$")) ) 
424   {
425     AliDebug(1,"Using RawReaderRoot");
426     if ( filename.Contains(TRegexp("^alien")) )
427     {
428       // insure we've initialized the grid...
429       if (!gGrid)
430       {
431         TGrid::Connect("alien://");
432       }
433     }
434          
435     rawReader = new AliRawReaderRoot(filename.Data());
436   }
437   else 
438   {
439     /// Anything not .root is supposed to be DATE file
440     AliDebug(1,"Using RawReaderDate");
441     rawReader = new AliRawReaderDate(filename.Data());
442   }
443
444   /// Basic test to see if the file is correct
445   Bool_t ok = rawReader->NextEvent();
446   if (!ok)
447   {
448     AliError(Form("File %s does not seem to be a raw data file",filename.Data()));
449     fFilePath->SetText("");
450     return kFALSE;
451   }
452   
453   rawReader->RewindEvents();
454   
455   AliMUONVTrackerDataMaker* reader(0x0);
456   Bool_t histogram(kFALSE);
457   
458   if ( uri.Contains(TRegexp("^H")) ) histogram = kTRUE;
459
460   if ( ocdbPath.Length() > 0 ) 
461   {
462     reader = new AliMUONTrackerCalibratedDataMaker(rawReader,ocdbPath.Data(),
463                                                    calibMode.Data(),
464                                                    histogram,
465                                                    sxmin.Atof(),
466                                                    sxmax.Atof());
467   }
468   else
469   {
470     reader = new AliMUONTrackerRawDataMaker(rawReader,histogram);
471   }
472   
473   reader->SetSource(filename.Data());
474   
475   AliMUONPainterRegistry::Instance()->Register(reader);
476   
477   AliMUONPainterEnv* env = AliMUONPainterHelper::Instance()->Env();
478   
479   Int_t n = env->Integer(fgkNumberOfDataSourcesKey);
480   
481   env->Set(fgkNumberOfDataSourcesKey,n+1);
482   
483   env->Set(Form(fgkDataSourceURIKey,n),uri.Data());
484   
485   AddRecentSource(uri.Data());
486   
487   env->Save();
488
489   return kTRUE;
490 }
491
492 //_____________________________________________________________________________
493 void 
494 AliMUONPainterDataSourceFrame::DataMakerWasRegistered(AliMUONVTrackerDataMaker* reader)
495 {
496   /// Update ourselves as a new data reader was created
497   
498   AliMUONPainterDataSourceItem* item = new AliMUONPainterDataSourceItem(fDataReaders,100,20,reader);
499       
500   item->Connect("StartRunning()",
501                 "AliMUONPainterDataSourceFrame",
502                 this,
503                 Form("StartRunning(=(AliMUONPainterDataSourceItem*)(0x%x))",item));
504
505   item->Connect("StopRunning()",
506                 "AliMUONPainterDataSourceFrame",
507                 this,
508                 Form("StopRunning(=(AliMUONPainterDataSourceItem*)(0x%x))",item));
509   
510   fDataReaders->AddFrame(item);
511   
512   fItems->Add(item);
513
514   fDataReaders->MapSubwindows();
515   fDataReaders->Resize();
516 }
517
518 //_____________________________________________________________________________
519 void 
520 AliMUONPainterDataSourceFrame::DataMakerWasUnregistered(AliMUONVTrackerDataMaker* maker)
521 {
522   /// Update ourselves as a data reader was deleted
523   
524   AliMUONPainterDataSourceItem* theItem(0x0);
525   
526   TIter next(fItems);
527   AliMUONPainterDataSourceItem* item;
528   
529   while ( ( item = static_cast<AliMUONPainterDataSourceItem*>(next()) ) && !theItem )
530   {
531     if ( item->DataMaker() == maker ) 
532     {
533       theItem = item;
534     }
535   }
536   
537   if  (!theItem) return;
538   
539   fDataReaders->RemoveFrame(theItem);
540   fItems->Remove(theItem);
541   theItem->DestroyWindow();
542   delete theItem;
543   
544   fDataReaders->MapSubwindows();
545   fDataReaders->Resize();
546
547 }
548
549 //_____________________________________________________________________________
550 void
551 AliMUONPainterDataSourceFrame::OpenFileDialog()
552 {
553   /// Open a file dialog to select a file to be read
554   
555   TGFileInfo fileInfo;
556   
557   const char* fileTypes[] = { 
558     "ROOT files","*.root",
559     "DATE files","*.raw",
560     "All files","*",
561     0,0 };
562   
563   fileInfo.fFileTypes = fileTypes;
564   delete[] fileInfo.fIniDir;
565
566   AliMUONPainterEnv* env = AliMUONPainterHelper::Instance()->Env();
567   
568   fileInfo.fIniDir = StrDup(env->String("LastOpenDir","."));
569   
570   new TGFileDialog(gClient->GetRoot(),gClient->GetRoot(),
571                    kFDOpen,&fileInfo);
572   
573   fFilePath->SetText(gSystem->ExpandPathName(Form("%s",fileInfo.fFilename)));
574   
575   env->Set("LastOpenDir",fileInfo.fIniDir);
576   env->Save();  
577 }
578
579
580 //_____________________________________________________________________________
581 void
582 AliMUONPainterDataSourceFrame::OpenRecentSource()
583 {
584   /// Open one source from the recently used ones
585   
586   TGTextLBEntry* t = (TGTextLBEntry*)fRecentSources->GetSelectedEntry();
587
588   TString uri(t->GetText()->GetString());
589   
590   if ( uri.Contains(TRegexp("^RAW")) || uri.Contains(TRegexp("^HRAW")) || 
591        uri.Contains(TRegexp("^CAL")) || uri.Contains(TRegexp("^HCAL")) )
592   {
593     CreateRawDataSource(uri);
594   }
595   else if ( uri.Contains(TRegexp("^OCDB")) )
596   {
597     CreateOCDBDataSource(uri);
598   }
599   
600   fRecentSources->Select(-1);
601 }
602
603 //_____________________________________________________________________________
604 void
605 AliMUONPainterDataSourceFrame::StartRunning(AliMUONPainterDataSourceItem* item)
606 {
607   /// One data source starts running. Disable the Run button of the other ones
608   TIter next(fItems);
609   AliMUONPainterDataSourceItem* o;
610   while ( ( o = static_cast<AliMUONPainterDataSourceItem*>(next()) ) )
611   {
612     if ( o != item ) 
613     {
614       o->DisableRun();
615     }
616   }
617 }  
618
619 //_____________________________________________________________________________
620 void
621 AliMUONPainterDataSourceFrame::StopRunning(AliMUONPainterDataSourceItem* /*item*/)
622 {
623   /// One data source stops running. Enable the Run button of all items
624   TIter next(fItems);
625   AliMUONPainterDataSourceItem* o;
626   while ( ( o = static_cast<AliMUONPainterDataSourceItem*>(next()) ) )
627   {
628     o->EnableRun();
629   }
630 }
631