1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
18 #include "AliMUONPainterDataSourceFrame.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"
32 #include <TGComboBox.h>
33 #include <TGFileDialog.h>
34 #include <TGNumberEntry.h>
35 #include <TGTextEntry.h>
37 #include <TObjArray.h>
38 #include <TObjString.h>
43 ///\class AliMUONPainterDataSourceFrame
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.
49 ///\author Laurent Aphecetche, Subatech
51 const char* AliMUONPainterDataSourceFrame::fgkNumberOfDataSourcesKey = "NumberOfDataSources";
52 const char* AliMUONPainterDataSourceFrame::fgkDataSourceURIKey = "DataSourceURI.%d";
55 ClassImp(AliMUONPainterDataSourceFrame)
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,"Zero suppress")),
68 fCalibrateGainConstantCapa(new TGCheckButton(fRawSelector22,"Zero suppress + gain (capa cste)")),
69 fCalibrateGain(new TGCheckButton(fRawSelector22,"Full calib (zero suppress + 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)),
85 AliMUONPainterRegistry* reg = AliMUONPainterRegistry::Instance();
87 reg->Connect("DataReaderWasRegistered(AliMUONVTrackerDataMaker*)",
88 "AliMUONPainterDataSourceFrame",
90 "DataReaderWasRegistered(AliMUONVTrackerDataMaker*)");
92 reg->Connect("DataReaderWasUnregistered(AliMUONVTrackerDataMaker*)",
93 "AliMUONPainterDataSourceFrame",
95 "DataReaderWasUnregistered(AliMUONVTrackerDataMaker*)");
97 fItems->SetOwner(kFALSE);
99 /// Recent source selection
101 AliMUONPainterEnv* env = AliMUONPainterHelper::Instance()->Env();
103 Int_t nsources = env->Integer(fgkNumberOfDataSourcesKey);
105 for ( Int_t i = 0; i < nsources; ++i )
107 AddRecentSource(env->String(Form(fgkDataSourceURIKey,i)));
110 fRecentSources->Resize(100,20);
112 TGButton* createRecentButton = new TGTextButton(fRecentSourceSelector,"Create data source");
113 createRecentButton->Connect("Clicked()",
114 "AliMUONPainterDataSourceFrame",
116 "OpenRecentSource()");
118 fRecentSourceSelector->AddFrame(fRecentSources,new TGLayoutHints(kLHintsExpandX | kLHintsTop,5,5,5,5));
119 fRecentSourceSelector->AddFrame(createRecentButton,new TGLayoutHints(kLHintsTop,5,5,5,5));
121 /// Raw file selection
123 TGButton* openButton = new TGPictureButton(fRawSelector21,
124 gClient->GetPicture("fileopen.xpm"));
125 openButton->SetToolTipText("Click to open file dialog");
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));
131 fRawSelector21->AddFrame(openButton,new TGLayoutHints(kLHintsTop,5,5,5,5));
132 fRawSelector21->AddFrame(fFilePath, new TGLayoutHints(kLHintsExpandX | kLHintsTop,5,5,5,5));
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);
140 fRawSelector23->AddFrame(fHistogramButton,new TGLayoutHints(kLHintsTop,5,5,5,5));
142 fHistogramButton->Connect("Clicked()","AliMUONPainterDataSourceFrame",this,"HistogramButtonClicked()");
144 fHistoMin->SetState(kFALSE);
145 fHistoMax->SetState(kFALSE);
147 fRawSelector23->AddFrame(fHistoMin,new TGLayoutHints(kLHintsTop,5,5,5,5));
148 fRawSelector23->AddFrame(fHistoMax,new TGLayoutHints(kLHintsTop,5,5,5,5));
150 TGButton* createRawButton = new TGTextButton(fRawSelector,"Create data source");
152 fRawSelector->AddFrame(fRawSelector2, new TGLayoutHints(kLHintsExpandX | kLHintsTop,5,5,5,5));
153 fRawSelector->AddFrame(createRawButton, new TGLayoutHints(kLHintsCenterY,5,5,5,5));
155 fCalibrateNoGain->Connect("Clicked()","AliMUONPainterDataSourceFrame",this,"CalibrateButtonClicked()");
156 fCalibrateGainConstantCapa->Connect("Clicked()","AliMUONPainterDataSourceFrame",this,"CalibrateButtonClicked()");
157 fCalibrateGain->Connect("Clicked()","AliMUONPainterDataSourceFrame",this,"CalibrateButtonClicked()");
159 openButton->Connect("Clicked()",
160 "AliMUONPainterDataSourceFrame",
164 createRawButton->Connect("Clicked()",
165 "AliMUONPainterDataSourceFrame",
167 "CreateRawDataSource()");
171 fOCDBTypes->AddEntry("Pedestals",0);
172 fOCDBTypes->AddEntry("Gains",1);
173 fOCDBTypes->AddEntry("Capacitances",2);
174 fOCDBTypes->Select(0);
175 fOCDBTypes->Resize(100,20);
177 TGButton* createOCDBButton = new TGTextButton(fOCDBSelector,"Create data source");
178 createOCDBButton->Connect("Clicked()",
179 "AliMUONPainterDataSourceFrame",
181 "CreateOCDBDataSource()");
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));
189 AddFrame(fRecentSourceSelector,new TGLayoutHints(kLHintsExpandX,10,10,10,10));
191 AddFrame(fRawSelector,new TGLayoutHints(kLHintsExpandX,10,10,10,10));
193 AddFrame(fOCDBSelector,new TGLayoutHints(kLHintsExpandX,10,10,10,10));
195 AddFrame(fDataReaders, new TGLayoutHints(kLHintsExpandX,10,10,10,10));
199 //_____________________________________________________________________________
200 AliMUONPainterDataSourceFrame::~AliMUONPainterDataSourceFrame()
207 //_____________________________________________________________________________
209 AliMUONPainterDataSourceFrame::AddRecentSource(const char* name)
211 /// Add a source to the list of recently used sources
213 TGListBox* lb = fRecentSources->GetListBox();
215 for ( Int_t i = 0; i < lb->GetNumberOfEntries(); ++i )
217 TGTextLBEntry* t = (TGTextLBEntry*)lb->GetEntry(i);
218 TString s(t->GetText()->GetString());
225 fRecentSources->AddEntry(name,lb->GetNumberOfEntries());
226 fRecentSources->MapSubwindows();
227 fRecentSources->Layout();
230 //_____________________________________________________________________________
232 AliMUONPainterDataSourceFrame::CalibrateButtonClicked()
234 /// Calibrate button was clicked.
236 if ( fCalibrateNoGain->IsOn() ||
237 fCalibrateGainConstantCapa->IsOn() ||
238 fCalibrateGain->IsOn() )
240 fRawOCDBPath->SetEnabled(kTRUE);
241 fRawOCDBPath->SetFocus();
245 fRawOCDBPath->SetEnabled(kFALSE);
249 //_____________________________________________________________________________
251 AliMUONPainterDataSourceFrame::HistogramButtonClicked()
253 /// Histogram button was clicked.
255 if ( fHistogramButton->IsOn() )
257 fHistoMin->SetState(kTRUE);
258 fHistoMax->SetState(kTRUE);
262 fHistoMin->SetState(kFALSE);
263 fHistoMax->SetState(kFALSE);
267 //_____________________________________________________________________________
269 AliMUONPainterDataSourceFrame::CreateOCDBDataSource()
271 /// Create an OCDB data source (using information from the widgets)
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();
278 CreateOCDBDataSource(cdbPath,runNumber,type);
280 fOCDBPath->SetText("");
281 fRunSelector->SetNumber(0);
284 //_____________________________________________________________________________
286 AliMUONPainterDataSourceFrame::CreateOCDBDataSource(const TString& uri)
288 /// Create an OCDB data source, given it's URI
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();
295 CreateOCDBDataSource(cdbPath,atoi(srun.Data()),type);
300 //_____________________________________________________________________________
302 AliMUONPainterDataSourceFrame::CreateOCDBDataSource(const TString& cdbPath,
306 /// Create an OCDB data source for a given (path,runnumber,type) triplet
308 AliMUONVTrackerDataMaker* reader = new AliMUONTrackerOCDBDataMaker(cdbPath.Data(),
312 if ( reader->IsValid() )
314 AliMUONPainterRegistry::Instance()->Register(reader);
316 AliMUONPainterEnv* env = AliMUONPainterHelper::Instance()->Env();
318 Int_t n = env->Integer(fgkNumberOfDataSourcesKey);
320 env->Set(fgkNumberOfDataSourcesKey,n+1);
322 TString ds(Form("OCDB;%s;%d;%s",cdbPath.Data(),runNumber,type.Data()));
324 env->Set(Form(fgkDataSourceURIKey,n),ds.Data());
328 AddRecentSource(ds.Data());
332 //_____________________________________________________________________________
334 AliMUONPainterDataSourceFrame::CreateRawDataSource()
336 /// Create a new raw data source (using info from the widgets)
338 TString uri(gSystem->ExpandPathName(fFilePath->GetText()));
340 if ( gSystem->AccessPathName(uri.Data()) )
342 AliError(Form("File %s does not exist",uri.Data()));
343 fFilePath->SetText("");
347 TString calibMode("");
350 if ( fCalibrateGain->IsOn() )
356 if ( fCalibrateGainConstantCapa->IsOn() )
358 calibMode = "GAINCONSTANTCAPA";
362 if ( fCalibrateNoGain->IsOn() )
364 calibMode = "NOGAIN";
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()));
376 if ( CreateRawDataSource(uri) )
378 fFilePath->SetText("");
379 fRawOCDBPath->SetText("");
383 //_____________________________________________________________________________
385 AliMUONPainterDataSourceFrame::CreateRawDataSource(const TString& uri)
387 /// Create a new raw data source, given its URI
392 TString sxmin("0.0");
393 TString sxmax("4096.0");
395 TObjArray* a = uri.Tokenize(";");
397 filename = static_cast<TObjString*>(a->At(1))->String();
399 if ( a->GetLast() > 1 )
401 ocdbPath = static_cast<TObjString*>(a->At(2))->String();
402 if ( ocdbPath == " " ) ocdbPath = "";
405 if ( a->GetLast() > 2 )
407 calibMode = static_cast<TObjString*>(a->At(3))->String();
408 if ( calibMode == " " ) calibMode = "";
411 if ( a->GetLast() > 3 )
413 sxmin = static_cast<TObjString*>(a->At(4))->String();
416 if ( a->GetLast() > 4 )
418 sxmax = static_cast<TObjString*>(a->At(5))->String();
421 AliRawReader* rawReader = 0x0;
423 if ( filename.Contains(TRegexp(".root$")) )
425 AliDebug(1,"Using RawReaderRoot");
426 if ( filename.Contains(TRegexp("^alien")) )
428 // insure we've initialized the grid...
431 TGrid::Connect("alien://");
435 rawReader = new AliRawReaderRoot(filename.Data());
439 /// Anything not .root is supposed to be DATE file
440 AliDebug(1,"Using RawReaderDate");
441 rawReader = new AliRawReaderDate(filename.Data());
444 /// Basic test to see if the file is correct
445 Bool_t ok = rawReader->NextEvent();
448 AliError(Form("File %s does not seem to be a raw data file",filename.Data()));
449 fFilePath->SetText("");
453 rawReader->RewindEvents();
455 AliMUONVTrackerDataMaker* reader(0x0);
456 Bool_t histogram(kFALSE);
458 if ( uri.Contains(TRegexp("^H")) ) histogram = kTRUE;
460 if ( ocdbPath.Length() > 0 )
462 reader = new AliMUONTrackerCalibratedDataMaker(rawReader,ocdbPath.Data(),
470 reader = new AliMUONTrackerRawDataMaker(rawReader,histogram);
473 reader->SetSource(filename.Data());
475 AliMUONPainterRegistry::Instance()->Register(reader);
477 AliMUONPainterEnv* env = AliMUONPainterHelper::Instance()->Env();
479 Int_t n = env->Integer(fgkNumberOfDataSourcesKey);
481 env->Set(fgkNumberOfDataSourcesKey,n+1);
483 env->Set(Form(fgkDataSourceURIKey,n),uri.Data());
485 AddRecentSource(uri.Data());
492 //_____________________________________________________________________________
494 AliMUONPainterDataSourceFrame::DataReaderWasRegistered(AliMUONVTrackerDataMaker* reader)
496 /// Update ourselves as a new data reader was created
498 AliMUONPainterDataSourceItem* item = new AliMUONPainterDataSourceItem(fDataReaders,100,20,reader);
500 item->Connect("StartRunning()",
501 "AliMUONPainterDataSourceFrame",
503 Form("StartRunning(=(AliMUONPainterDataSourceItem*)(0x%x))",item));
505 item->Connect("StopRunning()",
506 "AliMUONPainterDataSourceFrame",
508 Form("StopRunning(=(AliMUONPainterDataSourceItem*)(0x%x))",item));
510 fDataReaders->AddFrame(item);
514 fDataReaders->MapSubwindows();
515 fDataReaders->Resize();
518 //_____________________________________________________________________________
520 AliMUONPainterDataSourceFrame::DataReaderWasUnregistered(AliMUONVTrackerDataMaker* /*reader*/)
522 /// Update ourselves as a new data reader was deleted
524 // here we should find which (if any) datasourceitem has this reader, and remove it
528 //_____________________________________________________________________________
530 AliMUONPainterDataSourceFrame::OpenFileDialog()
532 /// Open a file dialog to select a file to be read
536 const char* fileTypes[] = {
537 "ROOT files","*.root",
538 "DATE files","*.raw",
542 fileInfo.fFileTypes = fileTypes;
544 new TGFileDialog(gClient->GetRoot(),gClient->GetRoot(),
548 fFilePath->SetText(gSystem->ExpandPathName(Form("%s",fileInfo.fFilename)));
552 //_____________________________________________________________________________
554 AliMUONPainterDataSourceFrame::OpenRecentSource()
556 /// Open one source from the recently used ones
558 TGTextLBEntry* t = (TGTextLBEntry*)fRecentSources->GetSelectedEntry();
560 TString uri(t->GetText()->GetString());
562 if ( uri.Contains(TRegexp("^RAW")) || uri.Contains(TRegexp("^HRAW")) ||
563 uri.Contains(TRegexp("^CAL")) || uri.Contains(TRegexp("^HCAL")) )
565 CreateRawDataSource(uri);
567 else if ( uri.Contains(TRegexp("^OCDB")) )
569 CreateOCDBDataSource(uri);
572 fRecentSources->Select(-1);
575 //_____________________________________________________________________________
577 AliMUONPainterDataSourceFrame::StartRunning(AliMUONPainterDataSourceItem* item)
579 /// One data source starts running. Disable the Run button of the other ones
581 AliMUONPainterDataSourceItem* o;
582 while ( ( o = static_cast<AliMUONPainterDataSourceItem*>(next()) ) )
591 //_____________________________________________________________________________
593 AliMUONPainterDataSourceFrame::StopRunning(AliMUONPainterDataSourceItem* /*item*/)
595 /// One data source stops running. Enable the Run button of all items
597 AliMUONPainterDataSourceItem* o;
598 while ( ( o = static_cast<AliMUONPainterDataSourceItem*>(next()) ) )