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 /// \class AliMUONPainterPlotSelector
20 /// Widget to select which data to plot for painters
22 /// \author Laurent Aphecetche
24 /// See AliMUONPainterInterfaceHelper for an important implementation note
25 /// about our use of TGButtonGroup
28 #include "AliMUONPainterPlotSelector.h"
30 #include "AliMUONPainterGroup.h"
31 #include "AliMUONPainterInterfaceHelper.h"
32 #include "AliMUONPainterMatrix.h"
33 #include "AliMUONPainterRegistry.h"
34 #include "AliMUONVPainter.h"
35 #include "AliMUONVTrackerData.h"
37 #include <Riostream.h>
39 #include <TGButtonGroup.h>
40 #include <TObjArray.h>
41 #include <TObjString.h>
44 ClassImp(AliMUONPainterPlotSelector)
47 const char* AliMUONPainterPlotSelector::fgkDefaultSourceName = "none";
49 //_____________________________________________________________________________
50 AliMUONPainterPlotSelector::AliMUONPainterPlotSelector(const TGWindow* window, UInt_t w, UInt_t h)
51 : TGCompositeFrame(window,w,h,kHorizontalFrame),
53 fDataSourceNames(0x0),
54 fDataSourceDimensions(0x0),
55 fDimensionButtonMap(new TMap),
61 fTypes = new TGButtonGroup(this,"Plot");
63 fDataSourceNames = new TGButtonGroup(this,"Sources");
65 AliMUONPainterRegistry* reg = AliMUONPainterRegistry::Instance();
67 reg->Connect("DataSourceWasRegistered(AliMUONVTrackerData*)",
68 "AliMUONPainterPlotSelector",
70 "DataSourceWasRegistered(AliMUONVTrackerData*)");
72 reg->Connect("DataSourceWasUnregistered(AliMUONVTrackerData*)",
73 "AliMUONPainterPlotSelector",
75 "DataSourceWasUnregistered(AliMUONVTrackerData*)");
77 AliMUONPainterInterfaceHelper::AddRadioButton(*fDataSourceNames,
82 CreateDimensionButtons(fgkDefaultSourceName);
84 fDataSourceDimensions = new TGButtonGroup(this,0,3,5,0,"Dimensions");
86 for ( Int_t i = 0; i < reg->NumberOfDataSources(); ++i )
88 AliMUONVTrackerData* data = reg->DataSource(i);
89 DataSourceWasRegistered(data);
92 fDataSourceNames->Connect("Clicked(Int_t)","AliMUONPainterPlotSelector",
94 "SourceButtonWasClicked(Int_t)");
97 AddFrame(fDataSourceNames);
98 AddFrame(fDataSourceDimensions);
101 //_____________________________________________________________________________
102 AliMUONPainterPlotSelector::~AliMUONPainterPlotSelector()
107 //_____________________________________________________________________________
109 AliMUONPainterPlotSelector::BackupDimensionButtons()
111 /// Backup the dimension button group
113 TString name = fDataSourceDimensions->GetTitle();
115 AliDebug(1,Form("name %s",name.Data()));
117 if ( name != fgkDefaultSourceName )
119 TGButtonGroup* group = static_cast<TGButtonGroup*>(fDimensionButtonMap->GetValue(name));
122 AliError(Form("Did not find group %s",name.Data()));
126 AliMUONPainterInterfaceHelper::Copy(*fDataSourceDimensions,*group);
131 fDataSourceDimensions->Disconnect("Clicked(Int_t)",
133 "DimensionButtonWasClicked(Int_t)");
137 //_____________________________________________________________________________
139 AliMUONPainterPlotSelector::CreateDimensionButtons(const char* dataSourceName)
141 /// Create the dimension button group for a given data source
143 AliDebug(1,Form("Creating dimension buttons for dataSource %s",dataSourceName));
145 AliMUONVTrackerData* data = AliMUONPainterRegistry::Instance()->DataSource(dataSourceName);
147 TGButtonGroup* bg = new TGButtonGroup(this,0,3,5,0,dataSourceName);
151 for ( Int_t i = 0; i < data->NumberOfDimensions(); ++i )
153 AliMUONPainterInterfaceHelper::AddRadioButton(*bg,
154 data->DimensionName(i),
155 reinterpret_cast<void*>(i));
159 fDimensionButtonMap->Add(new TObjString(dataSourceName),bg);
161 AliDebug(1,Form("bg is %p Count=%d",bg,bg->GetCount()));
162 StdoutToAliDebug(1,AliMUONPainterInterfaceHelper::Dump(*bg));
164 bg->Connect("Clicked(Int_t)","AliMUONPainterPlotSelector",this,
165 "DimensionButtonWasClicked(Int_t)");
168 //_____________________________________________________________________________
170 AliMUONPainterPlotSelector::CreateTypeButtons(const TObjArray& types)
172 /// Create the type button group
174 AliMUONPainterInterfaceHelper::ClearButtons(*fTypes);
176 TIter nextType(&types);
179 while ( ( str = static_cast<TObjString*>(nextType()) ) )
181 AliMUONPainterInterfaceHelper::AddRadioButton(*fTypes,str->String());
184 fTypes->Connect("Clicked(Int_t)","AliMUONPainterPlotSelector",this,
185 "TypeButtonWasClicked(Int_t)");
190 //_____________________________________________________________________________
192 AliMUONPainterPlotSelector::DataSourceWasChanged()
194 /// Data source was changed
195 DataSourceWasChanged(fCurrentType.Data(),fCurrentData,fCurrentDimension);
198 //_____________________________________________________________________________
200 AliMUONPainterPlotSelector::DataSourceWasChanged(const char* type,
201 AliMUONVTrackerData* data,
204 /// Emit a signal to tell data source was changed
205 AliDebug(1,Form("type=%s data=%s (%s)",
207 ( data ? data->GetName() : "" ),
208 ( ( data && dataIndex >= 0 ) ? data->DimensionName(dataIndex).Data() :
211 Long_t param[] = { (Long_t)type, (Long_t)data,
214 Emit("DataSourceWasChanged(const char*,AliMUONVTrackerData*,Int_t)",param);
217 //_____________________________________________________________________________
219 AliMUONPainterPlotSelector::DataSourceWasRegistered(AliMUONVTrackerData* data)
221 /// A new data source has been registered : add it to the interface
223 AliDebug(1,Form("Registering %s",data->GetName()));
225 AliMUONPainterInterfaceHelper::AddRadioButton(*fDataSourceNames,
229 data->Connect("NumberOfEventsChanged()",
230 "AliMUONPainterPlotSelector",
232 "NumberOfEventsChanged()");
234 CreateDimensionButtons(data->GetName());
236 fDataSourceNames->Show();
241 //_____________________________________________________________________________
243 AliMUONPainterPlotSelector::NumberOfEventsChanged()
245 /// Change the tool tip of the corresponding data source button
247 // find first the sender of the signal
249 // AliMUONVTrackerData* data = reinterpret_cast<AliMUONVTrackerData*>(gTQSender);
251 // TGButton* button = AliMUONPainterInterfaceHelper::FindButtonByUserData(*fDataSourceNames,data);
255 // button->SetToolTipText(Form("%d events",data->NumberOfEvents()),250);
259 //_____________________________________________________________________________
261 AliMUONPainterPlotSelector::DataSourceWasUnregistered(AliMUONVTrackerData* data)
263 /// A data source has been unregistered : remove it from the interface
265 TGButton* button = AliMUONPainterInterfaceHelper::FindButtonByUserData(*fDataSourceNames,data);
267 TGButton* bd = AliMUONPainterInterfaceHelper::FindDownButton(*fDataSourceNames);
271 // selected data source is the one we are removing...
272 // revert to "none" before actually removing it.
273 SourceButtonWasClicked(1);
276 AliMUONPainterInterfaceHelper::RemoveButton(*fDataSourceNames,button);
278 // do not forget to re-connect things
279 fDataSourceNames->Connect("Clicked(Int_t)","AliMUONPainterPlotSelector",
281 "SourceButtonWasClicked(Int_t)");
284 TObject* o = fDimensionButtonMap->Remove(new TObjString(data->GetName()));
288 AliError("Remove failed. Please check");
291 fDataSourceNames->Show();
296 //_____________________________________________________________________________
298 AliMUONPainterPlotSelector::DimensionButtonWasClicked(Int_t id)
300 /// One dim button was clicked
302 AliDebug(1,Form("id=%d",id));
304 TGTextButton* button = (TGTextButton*)fDataSourceDimensions->GetButton(id);
306 SetCurrentDimension(reinterpret_cast<Long_t>(button->GetUserData()));
308 if ( fCurrentDimension >= 0 )
310 AliMUONPainterInterfaceHelper::SetState(*fTypes,kTRUE);
311 AliMUONPainterInterfaceHelper::Select(*fTypes,fCurrentType.Data(),kFALSE);
315 AliDebug(1,Form("fCurrentDimension=%ld fCurrentData=%p fCurrentType=%s",
316 fCurrentDimension,fCurrentData,fCurrentType.Data()));
318 DataSourceWasChanged();
321 //_____________________________________________________________________________
323 AliMUONPainterPlotSelector::ResetDimensionButtonMap()
325 /// Reset the button group map
327 TIter next(fDimensionButtonMap);
330 while ( ( str = static_cast<TObjString*>(next()) ) )
332 TGButtonGroup* bg = static_cast<TGButtonGroup*>(fDimensionButtonMap->GetValue(str->String()));
333 AliMUONPainterInterfaceHelper::Unselect(*bg,"*");
337 //_____________________________________________________________________________
339 AliMUONPainterPlotSelector::RestoreDimensionButtons(const char* dataSourceName,
340 Bool_t updateCurrentDimension)
342 /// Restore (i.e. contrary of Backup) a given dimension button group
344 AliDebug(1,Form("name %s",dataSourceName));
345 TGButtonGroup* group = static_cast<TGButtonGroup*>(fDimensionButtonMap->GetValue(dataSourceName));
347 AliMUONPainterInterfaceHelper::Copy(*group,*fDataSourceDimensions);
349 fDataSourceDimensions->Connect("Clicked(Int_t)",
350 "AliMUONPainterPlotSelector",this,
351 "DimensionButtonWasClicked(Int_t)");
353 if ( updateCurrentDimension )
355 TGButton* button = AliMUONPainterInterfaceHelper::FindDownButton(*fDataSourceDimensions);
358 SetCurrentDimension(reinterpret_cast<Long_t>(button->GetUserData()));
362 SetCurrentDimension(-1);
366 fDataSourceDimensions->Show();
369 //_____________________________________________________________________________
371 AliMUONPainterPlotSelector::SetCurrentData(AliMUONVTrackerData* data)
373 /// Set the current data pointer
374 AliDebug(1,Form("fCurrentData %p -> %p",fCurrentData,data));
378 //_____________________________________________________________________________
380 AliMUONPainterPlotSelector::SetCurrentDimension(Long_t i)
382 /// Set the current dimension
383 AliDebug(1,Form("fCurrentDimension %ld -> %ld",fCurrentDimension,i));
384 fCurrentDimension = i;
387 //_____________________________________________________________________________
389 AliMUONPainterPlotSelector::SetCurrentType(const char* type)
391 /// Set the current type
392 AliDebug(1,Form("fCurrentType %s -> %s",fCurrentType.Data(),type));
396 //_____________________________________________________________________________
398 AliMUONPainterPlotSelector::SourceButtonWasClicked(Int_t id)
400 /// A source button was clicked
401 AliDebug(1,Form("BEGIN id %d fCurrentDimension=%ld fCurrentData=%p fCurrentType=%s",
403 fCurrentDimension,fCurrentData,fCurrentType.Data()));
405 BackupDimensionButtons();
407 TGButton* button = fDataSourceNames->GetButton(id);
410 AliError(Form("Could not get DataSource button id=%d",id));
411 StdoutToAliDebug(1,AliMUONPainterInterfaceHelper::Dump(*fDataSourceNames));
412 button->GetUserData(); // to trigger a crash so gdb is possible ;-)
415 AliMUONVTrackerData* data = reinterpret_cast<AliMUONVTrackerData*>(button->GetUserData());
417 TString name = data ? data->GetName() : fgkDefaultSourceName;
419 RestoreDimensionButtons(name,kTRUE);
422 fCurrentDimension >= 0 &&
423 fCurrentDimension < (Long_t)(data->NumberOfDimensions()) )
425 AliMUONPainterInterfaceHelper::SetState(*fTypes,kTRUE);
429 AliMUONPainterInterfaceHelper::SetState(*fTypes,kFALSE);
432 SetCurrentData(data);
436 fDataSourceNames->Show();
437 fDataSourceDimensions->Show();
443 AliDebug(1,Form("END fCurrentDimension=%ld fCurrentData=%p fCurrentType=%s",
444 fCurrentDimension,fCurrentData,fCurrentType.Data()));
446 DataSourceWasChanged();
449 //_____________________________________________________________________________
451 AliMUONPainterPlotSelector::TypeButtonWasClicked(Int_t id)
453 /// A type button was clicked
454 AliDebug(1,Form("fCurrentDimension=%ld fCurrentData=%p",
455 fCurrentDimension,fCurrentData));
457 TGTextButton* button = (TGTextButton*)fTypes->GetButton(id);
458 SetCurrentType(button->GetTitle());
460 AliDebug(1,Form("fCurrentType=%s",fCurrentType.Data()));
462 DataSourceWasChanged();
465 //_____________________________________________________________________________
466 void AliMUONPainterPlotSelector::Update(const AliMUONPainterMatrix& painterMatrix)
468 /// Update ourselves from a new painter matrix
474 SetCurrentDimension(-1);
476 AliMUONPainterInterfaceHelper::Unselect(*fDataSourceNames,"*");
477 AliMUONPainterInterfaceHelper::Unselect(*fDataSourceDimensions,"*");
479 ResetDimensionButtonMap();
482 types.SetOwner(kTRUE);
483 painterMatrix.GetTypes(types);
484 CreateTypeButtons(types);
486 if ( painterMatrix.Size() > 0 )
488 AliMUONVPainter* painter = painterMatrix.Painter(painterMatrix.Size()-1);
490 AliMUONPainterGroup* plotterGroup = painter->PlotterGroup();
494 // the group have some data to plot, so update our internal pointers
496 SetCurrentData(plotterGroup->Data());
497 SetCurrentDimension(plotterGroup->DataIndex());
498 SetCurrentType(plotterGroup->Type());
502 AliDebug(1,Form("After update type=%s data=%p dim=%ld",
503 fCurrentType.Data(),fCurrentData,fCurrentDimension));
505 // the *order* of the 3 following lines is *very* important
507 AliDebug(1,"Will update source buttons");
508 UpdateSourceButton();
509 AliDebug(1,"Will update dimension buttons");
510 UpdateDimensionButton();
511 AliDebug(1,"Will update type buttons");
517 AliDebug(1,Form("END fCurrentType=%s fCurrentData=%p fCurrentDimension=%ld",
518 fCurrentType.Data(),fCurrentData,
522 //_____________________________________________________________________________
524 AliMUONPainterPlotSelector::UpdateDimensionButton()
526 /// Update the dim buttons
528 TGTextButton* button = static_cast<TGTextButton*>
529 (AliMUONPainterInterfaceHelper::FindButtonByUserData(*fDataSourceDimensions,
530 reinterpret_cast<void*>(fCurrentDimension)));
534 // set this button as "ON"
535 AliMUONPainterInterfaceHelper::Select(*fDataSourceDimensions,button->GetTitle());
539 AliMUONPainterInterfaceHelper::Unselect(*fDataSourceDimensions,"*");
542 fDataSourceDimensions->Show();
545 //_____________________________________________________________________________
547 AliMUONPainterPlotSelector::UpdateSourceButton()
549 /// Update the source buttons
551 TGTextButton* button = static_cast<TGTextButton*>
552 (AliMUONPainterInterfaceHelper::FindButtonByUserData(*fDataSourceNames,
555 AliMUONPainterInterfaceHelper::Select(*fDataSourceNames,button->GetTitle());
557 RestoreDimensionButtons(button->GetTitle(),kFALSE);
559 fDataSourceNames->Show();
562 //_____________________________________________________________________________
564 AliMUONPainterPlotSelector::UpdateTypeButton()
566 /// Update the type buttons
568 AliDebug(1,Form("fCurrentType=%s",fCurrentType.Data()));
570 TGTextButton* button = static_cast<TGTextButton*>
571 (AliMUONPainterInterfaceHelper::FindButtonByName(*fTypes,fCurrentType));
575 AliMUONPainterInterfaceHelper::Select(*fTypes,button->GetTitle());
579 AliMUONPainterInterfaceHelper::Unselect(*fTypes,"*");
584 AliMUONPainterInterfaceHelper::SetState(*fTypes,kFALSE);