]> git.uio.no Git - u/mrichter/AliRoot.git/blame - MUON/AliMUONTriggerGUIdimap.cxx
Changes to use VTriggerStore (Laurent)
[u/mrichter/AliRoot.git] / MUON / AliMUONTriggerGUIdimap.cxx
CommitLineData
905654c2 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//////////////////////////////////////////////////////////////////////////
17// //
18// Graphical User Interface utility class for the MUON trigger //
19// - digits maps of the trigger chambers //
20// //
21//////////////////////////////////////////////////////////////////////////
22
23#include <TCanvas.h>
24#include <TGFrame.h>
25#include <TGButton.h>
26#include <TGTab.h>
27#include <TRootEmbeddedCanvas.h>
28#include <TBox.h>
29#include <TClonesArray.h>
30#include <TPave.h>
31#include <TPaveText.h>
32#include <TStyle.h>
33#include <TObjArray.h>
34
35#include "AliRun.h"
36
37#include "AliMUON.h"
38#include "AliMUONDigit.h"
39#include "AliMpSegmentation.h"
40#include "AliMpVSegmentation.h"
41#include "AliMUONGeometryTransformer.h"
42#include "AliMUONData.h"
43
44#include "AliMUONTriggerGUIboard.h"
45#include "AliMUONTriggerGUIdimap.h"
46
47/// \cond CLASSIMP
48ClassImp(AliMUONTriggerGUIdimap)
49/// \endcond
50
51//__________________________________________________________________________
52AliMUONTriggerGUIdimap::AliMUONTriggerGUIdimap(AliLoader *loader, TObjArray *boards, const TGWindow *p, const TGWindow *main, UInt_t w, UInt_t h)
53 : TObject(),
54 fQObject(),
55 fMain(0),
56 fLoader(0),
57 fMUONData(0),
58 fBoards(0),
59 fIsOn(0)
60{
61 /// frame constructor
62
63 fLoader = loader;
64 fIsOn = kTRUE;
65 fBoards = boards;
66
67 fMUONData = new AliMUONData(loader,"MUON","MUON");
68 fMUONData->SetTreeAddress("D");
69
70 gStyle->SetPadLeftMargin(0.05);
71 gStyle->SetPadRightMargin(0.05);
72 gStyle->SetPadTopMargin(0.05);
73 gStyle->SetPadBottomMargin(0.05);
74
75 gStyle->SetOptDate(0);
76 gStyle->SetOptTitle(0);
77 gStyle->SetOptStat(0);
78
79 fMain = new TGTransientFrame(p, main, w, h, kVerticalFrame);
80 fMain->Connect("CloseWindow()", "AliMUONTriggerGUIdimap", this, "DoClose()");
81 fMain->DontCallClose(); // to avoid double deletions.
82
83 // use hierarchical cleaning
84 fMain->SetCleanup(kDeepCleanup);
85
86 TGHorizontalFrame *hframe = new TGHorizontalFrame(fMain, 60, 20, kFixedWidth);
87
88 TGTextButton *closeButton = new TGTextButton(hframe, "Close", 1);
89 closeButton->Connect("Clicked()", "AliMUONTriggerGUIdimap", this, "DoClose()");
90
91 hframe->AddFrame(closeButton,
92 new TGLayoutHints(kLHintsTop |
93 kLHintsLeft,
94 2, 2, 2, 2)
95 );
96
97 hframe->Resize(150, closeButton->GetDefaultHeight());
98
99 TGTextButton *updateButton = new TGTextButton(hframe, "Update", 2);
100 updateButton->Connect("Clicked()", "AliMUONTriggerGUIdimap", this, "DoUpdate()");
101 updateButton->SetToolTipText("Read the digits for the current event");
102
103 hframe->AddFrame(updateButton,
104 new TGLayoutHints(kLHintsTop |
105 kLHintsLeft,
106 2, 2, 2, 2)
107 );
108
109 hframe->Resize(150, updateButton->GetDefaultHeight());
110 /*
111 TGTextButton *resetButton = new TGTextButton(hframe, "Reset", 3);
112 resetButton->Connect("Clicked()", "AliMUONTriggerGUIdimap", this, "DoReset()");
113 resetButton->SetToolTipText("Redraw unselected boards");
114
115 hframe->AddFrame(resetButton,
116 new TGLayoutHints(kLHintsTop |
117 kLHintsLeft,
118 2, 2, 2, 2)
119 );
120
121 hframe->Resize(150, resetButton->GetDefaultHeight());
122 */
123 fMain->AddFrame(hframe,
124 new TGLayoutHints(kLHintsBottom |
125 kLHintsLeft,
126 2, 2, 2, 2)
127 );
128
129 TGTab *tab = new TGTab(fMain, 300, 300);
130 //tab->Connect("Selected(Int_t)", "AliMUONTriggerGUIdimap", this, "DoTab(Int_t)");
131
132 // Tabs for MT11, MT12, MT21, MT22
133 TGLayoutHints *lot = new TGLayoutHints(kLHintsTop |
134 kLHintsLeft |
135 kLHintsExpandX |
136 kLHintsExpandY,
137 5, 5, 5, 5);
138
139 TGCompositeFrame *tf = 0;
140
141 // Tab for MT11
142 tf = tab->AddTab("MT11");
143
144 TGCompositeFrame *cf1 = new TGCompositeFrame(tf, 60, 60, kHorizontalFrame);
145 fEc[0] = new TRootEmbeddedCanvas("ec1", cf1, 500, 500);
146 cf1->AddFrame(fEc[0], lot);
147
148 tf->AddFrame(cf1, lot);
149 fEc[0]->GetCanvas()->SetBorderMode(0);
150 fEc[0]->GetCanvas()->SetBit(kNoContextMenu);
151
152 // Tab for MT12
153 tf = tab->AddTab("MT12");
154
155 TGCompositeFrame *cf2 = new TGCompositeFrame(tf, 60, 60, kHorizontalFrame);
156 fEc[1] = new TRootEmbeddedCanvas("ec2", cf2, 500, 500);
157 cf2->AddFrame(fEc[1], lot);
158
159 tf->AddFrame(cf2, lot);
160 fEc[1]->GetCanvas()->SetBorderMode(0);
161 fEc[1]->GetCanvas()->SetBit(kNoContextMenu);
162
163 // Tab for MT21
164 tf = tab->AddTab("MT21");
165
166 TGCompositeFrame *cf3 = new TGCompositeFrame(tf, 60, 60, kHorizontalFrame);
167 fEc[2] = new TRootEmbeddedCanvas("ec3", cf3, 500, 500);
168 cf3->AddFrame(fEc[2], lot);
169
170 tf->AddFrame(cf3, lot);
171 fEc[2]->GetCanvas()->SetBorderMode(0);
172 fEc[2]->GetCanvas()->SetBit(kNoContextMenu);
173
174 // Tab for MT22
175 tf = tab->AddTab("MT22");
176
177 TGCompositeFrame *cf4 = new TGCompositeFrame(tf, 60, 60, kHorizontalFrame);
178 fEc[3] = new TRootEmbeddedCanvas("ec4", cf4, 500, 500);
179 cf4->AddFrame(fEc[3], lot);
180
181 tf->AddFrame(cf4, lot);
182 fEc[3]->GetCanvas()->SetBorderMode(0);
183 fEc[3]->GetCanvas()->SetBit(kNoContextMenu);
184
185 fMain->AddFrame(tab,
186 new TGLayoutHints(kLHintsBottom |
187 kLHintsExpandX |
188 kLHintsExpandY,
189 2, 2, 2, 2)
190 );
191
192 fMain->MapSubwindows();
193 fMain->Resize();
194
195 fMain->CenterOnParent();
196
197 fMain->SetWindowName("Chambers digit maps");
198
199 fMain->MapWindow();
200
201 DrawMaps(11);
202 DrawMaps(12);
203 DrawMaps(13);
204 DrawMaps(14);
205
206}
207
208//__________________________________________________________________________
209AliMUONTriggerGUIdimap::~AliMUONTriggerGUIdimap()
210{
211 /// destructor
212
213 for (Int_t it = 0; it < kNMT; it++) {
214 for (Int_t ib = 0; ib < kNBoards; ib++) {
215 delete fPaveBoard[it][ib];
216 }
217 }
218
219 delete fMUONData;
220 fMain->DeleteWindow();
221
222}
223
224//__________________________________________________________________________
225AliMUONTriggerGUIdimap::AliMUONTriggerGUIdimap(const AliMUONTriggerGUIdimap& dimap)
226 : TObject(),
227 fQObject(),
228 fMain(0),
229 fLoader(0),
230 fMUONData(0),
231 fBoards(0),
232 fIsOn(0)
233{
234 /// copy constructor
235
236 dimap.Dump();
237 Fatal("AliMUONTriggerGUIdimap","copy constructor not implemented");
238
239}
240
241//__________________________________________________________________________
242AliMUONTriggerGUIdimap & AliMUONTriggerGUIdimap::operator=(const AliMUONTriggerGUIdimap& dimap)
243{
244 /// asignment operator
245
246 dimap.Dump();
247 Fatal("AliMUONTriggerGUIdimap","assignment operator not implemented");
248
249 return *this;
250
251}
252
253//__________________________________________________________________________
254void AliMUONTriggerGUIdimap::DrawMaps(Int_t chamber)
255{
256 /// draw the digits map for chamber-
257
258 TString mapspath = gSystem->Getenv("ALICE_ROOT");
259 mapspath.Append("/MUON/data");
260
261 TCanvas *canvas = fEc[chamber-11]->GetCanvas();
262 canvas->cd();
263 canvas->Clear();
264
265 AliMUONDigit *mdig;
266 AliMpPad mpad;
267
268 AliRunLoader *runLoader = fLoader->GetRunLoader();
269 gAlice = runLoader->GetAliRun();
270 AliMUON *pMUON = (AliMUON*)gAlice->GetModule("MUON");
271 const AliMUONGeometryTransformer* kGeomTransformer = pMUON->GetGeometryTransformer();
272
273 TClonesArray *muonDigits = fMUONData->Digits(chamber-1);
274 if (muonDigits == 0) { printf("No muonDigits \n"); return; }
275 gAlice->ResetDigits();
276 fMUONData->GetDigits();
277 Int_t nDigits = muonDigits->GetEntriesFast();
278
279 TPaveText *label;
280 TBox *boxd;
281
282 Char_t fntxt[6], name[8], cln[2];
283 Int_t detElemId, cathode, ix, iy, charge, color;
284 Int_t side, col, line, nbx;
285 Int_t holdS, holdL, holdC;
286 Float_t xCenter, yCenter, zCenter, xWidth, yWidth, holdXC, holdYC;
287 Float_t xMin, xMax, yMin, yMax;
288 Float_t ptx1, ptx2, pty1, pty2;
289 Float_t xpmin, xpmax, ypmin, ypmax;
290 Float_t xg1, xg2, yg1, yg2, zg1;
291
292 Float_t frameXmax = 0., frameYmax = 0.;
293
294 switch(chamber) {
295 case 11:
296 frameXmax = 257.0;
297 frameYmax = 306.6;
298 break;
299 case 12:
300 frameXmax = 259.7;
301 frameYmax = 309.9;
302 break;
303 case 13:
304 frameXmax = 273.0;
305 frameYmax = 325.7;
306 break;
307 case 14:
308 frameXmax = 275.7;
309 frameYmax = 329.0;
310 break;
311 }
312
313 canvas->Range(
314 -(1.15*frameXmax),
315 -(1.15*frameYmax),
316 +(1.15*frameXmax),
317 +(1.15*frameYmax)
318 );
319
320 // draw the boards
321
322 sprintf(fntxt,"%s/guimapp%2d.txt",mapspath.Data(),chamber);
323 FILE *ftxt = fopen(fntxt,"r");
324
325 for (Int_t ib = 0; ib < kNBoards; ib++) {
326
327 fscanf(ftxt,"%d %d %d %d %f %f %f %f %f %s \n",
328 &side,&col,&line,&nbx,
329 &xCenter,&yCenter,&xWidth,&yWidth,&zCenter,
330 &name[0]);
331
332 //printf("%d %d %d %d %f %f %f %f %f %s \n",side,col,line,nbx,xCenter,yCenter,xWidth,yWidth,zCenter,name);
333
334 holdS = side;
335 holdC = col;
336 holdL = line;
337
338 holdXC = xCenter;
339 holdYC = yCenter;
340
341 xMin = xCenter - xWidth/2;
342 xMax = xCenter + xWidth/2;
343 yMin = yCenter - yWidth/2;
344 yMax = yCenter + yWidth/2;
345
346 fPaveBoard[chamber-11][ib] = new TPave(xMin,yMin,xMax,yMax,1);
347 fPaveBoard[chamber-11][ib]->SetBit(kCannotPick);
348 fPaveBoard[chamber-11][ib]->SetFillStyle(0);
349 fPaveBoard[chamber-11][ib]->Draw();
350
351 Float_t lWidth = 12.0;
352
353 if (holdL == 9) {
354
355 sprintf(cln,"C%1d",holdC);
356
357 ptx1 = holdXC - lWidth;
358 ptx2 = holdXC + lWidth;
359 pty1 = +1.065*frameYmax - lWidth;
360 pty2 = +1.065*frameYmax + lWidth;
361
362 label = new TPaveText(ptx1,pty1,ptx2,pty2,cln);
363 label->AddText(cln);
364 label->SetBorderSize(0);
365 label->SetBit(kCannotPick);
366 label->Draw();
367 }
368 if (holdL == 1) {
369
370 sprintf(cln,"C%1d",holdC);
371
372 ptx1 = holdXC - lWidth;
373 ptx2 = holdXC + lWidth;
374 pty1 = -1.065*frameYmax - lWidth;
375 pty2 = -1.065*frameYmax + lWidth;
376
377 label = new TPaveText(ptx1,pty1,ptx2,pty2,cln);
378 label->AddText(cln);
379 label->SetBorderSize(0);
380 label->SetBit(kCannotPick);
381 label->Draw();
382 }
383 if (holdS == 0 && holdC == 7) {
384
385 sprintf(cln,"L%1d",holdL);
386
387 ptx1 = -1.07*frameXmax - lWidth;
388 ptx2 = -1.07*frameXmax + lWidth;
389 pty1 = holdYC - lWidth;
390 pty2 = holdYC + lWidth;
391
392 label = new TPaveText(ptx1,pty1,ptx2,pty2,cln);
393 label->AddText(cln);
394 label->SetBorderSize(0);
395 label->SetBit(kCannotPick);
396 label->Draw();
397 }
398 if (holdS == 1 && holdC == 7) {
399
400 sprintf(cln,"L%1d",holdL);
401
402 ptx1 = +1.07*frameXmax - lWidth;
403 ptx2 = +1.07*frameXmax + lWidth;
404 pty1 = holdYC - lWidth;
405 pty2 = holdYC + lWidth;
406
407 label = new TPaveText(ptx1,pty1,ptx2,pty2,cln);
408 label->AddText(cln);
409 label->SetBorderSize(0);
410 label->SetBit(kCannotPick);
411 label->Draw();
412 }
413
414 }
415
416 fclose(ftxt);
417
418 // draw digits set from the board GUI
419
420 AliMUONTriggerGUIboard *board;
421 Int_t imt = chamber -11;
422 Int_t nStripX, nStripY;
423 TBox *box;
424 for (Int_t ib = 0; ib < kNBoards; ib++) {
425
426 board = (AliMUONTriggerGUIboard*)fBoards->At(ib);
427
428 xCenter = board->GetXCenter(imt);
429 yCenter = board->GetYCenter(imt);
430
431 nStripX = board->GetXSiy2() - board->GetXSiy1() + 1;
432 nStripY = board->GetYSix2() - board->GetYSix1() + 1 ;
433
434 for (Int_t is = 0; is < nStripX; is++) {
435
436 if (board->GetXDig(imt,is) == 0) continue;
437
438 box = board->GetXDigBox(imt,is);
439
440 xpmin = box->GetX1();
441 xpmax = box->GetX2();
442 ypmin = box->GetY1();
443 ypmax = box->GetY2();
444
445 xpmin += xCenter;
446 xpmax += xCenter;
447 ypmin += yCenter;
448 ypmax += yCenter;
449
450 box->DrawBox(xpmin,ypmin,xpmax,ypmax);
451
452 }
453
454 for (Int_t is = 0; is < nStripY; is++) {
455
456 if (board->GetYDig(imt,is) == 0) continue;
457
458 box = board->GetYDigBox(imt,is);
459
460 xpmin = box->GetX1();
461 xpmax = box->GetX2();
462 ypmin = box->GetY1();
463 ypmax = box->GetY2();
464
465 xpmin += xCenter;
466 xpmax += xCenter;
467 ypmin += yCenter;
468 ypmax += yCenter;
469
470 box->DrawBox(xpmin,ypmin,xpmax,ypmax);
471
472 }
473
474 }
475
476 // draw the digits
477
478 for (Int_t id = 0; id < nDigits; id++) {
479
480 mdig = (AliMUONDigit*)muonDigits->UncheckedAt(id);
481
482 cathode = mdig->Cathode()+1;
483
484 ix=mdig->PadX();
485 iy=mdig->PadY();
486 detElemId=mdig->DetElemId();
487 charge = (Int_t)mdig->Signal();
488 color = 261+5*(charge-1);
489 if (color > 282) color = 282;
490
491 const AliMpVSegmentation* seg2 = AliMpSegmentation::Instance()->GetMpSegmentation(detElemId,AliMp::GetCathodType(cathode-1));
492
493 mpad = seg2->PadByIndices(AliMpIntPair(ix,iy),kTRUE);
494
495 // get the pad position and dimensions
496 Float_t xlocal1 = mpad.Position().X();
497 Float_t ylocal1 = mpad.Position().Y();
498 Float_t xlocal2 = mpad.Dimensions().X();
499 Float_t ylocal2 = mpad.Dimensions().Y();
500
501 kGeomTransformer->Local2Global(detElemId, xlocal1, ylocal1, 0, xg1, yg1, zg1);
502 // (no transformation for pad dimensions)
503 xg2 = xlocal2;
504 yg2 = ylocal2;
505
506 // transform in the monitor coordinate system
507 //xpmin = -(xg1+xg2);
508 //xpmax = -(xg1-xg2);
509 //ypmin = -(yg2-yg1);
510 //ypmax = +(yg2+yg1);
511 // ALICE SC
512 xpmin = +(xg1-xg2);
513 xpmax = +(xg1+xg2);
514 ypmin = -(yg2-yg1);
515 ypmax = +(yg2+yg1);
516
517 boxd = new TBox(xpmin,ypmin,xpmax,ypmax);
518 boxd->SetBit(kCannotPick);
519 boxd->SetFillStyle(1001);
520 boxd->SetFillColor(2);
521 boxd->Draw();
522
523 } // end digits loop
524
525 canvas->Modified();
526 canvas->Update();
527
528}
529
530//__________________________________________________________________________
531void AliMUONTriggerGUIdimap::DoTab(Int_t id) const
532{
533 /// some action when chamber tab is selected...
534
535 switch (id) {
536 case 0:
537 break;
538 case 1:
539 break;
540 case 2:
541 break;
542 case 3:
543 break;
544 default:
545 break;
546 }
547
548}
549
550//__________________________________________________________________________
551void AliMUONTriggerGUIdimap::DoClose()
552{
553 /// close the main frame
554
555 fIsOn = kFALSE;
556 CloseWindow();
557
558}
559
560//__________________________________________________________________________
561void AliMUONTriggerGUIdimap::DoUpdate()
562{
563 /// update maps for another run/event
564
565 //fMUONData->SetLoader(fLoader);
566 fMUONData = new AliMUONData(fLoader,"MUON","MUON");
567 fMUONData->SetTreeAddress("D");
568
569 for (Int_t it = 0; it < kNMT; it++) {
570 for (Int_t ib = 0; ib < kNBoards; ib++) {
571 delete fPaveBoard[it][ib];
572 }
573 }
574
575 DrawMaps(11);
576 DrawMaps(12);
577 DrawMaps(13);
578 DrawMaps(14);
579
580 AliMUONTriggerGUIboard *board;
581 for (Int_t ib = 0; ib < kNBoards; ib++) {
582 board = (AliMUONTriggerGUIboard*)fBoards->At(ib);
583 if (board->IsOpen()) SelectBoard(ib);
584 }
585
586}
587
588//__________________________________________________________________________
589void AliMUONTriggerGUIdimap::DoReset()
590{
591 /// draw unselected boards
592
593 for (Int_t it = 0; it < kNMT; it++) {
594
595 TCanvas *canvas = fEc[it]->GetCanvas();
596 canvas->cd();
597
598 for (Int_t ib = 0; ib < kNBoards; ib++) {
599 fPaveBoard[it][ib]->SetFillStyle(0);
600 }
601
602 canvas->Modified();
603 canvas->Update();
604
605 }
606
607}
608
609//__________________________________________________________________________
610void AliMUONTriggerGUIdimap::SelectBoard(Int_t id)
611{
612 /// highlight on the map the open board
613
614 for (Int_t it = 0; it < kNMT; it++) {
615
616 TCanvas *canvas = fEc[it]->GetCanvas();
617 canvas->cd();
618
619 fPaveBoard[it][id]->SetFillStyle(4020);
620 fPaveBoard[it][id]->SetFillColor(7);
621
622 canvas->Modified();
623 canvas->Update();
624
625 }
626
627}
628
629//__________________________________________________________________________
630void AliMUONTriggerGUIdimap::CloseWindow()
631{
632 /// called when window is closed via the window manager.
633
634 fMain->CloseWindow();
635
636}
637
638