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 "AliRawReader.h"
31 #include <TGComboBox.h>
32 #include <TGFileDialog.h>
33 #include <TGNumberEntry.h>
34 #include <TGTextEntry.h>
36 #include <TObjArray.h>
37 #include <TObjString.h>
42 ///\class AliMUONPainterDataSourceFrame
44 /// A complete frame to select and display various data sources to
45 /// be displayed : either raw data or OCDB data.
46 /// Later on we might add digits and clusters for instance.
48 ///\author Laurent Aphecetche, Subatech
50 const char* AliMUONPainterDataSourceFrame::fgkNumberOfDataSourcesKey = "NumberOfDataSources";
51 const char* AliMUONPainterDataSourceFrame::fgkDataSourceURIKey = "DataSourceURI.%d";
54 ClassImp(AliMUONPainterDataSourceFrame)
57 //_____________________________________________________________________________
58 AliMUONPainterDataSourceFrame::AliMUONPainterDataSourceFrame(const TGWindow* p, UInt_t w, UInt_t h)
59 : TGCompositeFrame(p,w,h,kVerticalFrame),
60 fRecentSourceSelector(new TGGroupFrame(this,"Recent sources",kHorizontalFrame)),
61 fRawSelector(new TGGroupFrame(this,"Raw file URI",kHorizontalFrame)),
62 fRawSelector2(new TGCompositeFrame(fRawSelector,w,h,kVerticalFrame)),
63 fRawSelector21(new TGCompositeFrame(fRawSelector2,w,h,kHorizontalFrame)),
64 fRawSelector22(new TGCompositeFrame(fRawSelector2,w,h,kHorizontalFrame)),
65 fRawSelector23(new TGCompositeFrame(fRawSelector2,w,h,kHorizontalFrame)),
66 fCalibrateNoGain(new TGCheckButton(fRawSelector22,"Ped subraction")),
67 fCalibrateGainConstantCapa(new TGCheckButton(fRawSelector22,"Ped subraction + gain (capa cste)")),
68 fCalibrateGain(new TGCheckButton(fRawSelector22,"Full calib (Ped subraction + gain with capa)")),
69 fHistogramButton(new TGCheckButton(fRawSelector23,"Histogram")),
70 fHistoMin(new TGNumberEntry(fRawSelector23,0)),
71 fHistoMax(new TGNumberEntry(fRawSelector23,4096)),
72 fRawOCDBPath(new TGTextEntry(fRawSelector22,"")),
73 fOCDBSelector(new TGGroupFrame(this,"OCDB Path",kHorizontalFrame)),
74 fDataReaders(new TGGroupFrame(this,"Data sources")),
75 fFilePath(new TGTextEntry(fRawSelector21,"")),
76 fOCDBPath(new TGTextEntry(fOCDBSelector,"")),
77 fRunSelector(new TGNumberEntry(fOCDBSelector,0)),
78 fOCDBTypes(new TGComboBox(fOCDBSelector)),
79 fRecentSources(new TGComboBox(fRecentSourceSelector)),
84 AliMUONPainterRegistry* reg = AliMUONPainterRegistry::Instance();
86 reg->Connect("DataMakerWasRegistered(AliMUONVTrackerDataMaker*)",
87 "AliMUONPainterDataSourceFrame",
89 "DataMakerWasRegistered(AliMUONVTrackerDataMaker*)");
91 reg->Connect("DataMakerWasUnregistered(AliMUONVTrackerDataMaker*)",
92 "AliMUONPainterDataSourceFrame",
94 "DataMakerWasUnregistered(AliMUONVTrackerDataMaker*)");
96 fItems->SetOwner(kFALSE);
98 /// Recent source selection
100 AliMUONPainterEnv* env = AliMUONPainterHelper::Instance()->Env();
102 Int_t nsources = env->Integer(fgkNumberOfDataSourcesKey);
104 for ( Int_t i = 0; i < nsources; ++i )
106 AddRecentSource(env->String(Form(fgkDataSourceURIKey,i)));
109 fRecentSources->Resize(100,20);
111 TGButton* createRecentButton = new TGTextButton(fRecentSourceSelector,"Create data source");
112 createRecentButton->Connect("Clicked()",
113 "AliMUONPainterDataSourceFrame",
115 "OpenRecentSource()");
117 fRecentSourceSelector->AddFrame(fRecentSources,new TGLayoutHints(kLHintsExpandX | kLHintsTop,5,5,5,5));
118 fRecentSourceSelector->AddFrame(createRecentButton,new TGLayoutHints(kLHintsTop,5,5,5,5));
120 /// Raw file selection
122 TGButton* openButton = new TGPictureButton(fRawSelector21,
123 gClient->GetPicture("fileopen.xpm"));
124 openButton->SetToolTipText("Click to open file dialog");
126 fRawSelector2->AddFrame(fRawSelector21, new TGLayoutHints(kLHintsExpandX,5,5,5,5));
127 fRawSelector2->AddFrame(fRawSelector22, new TGLayoutHints(kLHintsExpandX,5,5,5,5));
128 fRawSelector2->AddFrame(fRawSelector23, new TGLayoutHints(kLHintsExpandX,5,5,5,5));
130 fRawSelector21->AddFrame(openButton,new TGLayoutHints(kLHintsTop,5,5,5,5));
131 fRawSelector21->AddFrame(fFilePath, new TGLayoutHints(kLHintsExpandX | kLHintsTop,5,5,5,5));
133 fRawSelector22->AddFrame(fCalibrateNoGain, new TGLayoutHints(kLHintsTop,5,5,5,5));
134 fRawSelector22->AddFrame(fCalibrateGainConstantCapa, new TGLayoutHints(kLHintsTop,5,5,5,5));
135 fRawSelector22->AddFrame(fCalibrateGain, new TGLayoutHints(kLHintsTop,5,5,5,5));
136 fRawSelector22->AddFrame(fRawOCDBPath, new TGLayoutHints(kLHintsExpandX | kLHintsTop,5,5,5,5));
137 fRawOCDBPath->SetEnabled(kFALSE);
139 fRawSelector23->AddFrame(fHistogramButton,new TGLayoutHints(kLHintsTop,5,5,5,5));
141 fHistogramButton->Connect("Clicked()","AliMUONPainterDataSourceFrame",this,"HistogramButtonClicked()");
143 fHistoMin->SetState(kFALSE);
144 fHistoMax->SetState(kFALSE);
146 fRawSelector23->AddFrame(fHistoMin,new TGLayoutHints(kLHintsTop,5,5,5,5));
147 fRawSelector23->AddFrame(fHistoMax,new TGLayoutHints(kLHintsTop,5,5,5,5));
149 TGButton* createRawButton = new TGTextButton(fRawSelector,"Create data source");
151 fRawSelector->AddFrame(fRawSelector2, new TGLayoutHints(kLHintsExpandX | kLHintsTop,5,5,5,5));
152 fRawSelector->AddFrame(createRawButton, new TGLayoutHints(kLHintsCenterY,5,5,5,5));
154 fCalibrateNoGain->Connect("Clicked()","AliMUONPainterDataSourceFrame",this,"CalibrateButtonClicked()");
155 fCalibrateGainConstantCapa->Connect("Clicked()","AliMUONPainterDataSourceFrame",this,"CalibrateButtonClicked()");
156 fCalibrateGain->Connect("Clicked()","AliMUONPainterDataSourceFrame",this,"CalibrateButtonClicked()");
158 openButton->Connect("Clicked()",
159 "AliMUONPainterDataSourceFrame",
163 createRawButton->Connect("Clicked()",
164 "AliMUONPainterDataSourceFrame",
166 "CreateRawDataSource()");
170 fOCDBTypes->AddEntry("Pedestals",0);
171 fOCDBTypes->AddEntry("Gains",1);
172 fOCDBTypes->AddEntry("Capacitances",2);
173 fOCDBTypes->Select(0);
174 fOCDBTypes->Resize(100,20);
176 TGButton* createOCDBButton = new TGTextButton(fOCDBSelector,"Create data source");
177 createOCDBButton->Connect("Clicked()",
178 "AliMUONPainterDataSourceFrame",
180 "CreateOCDBDataSource()");
183 fOCDBSelector->AddFrame(fOCDBPath,new TGLayoutHints(kLHintsExpandX | kLHintsTop,5,5,5,5));
184 fOCDBSelector->AddFrame(fRunSelector,new TGLayoutHints(kLHintsTop,5,5,5,5));
185 fOCDBSelector->AddFrame(fOCDBTypes,new TGLayoutHints(kLHintsExpandX | kLHintsTop,5,5,5,5));
186 fOCDBSelector->AddFrame(createOCDBButton,new TGLayoutHints(kLHintsTop,5,5,5,5));
188 AddFrame(fRecentSourceSelector,new TGLayoutHints(kLHintsExpandX,10,10,10,10));
190 AddFrame(fRawSelector,new TGLayoutHints(kLHintsExpandX,10,10,10,10));
192 AddFrame(fOCDBSelector,new TGLayoutHints(kLHintsExpandX,10,10,10,10));
194 AddFrame(fDataReaders, new TGLayoutHints(kLHintsExpandX,10,10,10,10));
198 //_____________________________________________________________________________
199 AliMUONPainterDataSourceFrame::~AliMUONPainterDataSourceFrame()
206 //_____________________________________________________________________________
208 AliMUONPainterDataSourceFrame::AddRecentSource(const char* name)
210 /// Add a source to the list of recently used sources
212 TGListBox* lb = fRecentSources->GetListBox();
214 for ( Int_t i = 0; i < lb->GetNumberOfEntries(); ++i )
216 TGTextLBEntry* t = (TGTextLBEntry*)lb->GetEntry(i);
217 TString s(t->GetText()->GetString());
224 fRecentSources->AddEntry(name,lb->GetNumberOfEntries());
225 fRecentSources->MapSubwindows();
226 fRecentSources->Layout();
229 //_____________________________________________________________________________
231 AliMUONPainterDataSourceFrame::CalibrateButtonClicked()
233 /// Calibrate button was clicked.
235 if ( fCalibrateNoGain->IsOn() ||
236 fCalibrateGainConstantCapa->IsOn() ||
237 fCalibrateGain->IsOn() )
239 fRawOCDBPath->SetEnabled(kTRUE);
240 fRawOCDBPath->SetFocus();
244 fRawOCDBPath->SetEnabled(kFALSE);
248 //_____________________________________________________________________________
250 AliMUONPainterDataSourceFrame::HistogramButtonClicked()
252 /// Histogram button was clicked.
254 if ( fHistogramButton->IsOn() )
256 fHistoMin->SetState(kTRUE);
257 fHistoMax->SetState(kTRUE);
261 fHistoMin->SetState(kFALSE);
262 fHistoMax->SetState(kFALSE);
266 //_____________________________________________________________________________
268 AliMUONPainterDataSourceFrame::CreateOCDBDataSource()
270 /// Create an OCDB data source (using information from the widgets)
272 TString cdbPath = fOCDBPath->GetText();
273 Int_t runNumber = fRunSelector->GetIntNumber();
274 TGTextLBEntry* t = static_cast<TGTextLBEntry*>(fOCDBTypes->GetSelectedEntry());
275 TString type = t->GetText()->GetString();
277 CreateOCDBDataSource(cdbPath,runNumber,type);
279 fOCDBPath->SetText("");
280 fRunSelector->SetNumber(0);
283 //_____________________________________________________________________________
285 AliMUONPainterDataSourceFrame::CreateOCDBDataSource(const TString& uri)
287 /// Create an OCDB data source, given it's URI
289 TObjArray* a = uri.Tokenize(";");
290 TString cdbPath = static_cast<TObjString*>(a->At(1))->String();
291 TString srun = static_cast<TObjString*>(a->At(2))->String();
292 TString type = static_cast<TObjString*>(a->At(3))->String();
294 CreateOCDBDataSource(cdbPath,atoi(srun.Data()),type);
299 //_____________________________________________________________________________
301 AliMUONPainterDataSourceFrame::CreateOCDBDataSource(const TString& cdbPath,
305 /// Create an OCDB data source for a given (path,runnumber,type) triplet
307 AliMUONVTrackerDataMaker* reader = new AliMUONTrackerOCDBDataMaker(cdbPath.Data(),
311 if ( reader->IsValid() )
313 AliMUONPainterRegistry::Instance()->Register(reader);
315 AliMUONPainterEnv* env = AliMUONPainterHelper::Instance()->Env();
317 Int_t n = env->Integer(fgkNumberOfDataSourcesKey);
319 env->Set(fgkNumberOfDataSourcesKey,n+1);
321 TString ds(Form("OCDB;%s;%d;%s",cdbPath.Data(),runNumber,type.Data()));
323 env->Set(Form(fgkDataSourceURIKey,n),ds.Data());
327 AddRecentSource(ds.Data());
331 //_____________________________________________________________________________
333 AliMUONPainterDataSourceFrame::CreateRawDataSource()
335 /// Create a new raw data source (using info from the widgets)
337 TString uri(gSystem->ExpandPathName(fFilePath->GetText()));
339 if ( gSystem->AccessPathName(uri.Data()) )
341 AliError(Form("File %s does not exist",uri.Data()));
342 fFilePath->SetText("");
346 TString calibMode("");
349 if ( fCalibrateGain->IsOn() )
355 if ( fCalibrateGainConstantCapa->IsOn() )
357 calibMode = "GAINCONSTANTCAPA";
361 if ( fCalibrateNoGain->IsOn() )
363 calibMode = "NOGAIN";
367 uri = Form("%s%s;%s;%s;%s;%s;%s",
368 ( fHistogramButton->IsOn() ? "H":""),
369 name.Data(),uri.Data(),
370 ( strlen(fRawOCDBPath->GetText()) > 0 ? fRawOCDBPath->GetText() : " "),
371 ( calibMode.Length() > 0 ? calibMode.Data() : " "),
372 Form("%e",fHistoMin->GetNumber()),
373 Form("%e",fHistoMax->GetNumber()));
375 if ( CreateRawDataSource(uri) )
377 fFilePath->SetText("");
378 fRawOCDBPath->SetText("");
382 //_____________________________________________________________________________
384 AliMUONPainterDataSourceFrame::CreateRawDataSource(const TString& uri)
386 /// Create a new raw data source, given its URI
391 TString sxmin("0.0");
392 TString sxmax("4096.0");
394 TObjArray* a = uri.Tokenize(";");
396 filename = static_cast<TObjString*>(a->At(1))->String();
398 if ( a->GetLast() > 1 )
400 ocdbPath = static_cast<TObjString*>(a->At(2))->String();
401 if ( ocdbPath == " " ) ocdbPath = "";
404 if ( a->GetLast() > 2 )
406 calibMode = static_cast<TObjString*>(a->At(3))->String();
407 if ( calibMode == " " ) calibMode = "";
410 if ( a->GetLast() > 3 )
412 sxmin = static_cast<TObjString*>(a->At(4))->String();
415 if ( a->GetLast() > 4 )
417 sxmax = static_cast<TObjString*>(a->At(5))->String();
420 AliRawReader* rawReader = 0x0;
422 if ( filename.Contains(TRegexp("^alien")) )
424 // insure we've initialized the grid...
427 TGrid::Connect("alien://");
431 rawReader = AliRawReader::Create(filename.Data());
435 AliError(Form("Could not open file %s",filename.Data()));
436 fFilePath->SetText("");
440 /// Basic test to see if the file is correct
441 Bool_t ok = rawReader->NextEvent();
444 AliError(Form("File %s does not seem to be a raw data file",filename.Data()));
445 fFilePath->SetText("");
449 rawReader->RewindEvents();
451 AliMUONVTrackerDataMaker* reader(0x0);
452 Bool_t histogram(kFALSE);
454 if ( uri.Contains(TRegexp("^H")) ) histogram = kTRUE;
456 if ( ocdbPath.Length() > 0 )
458 reader = new AliMUONTrackerCalibratedDataMaker(rawReader,ocdbPath.Data(),
466 reader = new AliMUONTrackerRawDataMaker(rawReader,histogram);
469 reader->SetSource(filename.Data());
471 AliMUONPainterRegistry::Instance()->Register(reader);
473 AliMUONPainterEnv* env = AliMUONPainterHelper::Instance()->Env();
475 Int_t n = env->Integer(fgkNumberOfDataSourcesKey);
477 env->Set(fgkNumberOfDataSourcesKey,n+1);
479 env->Set(Form(fgkDataSourceURIKey,n),uri.Data());
481 AddRecentSource(uri.Data());
488 //_____________________________________________________________________________
490 AliMUONPainterDataSourceFrame::DataMakerWasRegistered(AliMUONVTrackerDataMaker* reader)
492 /// Update ourselves as a new data reader was created
494 AliMUONPainterDataSourceItem* item = new AliMUONPainterDataSourceItem(fDataReaders,100,20,reader);
496 item->Connect("StartRunning()",
497 "AliMUONPainterDataSourceFrame",
499 Form("StartRunning(=(AliMUONPainterDataSourceItem*)(0x%x))",item));
501 item->Connect("StopRunning()",
502 "AliMUONPainterDataSourceFrame",
504 Form("StopRunning(=(AliMUONPainterDataSourceItem*)(0x%x))",item));
506 fDataReaders->AddFrame(item);
510 fDataReaders->MapSubwindows();
511 fDataReaders->Resize();
514 //_____________________________________________________________________________
516 AliMUONPainterDataSourceFrame::DataMakerWasUnregistered(AliMUONVTrackerDataMaker* maker)
518 /// Update ourselves as a data reader was deleted
520 AliMUONPainterDataSourceItem* theItem(0x0);
523 AliMUONPainterDataSourceItem* item;
525 while ( ( item = static_cast<AliMUONPainterDataSourceItem*>(next()) ) && !theItem )
527 if ( item->DataMaker() == maker )
533 if (!theItem) return;
535 fDataReaders->RemoveFrame(theItem);
536 fItems->Remove(theItem);
537 theItem->DestroyWindow();
540 fDataReaders->MapSubwindows();
541 fDataReaders->Resize();
545 //_____________________________________________________________________________
547 AliMUONPainterDataSourceFrame::OpenFileDialog()
549 /// Open a file dialog to select a file to be read
553 const char* fileTypes[] = {
554 "ROOT files","*.root",
555 "DATE files","*.raw",
559 fileInfo.fFileTypes = fileTypes;
560 delete[] fileInfo.fIniDir;
562 AliMUONPainterEnv* env = AliMUONPainterHelper::Instance()->Env();
564 fileInfo.fIniDir = StrDup(env->String("LastOpenDir","."));
566 new TGFileDialog(gClient->GetRoot(),gClient->GetRoot(),
569 fFilePath->SetText(gSystem->ExpandPathName(Form("%s",fileInfo.fFilename)));
571 env->Set("LastOpenDir",fileInfo.fIniDir);
576 //_____________________________________________________________________________
578 AliMUONPainterDataSourceFrame::OpenRecentSource()
580 /// Open one source from the recently used ones
582 TGTextLBEntry* t = (TGTextLBEntry*)fRecentSources->GetSelectedEntry();
584 TString uri(t->GetText()->GetString());
586 if ( uri.Contains(TRegexp("^RAW")) || uri.Contains(TRegexp("^HRAW")) ||
587 uri.Contains(TRegexp("^CAL")) || uri.Contains(TRegexp("^HCAL")) )
589 CreateRawDataSource(uri);
591 else if ( uri.Contains(TRegexp("^OCDB")) )
593 CreateOCDBDataSource(uri);
596 fRecentSources->Select(-1);
599 //_____________________________________________________________________________
601 AliMUONPainterDataSourceFrame::StartRunning(AliMUONPainterDataSourceItem* item)
603 /// One data source starts running. Disable the Run button of the other ones
605 AliMUONPainterDataSourceItem* o;
606 while ( ( o = static_cast<AliMUONPainterDataSourceItem*>(next()) ) )
615 //_____________________________________________________________________________
617 AliMUONPainterDataSourceFrame::StopRunning(AliMUONPainterDataSourceItem* /*item*/)
619 /// One data source stops running. Enable the Run button of all items
621 AliMUONPainterDataSourceItem* o;
622 while ( ( o = static_cast<AliMUONPainterDataSourceItem*>(next()) ) )