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,"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)),
85 AliMUONPainterRegistry* reg = AliMUONPainterRegistry::Instance();
87 reg->Connect("DataMakerWasRegistered(AliMUONVTrackerDataMaker*)",
88 "AliMUONPainterDataSourceFrame",
90 "DataMakerWasRegistered(AliMUONVTrackerDataMaker*)");
92 reg->Connect("DataMakerWasUnregistered(AliMUONVTrackerDataMaker*)",
93 "AliMUONPainterDataSourceFrame",
95 "DataMakerWasUnregistered(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::DataMakerWasRegistered(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::DataMakerWasUnregistered(AliMUONVTrackerDataMaker* maker)
522 /// Update ourselves as a data reader was deleted
524 AliMUONPainterDataSourceItem* theItem(0x0);
527 AliMUONPainterDataSourceItem* item;
529 while ( ( item = static_cast<AliMUONPainterDataSourceItem*>(next()) ) && !theItem )
531 if ( item->DataMaker() == maker )
537 if (!theItem) return;
539 fDataReaders->RemoveFrame(theItem);
540 fItems->Remove(theItem);
541 theItem->DestroyWindow();
544 fDataReaders->MapSubwindows();
545 fDataReaders->Resize();
549 //_____________________________________________________________________________
551 AliMUONPainterDataSourceFrame::OpenFileDialog()
553 /// Open a file dialog to select a file to be read
557 const char* fileTypes[] = {
558 "ROOT files","*.root",
559 "DATE files","*.raw",
563 fileInfo.fFileTypes = fileTypes;
564 delete[] fileInfo.fIniDir;
566 AliMUONPainterEnv* env = AliMUONPainterHelper::Instance()->Env();
568 fileInfo.fIniDir = StrDup(env->String("LastOpenDir","."));
570 new TGFileDialog(gClient->GetRoot(),gClient->GetRoot(),
573 fFilePath->SetText(gSystem->ExpandPathName(Form("%s",fileInfo.fFilename)));
575 env->Set("LastOpenDir",fileInfo.fIniDir);
580 //_____________________________________________________________________________
582 AliMUONPainterDataSourceFrame::OpenRecentSource()
584 /// Open one source from the recently used ones
586 TGTextLBEntry* t = (TGTextLBEntry*)fRecentSources->GetSelectedEntry();
588 TString uri(t->GetText()->GetString());
590 if ( uri.Contains(TRegexp("^RAW")) || uri.Contains(TRegexp("^HRAW")) ||
591 uri.Contains(TRegexp("^CAL")) || uri.Contains(TRegexp("^HCAL")) )
593 CreateRawDataSource(uri);
595 else if ( uri.Contains(TRegexp("^OCDB")) )
597 CreateOCDBDataSource(uri);
600 fRecentSources->Select(-1);
603 //_____________________________________________________________________________
605 AliMUONPainterDataSourceFrame::StartRunning(AliMUONPainterDataSourceItem* item)
607 /// One data source starts running. Disable the Run button of the other ones
609 AliMUONPainterDataSourceItem* o;
610 while ( ( o = static_cast<AliMUONPainterDataSourceItem*>(next()) ) )
619 //_____________________________________________________________________________
621 AliMUONPainterDataSourceFrame::StopRunning(AliMUONPainterDataSourceItem* /*item*/)
623 /// One data source stops running. Enable the Run button of all items
625 AliMUONPainterDataSourceItem* o;
626 while ( ( o = static_cast<AliMUONPainterDataSourceItem*>(next()) ) )