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 **************************************************************************/
19 #include "AliMUONPainterDataSourceFrame.h"
23 #include "AliMUONPainterDataSourceItem.h"
24 #include "AliMUONPainterEnv.h"
25 #include "AliMUONPainterHelper.h"
26 #include "AliMUONPainterRegistry.h"
27 #include "AliMUONTrackerCalibratedDataMaker.h"
28 #include "AliMUONTrackerOCDBDataMaker.h"
29 #include "AliMUONTrackerRawDataMaker.h"
30 #include "AliRawReader.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("^alien")) )
425 // insure we've initialized the grid...
428 TGrid::Connect("alien://");
432 rawReader = AliRawReader::Create(filename.Data());
436 AliError(Form("Could not open file %s",filename.Data()));
437 fFilePath->SetText("");
441 /// Basic test to see if the file is correct
442 Bool_t ok = rawReader->NextEvent();
445 AliError(Form("File %s does not seem to be a raw data file",filename.Data()));
446 fFilePath->SetText("");
450 rawReader->RewindEvents();
452 AliMUONVTrackerDataMaker* reader(0x0);
453 Bool_t histogram(kFALSE);
455 if ( uri.Contains(TRegexp("^H")) ) histogram = kTRUE;
457 if ( ocdbPath.Length() > 0 )
459 reader = new AliMUONTrackerCalibratedDataMaker(rawReader,ocdbPath.Data(),
467 reader = new AliMUONTrackerRawDataMaker(rawReader,histogram);
470 reader->SetSource(filename.Data());
472 AliMUONPainterRegistry::Instance()->Register(reader);
474 AliMUONPainterEnv* env = AliMUONPainterHelper::Instance()->Env();
476 Int_t n = env->Integer(fgkNumberOfDataSourcesKey);
478 env->Set(fgkNumberOfDataSourcesKey,n+1);
480 env->Set(Form(fgkDataSourceURIKey,n),uri.Data());
482 AddRecentSource(uri.Data());
489 //_____________________________________________________________________________
491 AliMUONPainterDataSourceFrame::DataMakerWasRegistered(AliMUONVTrackerDataMaker* reader)
493 /// Update ourselves as a new data reader was created
495 AliMUONPainterDataSourceItem* item = new AliMUONPainterDataSourceItem(fDataReaders,100,20,reader);
497 item->Connect("StartRunning()",
498 "AliMUONPainterDataSourceFrame",
500 Form("StartRunning(=(AliMUONPainterDataSourceItem*)(0x%x))",item));
502 item->Connect("StopRunning()",
503 "AliMUONPainterDataSourceFrame",
505 Form("StopRunning(=(AliMUONPainterDataSourceItem*)(0x%x))",item));
507 fDataReaders->AddFrame(item);
511 fDataReaders->MapSubwindows();
512 fDataReaders->Resize();
515 //_____________________________________________________________________________
517 AliMUONPainterDataSourceFrame::DataMakerWasUnregistered(AliMUONVTrackerDataMaker* maker)
519 /// Update ourselves as a data reader was deleted
521 AliMUONPainterDataSourceItem* theItem(0x0);
524 AliMUONPainterDataSourceItem* item;
526 while ( ( item = static_cast<AliMUONPainterDataSourceItem*>(next()) ) && !theItem )
528 if ( item->DataMaker() == maker )
534 if (!theItem) return;
536 fDataReaders->RemoveFrame(theItem);
537 fItems->Remove(theItem);
538 theItem->DestroyWindow();
541 fDataReaders->MapSubwindows();
542 fDataReaders->Resize();
546 //_____________________________________________________________________________
548 AliMUONPainterDataSourceFrame::OpenFileDialog()
550 /// Open a file dialog to select a file to be read
554 const char* fileTypes[] = {
555 "ROOT files","*.root",
556 "DATE files","*.raw",
560 fileInfo.fFileTypes = fileTypes;
561 delete[] fileInfo.fIniDir;
563 AliMUONPainterEnv* env = AliMUONPainterHelper::Instance()->Env();
565 fileInfo.fIniDir = StrDup(env->String("LastOpenDir","."));
567 new TGFileDialog(gClient->GetRoot(),gClient->GetRoot(),
570 fFilePath->SetText(gSystem->ExpandPathName(Form("%s",fileInfo.fFilename)));
572 env->Set("LastOpenDir",fileInfo.fIniDir);
577 //_____________________________________________________________________________
579 AliMUONPainterDataSourceFrame::OpenRecentSource()
581 /// Open one source from the recently used ones
583 TGTextLBEntry* t = (TGTextLBEntry*)fRecentSources->GetSelectedEntry();
585 TString uri(t->GetText()->GetString());
587 if ( uri.Contains(TRegexp("^RAW")) || uri.Contains(TRegexp("^HRAW")) ||
588 uri.Contains(TRegexp("^CAL")) || uri.Contains(TRegexp("^HCAL")) )
590 CreateRawDataSource(uri);
592 else if ( uri.Contains(TRegexp("^OCDB")) )
594 CreateOCDBDataSource(uri);
597 fRecentSources->Select(-1);
600 //_____________________________________________________________________________
602 AliMUONPainterDataSourceFrame::StartRunning(AliMUONPainterDataSourceItem* item)
604 /// One data source starts running. Disable the Run button of the other ones
606 AliMUONPainterDataSourceItem* o;
607 while ( ( o = static_cast<AliMUONPainterDataSourceItem*>(next()) ) )
616 //_____________________________________________________________________________
618 AliMUONPainterDataSourceFrame::StopRunning(AliMUONPainterDataSourceItem* /*item*/)
620 /// One data source stops running. Enable the Run button of all items
622 AliMUONPainterDataSourceItem* o;
623 while ( ( o = static_cast<AliMUONPainterDataSourceItem*>(next()) ) )