]> git.uio.no Git - u/mrichter/AliRoot.git/blame - MUON/AliMUONPainterRegistry.cxx
First big commit of the mchview program and its accompanying library,
[u/mrichter/AliRoot.git] / MUON / AliMUONPainterRegistry.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#include "AliMUONPainterRegistry.h"
19
20#include "AliMUONPainterMatrix.h"
21#include "AliMUONVTrackerData.h"
22#include "AliMUONVTrackerDataMaker.h"
23#include "AliLog.h"
24#include <TGMenu.h>
25#include <TGWindow.h>
26#include <THashList.h>
27#include <TObjArray.h>
28#include <TString.h>
29#include <Riostream.h>
30
31///\class AliMUONPainterRegistry
32///
33/// Registry for AliMUONVPainter related stuff : painter data sources
34/// and painter matrices
35///
36///\author Laurent Aphecetche, Subatech
37
38///\cond CLASSIMP
39ClassImp(AliMUONPainterRegistry)
40///\endcond
41
42AliMUONPainterRegistry* AliMUONPainterRegistry::fgInstance(0x0);
43
44//_____________________________________________________________________________
45AliMUONPainterRegistry::AliMUONPainterRegistry() : TObject(),
46fDataSources(new TObjArray),
47fPainterMatrices(new TObjArray),
48fDataReaders(new TObjArray),
49fHistoryMenu(0x0),
50fMenuBar(0x0),
51fHistoryCounter(0)
52{
53 /// ctor
54 fDataSources->SetOwner(kTRUE);
55 fPainterMatrices->SetOwner(kTRUE);
56 fDataReaders->SetOwner(kTRUE);
57}
58
59//_____________________________________________________________________________
60AliMUONPainterRegistry::~AliMUONPainterRegistry()
61{
62 /// dtor
63 delete fDataSources;
64 delete fPainterMatrices;
65 delete fDataReaders;
66}
67
68//_____________________________________________________________________________
69AliMUONVTrackerDataMaker*
70AliMUONPainterRegistry::DataReader(Int_t i) const
71{
72 /// Get one data source
73 if ( i >= 0 && i <= fDataReaders->GetLast() )
74 {
75 return static_cast<AliMUONVTrackerDataMaker*>(fDataReaders->At(i));
76 }
77 else
78 {
79 AliError(Form("Index out of bounds : %d / %d",i,fDataReaders->GetLast()+1));
80 return 0x0;
81 }
82}
83
84//_____________________________________________________________________________
85AliMUONVTrackerData*
86AliMUONPainterRegistry::DataSource(Int_t i) const
87{
88 /// Get one data source
89 if ( i >= 0 && i <= fDataSources->GetLast() )
90 {
91 return static_cast<AliMUONVTrackerData*>(fDataSources->At(i));
92 }
93 else
94 {
95 AliError(Form("Index out of bounds : %d / %d",i,fDataSources->GetLast()+1));
96 return 0x0;
97 }
98}
99
100//_____________________________________________________________________________
101void
102AliMUONPainterRegistry::DataReaderWasRegistered(AliMUONVTrackerDataMaker* data)
103{
104 /// A new reader source was registered
105 Long_t param[] = { (Long_t)data };
106
107 Emit("DataReaderWasRegistered(AliMUONVTrackerDataMaker*)",param);
108}
109
110//_____________________________________________________________________________
111void
112AliMUONPainterRegistry::DataReaderWasUnregistered(AliMUONVTrackerDataMaker* data)
113{
114 /// A data reader was unregistered
115 Long_t param[] = { (Long_t)data };
116
117 Emit("DataReaderWasUnregistered(AliMUONVTrackerDataMaker*)",param);
118
119}
120
121//_____________________________________________________________________________
122void
123AliMUONPainterRegistry::DataSourceWasRegistered(AliMUONVTrackerData* data)
124{
125 /// A new data source was registered
126 Long_t param[] = { (Long_t)data };
127
128 Emit("DataSourceWasRegistered(AliMUONVTrackerData*)",param);
129}
130
131//_____________________________________________________________________________
132void
133AliMUONPainterRegistry::DataSourceWasUnregistered(AliMUONVTrackerData* data)
134{
135 /// A data source was unregistered
136 Long_t param[] = { (Long_t)data };
137
138 Emit("DataSourceWasUnregistered(AliMUONVTrackerData*)",param);
139
140}
141
142//_____________________________________________________________________________
143AliMUONVTrackerData*
144AliMUONPainterRegistry::FindDataSource(const char* name) const
145{
146 /// Find a data source by name
147 return static_cast<AliMUONVTrackerData*>(fDataSources->FindObject(name));
148}
149
150//_____________________________________________________________________________
151Int_t
152AliMUONPainterRegistry::FindIndexOf(AliMUONPainterMatrix* group) const
153{
154 /// Get the index of a given painterMatrix
155 return fPainterMatrices->IndexOf(group);
156}
157
158//_____________________________________________________________________________
159Int_t
160AliMUONPainterRegistry::FindIndexOf(AliMUONVTrackerData* data) const
161{
162 /// Get the index of a given data
163 return fDataSources->IndexOf(data);
164}
165
166//_____________________________________________________________________________
167AliMUONPainterMatrix*
168AliMUONPainterRegistry::FindPainterMatrix(const char* name) const
169{
170 /// Get a painterMatrix by name
171 return static_cast<AliMUONPainterMatrix*>(fPainterMatrices->FindObject(name));
172}
173
174//_____________________________________________________________________________
175void
176AliMUONPainterRegistry::HistoryMenuActivated(Int_t i)
177{
178 /// A painterMatrix was chosen from the history menu
179
180 AliDebug(1,Form("i=%d",i));
181
182 TGMenuEntry* entry = fHistoryMenu->GetEntry(i);
183
184 AliMUONPainterMatrix* group = reinterpret_cast<AliMUONPainterMatrix*>(entry->GetUserData());
185
186 PainterMatrixWantToShow(group);
187}
188
189//_____________________________________________________________________________
190AliMUONPainterRegistry*
191AliMUONPainterRegistry::Instance()
192{
193 /// Get unique instance of this class
194 if ( !fgInstance ) fgInstance = new AliMUONPainterRegistry;
195 return fgInstance;
196}
197
198//_____________________________________________________________________________
199AliMUONPainterMatrix*
200AliMUONPainterRegistry::PainterMatrix(Int_t i) const
201{
202 /// Get one painter matrix
203 if ( i >= 0 && i <= fPainterMatrices->GetLast() )
204 {
205 return static_cast<AliMUONPainterMatrix*>(fPainterMatrices->At(i));
206 }
207 else
208 {
209 AliError(Form("Index out of bounds : %d / %d",i,fPainterMatrices->GetLast()+1));
210 return 0x0;
211 }
212}
213
214//_____________________________________________________________________________
215void
216AliMUONPainterRegistry::PainterMatrixWantToShow(AliMUONPainterMatrix* group)
217{
218 /// A given paintermatrix want to appear on screen
219 Long_t param[] = { (Long_t)group };
220
221 Emit("PainterMatrixWantToShow(AliMUONPainterMatrix*)",param);
222}
223
224//_____________________________________________________________________________
225void
226AliMUONPainterRegistry::AddToHistory(AliMUONPainterMatrix* group)
227{
228 /// Add a matrix to the history
229
230 if ( !fHistoryMenu && fMenuBar )
231 {
232 fHistoryMenu = new TGPopupMenu(gClient->GetRoot());
233 TGPopupMenu* before = 0x0; //FIXME: could try to find a place where to put it (e.g. before Help ?)
234
235 fMenuBar->AddPopup("&History",fHistoryMenu, new TGLayoutHints(kLHintsNormal),before);
236
237 fHistoryMenu->Connect("Activated(Int_t)",
238 "AliMUONPainterRegistry",this,
239 "HistoryMenuActivated(Int_t)");
240
241 AliDebug(1,Form("HistoryMenu create at %x",fHistoryMenu));
242 }
243
244 if ( fHistoryMenu )
245 {
246 TIter next(fHistoryMenu->GetListOfEntries());
247 TGMenuEntry* e(0x0);
248
249 while ( ( e = static_cast<TGMenuEntry*>(next()) ) )
250 {
251 if ( e->GetUserData() == group )
252 {
253 fHistoryMenu->DeleteEntry(e);
254 break;
255 }
256 }
257
258 e = static_cast<TGMenuEntry*>(fHistoryMenu->GetListOfEntries()->First());
259
260 fHistoryMenu->AddEntry(group->GetName(),++fHistoryCounter,(void*)group,0x0,e);
261 }
262 else
263 {
264 AliError("fHistoryMenu is null. We probably did not find the relevant menu entry ?");
265 }
266}
267
268//_____________________________________________________________________________
269void
270AliMUONPainterRegistry::PainterMatrixWasRegistered(AliMUONPainterMatrix* group)
271{
272 /// A new painter matrix was registered
273 Long_t param[] = { (Long_t)group };
274
275 Emit("PainterMatrixWasRegistered(AliMUONPainterMatrix*)",param);
276}
277
278//_____________________________________________________________________________
279void
280AliMUONPainterRegistry::PainterMatrixWasUnregistered(AliMUONPainterMatrix* group)
281{
282 /// A painter matrix was unregistered
283 Long_t param[] = { (Long_t)group };
284
285 Emit("PainterMatrixWasUnregistered(AliMUONPainterMatrix*)",param);
286}
287
288//_____________________________________________________________________________
289void
290AliMUONPainterRegistry::Print(Option_t* opt) const
291{
292 /// Printout
293 TString sopt(opt);
294 sopt.ToUpper();
295
296 cout << "Number of data sources = " << NumberOfDataSources() << endl;
297 cout << "Number of data readers = " << NumberOfDataReaders() << endl;
298 cout << "Number of painter matrices = " << NumberOfPainterMatrices() << endl;
299
300 if ( sopt.Contains("FULL") || sopt.Contains("READER") )
301 {
302 TIter next(fDataReaders);
303 AliMUONVTrackerDataMaker* reader;
304
305 while ( ( reader = static_cast<AliMUONVTrackerDataMaker*>(next()) ) )
306 {
307 reader->Print();
308 }
309 }
310
311 if ( sopt.Contains("FULL") || sopt.Contains("DATA") )
312 {
313 TIter next(fDataSources);
314 AliMUONVTrackerData* data;
315
316 while ( ( data = static_cast<AliMUONVTrackerData*>(next()) ) )
317 {
318 data->Print();
319 }
320 }
321
322 if ( sopt.Contains("FULL") || sopt.Contains("MATRIX") )
323 {
324 TIter next(fPainterMatrices);
325 AliMUONPainterMatrix* matrix;
326
327 while ( ( matrix = static_cast<AliMUONPainterMatrix*>(next()) ) )
328 {
329 matrix->Print();
330 }
331 }
332
333}
334
335//_____________________________________________________________________________
336Int_t
337AliMUONPainterRegistry::Register(AliMUONPainterMatrix* group)
338{
339 /// group is adopted, i.e. the registry becomes the owner of it.
340 fPainterMatrices->AddLast(group);
341
342 PainterMatrixWasRegistered(group);
343
344 return fPainterMatrices->IndexOf(group);
345}
346
347//_____________________________________________________________________________
348void
349AliMUONPainterRegistry::Register(AliMUONVTrackerData* data)
350{
351 /// data is adopted, i.e. the registry becomes the owner of it.
352 fDataSources->AddLast(data);
353 DataSourceWasRegistered(data);
354}
355
356//_____________________________________________________________________________
357void
358AliMUONPainterRegistry::Register(AliMUONVTrackerDataMaker* reader)
359{
360 /// reader is adopted, i.e. the registry becomes the owner of it.
361 fDataReaders->AddLast(reader);
362 DataReaderWasRegistered(reader);
363 Register(reader->Data());
364 reader->SetOwner(kFALSE); // important so data it not deleted twice
365}
366
367//_____________________________________________________________________________
368Int_t
369AliMUONPainterRegistry::NumberOfDataReaders() const
370{
371 /// The number of data readers we handle
372 return fDataReaders->GetLast()+1;
373}
374
375//_____________________________________________________________________________
376Int_t
377AliMUONPainterRegistry::NumberOfDataSources() const
378{
379 /// The number of data soures we handle
380 return fDataSources->GetLast()+1;
381}
382
383//_____________________________________________________________________________
384Int_t
385AliMUONPainterRegistry::NumberOfPainterMatrices() const
386{
387 /// The number of painter matrices we handle
388 return fPainterMatrices->GetLast()+1;
389}
390
391//_____________________________________________________________________________
392Bool_t
393AliMUONPainterRegistry::Unregister(AliMUONVTrackerData* data)
394{
395 /// Unregister some data
396
397 if (!data) return kFALSE;
398
399 DataSourceWasUnregistered(data);
400
401 TObject* o = fDataSources->Remove(data);
402 if ( o )
403 {
404 delete o;
405 }
406 else
407 {
408 AliError(Form("Could not unregister data named %s title %s",data->GetName(),
409 data->GetTitle()));
410 }
411 return ( o != 0x0 );
412}
413
414//_____________________________________________________________________________
415Bool_t
416AliMUONPainterRegistry::Unregister(AliMUONVTrackerDataMaker* reader)
417{
418 /// Unregister some reader
419
420 if (!reader) return kFALSE;
421
422 DataReaderWasUnregistered(reader);
423
424 TObject* o = fDataReaders->Remove(reader);
425 if ( o )
426 {
427 delete o;
428 }
429 else
430 {
431 AliError(Form("Could not unregister data named %s title %s",reader->GetName(),
432 reader->GetTitle()));
433 }
434 return ( o != 0x0 );
435}
436
437//_____________________________________________________________________________
438Bool_t
439AliMUONPainterRegistry::Unregister(AliMUONPainterMatrix* group)
440{
441 /// Unregister some matrix
442
443 if (!group) return kFALSE;
444
445 PainterMatrixWasUnregistered(group);
446
447 TObject* o = fPainterMatrices->Remove(group);
448 if ( o )
449 {
450 delete o;
451 }
452 else
453 {
454 AliError(Form("Could not unregister group named %s",group->GetName()));
455 }
456 return ( o != 0x0 );
457}