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 **************************************************************************/
16 //////////////////////////////////////////////////////////////////////////
18 // Graphical User Interface utility class for the MUON trigger //
19 // - single board map of the strips/digits //
21 //////////////////////////////////////////////////////////////////////////
23 #include <TPolyLine.h>
27 #include <TRootEmbeddedCanvas.h>
29 #include <TPaveText.h>
30 #include <TGTextEdit.h>
33 #include <TObjArray.h>
38 #include "AliMUONData.h"
39 #include "AliMUONDigit.h"
40 #include "AliMpVSegmentation.h"
41 #include "AliMpSegmentation.h"
42 #include "AliMUONGeometryTransformer.h"
43 #include "AliMpDEIterator.h"
44 #include "AliMUONLocalTrigger.h"
45 #include "AliMUONLocalTriggerBoard.h"
46 #include "AliMUONTriggerCrateStore.h"
48 #include "AliMUONTriggerGUIboard.h"
49 #include "AliMUONTriggerGUIbdmap.h"
52 ClassImp(AliMUONTriggerGUIbdmap)
55 //__________________________________________________________________________
56 AliMUONTriggerGUIbdmap::AliMUONTriggerGUIbdmap(const TGWindow *p, const TGWindow *main, UInt_t w, UInt_t h)
79 gStyle->SetPadLeftMargin(0.05);
80 gStyle->SetPadRightMargin(0.05);
81 gStyle->SetPadTopMargin(0.05);
82 gStyle->SetPadBottomMargin(0.05);
84 fMain = new TGTransientFrame(p, main, w, h, kVerticalFrame);
85 fMain->Connect("CloseWindow()", "AliMUONTriggerGUIbdmap", this, "CloseWindow()");
86 fMain->DontCallClose(); // to avoid double deletions.
88 // use hierarchical cleaning
89 fMain->SetCleanup(kDeepCleanup);
91 fMain->ChangeOptions((fMain->GetOptions() & ~kVerticalFrame) | kHorizontalFrame);
93 // strips/digits canvases
97 TRootEmbeddedCanvas *recanvas[4];
99 for (Int_t i = 0; i < kNMT; i++) {
101 sprintf(ecname,"%1d",i+1);
102 recanvas[i] = new TRootEmbeddedCanvas(ecname,fMain,fCanvasSize,fCanvasSize);
104 fCanvas[i] = recanvas[i]->GetCanvas();
106 fCanvas[i]->SetBorderMode(0);
107 fCanvas[i]->SetBit(kNoContextMenu);
109 fCanvas[i]->Connect("ProcessedEvent(Int_t,Int_t,Int_t,TObject*)",
110 "AliMUONTriggerGUIbdmap",this,
111 "EditStrips(Int_t,Int_t,Int_t,TObject*)");
113 fMain->AddFrame(recanvas[i],
115 new TGTableLayoutHints(2,5,2,6,
116 kLHintsExpandX|kLHintsExpandY |
117 kLHintsShrinkX|kLHintsShrinkY |
118 kLHintsFillX|kLHintsFillY)
120 new TGLayoutHints(kLHintsTop |
127 //TGDimension size = fMain->GetDefaultSize();
128 //fMain->Resize(size);
132 TGCompositeFrame *cf0 = new TGCompositeFrame(fMain, 60, 20, kVerticalFrame);
134 TGCompositeFrame *cf1 = new TGCompositeFrame(cf0, 60, 20, kVerticalFrame | kFixedWidth);
136 cf1->AddFrame(fXStrips = new TGCheckButton(cf1, "Draw X strips and digits", 1),
137 new TGLayoutHints(kLHintsTop |
142 cf1->Resize(fXStrips->GetDefaultWidth()+10, fMain->GetDefaultHeight());
144 cf1->AddFrame(fYStrips = new TGCheckButton(cf1, "Draw Y strips and digits", 2),
145 new TGLayoutHints(kLHintsTop |
150 cf1->Resize(fYStrips->GetDefaultWidth()+10, fMain->GetDefaultHeight());
152 cf1->AddFrame(fEditStrips = new TGCheckButton(cf1, "Set/unset strips", 3),
153 new TGLayoutHints(kLHintsTop |
158 fXStrips->Connect("Clicked()", "AliMUONTriggerGUIbdmap", this, "HandleButtons()");
159 fYStrips->Connect("Clicked()", "AliMUONTriggerGUIbdmap", this, "HandleButtons()");
160 fEditStrips->Connect("Clicked()", "AliMUONTriggerGUIbdmap", this, "HandleEditButton()");
163 new TGLayoutHints(kLHintsTop |
168 TGCompositeFrame *cf2 = new TGCompositeFrame(cf0, 60, 20, kHorizontalFrame | kFixedWidth);
170 TGTextButton *digitsButton = new TGTextButton(cf2, "Digits", 4);
171 digitsButton->Connect("Clicked()", "AliMUONTriggerGUIbdmap", this, "DoDigits()");
173 //cf2->Resize(digitsButton->GetDefaultWidth()+40, fMain->GetDefaultHeight());
175 cf2->AddFrame(digitsButton,
176 new TGLayoutHints(kLHintsTop |
182 TGTextButton *dresetButton = new TGTextButton(cf2, "Reset", 5);
183 dresetButton->Connect("Clicked()", "AliMUONTriggerGUIbdmap", this, "ResetDigits()");
185 //cf2->Resize(dresetButton->GetDefaultWidth()+40, fMain->GetDefaultHeight());
187 cf2->AddFrame(dresetButton,
188 new TGLayoutHints(kLHintsTop |
194 TGTextButton *closeButton = new TGTextButton(cf2, "Close", 6);
195 closeButton->Connect("Clicked()", "AliMUONTriggerGUIbdmap", this, "DoClose()");
197 //cf2->Resize(closeButton->GetDefaultWidth()+40, fMain->GetDefaultHeight());
199 cf2->AddFrame(closeButton,
200 new TGLayoutHints(kLHintsTop |
207 new TGLayoutHints(kLHintsTop |
212 // editor window for the local trigger
214 TGCompositeFrame *cf3 = new TGCompositeFrame(cf0, 60, 20, kVerticalFrame | kFixedWidth);
216 fLocTrigE = new TGTextEdit(cf3, 100, 100, kSunkenFrame | kDoubleBorder);
217 cf3->AddFrame(fLocTrigE,
218 new TGLayoutHints(kLHintsExpandX |
224 new TGLayoutHints(kLHintsTop |
230 new TGLayoutHints(kLHintsTop |
235 fIsEditable = kFALSE;
239 fMain->MapSubwindows();
242 fMain->CenterOnParent();
244 //fMain->MapWindow();
245 //gClient->WaitFor(fMain);
249 //__________________________________________________________________________
250 AliMUONTriggerGUIbdmap::~AliMUONTriggerGUIbdmap()
254 fMain->DeleteWindow();
258 //__________________________________________________________________________
259 AliMUONTriggerGUIbdmap::AliMUONTriggerGUIbdmap(const AliMUONTriggerGUIbdmap& bdmap)
283 Fatal("AliMUONTriggerGUIbdmap","copy constructor not implemented");
287 //__________________________________________________________________________
288 AliMUONTriggerGUIbdmap & AliMUONTriggerGUIbdmap::operator=(const AliMUONTriggerGUIbdmap& bdmap)
290 /// asignment operator
293 Fatal("AliMUONTriggerGUIbdmap","assignment operator not implemented");
299 //__________________________________________________________________________
300 void AliMUONTriggerGUIbdmap::Show()
302 /// map the main frame
309 //__________________________________________________________________________
310 void AliMUONTriggerGUIbdmap::LocalTriggerInfo()
312 /// print the local trigger
314 AliMUONTriggerCrateStore* crateManager = new AliMUONTriggerCrateStore();
315 crateManager->ReadFromFile();
320 sprintf(buffer,"Local trigger info\n");
321 fLocTrigE->LoadBuffer(buffer);
323 AliRunLoader *runLoader = fLoader->GetRunLoader();
324 gAlice = runLoader->GetAliRun();
326 fMUONData->SetTreeAddress("GLT");
327 fMUONData->GetTriggerD();
329 Int_t circuitNumber = fBoard->GetIdCircuit();
331 TClonesArray *localTrigger = fMUONData->LocalTrigger();
332 if (localTrigger == 0) return;
334 Int_t nLocalTrigger = localTrigger->GetEntriesFast();
336 UShort_t x2m, x2u, x2d;
338 Int_t loStripX, loStripY, loDev, loCircuit, iStripX, iStripY, loLpt, loHpt;
339 AliMUONLocalTrigger *mlt;
341 for (Int_t ilt = 0; ilt < nLocalTrigger; ilt++) {
342 mlt = (AliMUONLocalTrigger*)localTrigger->UncheckedAt(ilt);
344 loCircuit = mlt->LoCircuit();
346 if (loCircuit == circuitNumber) {
348 AliMUONLocalTriggerBoard* ltb = crateManager->LocalBoard(loCircuit);
349 x2d = ltb->GetSwitch(0);
350 x2m = ltb->GetSwitch(1);
351 x2u = ltb->GetSwitch(2);
353 loStripX = mlt->LoStripX();
354 loStripY = mlt->LoStripY();
355 loDev = mlt->LoDev();
356 loLpt = mlt->LoLpt();
357 loHpt = mlt->LoHpt();
359 iStripX = loStripX/2;
360 if ((x2u == 1 || x2m == 1 || x2d == 1) && x2m == 1) {
361 iStripY = loStripY/2;
366 sprintf(buffer,"Circuit = %03d",loCircuit);
367 txt.LoadBuffer(buffer);
368 fLocTrigE->AddText(&txt);
370 sprintf(buffer,"LoStripX = %2d",loStripX);
371 txt.LoadBuffer(buffer);
372 fLocTrigE->AddText(&txt);
374 sprintf(buffer,"LoStripY = %2d",loStripY);
375 txt.LoadBuffer(buffer);
376 fLocTrigE->AddText(&txt);
378 sprintf(buffer,"LoDev = %2d",loDev);
379 txt.LoadBuffer(buffer);
380 fLocTrigE->AddText(&txt);
382 sprintf(buffer,"--------------------");
383 txt.LoadBuffer(buffer);
384 fLocTrigE->AddText(&txt);
386 sprintf(buffer,"X-strip = %2d ( %2d )",iStripX,(loStripX+loDev+1)/2);
387 txt.LoadBuffer(buffer);
388 fLocTrigE->AddText(&txt);
390 sprintf(buffer,"Y-strip = %2d",iStripY);
391 txt.LoadBuffer(buffer);
392 fLocTrigE->AddText(&txt);
394 sprintf(buffer,"--------------------");
395 txt.LoadBuffer(buffer);
396 fLocTrigE->AddText(&txt);
398 sprintf(buffer,"LoLpt = %2d",loLpt);
399 txt.LoadBuffer(buffer);
400 fLocTrigE->AddText(&txt);
402 sprintf(buffer,"LoHpt = %2d",loHpt);
403 txt.LoadBuffer(buffer);
404 fLocTrigE->AddText(&txt);
414 //__________________________________________________________________________
415 void AliMUONTriggerGUIbdmap::Init()
417 /// initialize the boards in the four MT
419 TString mapspath = gSystem->Getenv("ALICE_ROOT");
420 mapspath.Append("/MUON/data");
422 fMUONData = new AliMUONData(fLoader,"MUON","MUON");
423 fMUONData->SetTreeAddress("D");
425 TString mapName[kNMT];
426 mapName[0] = TString(mapspath.Data());
427 mapName[1] = TString(mapspath.Data());
428 mapName[2] = TString(mapspath.Data());
429 mapName[3] = TString(mapspath.Data());
430 mapName[0].Append("/guimapp11.txt");
431 mapName[1].Append("/guimapp12.txt");
432 mapName[2].Append("/guimapp13.txt");
433 mapName[3].Append("/guimapp14.txt");
435 Int_t side, col, line, nbx;
436 Float_t xCenter, yCenter, zCenter, xWidth, yWidth;
440 for (Int_t i = 0; i < kNMT; i++) {
442 fmap = fopen(mapName[i].Data(),"r");
444 for (Int_t ib = 0; ib < kNBoards; ib++) {
446 fscanf(fmap,"%d %d %d %d %f %f %f %f %f %s \n",&side,&col,&line,&nbx,&xCenter,&yCenter,&xWidth,&yWidth,&zCenter,&name[0]);
449 sprintf(name,"LC%1dL%1dB%1d%1d",col,line,2*nbx-1,2*nbx);
452 sprintf(name,"RC%1dL%1dB%1d%1d",col,line,2*nbx-1,2*nbx);
455 if (strncmp(name,fBoard->GetBoardName(),7) == 0) {
458 fXCenter[i] = xCenter;
459 fYCenter[i] = yCenter;
471 for (Int_t i = 0; i < kNMT; i++) {
472 xw = 1.20*fXWidth[i];
473 yw = 1.20*fYWidth[i];
474 fCanvas[i]->Range(-xw/2,-yw/2,+xw/2,+yw/2);
475 for (Int_t is = 0; is < kNS; is++) {
477 fXDigPL[i][is] = new TPolyLine(5);
478 fYDigPL[i][is] = new TPolyLine(5);
479 fXDigPL[i][is]->SetBit(kCannotPick);
480 fYDigPL[i][is]->SetBit(kCannotPick);
481 fXDigPL[i][is]->SetLineColor(4);
482 fYDigPL[i][is]->SetLineColor(4);
484 fXDigBox[i][is] = new TBox(0,0,0,0);
485 fYDigBox[i][is] = new TBox(0,0,0,0);
486 fXDigBox[i][is]->SetBit(kCannotPick);
487 fYDigBox[i][is]->SetBit(kCannotPick);
488 fXDigBox[i][is]->SetFillStyle(0);
489 fYDigBox[i][is]->SetFillStyle(0);
490 fXDigBox[i][is]->SetLineColor(4);
491 fYDigBox[i][is]->SetLineColor(4);
505 fNStripX = fBoard->GetXSiy2() - fBoard->GetXSiy1() + 1;
506 fNStripY = fBoard->GetYSix2() - fBoard->GetYSix1() + 1;
510 //__________________________________________________________________________
511 void AliMUONTriggerGUIbdmap::HandleEditButton()
513 /// handle the editable check button
515 if (((fXOn && !fYOn) || (!fXOn && fYOn)) &&
516 (fEditStrips->GetState() == kButtonDown)) {
519 fIsEditable = kFALSE;
524 //__________________________________________________________________________
525 void AliMUONTriggerGUIbdmap::EditStrips(Int_t event, Int_t x, Int_t y, TObject *sel)
532 Double_t xf1, yf1, xf2, yf2;
534 Double_t xMin, xMax, yMin, yMax;
535 Float_t xd, yd, fxDim, fyDim, cDim;
538 cDim = (Float_t)fCanvasSize;
540 // the (x,y) event does not really go up to the canvas size...
545 if (event == kButton1Down) {
547 cs = TString(sel->GetName());
552 fCanvas[iMT]->GetRange(xf1,yf1,xf2,yf2);
553 fxDim = (Float_t)xf2;
554 fyDim = (Float_t)yf2;
556 //xd = fxDim*(+2.0*(Float_t)(x)/cDim - 1.0);
557 //yd = fyDim*(-2.0*(Float_t)(y)/cDim + 1.0);
559 xd = +(2.0*fxDim*(Float_t)(x))/cDim - fxDim;
560 yd = -(2.0*fyDim*(Float_t)(y))/cDim + fyDim;
564 for (Int_t ix = 0; ix < fNStripX; ix++) {
566 px = fXDigPL[iMT][ix]->GetX();
567 py = fXDigPL[iMT][ix]->GetY();
573 for (Int_t ip = 0; ip < np; ip++) {
574 xMin = TMath::Min(xMin,px[ip]);
575 xMax = TMath::Max(xMax,px[ip]);
576 yMin = TMath::Min(yMin,py[ip]);
577 yMax = TMath::Max(yMax,py[ip]);
580 if (yd > (Float_t)yMin && yd < (Float_t)yMax) {
582 if (fXDigBox[iMT][ix]->GetFillStyle() == 0) {
584 fXDigBox[iMT][ix]->SetFillStyle(1001);
585 fXDigBox[iMT][ix]->SetFillColor(2);
587 sprintf(cln,"%2d",ix);
589 fXLabelL[iMT][ix]->Clear();
590 fXLabelL[iMT][ix]->AddText(cln);
591 fXLabelL[iMT][ix]->Draw();
593 fXLabelR[iMT][ix]->Clear();
594 fXLabelR[iMT][ix]->AddText(cln);
595 fXLabelR[iMT][ix]->Draw();
597 fXDigBox[iMT][ix]->SetX1(xMin);
598 fXDigBox[iMT][ix]->SetY1(yMin);
599 fXDigBox[iMT][ix]->SetX2(xMax);
600 fXDigBox[iMT][ix]->SetY2(yMax);
602 fXDigBox[iMT][ix]->Draw();
604 } else if (fXDigBox[iMT][ix]->GetFillStyle() == 1001) {
606 fXDigBox[iMT][ix]->SetFillStyle(0);
608 fXLabelL[iMT][ix]->Clear();
609 fXLabelL[iMT][ix]->Draw();
611 fXLabelR[iMT][ix]->Clear();
612 fXLabelR[iMT][ix]->Draw();
614 fXDigBox[iMT][ix]->SetX1(-fBoard->GetXCenter(iMT));
615 fXDigBox[iMT][ix]->SetY1(-fBoard->GetYCenter(iMT));
616 fXDigBox[iMT][ix]->SetX2(-fBoard->GetXCenter(iMT));
617 fXDigBox[iMT][ix]->SetY2(-fBoard->GetYCenter(iMT));
619 fXDigBox[iMT][ix]->Draw();
623 if (!fXDigBox[iMT][ix]->TestBit(kObjInCanvas))
624 fXDigBox[iMT][ix]->Draw();
626 fCanvas[iMT]->Modified();
627 fCanvas[iMT]->Update();
638 for (Int_t iy = 0; iy < fNStripY; iy++) {
640 px = fYDigPL[iMT][iy]->GetX();
641 py = fYDigPL[iMT][iy]->GetY();
647 for (Int_t ip = 0; ip < np; ip++) {
648 xMin = TMath::Min(xMin,px[ip]);
649 xMax = TMath::Max(xMax,px[ip]);
650 yMin = TMath::Min(yMin,py[ip]);
651 yMax = TMath::Max(yMax,py[ip]);
654 if (xd > (Float_t)xMin && xd < (Float_t)xMax) {
656 if (fYDigBox[iMT][iy]->GetFillStyle() == 0) {
658 fYDigBox[iMT][iy]->SetFillStyle(1001);
659 fYDigBox[iMT][iy]->SetFillColor(2);
661 sprintf(cln,"%2d",iy);
663 fYLabelL[iMT][iy]->Clear();
664 fYLabelL[iMT][iy]->AddText(cln);
665 fYLabelL[iMT][iy]->Draw();
667 fYLabelR[iMT][iy]->Clear();
668 fYLabelR[iMT][iy]->AddText(cln);
669 fYLabelR[iMT][iy]->Draw();
671 fYDigBox[iMT][iy]->SetX1(xMin);
672 fYDigBox[iMT][iy]->SetY1(yMin);
673 fYDigBox[iMT][iy]->SetX2(xMax);
674 fYDigBox[iMT][iy]->SetY2(yMax);
676 //fYDigBox[iMT][iy]->Draw();
678 } else if (fYDigBox[iMT][iy]->GetFillStyle() == 1001) {
680 fYDigBox[iMT][iy]->SetFillStyle(0);
682 fYLabelL[iMT][iy]->Clear();
683 fYLabelL[iMT][iy]->Draw();
685 fYLabelR[iMT][iy]->Clear();
686 fYLabelR[iMT][iy]->Draw();
688 fYDigBox[iMT][iy]->SetX1(-fBoard->GetXCenter(iMT));
689 fYDigBox[iMT][iy]->SetY1(-fBoard->GetYCenter(iMT));
690 fYDigBox[iMT][iy]->SetX2(-fBoard->GetXCenter(iMT));
691 fYDigBox[iMT][iy]->SetY2(-fBoard->GetYCenter(iMT));
693 //fYDigBox[iMT][iy]->Draw();
697 if (!fYDigBox[iMT][iy]->TestBit(kObjInCanvas))
698 fYDigBox[iMT][iy]->Draw();
700 fCanvas[iMT]->Modified();
701 fCanvas[iMT]->Update();
710 } // end button event
716 //__________________________________________________________________________
717 void AliMUONTriggerGUIbdmap::DoDigits()
719 /// set the board digits from GUI input (set/unset)
722 Int_t number = fBoard->GetNumber();
724 pos = fBoard->GetPosition();
725 over = fBoard->GetYOver();
726 AliMUONTriggerGUIboard *board;
728 for (Int_t imt = 0; imt < kNMT; imt++) {
730 for (Int_t ix = 0; ix < fNStripX; ix++) {
731 if (fXDigBox[imt][ix]->GetFillStyle() == 0) {
734 if (fXDigBox[imt][ix]->GetFillStyle() == 1001) {
737 fBoard->SetDigitX(imt,ix,amp);
740 for (Int_t iy = 0; iy < fNStripY; iy++) {
741 if (fYDigBox[imt][iy]->GetFillStyle() == 0) {
744 if (fYDigBox[imt][iy]->GetFillStyle() == 1001) {
747 fBoard->SetDigitY(imt,iy,amp);
750 for (Int_t io = 1; io <= over; io++) {
751 if (io == pos) continue;
752 board = (AliMUONTriggerGUIboard*)fBoards->UncheckedAt(number+io-pos);
753 board->SetDigitY(imt,iy,amp);
762 //__________________________________________________________________________
763 void AliMUONTriggerGUIbdmap::ResetDigits()
765 /// set the board digits from GUI input (set/unset)
768 Int_t number = fBoard->GetNumber();
769 AliMUONTriggerGUIboard *board;
771 pos = fBoard->GetPosition();
772 over = fBoard->GetYOver();
774 for (Int_t imt = 0; imt < kNMT; imt++) {
775 for (Int_t ix = 0; ix < fNStripX; ix++) {
776 fXDigBox[imt][ix]->SetFillStyle(0);
777 fXDigBox[imt][ix]->SetX1(-fBoard->GetXCenter(imt));
778 fXDigBox[imt][ix]->SetY1(-fBoard->GetYCenter(imt));
779 fXDigBox[imt][ix]->SetX2(-fBoard->GetXCenter(imt));
780 fXDigBox[imt][ix]->SetY2(-fBoard->GetYCenter(imt));
782 fBoard->SetDigitX(imt,ix,amp);
784 for (Int_t iy = 0; iy < fNStripY; iy++) {
785 fYDigBox[imt][iy]->SetFillStyle(0);
786 fYDigBox[imt][iy]->SetX1(-fBoard->GetXCenter(imt));
787 fYDigBox[imt][iy]->SetY1(-fBoard->GetYCenter(imt));
788 fYDigBox[imt][iy]->SetX2(-fBoard->GetXCenter(imt));
789 fYDigBox[imt][iy]->SetY2(-fBoard->GetYCenter(imt));
791 fBoard->SetDigitY(imt,iy,amp);
794 for (Int_t io = 1; io <= over; io++) {
795 if (io == pos) continue;
796 board = (AliMUONTriggerGUIboard*)fBoards->UncheckedAt(number+io-pos);
798 board->SetDigitY(imt,iy,amp);
805 fBoard->ClearXDigits();
806 fBoard->ClearYDigits();
809 for (Int_t io = 1; io <= over; io++) {
810 if (io == pos) continue;
811 board = (AliMUONTriggerGUIboard*)fBoards->UncheckedAt(number+io-pos);
812 board->ClearYDigits();
815 fXStrips->SetState(kButtonUp);
816 fYStrips->SetState(kButtonUp);
817 fEditStrips->SetState(kButtonUp);
818 fIsEditable = kFALSE;
826 //__________________________________________________________________________
827 void AliMUONTriggerGUIbdmap::HandleButtons(Int_t id)
829 /// handle the check buttons
832 TGButton *btn = (TGButton *) gTQSender;
833 id = btn->WidgetId();
837 if(fXStrips->GetState() == kButtonDown &&
838 fYStrips->GetState() == kButtonDown ) {
841 DrawStrips(kTRUE,kTRUE);
842 DrawDigits(kTRUE,kTRUE);
849 if(fXStrips->GetState() == kButtonDown &&
850 fYStrips->GetState() == kButtonUp ) {
853 DrawStrips(kTRUE,kFALSE);
854 DrawDigits(kTRUE,kFALSE);
861 if(fXStrips->GetState() == kButtonUp &&
862 fYStrips->GetState() == kButtonDown ) {
865 DrawStrips(kFALSE,kTRUE);
866 DrawDigits(kFALSE,kTRUE);
873 if(fXStrips->GetState() == kButtonUp &&
874 fYStrips->GetState() == kButtonUp ) {
886 //__________________________________________________________________________
887 void AliMUONTriggerGUIbdmap::DrawClear()
889 /// draw the frame of the board image in the canvas
891 for (Int_t i = 0; i < kNMT; i++) {
896 fCanvas[i]->Modified();
897 fCanvas[i]->Update();
903 //__________________________________________________________________________
904 void AliMUONTriggerGUIbdmap::DrawDigits(Bool_t bx, Bool_t by)
906 /// draw the digits in "x" or/and "y"
908 AliRunLoader *runLoader = fLoader->GetRunLoader();
909 gAlice = runLoader->GetAliRun();
910 AliMUON *pMUON = (AliMUON*)gAlice->GetModule("MUON");
911 const AliMUONGeometryTransformer* kGeomTransformer = pMUON->GetGeometryTransformer();
913 AliMUONTriggerGUIboard *board;
914 TClonesArray *muonDigits;
915 Int_t nDigits, over, pos, number;
916 const AliMpVSegmentation* seg;
919 Int_t cathode, detElemId, ix, iy, charge;
920 Int_t chamber, np = 5;
922 Float_t xpmin, xpmax, ypmin, ypmax;
923 Float_t xg1, xg2, yg1, yg2, zg1;
924 Float_t xdw, ydw, xcw, ycw;
925 Double_t xc1, xc2, yc1, yc2;
928 Double_t xMin, xMax, yMin, yMax;
931 number = fBoard->GetNumber();
932 pos = fBoard->GetPosition();
933 over = fBoard->GetYOver();
935 for (Int_t i = 0; i < kNMT; i++) {
939 fCanvas[i]->GetRange(xc1,yc1,xc2,yc2);
940 xcw = (Float_t)(0.5*(xc2-xc1));
941 ycw = (Float_t)(0.5*(yc2-yc1));
945 muonDigits = fMUONData->Digits(chamber-1);
946 if (muonDigits == 0) { printf("No muonDigits \n"); return; }
947 gAlice->ResetDigits();
948 fMUONData->GetDigits();
949 nDigits = muonDigits->GetEntriesFast();
951 for (Int_t id = 0; id < nDigits; id++) {
953 mdig = (AliMUONDigit*)muonDigits->UncheckedAt(id);
955 cathode = mdig->Cathode()+1;
959 detElemId = mdig->DetElemId();
960 charge = (Int_t)mdig->Signal();
962 Bool_t triggerBgn = kFALSE;
963 Int_t schg = (Int_t)(charge + 0.5);
964 // APPLY CONDITION ON SOFT BACKGROUND
965 Int_t tchg = schg - (Int_t(schg/10))*10;
966 if (schg<=10 || tchg>0) {
972 if (detElemId%100 != fBoard->GetDetElemId()) continue;
974 seg = AliMpSegmentation::Instance()->GetMpSegmentation(detElemId, AliMp::GetCathodType(cathode-1));
976 pad = seg->PadByIndices(AliMpIntPair(ix,iy),kTRUE);
978 //if (cathode == 1) printf("GUI x: ix %d iy %d \n",ix,iy);
979 //if (cathode == 2) printf("GUI y: ix %d iy %d \n",ix,iy);
981 // get the pad position and dimensions
982 Float_t xlocal1 = pad.Position().X();
983 Float_t ylocal1 = pad.Position().Y();
984 Float_t xlocal2 = pad.Dimensions().X();
985 Float_t ylocal2 = pad.Dimensions().Y();
987 kGeomTransformer->Local2Global(detElemId, xlocal1, ylocal1, 0, xg1, yg1, zg1);
988 // (no transformation for pad dimensions)
992 // transform in the monitor coordinate system
993 //xpmin = -(xg1+xg2);
994 //xpmax = -(xg1-xg2);
995 //ypmin = -(yg2-yg1);
996 //ypmax = +(yg2+yg1);
1003 xpmin -= fXCenter[i];
1004 xpmax -= fXCenter[i];
1005 ypmin -= fYCenter[i];
1006 ypmax -= fYCenter[i];
1012 if ((xdw > ydw) && bx) {
1014 //printf("X strips mdig->Cathode() = %1d \n",mdig->Cathode());
1017 iX = fBoard->GetXSix();
1018 iY1 = fBoard->GetXSiy1();
1019 iY2 = fBoard->GetXSiy2();
1020 if (ix == iX && iy >= iY1 && iy <= iY2) {
1021 //printf("Digit indices (x-strip) ix = %3d iy = %3d board = %s %d chamber = %2d \n",ix,iy,fBoard->GetBoardName(),fBoard->GetNumber(),chamber);
1023 xpmin += 0.01*fXWidth[i];
1024 xpmax -= 0.01*fXWidth[i];
1028 boxd = new TBox(xpmin,ypmin,xpmax,ypmax);
1029 boxd->SetFillStyle(1001);
1030 if (triggerBgn) boxd->SetFillColor(6);
1031 else boxd->SetFillColor(5);
1032 boxd->SetBit(kCannotPick);
1035 fXDigBox[i][iy-iY1]->SetFillStyle(1001);
1036 fXDigBox[i][iy-iY1]->SetFillColor(2);
1037 fXDigBox[i][iy-iY1]->SetX1(xpmin);
1038 fXDigBox[i][iy-iY1]->SetY1(ypmin);
1039 fXDigBox[i][iy-iY1]->SetX2(xpmax);
1040 fXDigBox[i][iy-iY1]->SetY2(ypmax);
1041 fXDigBox[i][iy-iY1]->Draw();
1043 sprintf(cln,"%2d",(iy-iY1));
1044 fXLabelL[i][iy-iY1]->Clear();
1045 fXLabelL[i][iy-iY1]->AddText(cln);
1046 fXLabelL[i][iy-iY1]->Draw();
1047 fXLabelR[i][iy-iY1]->Clear();
1048 fXLabelR[i][iy-iY1]->AddText(cln);
1049 fXLabelR[i][iy-iY1]->Draw();
1051 fBoard->SetDigitX(i,iy-iY1,charge);
1058 if ((xdw < ydw) && by) {
1060 //printf("Y strips mdig->Cathode() = %1d \n",mdig->Cathode());
1063 iX1 = fBoard->GetYSix1();
1064 iX2 = fBoard->GetYSix2();
1065 iY = fBoard->GetYSiy();
1066 if (ix >= iX1 && ix <= iX2 && iy == iY) {
1067 //printf("Digit indices (y-strip) ix = %3d iy = %3d board = %s chamber = %2d \n",ix,iy,fBoard->GetBoardName(),chamber);
1068 ypmin = -0.5*fYWidth[i];
1069 ypmax = +0.5*fYWidth[i];
1071 ypmin = -0.5*fYWidth[i];
1072 ypmax = +0.5*fYWidth[i];
1073 ypmin += 0.01*fYWidth[i];
1074 ypmax -= 0.01*fYWidth[i];
1078 boxd = new TBox(xpmin,ypmin,xpmax,ypmax);
1079 boxd->SetFillStyle(1001);
1080 if (triggerBgn) boxd->SetFillColor(6);
1081 else boxd->SetFillColor(5);
1082 boxd->SetBit(kCannotPick);
1085 fYDigBox[i][ix-iX1]->SetFillStyle(1001);
1086 fYDigBox[i][ix-iX1]->SetFillColor(2);
1087 fYDigBox[i][ix-iX1]->SetX1(xpmin);
1088 fYDigBox[i][ix-iX1]->SetY1(ypmin);
1089 fYDigBox[i][ix-iX1]->SetX2(xpmax);
1090 fYDigBox[i][ix-iX1]->SetY2(ypmax);
1091 fYDigBox[i][ix-iX1]->Draw();
1093 sprintf(cln,"%2d",(ix-iX1));
1094 fYLabelL[i][ix-iX1]->Clear();
1095 fYLabelL[i][ix-iX1]->AddText(cln);
1096 fYLabelL[i][ix-iX1]->Draw();
1097 fYLabelR[i][ix-iX1]->Clear();
1098 fYLabelR[i][ix-iX1]->AddText(cln);
1099 fYLabelR[i][ix-iX1]->Draw();
1101 fBoard->SetDigitY(i,ix-iX1,charge);
1103 // extended y-strips
1104 for (Int_t io = 1; io <= over; io++) {
1105 if (io == pos) continue;
1106 board = (AliMUONTriggerGUIboard*)fBoards->UncheckedAt(number+io-pos);
1107 board->SetDigitY(i,ix-iX1,charge);
1113 } // end digits loop
1118 for (Int_t ix = 0; ix < fNStripX; ix++) {
1119 //if (fBoard->GetXDig(i,ix) > 0) {
1120 if (fXDigBox[i][ix]->GetFillStyle() == 1001 ||
1121 fBoard->GetXDig(i,ix) > 0) {
1123 px = fXDigPL[i][ix]->GetX();
1124 py = fXDigPL[i][ix]->GetY();
1130 for (Int_t ip = 0; ip < np; ip++) {
1131 xMin = TMath::Min(xMin,px[ip]);
1132 xMax = TMath::Max(xMax,px[ip]);
1133 yMin = TMath::Min(yMin,py[ip]);
1134 yMax = TMath::Max(yMax,py[ip]);
1137 if (fXDigBox[i][ix]->GetFillStyle() == 0) {
1138 fXDigBox[i][ix]->SetFillStyle(1001);
1139 fXDigBox[i][ix]->SetFillColor(2);
1140 fXDigBox[i][ix]->SetX1(xMin);
1141 fXDigBox[i][ix]->SetY1(yMin);
1142 fXDigBox[i][ix]->SetX2(xMax);
1143 fXDigBox[i][ix]->SetY2(yMax);
1146 sprintf(cln,"%2d",ix);
1148 fXLabelL[i][ix]->Clear();
1149 fXLabelL[i][ix]->AddText(cln);
1150 fXLabelL[i][ix]->Draw();
1152 fXLabelR[i][ix]->Clear();
1153 fXLabelR[i][ix]->AddText(cln);
1154 fXLabelR[i][ix]->Draw();
1156 fXDigBox[i][ix]->Draw();
1167 for (Int_t iy = 0; iy < fNStripY; iy++) {
1168 //if (fBoard->GetYDig(i,iy) > 0) {
1169 if (fYDigBox[i][iy]->GetFillStyle() == 1001 ||
1170 fBoard->GetYDig(i,iy) > 0) {
1172 px = fYDigPL[i][iy]->GetX();
1173 py = fYDigPL[i][iy]->GetY();
1179 for (Int_t ip = 0; ip < np; ip++) {
1180 xMin = TMath::Min(xMin,px[ip]);
1181 xMax = TMath::Max(xMax,px[ip]);
1182 yMin = TMath::Min(yMin,py[ip]);
1183 yMax = TMath::Max(yMax,py[ip]);
1186 if (fYDigBox[i][iy]->GetFillStyle() == 0) {
1187 fYDigBox[i][iy]->SetFillStyle(1001);
1188 fYDigBox[i][iy]->SetFillColor(2);
1189 fYDigBox[i][iy]->SetX1(xMin);
1190 fYDigBox[i][iy]->SetY1(yMin);
1191 fYDigBox[i][iy]->SetX2(xMax);
1192 fYDigBox[i][iy]->SetY2(yMax);
1195 sprintf(cln,"%2d",iy);
1197 fYLabelL[i][iy]->Clear();
1198 fYLabelL[i][iy]->AddText(cln);
1199 fYLabelL[i][iy]->Draw();
1201 fYLabelR[i][iy]->Clear();
1202 fYLabelR[i][iy]->AddText(cln);
1203 fYLabelR[i][iy]->Draw();
1206 fYDigBox[i][iy]->Draw();
1214 fCanvas[i]->Modified();
1215 fCanvas[i]->Update();
1217 } // end canvas loop
1223 //__________________________________________________________________________
1224 void AliMUONTriggerGUIbdmap::DrawStrips(Bool_t bx, Bool_t by)
1226 /// draw the "x" or/and "y" strips
1228 AliRunLoader *runLoader = fLoader->GetRunLoader();
1229 gAlice = runLoader->GetAliRun();
1230 AliMUON *pMUON = (AliMUON*)gAlice->GetModule("MUON");
1231 const AliMUONGeometryTransformer* kGeomTransformer = pMUON->GetGeometryTransformer();
1233 const AliMpVSegmentation* seg;
1237 Float_t xg1, xg2, yg1, yg2, zg1;
1238 Float_t xlocal1, xlocal2, ylocal1, ylocal2;
1239 Int_t detElemId, ic, maxX, maxY;
1240 Float_t xdw, ydw, xpmin, xpmax, ypmin, ypmax;
1241 Float_t ptx1, ptx2, pty1, pty2;
1243 Double_t xc1, xc2, yc1, yc2;
1246 Bool_t makeLabelsX = kFALSE;
1247 Bool_t makeLabelsY = kFALSE;
1249 if (bx && !fLabelX) {
1250 makeLabelsX = kTRUE;
1254 if (by && !fLabelY) {
1255 makeLabelsY = kTRUE;
1259 for (Int_t i = 0; i < kNMT; i++) {
1263 fCanvas[i]->GetRange(xc1,yc1,xc2,yc2);
1264 xcw = (Float_t)(0.5*(xc2-xc1));
1265 ycw = (Float_t)(0.5*(yc2-yc1));
1269 for ( it.First(chamber-1); ! it.IsDone(); it.Next() ) {
1271 detElemId = it.CurrentDEId();
1273 if (detElemId%100 != fBoard->GetDetElemId()) continue;
1275 /*---------- y-pads ic = 2 ----------*/
1278 seg = AliMpSegmentation::Instance()->GetMpSegmentation(detElemId, AliMp::GetCathodType(ic-1));
1280 maxX = seg->MaxPadIndexX();
1281 maxY = seg->MaxPadIndexY();
1283 for (Int_t ix = 0; ix <= maxX; ix++) {
1284 for (Int_t iy = 0; iy <= maxY; iy++) {
1286 pad = seg->PadByIndices(AliMpIntPair(ix,iy),kFALSE);
1288 if (!pad.IsValid()) continue;
1290 // get the pad position and dimensions
1291 xlocal1 = pad.Position().X();
1292 ylocal1 = pad.Position().Y();
1293 xlocal2 = pad.Dimensions().X();
1294 ylocal2 = pad.Dimensions().Y();
1296 kGeomTransformer->Local2Global(detElemId, xlocal1, ylocal1, 0, xg1, yg1, zg1);
1297 // (no transformation for pad dimensions)
1301 // transform in the monitor coordinate system
1302 //xpmin = -(xg1+xg2);
1303 //xpmax = -(xg1-xg2);
1304 //ypmin = -(yg2-yg1);
1305 //ypmax = +(yg2+yg1);
1312 xpmin -= fXCenter[i];
1313 xpmax -= fXCenter[i];
1314 ypmin -= fYCenter[i];
1315 ypmax -= fYCenter[i];
1323 Int_t iX1, iX2, iY, ixDig;
1324 iX1 = fBoard->GetYSix1();
1325 iX2 = fBoard->GetYSix2();
1326 iY = fBoard->GetYSiy();
1327 if (ix >= iX1 && ix <= iX2 && iy == iY) {
1329 ypmin = -0.5*fYWidth[i];
1330 ypmax = +0.5*fYWidth[i];
1332 ypmin += 0.01*fYWidth[i];
1333 ypmax -= 0.01*fYWidth[i];
1338 fYDigPL[i][ixDig]->SetPoint(0,xpmin,ypmin);
1339 fYDigPL[i][ixDig]->SetPoint(1,xpmax,ypmin);
1340 fYDigPL[i][ixDig]->SetPoint(2,xpmax,ypmax);
1341 fYDigPL[i][ixDig]->SetPoint(3,xpmin,ypmax);
1342 fYDigPL[i][ixDig]->SetPoint(4,xpmin,ypmin);
1343 fYDigPL[i][ixDig]->Draw();
1345 fYDigBox[i][ixDig]->SetFillStyle(1001);
1346 fYDigBox[i][ixDig]->SetFillColor(5);
1347 fYDigBox[i][ixDig]->DrawBox(xpmin,ypmin,xpmax,ypmax);
1350 sprintf(cln,"%2d",(ix-iX1));
1354 pty1 = 1.065*ypmin - 0.04*ycw;
1355 pty2 = 1.065*ypmin + 0.04*ycw;
1356 fYLabelL[i][ix-iX1] = new TPaveText(ptx1,pty1,ptx2,pty2);
1357 fYLabelL[i][ix-iX1]->SetBorderSize(0);
1358 fYLabelL[i][ix-iX1]->SetBit(kCannotPick);
1360 pty1 = 1.065*ypmax - 0.04*ycw;
1361 pty2 = 1.065*ypmax + 0.04*ycw;
1362 fYLabelR[i][ix-iX1] = new TPaveText(ptx1,pty1,ptx2,pty2);
1363 fYLabelR[i][ix-iX1]->SetBorderSize(0);
1364 fYLabelR[i][ix-iX1]->SetBit(kCannotPick);
1375 /*---------- x-pads ic = 1 ----------*/
1378 seg = AliMpSegmentation::Instance()->GetMpSegmentation(detElemId, AliMp::GetCathodType(ic-1));
1380 maxX = seg->MaxPadIndexX();
1381 maxY = seg->MaxPadIndexY();
1383 for (Int_t ix = 0; ix <= maxX; ix++) {
1384 for (Int_t iy = 0; iy <= maxY; iy++) {
1386 pad = seg->PadByIndices(AliMpIntPair(ix,iy),kFALSE);
1388 if (!pad.IsValid()) continue;
1390 // get the pad position and dimensions
1391 xlocal1 = pad.Position().X();
1392 ylocal1 = pad.Position().Y();
1393 xlocal2 = pad.Dimensions().X();
1394 ylocal2 = pad.Dimensions().Y();
1396 kGeomTransformer->Local2Global(detElemId, xlocal1, ylocal1, 0, xg1, yg1, zg1);
1397 // (no transformation for pad dimensions)
1401 // transform in the monitor coordinate system
1402 //xpmin = -(xg1+xg2);
1403 //xpmax = -(xg1-xg2);
1404 //ypmin = -(yg2-yg1);
1405 //ypmax = +(yg2+yg1);
1412 xpmin -= fXCenter[i];
1413 xpmax -= fXCenter[i];
1414 ypmin -= fYCenter[i];
1415 ypmax -= fYCenter[i];
1422 Int_t iX, iY1, iY2, iyDig;
1423 iX = fBoard->GetXSix();
1424 iY1 = fBoard->GetXSiy1();
1425 iY2 = fBoard->GetXSiy2();
1426 if (ix == iX && iy >= iY1 && iy <= iY2) {
1428 xpmin += 0.01*fXWidth[i];
1429 xpmax -= 0.01*fXWidth[i];
1434 fXDigPL[i][iyDig]->SetPoint(0,xpmin,ypmin);
1435 fXDigPL[i][iyDig]->SetPoint(1,xpmax,ypmin);
1436 fXDigPL[i][iyDig]->SetPoint(2,xpmax,ypmax);
1437 fXDigPL[i][iyDig]->SetPoint(3,xpmin,ypmax);
1438 fXDigPL[i][iyDig]->SetPoint(4,xpmin,ypmin);
1439 fXDigPL[i][iyDig]->Draw();
1441 fXDigBox[i][iyDig]->SetFillStyle(1001);
1442 fXDigBox[i][iyDig]->SetFillColor(5);
1443 fXDigBox[i][iyDig]->DrawBox(xpmin,ypmin,xpmax,ypmax);
1446 sprintf(cln,"%2d",(iy-iY1));
1450 ptx1 = 1.065*xpmin - 0.04*xcw;
1451 ptx2 = 1.065*xpmin + 0.04*xcw;
1452 fXLabelL[i][iy-iY1] = new TPaveText(ptx1,pty1,ptx2,pty2);
1453 fXLabelL[i][iy-iY1]->SetBorderSize(0);
1454 fXLabelL[i][iy-iY1]->SetBit(kCannotPick);
1456 ptx1 = 1.065*xpmax - 0.04*xcw;
1457 ptx2 = 1.065*xpmax + 0.04*xcw;
1458 fXLabelR[i][iy-iY1] = new TPaveText(ptx1,pty1,ptx2,pty2);
1459 fXLabelR[i][iy-iY1]->SetBorderSize(0);
1460 fXLabelR[i][iy-iY1]->SetBit(kCannotPick);
1473 fCanvas[i]->Modified();
1474 fCanvas[i]->Update();
1482 //__________________________________________________________________________
1483 void AliMUONTriggerGUIbdmap::CloseWindow()
1485 /// close dialog in response to window manager close.
1491 //__________________________________________________________________________
1492 void AliMUONTriggerGUIbdmap::DoClose()
1494 /// handle Close button.
1496 fBoard->SetOpen(kFALSE);
1497 TTimer::SingleShot(150,"AliMUONTriggerGUIbdmap",this,"CloseWindow()");