]> git.uio.no Git - u/mrichter/AliRoot.git/blame_incremental - MUON/AliMUONPainterDataSourceFrame.cxx
Doxygen warnings fixed
[u/mrichter/AliRoot.git] / MUON / AliMUONPainterDataSourceFrame.cxx
... / ...
CommitLineData
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
51const char* AliMUONPainterDataSourceFrame::fgkNumberOfDataSourcesKey = "NumberOfDataSources";
52const char* AliMUONPainterDataSourceFrame::fgkDataSourceURIKey = "DataSourceURI.%d";
53
54///\cond CLASSIMP
55ClassImp(AliMUONPainterDataSourceFrame)
56///\endcond
57
58//_____________________________________________________________________________
59AliMUONPainterDataSourceFrame::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//_____________________________________________________________________________
200AliMUONPainterDataSourceFrame::~AliMUONPainterDataSourceFrame()
201{
202 /// dtor
203
204 delete fItems;
205}
206
207//_____________________________________________________________________________
208void
209AliMUONPainterDataSourceFrame::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//_____________________________________________________________________________
231void
232AliMUONPainterDataSourceFrame::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//_____________________________________________________________________________
250void
251AliMUONPainterDataSourceFrame::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//_____________________________________________________________________________
268void
269AliMUONPainterDataSourceFrame::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//_____________________________________________________________________________
285void
286AliMUONPainterDataSourceFrame::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//_____________________________________________________________________________
301void
302AliMUONPainterDataSourceFrame::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//_____________________________________________________________________________
333void
334AliMUONPainterDataSourceFrame::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//_____________________________________________________________________________
384Bool_t
385AliMUONPainterDataSourceFrame::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//_____________________________________________________________________________
493void
494AliMUONPainterDataSourceFrame::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//_____________________________________________________________________________
519void
520AliMUONPainterDataSourceFrame::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//_____________________________________________________________________________
550void
551AliMUONPainterDataSourceFrame::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//_____________________________________________________________________________
581void
582AliMUONPainterDataSourceFrame::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//_____________________________________________________________________________
604void
605AliMUONPainterDataSourceFrame::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//_____________________________________________________________________________
620void
621AliMUONPainterDataSourceFrame::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