]> git.uio.no Git - u/mrichter/AliRoot.git/blame - MUON/AliMUONPainterMasterFrame.cxx
Bug fix (selection of RawReaderDate from Yuri was not correct)
[u/mrichter/AliRoot.git] / MUON / AliMUONPainterMasterFrame.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 "AliMUONPainterMasterFrame.h"
19
20#include "AliMUONChamberPainter.h"
21#include "AliMUONPainterGroup.h"
22#include "AliMUONPainterMatrix.h"
23#include "AliMUONPainterMatrixFrame.h"
24#include "AliMUONPainterInterfaceHelper.h"
25#include "AliMUONPainterRegistry.h"
26#include "AliMUONAttPainterSelectorFrame.h"
27#include "AliMUONVPainter.h"
28#include "AliCodeTimer.h"
29#include "AliLog.h"
30#include <Riostream.h>
31#include <TApplication.h>
32#include <TCanvas.h>
33#include <TEnv.h>
34#include <TGComboBox.h>
35#include <TGLabel.h>
36#include <TObjArray.h>
37#include <TObjString.h>
38#include <TGButtonGroup.h>
39#include <TGMsgBox.h>
40
41/// \class AliMUONPainterMasterFrame
42///
43/// Main window of the 2D display
44///
45/// \author Laurent Aphecetche, Subatech
46
47///\cond CLASSIMP
48ClassImp(AliMUONPainterMasterFrame)
49///\endcond
50
51namespace
52{
53 UInt_t UniqueID(Int_t nx, Int_t ny)
54 {
55 return ny | (nx << 8);
56 }
57
58 Int_t Nx(UInt_t uniqueID)
59 {
60 return ( uniqueID & 0xFF00 ) >> 8;
61 }
62
63 Int_t Ny(UInt_t uniqueID)
64 {
65 return uniqueID & 0xFF;
66 }
67
68}
69
70const Int_t AliMUONPainterMasterFrame::fgkBorderSize = 10;
71
72//_____________________________________________________________________________
73AliMUONPainterMasterFrame::AliMUONPainterMasterFrame(const TGWindow* p,
74 UInt_t w, UInt_t h)
75: TGCompositeFrame(p,w,h,kVerticalFrame),
76 fNavigationFrame(0x0),
77 fPainterMatrixFrame(0x0),
78 fBackButton(0x0),
79 fForwardButton(0x0),
80 fGroupTitle(0x0),
81 fNavigation(),
82 fCurrentNavigationPosition(-1),
83 fAttPainterSelectorFrame(0x0)
84{
85 /// ctor
86
87 UInt_t wi = w - fgkBorderSize*2;
88 UInt_t hi = h - fgkBorderSize*3;
89
90 fNavigationFrame = new TGHorizontalFrame(this,wi);
91
92 AddFrame(fNavigationFrame,new TGLayoutHints(kLHintsExpandX|kLHintsTop,
93 fgkBorderSize,fgkBorderSize,
94 fgkBorderSize,fgkBorderSize));
95
96 fBackButton = new TGPictureButton(fNavigationFrame,
97 gClient->GetPicture("tb_back.xpm"));
98
99 fForwardButton = new TGPictureButton(fNavigationFrame,
100 gClient->GetPicture("tb_forw.xpm"));
101
102 fAttPainterSelectorFrame = new AliMUONAttPainterSelectorFrame(fNavigationFrame,w/2,20);
103
104 fGroupTitle = new TGLabel(fNavigationFrame,"");
105
106 fNavigationFrame->AddFrame(fBackButton,new TGLayoutHints(kLHintsCenterY));
107 fNavigationFrame->AddFrame(fForwardButton,new TGLayoutHints(kLHintsCenterY));
108
109 fNavigationFrame->AddFrame(fAttPainterSelectorFrame,new TGLayoutHints(kLHintsCenterY,10));
110
111 fAttPainterSelectorFrame->Connect("Clicked(AliMUONAttPainter*)",
112 "AliMUONPainterMasterFrame",
113 this,
114 "AttributesChanged(AliMUONAttPainter*)");
115
116 fNavigationFrame->AddFrame(fGroupTitle,new TGLayoutHints(kLHintsExpandX|kLHintsCenterX|kLHintsCenterY,10));
117
118 fForwardButton->Connect("Clicked()","AliMUONPainterMasterFrame",
119 this,
120 "Forward()");
121
122 fBackButton->Connect("Clicked()","AliMUONPainterMasterFrame",
123 this,
124 "Backward()");
125
126
127
128 UInt_t w1 = wi;
9016a84e 129 // UInt_t h1 = hi - fNavigationFrame->GetHeight() - 3*fgkBorderSize;
130 UInt_t h1 = hi - 7*12;
0145e89a 131
132 MakeTopPainterMatrix(w1,h1);
133
134 AddFrame(fPainterMatrixFrame,new TGLayoutHints(kLHintsExpandX,
135 fgkBorderSize,fgkBorderSize,
136 0,fgkBorderSize));
137
138 AliMUONPainterInterfaceHelper::SetBackgroundColor("MasterFrame.Navigation",*fNavigationFrame);
139 AliMUONPainterInterfaceHelper::SetBackgroundColor("MasterFrame.Main",*this);
140
141 AliDebug(1,Form("fNavigation=%p",&fNavigation));
142
143 AliMUONPainterRegistry::Instance()->Connect("PainterMatrixWantToShow(AliMUONPainterMatrix*)",
144 "AliMUONPainterMasterFrame",
145 this,
146 "PainterMatrixWantToShow(AliMUONPainterMatrix*)");
147
148 fPainterMatrixFrame->DataSourceWasChanged("*",0x0,-1);
149}
150
151//_____________________________________________________________________________
152AliMUONPainterMasterFrame::~AliMUONPainterMasterFrame()
153{
154 /// dtor
155 Cleanup();
156}
157
158//_____________________________________________________________________________
159void
160AliMUONPainterMasterFrame::AddPainterMatrix(AliMUONPainterMatrix* painterMatrix)
161{
162 /// array is adopted (by the registry)
163
164 AliDebug(1,Form("matrix=%x %s",painterMatrix,painterMatrix->GetName()));
165
166 Int_t i = AliMUONPainterRegistry::Instance()->Register(painterMatrix);
167
168 SetNavigation(i);
169}
170
171//_____________________________________________________________________________
172void
173AliMUONPainterMasterFrame::PainterMatrixWantToShow(AliMUONPainterMatrix* group)
174{
9016a84e 175 /// FIXME: should check whether we are the active window before
176 /// responding to this message ?
0145e89a 177
178 AliDebug(1,Form("group=%x %s",group,group->GetName()));
179
180 Int_t i = AliMUONPainterRegistry::Instance()->FindIndexOf(group);
181
182 Int_t alreadyThere(-1);
183
184 for ( Int_t j = 0; j < fNavigation.GetSize(); ++j )
185 {
186 if ( fNavigation[j] == i ) alreadyThere = j;
187 }
188
189 if (alreadyThere<0)
190 {
191 SetNavigation(i);
192 }
193 else
194 {
195 fCurrentNavigationPosition = alreadyThere;
196 }
197
198 ShowPainterMatrix(group);
199}
200
201//_____________________________________________________________________________
202void
203AliMUONPainterMasterFrame::SetNavigation(Int_t i)
204{
205 /// Change navigation position
206
207 ++fCurrentNavigationPosition;
208 fNavigation.Set(fCurrentNavigationPosition+1);
209 fNavigation[fCurrentNavigationPosition] = i;
210}
211
212//_____________________________________________________________________________
213void
214AliMUONPainterMasterFrame::ShowPainterMatrix(AliMUONPainterMatrix* painterMatrix)
215{
216 /// Change the painter matrix we show
217
218 fPainterMatrixFrame->Use(painterMatrix);
219
220 painterMatrix->Connect("Clicked(AliMUONVPainter*,Double_t*)",
221 "AliMUONPainterMasterFrame",this,
222 "Clicked(AliMUONVPainter*,Double_t*)");
223
224 painterMatrix->Connect("ShiftClicked(AliMUONVPainter*,Double_t*)",
225 "AliMUONPainterMasterFrame",this,
226 "ShiftClicked(AliMUONVPainter*,Double_t*)");
227
228 fPainterMatrixFrame->Connect("TitleHasChanged(const char*)",
229 "AliMUONPainterMasterFrame",this,
230 "ChangeTitle(const char*)");
231 UpdateNavigation();
232
233 UpdateAttributes(*(fPainterMatrixFrame->Matrix()));
234
235 AliMUONPainterRegistry::Instance()->AddToHistory(painterMatrix);
236
237 Layout();
238}
239
240//_____________________________________________________________________________
241void
242AliMUONPainterMasterFrame::ChangeTitle(const char* newTitle)
243{
244 /// Change the top title
245
246 fGroupTitle->SetText(newTitle);
247 fGroupTitle->Resize();
248 Layout();
249}
250
251//_____________________________________________________________________________
252void
253AliMUONPainterMasterFrame::Backward()
254{
255 /// Move back one step in the history
256 --fCurrentNavigationPosition;
257
258 AliMUONPainterMatrix* group =
259 AliMUONPainterRegistry::Instance()->PainterMatrix(fNavigation[fCurrentNavigationPosition]);
260
261 ShowPainterMatrix(group);
262
263 UpdateNavigation();
264}
265
266//_____________________________________________________________________________
267void
268AliMUONPainterMasterFrame::Forward()
269{
270 /// Move forward one step in history
271
272 ++fCurrentNavigationPosition;
273
274 AliMUONPainterMatrix* group =
275 AliMUONPainterRegistry::Instance()->PainterMatrix(fNavigation[fCurrentNavigationPosition]);
276
277 ShowPainterMatrix(group);
278
279 UpdateNavigation();
280}
281
282//_____________________________________________________________________________
283void
284AliMUONPainterMasterFrame::Clicked(AliMUONVPainter* painter, Double_t* values)
285{
286 /// A given painter was (singly) clicked
287
288 AliDebug(1,Form("%s x %7.3f y %7.3f",painter->GetName(),values[0],values[1]));
289
290 AliCodeTimerAuto("")
291
292 fPainterMatrixFrame->MouseLeave(painter);
293
294 AliMUONPainterMatrix* matrix = new AliMUONPainterMatrix(painter->Name().Data());
295
296 AliMUONVPainter* p = painter->Detach();
297
298 p->SetResponder(1);
299
300 matrix->Adopt(p);
301
302 AddPainterMatrix(matrix);
303 ShowPainterMatrix(matrix);
304}
305
306//_____________________________________________________________________________
307void
308AliMUONPainterMasterFrame::ShiftClicked(AliMUONVPainter* painter, Double_t*)
309{
310 /// A given painter was shift-clicked
311
312 AliMUONPainterMatrix* currentMatrix = fPainterMatrixFrame->Matrix();
313
314 AliMUONAttPainter a = painter->Attributes();
315
316 TString basename(Form("%s-DUAL",painter->GetName()));
317
318 TString newName = AliMUONPainterMatrix::NameIt(basename.Data(),a);
319
320 AliMUONPainterMatrix* matrix =
321 AliMUONPainterRegistry::Instance()->FindPainterMatrix(newName.Data());
322
323 if (!matrix)
324 {
325 // No. So we must make a new matrix painter from the existing one,
326 // and add to this new matrix the painters of the other one, but
327 // using the new attributes...
328
329 // create "opposite" attributes
330 AliMUONAttPainter a1(a);
331 AliMUONAttPainter a2(a);
332
333 if ( a.IsCathodeDefined() )
334 {
335 a2.SetCathode(!a.IsCathode0(),!a.IsCathode1());
336 }
337
338 if ( a.IsPlaneDefined() )
339 {
340 a2.SetPlane(!a.IsBendingPlane(),!a.IsNonBendingPlane());
341 }
342
343 a1.SetCathodeAndPlaneDisabled(kTRUE);
344 a2.SetCathodeAndPlaneDisabled(kTRUE);
345
346 AliMUONVPainter* p1 = AliMUONVPainter::CreatePainter(painter->ClassName(),
347 a1,
348 painter->ID0(),
349 painter->ID1());
350
351 AliMUONVPainter* p2 = AliMUONVPainter::CreatePainter(painter->ClassName(),
352 a2,
353 painter->ID0(),
354 painter->ID1());
355
356 if (!p1 || !p2)
357 {
358 Int_t ret;
359 new TGMsgBox(gClient->GetRoot(), this,
360 "Invalid combination", "Cannot create 2 views from this painter",
361 kMBIconExclamation, kMBOk, &ret);
362 PainterMatrixWantToShow(currentMatrix);
363 delete p1;
364 delete p2;
365 return;
366 }
367
368 AliInfo(Form("Starting from %s will generate %s and %s",
369 a.GetName(),
370 a1.GetName(),
371 a2.GetName()));
372
373 p1->UpdateGroupsFrom(*(painter->Master()));
374 p2->UpdateGroupsFrom(*(painter->Master()));
375
376 p1->SetResponder(1);
377 p2->SetResponder(1);
378
379 Int_t nx(2);
380 Int_t ny(1);
381
382 AliMpArea area(painter->Area());
383
384 if ( area.Dimensions().X() > 1.2*area.Dimensions().Y() )
385 {
386 nx = 1;
387 ny = 2;
388 }
389
390 matrix = new AliMUONPainterMatrix(basename.Data(),nx,ny);
391
392 matrix->Adopt(p1);
393 matrix->Adopt(p2);
394
395 AddPainterMatrix(matrix);
396 }
397
398 matrix->SetData(currentMatrix->DataPattern(),
399 currentMatrix->Data(),
400 currentMatrix->DataIndex());
401
402 fPainterMatrixFrame->MouseLeave(painter);
403
404 PainterMatrixWantToShow(matrix);
405}
406
407//_____________________________________________________________________________
408void
409AliMUONPainterMasterFrame::Update()
410{
411 /// Update ourselves
412
413 fPainterMatrixFrame->Update();
414}
415
416//_____________________________________________________________________________
417void
418AliMUONPainterMasterFrame::UpdateAttributes(const AliMUONPainterMatrix& painterMatrix)
419{
420 /// Update the view buttons from the matrix we actually plot
421
422 fAttPainterSelectorFrame->Update(painterMatrix.Attributes());
423}
424
425//_____________________________________________________________________________
426void
427AliMUONPainterMasterFrame::MakeTopPainterMatrix(UInt_t w, UInt_t h)
428{
429 /// Create the first painter matrix that appears when we are create
430 /// FIXME: how to make this more flexible ?
431
432 fPainterMatrixFrame = new AliMUONPainterMatrixFrame(this,w,h);
433
434 AliMUONAttPainter att;
435
436 att.SetCathode(kTRUE,kFALSE);
437 att.SetViewPoint(kTRUE,kFALSE);
438
439 TString name = AliMUONPainterMatrix::NameIt("Tracker",att);
440
441 AliMUONPainterMatrix* painterMatrix = AliMUONPainterRegistry::Instance()->FindPainterMatrix(name);
442
443 if (!painterMatrix)
444 {
445 AliError(Form("Could not get pre-defined painter matrix %s : check that !",name.Data()));
446 }
447 else
448 {
449 PainterMatrixWantToShow(painterMatrix);
450// fPainterMatrixFrame->Use(painterMatrix);
451// ShowPainterMatrix(painterMatrix);
452 }
453}
454
455//_____________________________________________________________________________
456void
457AliMUONPainterMasterFrame::UpdateNavigation()
458{
459 /// Update navigation frame
460
461 fBackButton->SetEnabled(kTRUE);
462 fForwardButton->SetEnabled(kTRUE);
463
464 if ( fCurrentNavigationPosition == 0 )
465 {
466 fBackButton->SetEnabled(kFALSE);
467 }
468 if ( fCurrentNavigationPosition == fNavigation.GetSize()-1 )
469 {
470 fForwardButton->SetEnabled(kFALSE);
471 }
472}
473
474//_____________________________________________________________________________
475void
476AliMUONPainterMasterFrame::AttributesChanged(AliMUONAttPainter* newValues)
477{
478 /// Attributes changed (e.g. from cath0 to cath1 or bending to nonbending, etc...)
479
480 AliMUONPainterMatrix* currentMatrix = fPainterMatrixFrame->Matrix();
481
482 AliMUONAttPainter a = currentMatrix->Validate(*newValues);
483
484 if (!a.IsValid())
485 {
486 Int_t ret;
487 new TGMsgBox(gClient->GetRoot(), this,
488 "Invalid combination", "Change of attributes not possible for this object",
489 kMBIconExclamation, kMBOk, &ret);
490 PainterMatrixWantToShow(currentMatrix);
491 return;
492 }
493
494 // First check if we already have this matrix available
495
496 TString newName = AliMUONPainterMatrix::NameIt(currentMatrix->Basename(),a);
497
498 AliMUONPainterMatrix* matrix =
499 AliMUONPainterRegistry::Instance()->FindPainterMatrix(newName.Data());
500
501 if (!matrix)
502 {
503 // No. So we must make a new matrix painter from the existing one,
504 // and add to this new matrix the painters of the other one, but
505 // using the new attributes...
506
507 matrix = currentMatrix->Clone(a);
508
509 AddPainterMatrix(matrix);
510 }
511
512 matrix->SetData(currentMatrix->DataPattern(),
513 currentMatrix->Data(),
514 currentMatrix->DataIndex());
515
516 PainterMatrixWantToShow(matrix);
517}