Make the Scan method public
[u/mrichter/AliRoot.git] / MUON / AliMUONPainterPlotSelector.cxx
CommitLineData
0145e89a 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/// \class AliMUONPainterPlotSelector
19///
20/// Widget to select which data to plot for painters
21///
22/// \author Laurent Aphecetche
23///
24/// See AliMUONPainterInterfaceHelper for an important implementation note
25/// about our use of TGButtonGroup
26///
27
28#include "AliMUONPainterPlotSelector.h"
29
30#include "AliMUONPainterGroup.h"
31#include "AliMUONPainterInterfaceHelper.h"
32#include "AliMUONPainterMatrix.h"
8f0acce4 33#include "AliMUONPainterDataRegistry.h"
0145e89a 34#include "AliMUONVPainter.h"
35#include "AliMUONVTrackerData.h"
36#include "AliLog.h"
37#include <Riostream.h>
38#include <TGButton.h>
39#include <TGButtonGroup.h>
40#include <TObjArray.h>
41#include <TObjString.h>
42
43///\cond CLASSIMP
44ClassImp(AliMUONPainterPlotSelector)
45///\endcond
46
47const char* AliMUONPainterPlotSelector::fgkDefaultSourceName = "none";
48
49//_____________________________________________________________________________
50AliMUONPainterPlotSelector::AliMUONPainterPlotSelector(const TGWindow* window, UInt_t w, UInt_t h)
51: TGCompositeFrame(window,w,h,kHorizontalFrame),
52fTypes(0x0),
53fDataSourceNames(0x0),
54fDataSourceDimensions(0x0),
55fDimensionButtonMap(new TMap),
56fCurrentType(""),
57fCurrentData(0x0),
58fCurrentDimension(-1)
59{
60 /// ctor
61 fTypes = new TGButtonGroup(this,"Plot");
62
63 fDataSourceNames = new TGButtonGroup(this,"Sources");
64
8f0acce4 65 AliMUONPainterDataRegistry* reg = AliMUONPainterDataRegistry::Instance();
0145e89a 66
67 reg->Connect("DataSourceWasRegistered(AliMUONVTrackerData*)",
68 "AliMUONPainterPlotSelector",
69 this,
70 "DataSourceWasRegistered(AliMUONVTrackerData*)");
71
72 reg->Connect("DataSourceWasUnregistered(AliMUONVTrackerData*)",
73 "AliMUONPainterPlotSelector",
74 this,
75 "DataSourceWasUnregistered(AliMUONVTrackerData*)");
76
77 AliMUONPainterInterfaceHelper::AddRadioButton(*fDataSourceNames,
78 fgkDefaultSourceName,
79 0x0,
80 kTRUE);
81
82 CreateDimensionButtons(fgkDefaultSourceName);
83
84 fDataSourceDimensions = new TGButtonGroup(this,0,3,5,0,"Dimensions");
85
86 for ( Int_t i = 0; i < reg->NumberOfDataSources(); ++i )
87 {
88 AliMUONVTrackerData* data = reg->DataSource(i);
89 DataSourceWasRegistered(data);
90 }
91
92 fDataSourceNames->Connect("Clicked(Int_t)","AliMUONPainterPlotSelector",
93 this,
94 "SourceButtonWasClicked(Int_t)");
95
96 AddFrame(fTypes);
97 AddFrame(fDataSourceNames);
98 AddFrame(fDataSourceDimensions);
99}
100
101//_____________________________________________________________________________
102AliMUONPainterPlotSelector::~AliMUONPainterPlotSelector()
103{
104 /// dtor
105}
106
107//_____________________________________________________________________________
108void
109AliMUONPainterPlotSelector::BackupDimensionButtons()
110{
111 /// Backup the dimension button group
112
113 TString name = fDataSourceDimensions->GetTitle();
114
115 AliDebug(1,Form("name %s",name.Data()));
116
117 if ( name != fgkDefaultSourceName )
118 {
119 TGButtonGroup* group = static_cast<TGButtonGroup*>(fDimensionButtonMap->GetValue(name));
120 if (!group)
121 {
122 AliError(Form("Did not find group %s",name.Data()));
123 }
124 else
125 {
126 AliMUONPainterInterfaceHelper::Copy(*fDataSourceDimensions,*group);
127 }
128
129 }
130
131 fDataSourceDimensions->Disconnect("Clicked(Int_t)",
132 this,
133 "DimensionButtonWasClicked(Int_t)");
134}
135
136
137//_____________________________________________________________________________
138void
139AliMUONPainterPlotSelector::CreateDimensionButtons(const char* dataSourceName)
140{
141 /// Create the dimension button group for a given data source
142
143 AliDebug(1,Form("Creating dimension buttons for dataSource %s",dataSourceName));
144
8f0acce4 145 AliMUONVTrackerData* data = AliMUONPainterDataRegistry::Instance()->DataSource(dataSourceName);
0145e89a 146
147 TGButtonGroup* bg = new TGButtonGroup(this,0,3,5,0,dataSourceName);
148
149 if ( data )
150 {
151 for ( Int_t i = 0; i < data->NumberOfDimensions(); ++i )
152 {
153 AliMUONPainterInterfaceHelper::AddRadioButton(*bg,
154 data->DimensionName(i),
155 reinterpret_cast<void*>(i));
156 }
157 }
158
159 fDimensionButtonMap->Add(new TObjString(dataSourceName),bg);
160
161 AliDebug(1,Form("bg is %p Count=%d",bg,bg->GetCount()));
162 StdoutToAliDebug(1,AliMUONPainterInterfaceHelper::Dump(*bg));
163
164 bg->Connect("Clicked(Int_t)","AliMUONPainterPlotSelector",this,
165 "DimensionButtonWasClicked(Int_t)");
166}
167
168//_____________________________________________________________________________
169void
170AliMUONPainterPlotSelector::CreateTypeButtons(const TObjArray& types)
171{
172 /// Create the type button group
173
174 AliMUONPainterInterfaceHelper::ClearButtons(*fTypes);
175
176 TIter nextType(&types);
177 TObjString* str;
178
179 while ( ( str = static_cast<TObjString*>(nextType()) ) )
180 {
181 AliMUONPainterInterfaceHelper::AddRadioButton(*fTypes,str->String());
182 }
183
184 fTypes->Connect("Clicked(Int_t)","AliMUONPainterPlotSelector",this,
185 "TypeButtonWasClicked(Int_t)");
186
187 fTypes->Show();
188}
189
190//_____________________________________________________________________________
191void
192AliMUONPainterPlotSelector::DataSourceWasChanged()
193{
194 /// Data source was changed
195 DataSourceWasChanged(fCurrentType.Data(),fCurrentData,fCurrentDimension);
196}
197
198//_____________________________________________________________________________
199void
200AliMUONPainterPlotSelector::DataSourceWasChanged(const char* type,
201 AliMUONVTrackerData* data,
202 Int_t dataIndex)
203{
204 /// Emit a signal to tell data source was changed
205 AliDebug(1,Form("type=%s data=%s (%s)",
206 type,
207 ( data ? data->GetName() : "" ),
208 ( ( data && dataIndex >= 0 ) ? data->DimensionName(dataIndex).Data() :
209 "")));
210
ede0d590 211 UpdateTypeButton();
212
0145e89a 213 Long_t param[] = { (Long_t)type, (Long_t)data,
214 (Long_t)dataIndex };
215
216 Emit("DataSourceWasChanged(const char*,AliMUONVTrackerData*,Int_t)",param);
217}
218
219//_____________________________________________________________________________
220void
221AliMUONPainterPlotSelector::DataSourceWasRegistered(AliMUONVTrackerData* data)
222{
223 /// A new data source has been registered : add it to the interface
224
225 AliDebug(1,Form("Registering %s",data->GetName()));
226
227 AliMUONPainterInterfaceHelper::AddRadioButton(*fDataSourceNames,
228 data->GetName(),
229 data);
230
231 data->Connect("NumberOfEventsChanged()",
232 "AliMUONPainterPlotSelector",
233 this,
234 "NumberOfEventsChanged()");
235
236 CreateDimensionButtons(data->GetName());
237
238 fDataSourceNames->Show();
239
240 Layout();
241}
242
243//_____________________________________________________________________________
244void
245AliMUONPainterPlotSelector::NumberOfEventsChanged()
246{
247 /// Change the tool tip of the corresponding data source button
248
249 // find first the sender of the signal
250
49419555 251// AliMUONVTrackerData* data = reinterpret_cast<AliMUONVTrackerData*>(gTQSender);
252//
253// TGButton* button = AliMUONPainterInterfaceHelper::FindButtonByUserData(*fDataSourceNames,data);
254//
255// if (button)
256// {
257// button->SetToolTipText(Form("%d events",data->NumberOfEvents()),250);
258// }
0145e89a 259}
260
261//_____________________________________________________________________________
262void
263AliMUONPainterPlotSelector::DataSourceWasUnregistered(AliMUONVTrackerData* data)
264{
265 /// A data source has been unregistered : remove it from the interface
266
49419555 267 TGButton* button = AliMUONPainterInterfaceHelper::FindButtonByUserData(*fDataSourceNames,data);
0145e89a 268
49419555 269 TGButton* bd = AliMUONPainterInterfaceHelper::FindDownButton(*fDataSourceNames);
270
271 if ( bd == button )
0145e89a 272 {
49419555 273 // selected data source is the one we are removing...
274 // revert to "none" before actually removing it.
275 SourceButtonWasClicked(1);
0145e89a 276 }
277
49419555 278 AliMUONPainterInterfaceHelper::RemoveButton(*fDataSourceNames,button);
279
280 // do not forget to re-connect things
281 fDataSourceNames->Connect("Clicked(Int_t)","AliMUONPainterPlotSelector",
282 this,
283 "SourceButtonWasClicked(Int_t)");
0145e89a 284
49419555 285
0145e89a 286 TObject* o = fDimensionButtonMap->Remove(new TObjString(data->GetName()));
287
288 if (!o)
289 {
290 AliError("Remove failed. Please check");
291 }
49419555 292
293 fDataSourceNames->Show();
0145e89a 294
295 Layout();
296}
297
298//_____________________________________________________________________________
299void
300AliMUONPainterPlotSelector::DimensionButtonWasClicked(Int_t id)
301{
302 /// One dim button was clicked
303
304 AliDebug(1,Form("id=%d",id));
305
306 TGTextButton* button = (TGTextButton*)fDataSourceDimensions->GetButton(id);
307
c9756e69 308 SetCurrentDimension(reinterpret_cast<Long_t>(button->GetUserData()));
0145e89a 309
310 if ( fCurrentDimension >= 0 )
311 {
312 AliMUONPainterInterfaceHelper::SetState(*fTypes,kTRUE);
313 AliMUONPainterInterfaceHelper::Select(*fTypes,fCurrentType.Data(),kFALSE);
314 fTypes->Show();
315 }
316
c9756e69 317 AliDebug(1,Form("fCurrentDimension=%ld fCurrentData=%p fCurrentType=%s",
0145e89a 318 fCurrentDimension,fCurrentData,fCurrentType.Data()));
319
320 DataSourceWasChanged();
321}
322
323//_____________________________________________________________________________
324void
325AliMUONPainterPlotSelector::ResetDimensionButtonMap()
326{
327 /// Reset the button group map
328
329 TIter next(fDimensionButtonMap);
330 TObjString* str;
331
332 while ( ( str = static_cast<TObjString*>(next()) ) )
333 {
334 TGButtonGroup* bg = static_cast<TGButtonGroup*>(fDimensionButtonMap->GetValue(str->String()));
335 AliMUONPainterInterfaceHelper::Unselect(*bg,"*");
336 }
337}
338
339//_____________________________________________________________________________
340void
341AliMUONPainterPlotSelector::RestoreDimensionButtons(const char* dataSourceName,
342 Bool_t updateCurrentDimension)
343{
344 /// Restore (i.e. contrary of Backup) a given dimension button group
345
346 AliDebug(1,Form("name %s",dataSourceName));
347 TGButtonGroup* group = static_cast<TGButtonGroup*>(fDimensionButtonMap->GetValue(dataSourceName));
348
349 AliMUONPainterInterfaceHelper::Copy(*group,*fDataSourceDimensions);
350
351 fDataSourceDimensions->Connect("Clicked(Int_t)",
352 "AliMUONPainterPlotSelector",this,
353 "DimensionButtonWasClicked(Int_t)");
354
355 if ( updateCurrentDimension )
356 {
357 TGButton* button = AliMUONPainterInterfaceHelper::FindDownButton(*fDataSourceDimensions);
358 if ( button )
359 {
c9756e69 360 SetCurrentDimension(reinterpret_cast<Long_t>(button->GetUserData()));
0145e89a 361 }
362 else
363 {
364 SetCurrentDimension(-1);
365 }
366 }
367
368 fDataSourceDimensions->Show();
369}
370
371//_____________________________________________________________________________
372void
373AliMUONPainterPlotSelector::SetCurrentData(AliMUONVTrackerData* data)
374{
375 /// Set the current data pointer
376 AliDebug(1,Form("fCurrentData %p -> %p",fCurrentData,data));
377 fCurrentData = data;
378}
379
380//_____________________________________________________________________________
381void
c9756e69 382AliMUONPainterPlotSelector::SetCurrentDimension(Long_t i)
0145e89a 383{
384 /// Set the current dimension
c9756e69 385 AliDebug(1,Form("fCurrentDimension %ld -> %ld",fCurrentDimension,i));
0145e89a 386 fCurrentDimension = i;
387}
388
389//_____________________________________________________________________________
390void
391AliMUONPainterPlotSelector::SetCurrentType(const char* type)
392{
393 /// Set the current type
394 AliDebug(1,Form("fCurrentType %s -> %s",fCurrentType.Data(),type));
395 fCurrentType = type;
396}
397
398//_____________________________________________________________________________
399void
400AliMUONPainterPlotSelector::SourceButtonWasClicked(Int_t id)
401{
402 /// A source button was clicked
c9756e69 403 AliDebug(1,Form("BEGIN id %d fCurrentDimension=%ld fCurrentData=%p fCurrentType=%s",
0145e89a 404 id,
405 fCurrentDimension,fCurrentData,fCurrentType.Data()));
406
407 BackupDimensionButtons();
408
409 TGButton* button = fDataSourceNames->GetButton(id);
410 if ( !button )
411 {
0145e89a 412 StdoutToAliDebug(1,AliMUONPainterInterfaceHelper::Dump(*fDataSourceNames));
fc2293be 413 AliFatal(Form("Could not get DataSource button id=%d",id));
0145e89a 414 }
415
416 AliMUONVTrackerData* data = reinterpret_cast<AliMUONVTrackerData*>(button->GetUserData());
417
418 TString name = data ? data->GetName() : fgkDefaultSourceName;
419
420 RestoreDimensionButtons(name,kTRUE);
421
422 if ( data != 0 &&
423 fCurrentDimension >= 0 &&
c9756e69 424 fCurrentDimension < (Long_t)(data->NumberOfDimensions()) )
0145e89a 425 {
426 AliMUONPainterInterfaceHelper::SetState(*fTypes,kTRUE);
427 }
428 else
429 {
430 AliMUONPainterInterfaceHelper::SetState(*fTypes,kFALSE);
431 }
432
433 SetCurrentData(data);
434
435 UpdateTypeButton();
436
437 fDataSourceNames->Show();
438 fDataSourceDimensions->Show();
439 fTypes->Show();
440
441 Resize();
442 Layout();
443
c9756e69 444 AliDebug(1,Form("END fCurrentDimension=%ld fCurrentData=%p fCurrentType=%s",
0145e89a 445 fCurrentDimension,fCurrentData,fCurrentType.Data()));
446
447 DataSourceWasChanged();
448}
449
450//_____________________________________________________________________________
451void
452AliMUONPainterPlotSelector::TypeButtonWasClicked(Int_t id)
453{
454 /// A type button was clicked
c9756e69 455 AliDebug(1,Form("fCurrentDimension=%ld fCurrentData=%p",
0145e89a 456 fCurrentDimension,fCurrentData));
457
458 TGTextButton* button = (TGTextButton*)fTypes->GetButton(id);
459 SetCurrentType(button->GetTitle());
460
461 AliDebug(1,Form("fCurrentType=%s",fCurrentType.Data()));
462
463 DataSourceWasChanged();
464}
465
466//_____________________________________________________________________________
467void AliMUONPainterPlotSelector::Update(const AliMUONPainterMatrix& painterMatrix)
468{
469 /// Update ourselves from a new painter matrix
470
471 AliDebug(1,"BEGIN");
472
473 SetCurrentType("");
474 SetCurrentData(0x0);
475 SetCurrentDimension(-1);
476
477 AliMUONPainterInterfaceHelper::Unselect(*fDataSourceNames,"*");
478 AliMUONPainterInterfaceHelper::Unselect(*fDataSourceDimensions,"*");
479
480 ResetDimensionButtonMap();
481
482 TObjArray types;
483 types.SetOwner(kTRUE);
484 painterMatrix.GetTypes(types);
485 CreateTypeButtons(types);
486
487 if ( painterMatrix.Size() > 0 )
488 {
489 AliMUONVPainter* painter = painterMatrix.Painter(painterMatrix.Size()-1);
490
491 AliMUONPainterGroup* plotterGroup = painter->PlotterGroup();
492
493 if ( plotterGroup )
494 {
495 // the group have some data to plot, so update our internal pointers
496 // to reflect that
497 SetCurrentData(plotterGroup->Data());
498 SetCurrentDimension(plotterGroup->DataIndex());
499 SetCurrentType(plotterGroup->Type());
500 }
501 }
502
c9756e69 503 AliDebug(1,Form("After update type=%s data=%p dim=%ld",
0145e89a 504 fCurrentType.Data(),fCurrentData,fCurrentDimension));
505
506 // the *order* of the 3 following lines is *very* important
507
508 AliDebug(1,"Will update source buttons");
509 UpdateSourceButton();
510 AliDebug(1,"Will update dimension buttons");
511 UpdateDimensionButton();
512 AliDebug(1,"Will update type buttons");
513 UpdateTypeButton();
514
515 Resize();
516 Layout();
517
c9756e69 518 AliDebug(1,Form("END fCurrentType=%s fCurrentData=%p fCurrentDimension=%ld",
0145e89a 519 fCurrentType.Data(),fCurrentData,
520 fCurrentDimension));
521}
522
523//_____________________________________________________________________________
524void
525AliMUONPainterPlotSelector::UpdateDimensionButton()
526{
527 /// Update the dim buttons
528
529 TGTextButton* button = static_cast<TGTextButton*>
530 (AliMUONPainterInterfaceHelper::FindButtonByUserData(*fDataSourceDimensions,
531 reinterpret_cast<void*>(fCurrentDimension)));
532
533 if ( button )
534 {
535 // set this button as "ON"
536 AliMUONPainterInterfaceHelper::Select(*fDataSourceDimensions,button->GetTitle());
537 }
538 else
539 {
540 AliMUONPainterInterfaceHelper::Unselect(*fDataSourceDimensions,"*");
541 }
542
543 fDataSourceDimensions->Show();
544}
545
546//_____________________________________________________________________________
547void
548AliMUONPainterPlotSelector::UpdateSourceButton()
549{
550 /// Update the source buttons
551
552 TGTextButton* button = static_cast<TGTextButton*>
553 (AliMUONPainterInterfaceHelper::FindButtonByUserData(*fDataSourceNames,
554 fCurrentData));
555
1ffbeb9d 556 if ( button )
557 {
558 AliMUONPainterInterfaceHelper::Select(*fDataSourceNames,button->GetTitle());
0145e89a 559
1ffbeb9d 560 RestoreDimensionButtons(button->GetTitle(),kFALSE);
561 }
0145e89a 562
563 fDataSourceNames->Show();
564}
565
566//_____________________________________________________________________________
567void
568AliMUONPainterPlotSelector::UpdateTypeButton()
569{
570 /// Update the type buttons
ede0d590 571
0145e89a 572 AliDebug(1,Form("fCurrentType=%s",fCurrentType.Data()));
573
ede0d590 574 if (!fCurrentData)
575 {
576 AliMUONPainterInterfaceHelper::SetState(*fTypes,kFALSE);
577 }
578 else
579 {
580 // disable levels that cannot be handled by this data
581 TGTextButton* padButton = static_cast<TGTextButton*>
582 (AliMUONPainterInterfaceHelper::FindButtonByName(*fTypes,"PAD"));
583 if (padButton)
584 {
585 padButton->SetEnabled(fCurrentData->IsChannelLevelEnabled());
586 }
0edb62c4 587 TGTextButton* manuButton = static_cast<TGTextButton*>
588 (AliMUONPainterInterfaceHelper::FindButtonByName(*fTypes,"MANU"));
589 if (manuButton)
590 {
591 manuButton->SetEnabled(fCurrentData->IsManuLevelEnabled());
592 }
06bc44ee 593 TGTextButton* busPatchButton = static_cast<TGTextButton*>
594 (AliMUONPainterInterfaceHelper::FindButtonByName(*fTypes,"BUSPATCH"));
595 if (busPatchButton)
596 {
597 busPatchButton->SetEnabled(fCurrentData->IsBusPatchLevelEnabled());
598 }
599 TGTextButton* pcbButton = static_cast<TGTextButton*>
600 (AliMUONPainterInterfaceHelper::FindButtonByName(*fTypes,"PCB"));
601 if (pcbButton)
602 {
603 pcbButton->SetEnabled(fCurrentData->IsPCBLevelEnabled());
604 }
0edb62c4 605
ede0d590 606 }
607
0145e89a 608 TGTextButton* button = static_cast<TGTextButton*>
609 (AliMUONPainterInterfaceHelper::FindButtonByName(*fTypes,fCurrentType));
610
611 if ( button )
612 {
613 AliMUONPainterInterfaceHelper::Select(*fTypes,button->GetTitle());
614 }
615 else
616 {
617 AliMUONPainterInterfaceHelper::Unselect(*fTypes,"*");
618 }
619
ede0d590 620
0145e89a 621 fTypes->Show();
622}
623