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()->FindDataSource(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 AliDebug(1,Form("Unregistering %s",data->GetName()));
267 TGButton* button = AliMUONPainterInterfaceHelper::FindButtonByName(*fDataSourceNames,
269 AliMUONVTrackerData* check = reinterpret_cast<AliMUONVTrackerData*>(button->GetUserData());
270 if ( !button || check != data )
272 AliError("Something is seriously wrong. Please check");
276 fDataSourceNames->Remove(button);
278 button->DestroyWindow();
280 fDataSourceNames->Show();
282 TObject* o = fDimensionButtonMap->Remove(new TObjString(data->GetName()));
286 AliError("Remove failed. Please check");
292 //_____________________________________________________________________________
294 AliMUONPainterPlotSelector::DimensionButtonWasClicked(Int_t id)
296 /// One dim button was clicked
298 AliDebug(1,Form("id=%d",id));
300 TGTextButton* button = (TGTextButton*)fDataSourceDimensions->GetButton(id);
302 SetCurrentDimension(reinterpret_cast<Int_t>(button->GetUserData()));
304 if ( fCurrentDimension >= 0 )
306 AliMUONPainterInterfaceHelper::SetState(*fTypes,kTRUE);
307 AliMUONPainterInterfaceHelper::Select(*fTypes,fCurrentType.Data(),kFALSE);
311 AliDebug(1,Form("fCurrentDimension=%d fCurrentData=%p fCurrentType=%s",
312 fCurrentDimension,fCurrentData,fCurrentType.Data()));
314 DataSourceWasChanged();
317 //_____________________________________________________________________________
319 AliMUONPainterPlotSelector::ResetDimensionButtonMap()
321 /// Reset the button group map
323 TIter next(fDimensionButtonMap);
326 while ( ( str = static_cast<TObjString*>(next()) ) )
328 TGButtonGroup* bg = static_cast<TGButtonGroup*>(fDimensionButtonMap->GetValue(str->String()));
329 AliMUONPainterInterfaceHelper::Unselect(*bg,"*");
333 //_____________________________________________________________________________
335 AliMUONPainterPlotSelector::RestoreDimensionButtons(const char* dataSourceName,
336 Bool_t updateCurrentDimension)
338 /// Restore (i.e. contrary of Backup) a given dimension button group
340 AliDebug(1,Form("name %s",dataSourceName));
341 TGButtonGroup* group = static_cast<TGButtonGroup*>(fDimensionButtonMap->GetValue(dataSourceName));
343 AliMUONPainterInterfaceHelper::Copy(*group,*fDataSourceDimensions);
345 fDataSourceDimensions->Connect("Clicked(Int_t)",
346 "AliMUONPainterPlotSelector",this,
347 "DimensionButtonWasClicked(Int_t)");
349 if ( updateCurrentDimension )
351 TGButton* button = AliMUONPainterInterfaceHelper::FindDownButton(*fDataSourceDimensions);
354 SetCurrentDimension(reinterpret_cast<Int_t>(button->GetUserData()));
358 SetCurrentDimension(-1);
362 fDataSourceDimensions->Show();
365 //_____________________________________________________________________________
367 AliMUONPainterPlotSelector::SetCurrentData(AliMUONVTrackerData* data)
369 /// Set the current data pointer
370 AliDebug(1,Form("fCurrentData %p -> %p",fCurrentData,data));
374 //_____________________________________________________________________________
376 AliMUONPainterPlotSelector::SetCurrentDimension(Int_t i)
378 /// Set the current dimension
379 AliDebug(1,Form("fCurrentDimension %d -> %d",fCurrentDimension,i));
380 fCurrentDimension = i;
383 //_____________________________________________________________________________
385 AliMUONPainterPlotSelector::SetCurrentType(const char* type)
387 /// Set the current type
388 AliDebug(1,Form("fCurrentType %s -> %s",fCurrentType.Data(),type));
392 //_____________________________________________________________________________
394 AliMUONPainterPlotSelector::SourceButtonWasClicked(Int_t id)
396 /// A source button was clicked
397 AliDebug(1,Form("BEGIN id %d fCurrentDimension=%d fCurrentData=%p fCurrentType=%s",
399 fCurrentDimension,fCurrentData,fCurrentType.Data()));
401 BackupDimensionButtons();
403 TGButton* button = fDataSourceNames->GetButton(id);
406 AliError(Form("Could not get DataSource button id=%d",id));
407 StdoutToAliDebug(1,AliMUONPainterInterfaceHelper::Dump(*fDataSourceNames));
408 button->GetUserData(); // to trigger a crash so gdb is possible ;-)
411 AliMUONVTrackerData* data = reinterpret_cast<AliMUONVTrackerData*>(button->GetUserData());
413 TString name = data ? data->GetName() : fgkDefaultSourceName;
415 RestoreDimensionButtons(name,kTRUE);
418 fCurrentDimension >= 0 &&
419 fCurrentDimension < data->NumberOfDimensions() )
421 AliMUONPainterInterfaceHelper::SetState(*fTypes,kTRUE);
425 AliMUONPainterInterfaceHelper::SetState(*fTypes,kFALSE);
428 SetCurrentData(data);
432 fDataSourceNames->Show();
433 fDataSourceDimensions->Show();
439 AliDebug(1,Form("END fCurrentDimension=%d fCurrentData=%p fCurrentType=%s",
440 fCurrentDimension,fCurrentData,fCurrentType.Data()));
442 DataSourceWasChanged();
445 //_____________________________________________________________________________
447 AliMUONPainterPlotSelector::TypeButtonWasClicked(Int_t id)
449 /// A type button was clicked
450 AliDebug(1,Form("fCurrentDimension=%d fCurrentData=%p",
451 fCurrentDimension,fCurrentData));
453 TGTextButton* button = (TGTextButton*)fTypes->GetButton(id);
454 SetCurrentType(button->GetTitle());
456 AliDebug(1,Form("fCurrentType=%s",fCurrentType.Data()));
458 DataSourceWasChanged();
461 //_____________________________________________________________________________
462 void AliMUONPainterPlotSelector::Update(const AliMUONPainterMatrix& painterMatrix)
464 /// Update ourselves from a new painter matrix
470 SetCurrentDimension(-1);
472 AliMUONPainterInterfaceHelper::Unselect(*fDataSourceNames,"*");
473 AliMUONPainterInterfaceHelper::Unselect(*fDataSourceDimensions,"*");
475 ResetDimensionButtonMap();
478 types.SetOwner(kTRUE);
479 painterMatrix.GetTypes(types);
480 CreateTypeButtons(types);
482 if ( painterMatrix.Size() > 0 )
484 AliMUONVPainter* painter = painterMatrix.Painter(painterMatrix.Size()-1);
486 AliMUONPainterGroup* plotterGroup = painter->PlotterGroup();
490 // the group have some data to plot, so update our internal pointers
492 SetCurrentData(plotterGroup->Data());
493 SetCurrentDimension(plotterGroup->DataIndex());
494 SetCurrentType(plotterGroup->Type());
498 AliDebug(1,Form("After update type=%s data=%p dim=%d",
499 fCurrentType.Data(),fCurrentData,fCurrentDimension));
501 // the *order* of the 3 following lines is *very* important
503 AliDebug(1,"Will update source buttons");
504 UpdateSourceButton();
505 AliDebug(1,"Will update dimension buttons");
506 UpdateDimensionButton();
507 AliDebug(1,"Will update type buttons");
513 AliDebug(1,Form("END fCurrentType=%s fCurrentData=%p fCurrentDimension=%d",
514 fCurrentType.Data(),fCurrentData,
518 //_____________________________________________________________________________
520 AliMUONPainterPlotSelector::UpdateDimensionButton()
522 /// Update the dim buttons
524 TGTextButton* button = static_cast<TGTextButton*>
525 (AliMUONPainterInterfaceHelper::FindButtonByUserData(*fDataSourceDimensions,
526 reinterpret_cast<void*>(fCurrentDimension)));
530 // set this button as "ON"
531 AliMUONPainterInterfaceHelper::Select(*fDataSourceDimensions,button->GetTitle());
535 AliMUONPainterInterfaceHelper::Unselect(*fDataSourceDimensions,"*");
538 fDataSourceDimensions->Show();
541 //_____________________________________________________________________________
543 AliMUONPainterPlotSelector::UpdateSourceButton()
545 /// Update the source buttons
547 TGTextButton* button = static_cast<TGTextButton*>
548 (AliMUONPainterInterfaceHelper::FindButtonByUserData(*fDataSourceNames,
551 AliMUONPainterInterfaceHelper::Select(*fDataSourceNames,button->GetTitle());
553 RestoreDimensionButtons(button->GetTitle(),kFALSE);
555 fDataSourceNames->Show();
558 //_____________________________________________________________________________
560 AliMUONPainterPlotSelector::UpdateTypeButton()
562 /// Update the type buttons
564 AliDebug(1,Form("fCurrentType=%s",fCurrentType.Data()));
566 TGTextButton* button = static_cast<TGTextButton*>
567 (AliMUONPainterInterfaceHelper::FindButtonByName(*fTypes,fCurrentType));
571 AliMUONPainterInterfaceHelper::Select(*fTypes,button->GetTitle());
575 AliMUONPainterInterfaceHelper::Unselect(*fTypes,"*");
580 AliMUONPainterInterfaceHelper::SetState(*fTypes,kFALSE);