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 //-----------------------------------------------------------------------------
19 /// \class AliMUONTriggerGUIbdmap
21 /// The gui map of a single board object, strips/digits
23 /// \author Bogdan Vulpescu, LPC Clermont-Ferrand
24 //-----------------------------------------------------------------------------
26 #include <TPolyLine.h>
29 #include <TRootEmbeddedCanvas.h>
31 #include <TPaveText.h>
32 #include <TGTextEdit.h>
35 #include <TObjArray.h>
38 #include "AliRunLoader.h"
39 #include "AliMUONVDigit.h"
40 #include "AliMUONGeometryTransformer.h"
41 #include "AliMUONLocalTrigger.h"
42 #include "AliMUONLocalTriggerBoard.h"
43 #include "AliMUONTriggerCrateStore.h"
44 #include "AliMUONMCDataInterface.h"
45 #include "AliMUONTriggerStoreV1.h"
46 #include "AliMUONDigitStoreV1.h"
47 #include "AliMUONTriggerGUIboard.h"
48 #include "AliMUONTriggerGUIbdmap.h"
50 #include "AliMpDEManager.h"
51 #include "AliMpDEIterator.h"
52 #include "AliMpEncodePair.h"
53 #include "AliMpVSegmentation.h"
54 #include "AliMpSegmentation.h"
60 ClassImp(AliMUONTriggerGUIbdmap)
63 //__________________________________________________________________________
64 AliMUONTriggerGUIbdmap::AliMUONTriggerGUIbdmap(const TGWindow *p, const TGWindow *mainWindow, UInt_t w, UInt_t h)
85 fCalibrationData(0x0),
90 gStyle->SetPadLeftMargin(0.05);
91 gStyle->SetPadRightMargin(0.05);
92 gStyle->SetPadTopMargin(0.05);
93 gStyle->SetPadBottomMargin(0.05);
95 fMain = new TGTransientFrame(p, mainWindow, w, h, kVerticalFrame);
96 fMain->Connect("CloseWindow()", "AliMUONTriggerGUIbdmap", this, "CloseWindow()");
97 fMain->DontCallClose(); // to avoid double deletions.
99 // use hierarchical cleaning
100 fMain->SetCleanup(kDeepCleanup);
102 fMain->ChangeOptions((fMain->GetOptions() & ~kVerticalFrame) | kHorizontalFrame);
104 // strips/digits canvases
108 TRootEmbeddedCanvas *recanvas[4];
110 for (Int_t i = 0; i < kNMT; i++) {
112 snprintf(ecname,2,"%1d",i+1);
113 recanvas[i] = new TRootEmbeddedCanvas(ecname,fMain,fCanvasSize,fCanvasSize);
115 fCanvas[i] = recanvas[i]->GetCanvas();
117 fCanvas[i]->SetBorderMode(0);
118 fCanvas[i]->SetBit(kNoContextMenu);
120 fCanvas[i]->Connect("ProcessedEvent(Int_t,Int_t,Int_t,TObject*)",
121 "AliMUONTriggerGUIbdmap",this,
122 "EditStrips(Int_t,Int_t,Int_t,TObject*)");
124 fMain->AddFrame(recanvas[i],
126 new TGTableLayoutHints(2,5,2,6,
127 kLHintsExpandX|kLHintsExpandY |
128 kLHintsShrinkX|kLHintsShrinkY |
129 kLHintsFillX|kLHintsFillY)
131 new TGLayoutHints(kLHintsTop |
138 //TGDimension size = fMain->GetDefaultSize();
139 //fMain->Resize(size);
143 TGCompositeFrame *cf0 = new TGCompositeFrame(fMain, 60, 20, kVerticalFrame);
145 TGCompositeFrame *cf1 = new TGCompositeFrame(cf0, 60, 20, kVerticalFrame | kFixedWidth);
147 cf1->AddFrame(fXStrips = new TGCheckButton(cf1, "Draw X strips and digits", 1),
148 new TGLayoutHints(kLHintsTop |
153 cf1->Resize(fXStrips->GetDefaultWidth()+10, fMain->GetDefaultHeight());
155 cf1->AddFrame(fYStrips = new TGCheckButton(cf1, "Draw Y strips and digits", 2),
156 new TGLayoutHints(kLHintsTop |
161 cf1->Resize(fYStrips->GetDefaultWidth()+10, fMain->GetDefaultHeight());
163 cf1->AddFrame(fEditStrips = new TGCheckButton(cf1, "Set/unset strips", 3),
164 new TGLayoutHints(kLHintsTop |
169 fXStrips->Connect("Clicked()", "AliMUONTriggerGUIbdmap", this, "HandleButtons()");
170 fYStrips->Connect("Clicked()", "AliMUONTriggerGUIbdmap", this, "HandleButtons()");
171 fEditStrips->Connect("Clicked()", "AliMUONTriggerGUIbdmap", this, "HandleEditButton()");
174 new TGLayoutHints(kLHintsTop |
179 TGCompositeFrame *cf2 = new TGCompositeFrame(cf0, 60, 20, kHorizontalFrame | kFixedWidth);
181 TGTextButton *digitsButton = new TGTextButton(cf2, "Digits", 4);
182 digitsButton->Connect("Clicked()", "AliMUONTriggerGUIbdmap", this, "DoDigits()");
184 //cf2->Resize(digitsButton->GetDefaultWidth()+40, fMain->GetDefaultHeight());
186 cf2->AddFrame(digitsButton,
187 new TGLayoutHints(kLHintsTop |
193 TGTextButton *dresetButton = new TGTextButton(cf2, "Reset", 5);
194 dresetButton->Connect("Clicked()", "AliMUONTriggerGUIbdmap", this, "ResetDigits()");
196 //cf2->Resize(dresetButton->GetDefaultWidth()+40, fMain->GetDefaultHeight());
198 cf2->AddFrame(dresetButton,
199 new TGLayoutHints(kLHintsTop |
205 TGTextButton *closeButton = new TGTextButton(cf2, "Close", 6);
206 closeButton->Connect("Clicked()", "AliMUONTriggerGUIbdmap", this, "DoClose()");
208 //cf2->Resize(closeButton->GetDefaultWidth()+40, fMain->GetDefaultHeight());
210 cf2->AddFrame(closeButton,
211 new TGLayoutHints(kLHintsTop |
218 new TGLayoutHints(kLHintsTop |
223 // editor window for the local trigger
225 TGCompositeFrame *cf3 = new TGCompositeFrame(cf0, 60, 20, kVerticalFrame | kFixedWidth);
227 fLocTrigE = new TGTextEdit(cf3, 100, 100, kSunkenFrame | kDoubleBorder);
228 cf3->AddFrame(fLocTrigE,
229 new TGLayoutHints(kLHintsExpandX |
235 new TGLayoutHints(kLHintsTop |
241 new TGLayoutHints(kLHintsTop |
246 fIsEditable = kFALSE;
250 fMain->MapSubwindows();
253 fMain->CenterOnParent();
255 //fMain->MapWindow();
256 //gClient->WaitFor(fMain);
260 //__________________________________________________________________________
261 AliMUONTriggerGUIbdmap::~AliMUONTriggerGUIbdmap()
265 fMain->DeleteWindow();
269 //__________________________________________________________________________
270 void AliMUONTriggerGUIbdmap::Show()
272 /// map the main frame
279 //__________________________________________________________________________
280 void AliMUONTriggerGUIbdmap::LocalTriggerInfo()
282 /// print the local trigger
287 snprintf(buffer,20,"Local trigger info\n");
288 fLocTrigE->LoadBuffer(buffer);
290 AliMUONVTriggerStore *triggerStore;
292 if (fLoader != 0x0) {
293 AliRunLoader *runLoader = fLoader->GetRunLoader();
294 triggerStore = fMCDataInterface->TriggerStore(runLoader->GetEventNumber());
295 } else if (fRawTriggerStore != 0x0) {
296 triggerStore = static_cast<AliMUONVTriggerStore*>(fRawTriggerStore);
298 snprintf(buffer,20,"No data loaded yet...\n");
299 txt.LoadBuffer(buffer);
300 fLocTrigE->AddText(&txt);
304 Int_t circuitNumber = fBoard->GetIdCircuit();
306 UShort_t x2m, x2u, x2d;
308 Int_t loStripX, loStripY, loDev, loCircuit, iStripX, iStripY, loLpt, loHpt;
309 AliMUONLocalTrigger *mlt;
311 TIter next(triggerStore->CreateLocalIterator());
313 while ( ( mlt = static_cast<AliMUONLocalTrigger*>(next()) ) )
315 loCircuit = mlt->LoCircuit();
317 if (loCircuit == circuitNumber) {
319 AliMUONLocalTriggerBoard* ltb = fCrateManager->LocalBoard(loCircuit);
320 x2d = ltb->GetSwitch(0);
321 x2m = ltb->GetSwitch(1);
322 x2u = ltb->GetSwitch(2);
324 loStripX = mlt->LoStripX();
325 loStripY = mlt->LoStripY();
326 loDev = mlt->LoDev();
327 loLpt = mlt->LoLpt();
328 loHpt = mlt->LoHpt();
330 iStripX = loStripX/2;
331 if ((x2u == 1 || x2m == 1 || x2d == 1) && x2m == 1) {
332 iStripY = loStripY/2;
337 snprintf(buffer,20,"Circuit = %03d",loCircuit);
338 txt.LoadBuffer(buffer);
339 fLocTrigE->AddText(&txt);
341 snprintf(buffer,20,"LoStripX = %2d",loStripX);
342 txt.LoadBuffer(buffer);
343 fLocTrigE->AddText(&txt);
345 snprintf(buffer,20,"LoStripY = %2d",loStripY);
346 txt.LoadBuffer(buffer);
347 fLocTrigE->AddText(&txt);
349 snprintf(buffer,20,"LoDev = %2d",loDev);
350 txt.LoadBuffer(buffer);
351 fLocTrigE->AddText(&txt);
353 snprintf(buffer,20,"--------------------");
354 txt.LoadBuffer(buffer);
355 fLocTrigE->AddText(&txt);
357 snprintf(buffer,20,"X-strip = %2d ( %2d )",iStripX,(loStripX+loDev+1)/2);
358 txt.LoadBuffer(buffer);
359 fLocTrigE->AddText(&txt);
361 snprintf(buffer,20,"Y-strip = %2d",iStripY);
362 txt.LoadBuffer(buffer);
363 fLocTrigE->AddText(&txt);
365 snprintf(buffer,20,"--------------------");
366 txt.LoadBuffer(buffer);
367 fLocTrigE->AddText(&txt);
369 snprintf(buffer,20,"LoLpt = %2d",loLpt);
370 txt.LoadBuffer(buffer);
371 fLocTrigE->AddText(&txt);
373 snprintf(buffer,20,"LoHpt = %2d",loHpt);
374 txt.LoadBuffer(buffer);
375 fLocTrigE->AddText(&txt);
385 //__________________________________________________________________________
386 void AliMUONTriggerGUIbdmap::Init()
388 /// initialize the boards in the four MT
390 for (Int_t i = 0; i < kNMT; i++) {
392 fXWidth[i] = fBoard->GetXWidth(i);
393 fYWidth[i] = fBoard->GetYWidth(i);
394 fXCenter[i] = fBoard->GetXCenter(i);
395 fYCenter[i] = fBoard->GetYCenter(i);
400 for (Int_t i = 0; i < kNMT; i++) {
401 xw = 1.20*fXWidth[i];
402 yw = 1.20*fYWidth[i];
403 fCanvas[i]->Range(-xw/2,-yw/2,+xw/2,+yw/2);
404 for (Int_t is = 0; is < kNS; is++) {
406 fXDigPL[i][is] = new TPolyLine(5);
407 fYDigPL[i][is] = new TPolyLine(5);
408 fXDigPL[i][is]->SetBit(kCannotPick);
409 fYDigPL[i][is]->SetBit(kCannotPick);
410 fXDigPL[i][is]->SetLineColor(4);
411 fYDigPL[i][is]->SetLineColor(4);
413 fXDigBox[i][is] = new TBox(0,0,0,0);
414 fYDigBox[i][is] = new TBox(0,0,0,0);
415 fXDigBox[i][is]->SetBit(kCannotPick);
416 fYDigBox[i][is]->SetBit(kCannotPick);
417 fXDigBox[i][is]->SetFillStyle(0);
418 fYDigBox[i][is]->SetFillStyle(0);
419 fXDigBox[i][is]->SetLineColor(4);
420 fYDigBox[i][is]->SetLineColor(4);
434 fNStripX = fBoard->GetXSiy2() - fBoard->GetXSiy1() + 1;
435 fNStripY = fBoard->GetYSix2() - fBoard->GetYSix1() + 1;
439 //__________________________________________________________________________
440 void AliMUONTriggerGUIbdmap::HandleEditButton()
442 /// handle the editable check button
444 if (((fXOn && !fYOn) || (!fXOn && fYOn)) &&
445 (fEditStrips->GetState() == kButtonDown)) {
448 fIsEditable = kFALSE;
453 //__________________________________________________________________________
454 void AliMUONTriggerGUIbdmap::EditStrips(Int_t event, Int_t x, Int_t y, TObject *sel)
461 Double_t xf1, yf1, xf2, yf2;
463 Double_t xMin, xMax, yMin, yMax;
464 Float_t xd, yd, fxDim, fyDim, cDim;
467 cDim = (Float_t)fCanvasSize;
469 // the (x,y) event does not really go up to the canvas size...
474 if (event == kButton1Down) {
476 cs = TString(sel->GetName());
481 fCanvas[iMT]->GetRange(xf1,yf1,xf2,yf2);
482 fxDim = (Float_t)xf2;
483 fyDim = (Float_t)yf2;
485 //xd = fxDim*(+2.0*(Float_t)(x)/cDim - 1.0);
486 //yd = fyDim*(-2.0*(Float_t)(y)/cDim + 1.0);
488 xd = +(2.0*fxDim*(Float_t)(x))/cDim - fxDim;
489 yd = -(2.0*fyDim*(Float_t)(y))/cDim + fyDim;
493 for (Int_t ix = 0; ix < fNStripX; ix++) {
495 px = fXDigPL[iMT][ix]->GetX();
496 py = fXDigPL[iMT][ix]->GetY();
502 for (Int_t ip = 0; ip < np; ip++) {
503 xMin = TMath::Min(xMin,px[ip]);
504 xMax = TMath::Max(xMax,px[ip]);
505 yMin = TMath::Min(yMin,py[ip]);
506 yMax = TMath::Max(yMax,py[ip]);
509 if (yd > (Float_t)yMin && yd < (Float_t)yMax) {
511 if (fXDigBox[iMT][ix]->GetFillStyle() == 0) {
513 fXDigBox[iMT][ix]->SetFillStyle(1001);
514 fXDigBox[iMT][ix]->SetFillColor(2);
516 snprintf(cln,3,"%2d",ix);
518 fXLabelL[iMT][ix]->Clear();
519 fXLabelL[iMT][ix]->AddText(cln);
520 fXLabelL[iMT][ix]->Draw();
522 fXLabelR[iMT][ix]->Clear();
523 fXLabelR[iMT][ix]->AddText(cln);
524 fXLabelR[iMT][ix]->Draw();
526 fXDigBox[iMT][ix]->SetX1(xMin);
527 fXDigBox[iMT][ix]->SetY1(yMin);
528 fXDigBox[iMT][ix]->SetX2(xMax);
529 fXDigBox[iMT][ix]->SetY2(yMax);
531 fXDigBox[iMT][ix]->Draw();
533 } else if (fXDigBox[iMT][ix]->GetFillStyle() == 1001) {
535 fXDigBox[iMT][ix]->SetFillStyle(0);
537 fXLabelL[iMT][ix]->Clear();
538 fXLabelL[iMT][ix]->Draw();
540 fXLabelR[iMT][ix]->Clear();
541 fXLabelR[iMT][ix]->Draw();
543 fXDigBox[iMT][ix]->SetX1(-fBoard->GetXCenter(iMT));
544 fXDigBox[iMT][ix]->SetY1(-fBoard->GetYCenter(iMT));
545 fXDigBox[iMT][ix]->SetX2(-fBoard->GetXCenter(iMT));
546 fXDigBox[iMT][ix]->SetY2(-fBoard->GetYCenter(iMT));
548 fXDigBox[iMT][ix]->Draw();
552 if (!fXDigBox[iMT][ix]->TestBit(kObjInCanvas))
553 fXDigBox[iMT][ix]->Draw();
555 fCanvas[iMT]->Modified();
556 fCanvas[iMT]->Update();
567 for (Int_t iy = 0; iy < fNStripY; iy++) {
569 px = fYDigPL[iMT][iy]->GetX();
570 py = fYDigPL[iMT][iy]->GetY();
576 for (Int_t ip = 0; ip < np; ip++) {
577 xMin = TMath::Min(xMin,px[ip]);
578 xMax = TMath::Max(xMax,px[ip]);
579 yMin = TMath::Min(yMin,py[ip]);
580 yMax = TMath::Max(yMax,py[ip]);
583 if (xd > (Float_t)xMin && xd < (Float_t)xMax) {
585 if (fYDigBox[iMT][iy]->GetFillStyle() == 0) {
587 fYDigBox[iMT][iy]->SetFillStyle(1001);
588 fYDigBox[iMT][iy]->SetFillColor(2);
590 snprintf(cln,3,"%2d",iy);
592 fYLabelL[iMT][iy]->Clear();
593 fYLabelL[iMT][iy]->AddText(cln);
594 fYLabelL[iMT][iy]->Draw();
596 fYLabelR[iMT][iy]->Clear();
597 fYLabelR[iMT][iy]->AddText(cln);
598 fYLabelR[iMT][iy]->Draw();
600 fYDigBox[iMT][iy]->SetX1(xMin);
601 fYDigBox[iMT][iy]->SetY1(yMin);
602 fYDigBox[iMT][iy]->SetX2(xMax);
603 fYDigBox[iMT][iy]->SetY2(yMax);
605 fYDigBox[iMT][iy]->Draw();
607 } else if (fYDigBox[iMT][iy]->GetFillStyle() == 1001) {
609 fYDigBox[iMT][iy]->SetFillStyle(0);
611 fYLabelL[iMT][iy]->Clear();
612 fYLabelL[iMT][iy]->Draw();
614 fYLabelR[iMT][iy]->Clear();
615 fYLabelR[iMT][iy]->Draw();
617 fYDigBox[iMT][iy]->SetX1(-fBoard->GetXCenter(iMT));
618 fYDigBox[iMT][iy]->SetY1(-fBoard->GetYCenter(iMT));
619 fYDigBox[iMT][iy]->SetX2(-fBoard->GetXCenter(iMT));
620 fYDigBox[iMT][iy]->SetY2(-fBoard->GetYCenter(iMT));
622 fYDigBox[iMT][iy]->Draw();
626 if (!fYDigBox[iMT][iy]->TestBit(kObjInCanvas))
627 fYDigBox[iMT][iy]->Draw();
629 fCanvas[iMT]->Modified();
630 fCanvas[iMT]->Update();
639 } // end button event
645 //__________________________________________________________________________
646 void AliMUONTriggerGUIbdmap::DoDigits()
648 /// set the board digits from GUI input (set/unset)
651 Int_t number = fBoard->GetNumber();
653 pos = fBoard->GetPosition();
654 over = fBoard->GetYOver();
655 AliMUONTriggerGUIboard *board;
657 for (Int_t imt = 0; imt < kNMT; imt++) {
659 for (Int_t ix = 0; ix < fNStripX; ix++) {
660 if (fXDigBox[imt][ix]->GetFillStyle() == 0) {
663 if (fXDigBox[imt][ix]->GetFillStyle() == 1001) {
666 fBoard->SetDigitX(imt,ix,amp);
669 for (Int_t iy = 0; iy < fNStripY; iy++) {
670 if (fYDigBox[imt][iy]->GetFillStyle() == 0) {
673 if (fYDigBox[imt][iy]->GetFillStyle() == 1001) {
676 fBoard->SetDigitY(imt,iy,amp);
679 for (Int_t io = 1; io <= over; io++) {
680 if (io == pos) continue;
681 board = (AliMUONTriggerGUIboard*)fBoards->UncheckedAt(number+io-pos);
682 board->SetDigitY(imt,iy,amp);
691 //__________________________________________________________________________
692 void AliMUONTriggerGUIbdmap::ResetDigits()
694 /// set the board digits from GUI input (set/unset)
697 Int_t number = fBoard->GetNumber();
698 AliMUONTriggerGUIboard *board;
700 pos = fBoard->GetPosition();
701 over = fBoard->GetYOver();
703 for (Int_t imt = 0; imt < kNMT; imt++) {
704 for (Int_t ix = 0; ix < fNStripX; ix++) {
705 fXDigBox[imt][ix]->SetFillStyle(0);
706 fXDigBox[imt][ix]->SetX1(-fBoard->GetXCenter(imt));
707 fXDigBox[imt][ix]->SetY1(-fBoard->GetYCenter(imt));
708 fXDigBox[imt][ix]->SetX2(-fBoard->GetXCenter(imt));
709 fXDigBox[imt][ix]->SetY2(-fBoard->GetYCenter(imt));
711 fBoard->SetDigitX(imt,ix,amp);
713 for (Int_t iy = 0; iy < fNStripY; iy++) {
714 fYDigBox[imt][iy]->SetFillStyle(0);
715 fYDigBox[imt][iy]->SetX1(-fBoard->GetXCenter(imt));
716 fYDigBox[imt][iy]->SetY1(-fBoard->GetYCenter(imt));
717 fYDigBox[imt][iy]->SetX2(-fBoard->GetXCenter(imt));
718 fYDigBox[imt][iy]->SetY2(-fBoard->GetYCenter(imt));
720 fBoard->SetDigitY(imt,iy,amp);
723 for (Int_t io = 1; io <= over; io++) {
724 if (io == pos) continue;
725 board = (AliMUONTriggerGUIboard*)fBoards->UncheckedAt(number+io-pos);
727 board->SetDigitY(imt,iy,amp);
734 fBoard->ClearXDigits();
735 fBoard->ClearYDigits();
738 for (Int_t io = 1; io <= over; io++) {
739 if (io == pos) continue;
740 board = (AliMUONTriggerGUIboard*)fBoards->UncheckedAt(number+io-pos);
741 board->ClearYDigits();
744 fXStrips->SetState(kButtonUp);
745 fYStrips->SetState(kButtonUp);
746 fEditStrips->SetState(kButtonUp);
747 fIsEditable = kFALSE;
755 //__________________________________________________________________________
756 void AliMUONTriggerGUIbdmap::HandleButtons(Int_t id)
758 /// handle the check buttons
761 TGButton *btn = (TGButton *) gTQSender;
762 id = btn->WidgetId();
766 if(fXStrips->GetState() == kButtonDown &&
767 fYStrips->GetState() == kButtonDown ) {
770 DrawStrips(kTRUE,kTRUE);
771 DrawDigits(kTRUE,kTRUE);
778 if(fXStrips->GetState() == kButtonDown &&
779 fYStrips->GetState() == kButtonUp ) {
782 DrawStrips(kTRUE,kFALSE);
783 DrawDigits(kTRUE,kFALSE);
790 if(fXStrips->GetState() == kButtonUp &&
791 fYStrips->GetState() == kButtonDown ) {
794 DrawStrips(kFALSE,kTRUE);
795 DrawDigits(kFALSE,kTRUE);
802 if(fXStrips->GetState() == kButtonUp &&
803 fYStrips->GetState() == kButtonUp ) {
815 //__________________________________________________________________________
816 void AliMUONTriggerGUIbdmap::DrawClear()
818 /// draw the frame of the board image in the canvas
820 for (Int_t i = 0; i < kNMT; i++) {
825 fCanvas[i]->Modified();
826 fCanvas[i]->Update();
832 //__________________________________________________________________________
833 void AliMUONTriggerGUIbdmap::DrawDigits(Bool_t bx, Bool_t by)
835 /// draw the digits in "x" or/and "y"
837 Bool_t drawDigits = kTRUE;
838 Bool_t drawDigitsRaw = kTRUE;
839 if (fLoader == 0x0) {
842 if (fRawDigitStore == 0x0) {
843 drawDigitsRaw = kFALSE;
846 AliMUONTriggerGUIboard *board;
847 Int_t over, pos, number;
848 const AliMpVSegmentation* seg;
850 Int_t cathode, detElemId, ix, iy, charge;
851 Int_t chamber, np = 5;
853 Float_t xpmin, xpmax, ypmin, ypmax;
854 Float_t xg1, xg2, yg1, yg2, zg1;
855 Float_t xdw, ydw, xcw, ycw;
856 Double_t xc1, xc2, yc1, yc2;
859 Double_t xMin, xMax, yMin, yMax;
862 number = fBoard->GetNumber();
863 pos = fBoard->GetPosition();
864 over = fBoard->GetYOver();
866 if (drawDigits || drawDigitsRaw) {
868 for (Int_t i = 0; i < kNMT; i++) {
872 fCanvas[i]->GetRange(xc1,yc1,xc2,yc2);
873 xcw = (Float_t)(0.5*(xc2-xc1));
874 ycw = (Float_t)(0.5*(yc2-yc1));
876 AliMUONVDigitStore *digitStore = 0x0;
877 AliMUONGeometryTransformer transformer;
878 transformer.LoadGeometryData("transform.dat");
881 AliRunLoader *runLoader = fLoader->GetRunLoader();
882 digitStore = fMCDataInterface->DigitStore(runLoader->GetEventNumber());
885 digitStore = static_cast<AliMUONVDigitStore*>(fRawDigitStore);
890 MpPair_t deRange = AliMpDEManager::GetDetElemIdRange(chamber-1);
891 TIter next(digitStore->CreateIterator(AliMp::PairFirst(deRange),AliMp::PairSecond(deRange)));
894 while ( ( mdig = static_cast<AliMUONVDigit*>(next())) )
896 cathode = mdig->Cathode();
900 detElemId = mdig->DetElemId();
901 charge = (Int_t)mdig->Charge();
903 Bool_t triggerBgn = kFALSE;
904 Int_t schg = (Int_t)(charge + 0.5);
905 // APPLY CONDITION ON SOFT BACKGROUND
906 Int_t tchg = schg - (Int_t(schg/10))*10;
907 if (schg<=10 || tchg>0) {
913 if (detElemId%100 != fBoard->GetDetElemId()) continue;
915 seg = AliMpSegmentation::Instance()->GetMpSegmentation(detElemId, AliMp::GetCathodType(cathode));
917 pad = seg->PadByIndices(ix,iy,kTRUE);
919 //if (cathode == 0) printf("GUI x: ix %d iy %d \n",ix,iy);
920 //if (cathode == 1) printf("GUI y: ix %d iy %d \n",ix,iy);
922 // get the pad position and dimensions
923 Float_t xlocal1 = pad.GetPositionX();
924 Float_t ylocal1 = pad.GetPositionY();
925 Float_t xlocal2 = pad.GetDimensionX();
926 Float_t ylocal2 = pad.GetDimensionY();
928 transformer.Local2Global(detElemId, xlocal1, ylocal1, 0, xg1, yg1, zg1);
929 // (no transformation for pad dimensions)
933 // transform in the monitor coordinate system
940 xpmin -= fXCenter[i];
941 xpmax -= fXCenter[i];
942 ypmin -= fYCenter[i];
943 ypmax -= fYCenter[i];
949 if ((xdw > ydw) && bx) {
951 //printf("X strips mdig->Cathode() = %1d \n",mdig->Cathode());
954 iX = fBoard->GetXSix();
955 iY1 = fBoard->GetXSiy1();
956 iY2 = fBoard->GetXSiy2();
957 if (ix == iX && iy >= iY1 && iy <= iY2) {
958 //printf("Digit indices (x-strip) ix = %3d iy = %3d board = %s %d chamber = %2d \n",ix,iy,fBoard->GetBoardName(),fBoard->GetNumber(),chamber);
960 xpmin += 0.01*fXWidth[i];
961 xpmax -= 0.01*fXWidth[i];
965 boxd = new TBox(xpmin,ypmin,xpmax,ypmax);
966 boxd->SetFillStyle(1001);
967 if (triggerBgn) boxd->SetFillColor(6);
968 else boxd->SetFillColor(5);
969 boxd->SetBit(kCannotPick);
972 fXDigBox[i][iy-iY1]->SetFillStyle(1001);
973 fXDigBox[i][iy-iY1]->SetFillColor(2);
974 fXDigBox[i][iy-iY1]->SetX1(xpmin);
975 fXDigBox[i][iy-iY1]->SetY1(ypmin);
976 fXDigBox[i][iy-iY1]->SetX2(xpmax);
977 fXDigBox[i][iy-iY1]->SetY2(ypmax);
978 fXDigBox[i][iy-iY1]->Draw();
980 snprintf(cln,3,"%2d",(iy-iY1));
981 fXLabelL[i][iy-iY1]->Clear();
982 fXLabelL[i][iy-iY1]->AddText(cln);
983 fXLabelL[i][iy-iY1]->Draw();
984 fXLabelR[i][iy-iY1]->Clear();
985 fXLabelR[i][iy-iY1]->AddText(cln);
986 fXLabelR[i][iy-iY1]->Draw();
988 fBoard->SetDigitX(i,iy-iY1,charge);
995 if ((xdw < ydw) && by) {
997 //printf("Y strips mdig->Cathode() = %1d \n",mdig->Cathode());
1000 iX1 = fBoard->GetYSix1();
1001 iX2 = fBoard->GetYSix2();
1002 iY = fBoard->GetYSiy();
1003 if (ix >= iX1 && ix <= iX2 && iy == iY) {
1004 //printf("Digit indices (y-strip) ix = %3d iy = %3d board = %s chamber = %2d \n",ix,iy,fBoard->GetBoardName(),chamber);
1005 ypmin = -0.5*fYWidth[i];
1006 ypmax = +0.5*fYWidth[i];
1008 ypmin = -0.5*fYWidth[i];
1009 ypmax = +0.5*fYWidth[i];
1010 ypmin += 0.01*fYWidth[i];
1011 ypmax -= 0.01*fYWidth[i];
1015 boxd = new TBox(xpmin,ypmin,xpmax,ypmax);
1016 boxd->SetFillStyle(1001);
1017 if (triggerBgn) boxd->SetFillColor(6);
1018 else boxd->SetFillColor(5);
1019 boxd->SetBit(kCannotPick);
1022 fYDigBox[i][ix-iX1]->SetFillStyle(1001);
1023 fYDigBox[i][ix-iX1]->SetFillColor(2);
1024 fYDigBox[i][ix-iX1]->SetX1(xpmin);
1025 fYDigBox[i][ix-iX1]->SetY1(ypmin);
1026 fYDigBox[i][ix-iX1]->SetX2(xpmax);
1027 fYDigBox[i][ix-iX1]->SetY2(ypmax);
1028 fYDigBox[i][ix-iX1]->Draw();
1030 snprintf(cln,3,"%2d",(ix-iX1));
1031 fYLabelL[i][ix-iX1]->Clear();
1032 fYLabelL[i][ix-iX1]->AddText(cln);
1033 fYLabelL[i][ix-iX1]->Draw();
1034 fYLabelR[i][ix-iX1]->Clear();
1035 fYLabelR[i][ix-iX1]->AddText(cln);
1036 fYLabelR[i][ix-iX1]->Draw();
1038 fBoard->SetDigitY(i,ix-iX1,charge);
1040 // extended y-strips
1041 for (Int_t io = 1; io <= over; io++) {
1042 if (io == pos) continue;
1043 board = (AliMUONTriggerGUIboard*)fBoards->UncheckedAt(number+io-pos);
1044 board->SetDigitY(i,ix-iX1,charge);
1050 } // end digits loop
1052 } // end chamber loop
1057 for (Int_t i = 0; i < kNMT; i++) {
1061 fCanvas[i]->GetRange(xc1,yc1,xc2,yc2);
1062 xcw = (Float_t)(0.5*(xc2-xc1));
1063 ycw = (Float_t)(0.5*(yc2-yc1));
1068 for (ix = 0; ix < fNStripX; ix++) {
1069 //if (fBoard->GetXDig(i,ix) > 0) {
1070 if (fXDigBox[i][ix]->GetFillStyle() == 1001 ||
1071 fBoard->GetXDig(i,ix) > 0) {
1073 px = fXDigPL[i][ix]->GetX();
1074 py = fXDigPL[i][ix]->GetY();
1080 for (Int_t ip = 0; ip < np; ip++) {
1081 xMin = TMath::Min(xMin,px[ip]);
1082 xMax = TMath::Max(xMax,px[ip]);
1083 yMin = TMath::Min(yMin,py[ip]);
1084 yMax = TMath::Max(yMax,py[ip]);
1087 if (fXDigBox[i][ix]->GetFillStyle() == 0) {
1088 fXDigBox[i][ix]->SetFillStyle(1001);
1089 fXDigBox[i][ix]->SetFillColor(2);
1090 fXDigBox[i][ix]->SetX1(xMin);
1091 fXDigBox[i][ix]->SetY1(yMin);
1092 fXDigBox[i][ix]->SetX2(xMax);
1093 fXDigBox[i][ix]->SetY2(yMax);
1096 snprintf(cln,3,"%2d",ix);
1098 fXLabelL[i][ix]->Clear();
1099 fXLabelL[i][ix]->AddText(cln);
1100 fXLabelL[i][ix]->Draw();
1102 fXLabelR[i][ix]->Clear();
1103 fXLabelR[i][ix]->AddText(cln);
1104 fXLabelR[i][ix]->Draw();
1106 fXDigBox[i][ix]->Draw();
1117 for (iy = 0; iy < fNStripY; iy++) {
1118 //if (fBoard->GetYDig(i,iy) > 0) {
1119 if (fYDigBox[i][iy]->GetFillStyle() == 1001 ||
1120 fBoard->GetYDig(i,iy) > 0) {
1122 px = fYDigPL[i][iy]->GetX();
1123 py = fYDigPL[i][iy]->GetY();
1129 for (Int_t ip = 0; ip < np; ip++) {
1130 xMin = TMath::Min(xMin,px[ip]);
1131 xMax = TMath::Max(xMax,px[ip]);
1132 yMin = TMath::Min(yMin,py[ip]);
1133 yMax = TMath::Max(yMax,py[ip]);
1136 if (fYDigBox[i][iy]->GetFillStyle() == 0) {
1137 fYDigBox[i][iy]->SetFillStyle(1001);
1138 fYDigBox[i][iy]->SetFillColor(2);
1139 fYDigBox[i][iy]->SetX1(xMin);
1140 fYDigBox[i][iy]->SetY1(yMin);
1141 fYDigBox[i][iy]->SetX2(xMax);
1142 fYDigBox[i][iy]->SetY2(yMax);
1145 snprintf(cln,3,"%2d",iy);
1147 fYLabelL[i][iy]->Clear();
1148 fYLabelL[i][iy]->AddText(cln);
1149 fYLabelL[i][iy]->Draw();
1151 fYLabelR[i][iy]->Clear();
1152 fYLabelR[i][iy]->AddText(cln);
1153 fYLabelR[i][iy]->Draw();
1155 fYDigBox[i][iy]->Draw();
1163 fCanvas[i]->Modified();
1164 fCanvas[i]->Update();
1166 } // end canvas (chamber) loop
1172 //__________________________________________________________________________
1173 void AliMUONTriggerGUIbdmap::DrawStrips(Bool_t bx, Bool_t by)
1175 /// draw the "x" or/and "y" strips
1177 AliMUONGeometryTransformer transformer;
1178 transformer.LoadGeometryData("transform.dat");
1180 const AliMpVSegmentation* seg;
1184 Float_t xg1, xg2, yg1, yg2, zg1;
1185 Float_t xlocal1, xlocal2, ylocal1, ylocal2;
1186 Int_t detElemId, maxX, maxY;
1187 Float_t xdw, ydw, xpmin, xpmax, ypmin, ypmax;
1188 Float_t ptx1, ptx2, pty1, pty2;
1190 Double_t xc1, xc2, yc1, yc2;
1193 Bool_t makeLabelsX = kFALSE;
1194 Bool_t makeLabelsY = kFALSE;
1196 if (bx && !fLabelX) {
1197 makeLabelsX = kTRUE;
1201 if (by && !fLabelY) {
1202 makeLabelsY = kTRUE;
1206 for (Int_t i = 0; i < kNMT; i++) {
1210 fCanvas[i]->GetRange(xc1,yc1,xc2,yc2);
1211 xcw = (Float_t)(0.5*(xc2-xc1));
1212 ycw = (Float_t)(0.5*(yc2-yc1));
1216 for ( it.First(chamber-1); ! it.IsDone(); it.Next() ) {
1218 detElemId = it.CurrentDEId();
1220 if (detElemId%100 != fBoard->GetDetElemId()) continue;
1222 /*---------- y-pads ic = 1 ----------*/
1224 seg = AliMpSegmentation::Instance()->GetMpSegmentation(detElemId, AliMp::kCath1);
1226 maxX = seg->MaxPadIndexX();
1227 maxY = seg->MaxPadIndexY();
1229 for (Int_t ix = 0; ix <= maxX; ix++) {
1230 for (Int_t iy = 0; iy <= maxY; iy++) {
1232 pad = seg->PadByIndices(ix,iy,kFALSE);
1234 if (!pad.IsValid()) continue;
1236 // get the pad position and dimensions
1237 xlocal1 = pad.GetPositionX();
1238 ylocal1 = pad.GetPositionY();
1239 xlocal2 = pad.GetDimensionX();
1240 ylocal2 = pad.GetDimensionY();
1242 transformer.Local2Global(detElemId, xlocal1, ylocal1, 0, xg1, yg1, zg1);
1243 // (no transformation for pad dimensions)
1247 // transform in the monitor coordinate system
1254 xpmin -= fXCenter[i];
1255 xpmax -= fXCenter[i];
1256 ypmin -= fYCenter[i];
1257 ypmax -= fYCenter[i];
1265 Int_t iX1, iX2, iY, ixDig;
1266 iX1 = fBoard->GetYSix1();
1267 iX2 = fBoard->GetYSix2();
1268 iY = fBoard->GetYSiy();
1269 if (ix >= iX1 && ix <= iX2 && iy == iY) {
1271 ypmin = -0.5*fYWidth[i];
1272 ypmax = +0.5*fYWidth[i];
1274 ypmin += 0.01*fYWidth[i];
1275 ypmax -= 0.01*fYWidth[i];
1280 fYDigPL[i][ixDig]->SetPoint(0,xpmin,ypmin);
1281 fYDigPL[i][ixDig]->SetPoint(1,xpmax,ypmin);
1282 fYDigPL[i][ixDig]->SetPoint(2,xpmax,ypmax);
1283 fYDigPL[i][ixDig]->SetPoint(3,xpmin,ypmax);
1284 fYDigPL[i][ixDig]->SetPoint(4,xpmin,ypmin);
1285 fYDigPL[i][ixDig]->Draw();
1287 fYDigBox[i][ixDig]->SetFillStyle(1001);
1288 fYDigBox[i][ixDig]->SetFillColor(5);
1289 fYDigBox[i][ixDig]->DrawBox(xpmin,ypmin,xpmax,ypmax);
1292 snprintf(cln,3,"%2d",(ix-iX1));
1296 pty1 = 1.065*ypmin - 0.04*ycw;
1297 pty2 = 1.065*ypmin + 0.04*ycw;
1298 fYLabelL[i][ix-iX1] = new TPaveText(ptx1,pty1,ptx2,pty2);
1299 fYLabelL[i][ix-iX1]->SetBorderSize(0);
1300 fYLabelL[i][ix-iX1]->SetBit(kCannotPick);
1302 pty1 = 1.065*ypmax - 0.04*ycw;
1303 pty2 = 1.065*ypmax + 0.04*ycw;
1304 fYLabelR[i][ix-iX1] = new TPaveText(ptx1,pty1,ptx2,pty2);
1305 fYLabelR[i][ix-iX1]->SetBorderSize(0);
1306 fYLabelR[i][ix-iX1]->SetBit(kCannotPick);
1317 /*---------- x-pads ic = 0 ----------*/
1319 seg = AliMpSegmentation::Instance()->GetMpSegmentation(detElemId, AliMp::kCath0);
1321 maxX = seg->MaxPadIndexX();
1322 maxY = seg->MaxPadIndexY();
1324 for (Int_t ix = 0; ix <= maxX; ix++) {
1325 for (Int_t iy = 0; iy <= maxY; iy++) {
1327 pad = seg->PadByIndices(ix,iy,kFALSE);
1329 if (!pad.IsValid()) continue;
1331 // get the pad position and dimensions
1332 xlocal1 = pad.GetPositionX();
1333 ylocal1 = pad.GetPositionY();
1334 xlocal2 = pad.GetDimensionX();
1335 ylocal2 = pad.GetDimensionY();
1337 transformer.Local2Global(detElemId, xlocal1, ylocal1, 0, xg1, yg1, zg1);
1338 // (no transformation for pad dimensions)
1342 // transform in the monitor coordinate system
1349 xpmin -= fXCenter[i];
1350 xpmax -= fXCenter[i];
1351 ypmin -= fYCenter[i];
1352 ypmax -= fYCenter[i];
1359 Int_t iX, iY1, iY2, iyDig;
1360 iX = fBoard->GetXSix();
1361 iY1 = fBoard->GetXSiy1();
1362 iY2 = fBoard->GetXSiy2();
1363 if (ix == iX && iy >= iY1 && iy <= iY2) {
1365 xpmin += 0.01*fXWidth[i];
1366 xpmax -= 0.01*fXWidth[i];
1371 fXDigPL[i][iyDig]->SetPoint(0,xpmin,ypmin);
1372 fXDigPL[i][iyDig]->SetPoint(1,xpmax,ypmin);
1373 fXDigPL[i][iyDig]->SetPoint(2,xpmax,ypmax);
1374 fXDigPL[i][iyDig]->SetPoint(3,xpmin,ypmax);
1375 fXDigPL[i][iyDig]->SetPoint(4,xpmin,ypmin);
1376 fXDigPL[i][iyDig]->Draw();
1378 fXDigBox[i][iyDig]->SetFillStyle(1001);
1379 fXDigBox[i][iyDig]->SetFillColor(5);
1380 fXDigBox[i][iyDig]->DrawBox(xpmin,ypmin,xpmax,ypmax);
1383 snprintf(cln,3,"%2d",(iy-iY1));
1387 ptx1 = 1.065*xpmin - 0.04*xcw;
1388 ptx2 = 1.065*xpmin + 0.04*xcw;
1389 fXLabelL[i][iy-iY1] = new TPaveText(ptx1,pty1,ptx2,pty2);
1390 fXLabelL[i][iy-iY1]->SetBorderSize(0);
1391 fXLabelL[i][iy-iY1]->SetBit(kCannotPick);
1393 ptx1 = 1.065*xpmax - 0.04*xcw;
1394 ptx2 = 1.065*xpmax + 0.04*xcw;
1395 fXLabelR[i][iy-iY1] = new TPaveText(ptx1,pty1,ptx2,pty2);
1396 fXLabelR[i][iy-iY1]->SetBorderSize(0);
1397 fXLabelR[i][iy-iY1]->SetBit(kCannotPick);
1410 fCanvas[i]->Modified();
1411 fCanvas[i]->Update();
1419 //__________________________________________________________________________
1420 void AliMUONTriggerGUIbdmap::CloseWindow() const
1422 /// close dialog in response to window manager close.
1428 //__________________________________________________________________________
1429 void AliMUONTriggerGUIbdmap::DoClose()
1431 /// handle Close button.
1433 fBoard->SetOpen(kFALSE);
1434 TTimer::SingleShot(150,"AliMUONTriggerGUIbdmap",this,"CloseWindow()");