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