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 /// \class AliMUONTriggerGUIbdmap
20 /// The gui map of a single board object, strips/digits
22 /// \author Bogdan Vulpescu, LPC Clermont-Ferrand
24 #include <TPolyLine.h>
27 #include <TRootEmbeddedCanvas.h>
29 #include <TPaveText.h>
30 #include <TGTextEdit.h>
33 #include <TObjArray.h>
38 #include "AliMUONVDigit.h"
39 #include "AliMpVSegmentation.h"
40 #include "AliMpSegmentation.h"
41 #include "AliMUONGeometryTransformer.h"
42 #include "AliMpDEIterator.h"
43 #include "AliMUONLocalTrigger.h"
44 #include "AliMUONLocalTriggerBoard.h"
45 #include "AliMUONTriggerCrateStore.h"
47 #include "AliMUONTriggerGUIboard.h"
48 #include "AliMUONTriggerGUIbdmap.h"
50 #include "AliMUONVTriggerStore.h"
51 #include "AliMUONVDigitStore.h"
53 #include "AliMpDEManager.h"
56 ClassImp(AliMUONTriggerGUIbdmap)
59 //__________________________________________________________________________
60 AliMUONTriggerGUIbdmap::AliMUONTriggerGUIbdmap(const TGWindow *p, const TGWindow *main, UInt_t w, UInt_t h)
81 gStyle->SetPadLeftMargin(0.05);
82 gStyle->SetPadRightMargin(0.05);
83 gStyle->SetPadTopMargin(0.05);
84 gStyle->SetPadBottomMargin(0.05);
86 fMain = new TGTransientFrame(p, main, w, h, kVerticalFrame);
87 fMain->Connect("CloseWindow()", "AliMUONTriggerGUIbdmap", this, "CloseWindow()");
88 fMain->DontCallClose(); // to avoid double deletions.
90 // use hierarchical cleaning
91 fMain->SetCleanup(kDeepCleanup);
93 fMain->ChangeOptions((fMain->GetOptions() & ~kVerticalFrame) | kHorizontalFrame);
95 // strips/digits canvases
99 TRootEmbeddedCanvas *recanvas[4];
101 for (Int_t i = 0; i < kNMT; i++) {
103 sprintf(ecname,"%1d",i+1);
104 recanvas[i] = new TRootEmbeddedCanvas(ecname,fMain,fCanvasSize,fCanvasSize);
106 fCanvas[i] = recanvas[i]->GetCanvas();
108 fCanvas[i]->SetBorderMode(0);
109 fCanvas[i]->SetBit(kNoContextMenu);
111 fCanvas[i]->Connect("ProcessedEvent(Int_t,Int_t,Int_t,TObject*)",
112 "AliMUONTriggerGUIbdmap",this,
113 "EditStrips(Int_t,Int_t,Int_t,TObject*)");
115 fMain->AddFrame(recanvas[i],
117 new TGTableLayoutHints(2,5,2,6,
118 kLHintsExpandX|kLHintsExpandY |
119 kLHintsShrinkX|kLHintsShrinkY |
120 kLHintsFillX|kLHintsFillY)
122 new TGLayoutHints(kLHintsTop |
129 //TGDimension size = fMain->GetDefaultSize();
130 //fMain->Resize(size);
134 TGCompositeFrame *cf0 = new TGCompositeFrame(fMain, 60, 20, kVerticalFrame);
136 TGCompositeFrame *cf1 = new TGCompositeFrame(cf0, 60, 20, kVerticalFrame | kFixedWidth);
138 cf1->AddFrame(fXStrips = new TGCheckButton(cf1, "Draw X strips and digits", 1),
139 new TGLayoutHints(kLHintsTop |
144 cf1->Resize(fXStrips->GetDefaultWidth()+10, fMain->GetDefaultHeight());
146 cf1->AddFrame(fYStrips = new TGCheckButton(cf1, "Draw Y strips and digits", 2),
147 new TGLayoutHints(kLHintsTop |
152 cf1->Resize(fYStrips->GetDefaultWidth()+10, fMain->GetDefaultHeight());
154 cf1->AddFrame(fEditStrips = new TGCheckButton(cf1, "Set/unset strips", 3),
155 new TGLayoutHints(kLHintsTop |
160 fXStrips->Connect("Clicked()", "AliMUONTriggerGUIbdmap", this, "HandleButtons()");
161 fYStrips->Connect("Clicked()", "AliMUONTriggerGUIbdmap", this, "HandleButtons()");
162 fEditStrips->Connect("Clicked()", "AliMUONTriggerGUIbdmap", this, "HandleEditButton()");
165 new TGLayoutHints(kLHintsTop |
170 TGCompositeFrame *cf2 = new TGCompositeFrame(cf0, 60, 20, kHorizontalFrame | kFixedWidth);
172 TGTextButton *digitsButton = new TGTextButton(cf2, "Digits", 4);
173 digitsButton->Connect("Clicked()", "AliMUONTriggerGUIbdmap", this, "DoDigits()");
175 //cf2->Resize(digitsButton->GetDefaultWidth()+40, fMain->GetDefaultHeight());
177 cf2->AddFrame(digitsButton,
178 new TGLayoutHints(kLHintsTop |
184 TGTextButton *dresetButton = new TGTextButton(cf2, "Reset", 5);
185 dresetButton->Connect("Clicked()", "AliMUONTriggerGUIbdmap", this, "ResetDigits()");
187 //cf2->Resize(dresetButton->GetDefaultWidth()+40, fMain->GetDefaultHeight());
189 cf2->AddFrame(dresetButton,
190 new TGLayoutHints(kLHintsTop |
196 TGTextButton *closeButton = new TGTextButton(cf2, "Close", 6);
197 closeButton->Connect("Clicked()", "AliMUONTriggerGUIbdmap", this, "DoClose()");
199 //cf2->Resize(closeButton->GetDefaultWidth()+40, fMain->GetDefaultHeight());
201 cf2->AddFrame(closeButton,
202 new TGLayoutHints(kLHintsTop |
209 new TGLayoutHints(kLHintsTop |
214 // editor window for the local trigger
216 TGCompositeFrame *cf3 = new TGCompositeFrame(cf0, 60, 20, kVerticalFrame | kFixedWidth);
218 fLocTrigE = new TGTextEdit(cf3, 100, 100, kSunkenFrame | kDoubleBorder);
219 cf3->AddFrame(fLocTrigE,
220 new TGLayoutHints(kLHintsExpandX |
226 new TGLayoutHints(kLHintsTop |
232 new TGLayoutHints(kLHintsTop |
237 fIsEditable = kFALSE;
241 fMain->MapSubwindows();
244 fMain->CenterOnParent();
246 //fMain->MapWindow();
247 //gClient->WaitFor(fMain);
251 //__________________________________________________________________________
252 AliMUONTriggerGUIbdmap::~AliMUONTriggerGUIbdmap()
256 fMain->DeleteWindow();
260 //__________________________________________________________________________
261 void AliMUONTriggerGUIbdmap::Show()
263 /// map the main frame
270 //__________________________________________________________________________
271 void AliMUONTriggerGUIbdmap::LocalTriggerInfo()
273 /// print the local trigger
275 AliMUONTriggerCrateStore* crateManager = new AliMUONTriggerCrateStore();
276 crateManager->ReadFromFile();
281 sprintf(buffer,"Local trigger info\n");
282 fLocTrigE->LoadBuffer(buffer);
284 AliRunLoader *runLoader = fLoader->GetRunLoader();
285 gAlice = runLoader->GetAliRun();
287 fLoader->LoadDigits("READ");
289 TTree* treeD = fLoader->TreeD();
291 AliMUONVTriggerStore* triggerStore = AliMUONVTriggerStore::Create(*treeD);
293 Int_t circuitNumber = fBoard->GetIdCircuit();
295 UShort_t x2m, x2u, x2d;
297 Int_t loStripX, loStripY, loDev, loCircuit, iStripX, iStripY, loLpt, loHpt;
298 AliMUONLocalTrigger *mlt;
300 TIter next(triggerStore->CreateLocalIterator());
302 while ( ( mlt = static_cast<AliMUONLocalTrigger*>(next()) ) )
304 loCircuit = mlt->LoCircuit();
306 if (loCircuit == circuitNumber) {
308 AliMUONLocalTriggerBoard* ltb = crateManager->LocalBoard(loCircuit);
309 x2d = ltb->GetSwitch(0);
310 x2m = ltb->GetSwitch(1);
311 x2u = ltb->GetSwitch(2);
313 loStripX = mlt->LoStripX();
314 loStripY = mlt->LoStripY();
315 loDev = mlt->LoDev();
316 loLpt = mlt->LoLpt();
317 loHpt = mlt->LoHpt();
319 iStripX = loStripX/2;
320 if ((x2u == 1 || x2m == 1 || x2d == 1) && x2m == 1) {
321 iStripY = loStripY/2;
326 sprintf(buffer,"Circuit = %03d",loCircuit);
327 txt.LoadBuffer(buffer);
328 fLocTrigE->AddText(&txt);
330 sprintf(buffer,"LoStripX = %2d",loStripX);
331 txt.LoadBuffer(buffer);
332 fLocTrigE->AddText(&txt);
334 sprintf(buffer,"LoStripY = %2d",loStripY);
335 txt.LoadBuffer(buffer);
336 fLocTrigE->AddText(&txt);
338 sprintf(buffer,"LoDev = %2d",loDev);
339 txt.LoadBuffer(buffer);
340 fLocTrigE->AddText(&txt);
342 sprintf(buffer,"--------------------");
343 txt.LoadBuffer(buffer);
344 fLocTrigE->AddText(&txt);
346 sprintf(buffer,"X-strip = %2d ( %2d )",iStripX,(loStripX+loDev+1)/2);
347 txt.LoadBuffer(buffer);
348 fLocTrigE->AddText(&txt);
350 sprintf(buffer,"Y-strip = %2d",iStripY);
351 txt.LoadBuffer(buffer);
352 fLocTrigE->AddText(&txt);
354 sprintf(buffer,"--------------------");
355 txt.LoadBuffer(buffer);
356 fLocTrigE->AddText(&txt);
358 sprintf(buffer,"LoLpt = %2d",loLpt);
359 txt.LoadBuffer(buffer);
360 fLocTrigE->AddText(&txt);
362 sprintf(buffer,"LoHpt = %2d",loHpt);
363 txt.LoadBuffer(buffer);
364 fLocTrigE->AddText(&txt);
375 //__________________________________________________________________________
376 void AliMUONTriggerGUIbdmap::Init()
378 /// initialize the boards in the four MT
380 TString mapspath = gSystem->Getenv("ALICE_ROOT");
381 mapspath.Append("/MUON/data");
383 TString mapName[kNMT];
384 mapName[0] = TString(mapspath.Data());
385 mapName[1] = TString(mapspath.Data());
386 mapName[2] = TString(mapspath.Data());
387 mapName[3] = TString(mapspath.Data());
388 mapName[0].Append("/guimapp11.txt");
389 mapName[1].Append("/guimapp12.txt");
390 mapName[2].Append("/guimapp13.txt");
391 mapName[3].Append("/guimapp14.txt");
393 Int_t side, col, line, nbx;
394 Float_t xCenter, yCenter, zCenter, xWidth, yWidth;
398 for (Int_t i = 0; i < kNMT; i++) {
400 fmap = fopen(mapName[i].Data(),"r");
402 for (Int_t ib = 0; ib < kNBoards; ib++) {
404 fscanf(fmap,"%d %d %d %d %f %f %f %f %f %s \n",&side,&col,&line,&nbx,&xCenter,&yCenter,&xWidth,&yWidth,&zCenter,&name[0]);
407 sprintf(name,"LC%1dL%1dB%1d%1d",col,line,2*nbx-1,2*nbx);
410 sprintf(name,"RC%1dL%1dB%1d%1d",col,line,2*nbx-1,2*nbx);
413 if (strncmp(name,fBoard->GetBoardName(),7) == 0) {
416 fXCenter[i] = xCenter;
417 fYCenter[i] = yCenter;
429 for (Int_t i = 0; i < kNMT; i++) {
430 xw = 1.20*fXWidth[i];
431 yw = 1.20*fYWidth[i];
432 fCanvas[i]->Range(-xw/2,-yw/2,+xw/2,+yw/2);
433 for (Int_t is = 0; is < kNS; is++) {
435 fXDigPL[i][is] = new TPolyLine(5);
436 fYDigPL[i][is] = new TPolyLine(5);
437 fXDigPL[i][is]->SetBit(kCannotPick);
438 fYDigPL[i][is]->SetBit(kCannotPick);
439 fXDigPL[i][is]->SetLineColor(4);
440 fYDigPL[i][is]->SetLineColor(4);
442 fXDigBox[i][is] = new TBox(0,0,0,0);
443 fYDigBox[i][is] = new TBox(0,0,0,0);
444 fXDigBox[i][is]->SetBit(kCannotPick);
445 fYDigBox[i][is]->SetBit(kCannotPick);
446 fXDigBox[i][is]->SetFillStyle(0);
447 fYDigBox[i][is]->SetFillStyle(0);
448 fXDigBox[i][is]->SetLineColor(4);
449 fYDigBox[i][is]->SetLineColor(4);
463 fNStripX = fBoard->GetXSiy2() - fBoard->GetXSiy1() + 1;
464 fNStripY = fBoard->GetYSix2() - fBoard->GetYSix1() + 1;
468 //__________________________________________________________________________
469 void AliMUONTriggerGUIbdmap::HandleEditButton()
471 /// handle the editable check button
473 if (((fXOn && !fYOn) || (!fXOn && fYOn)) &&
474 (fEditStrips->GetState() == kButtonDown)) {
477 fIsEditable = kFALSE;
482 //__________________________________________________________________________
483 void AliMUONTriggerGUIbdmap::EditStrips(Int_t event, Int_t x, Int_t y, TObject *sel)
490 Double_t xf1, yf1, xf2, yf2;
492 Double_t xMin, xMax, yMin, yMax;
493 Float_t xd, yd, fxDim, fyDim, cDim;
496 cDim = (Float_t)fCanvasSize;
498 // the (x,y) event does not really go up to the canvas size...
503 if (event == kButton1Down) {
505 cs = TString(sel->GetName());
510 fCanvas[iMT]->GetRange(xf1,yf1,xf2,yf2);
511 fxDim = (Float_t)xf2;
512 fyDim = (Float_t)yf2;
514 //xd = fxDim*(+2.0*(Float_t)(x)/cDim - 1.0);
515 //yd = fyDim*(-2.0*(Float_t)(y)/cDim + 1.0);
517 xd = +(2.0*fxDim*(Float_t)(x))/cDim - fxDim;
518 yd = -(2.0*fyDim*(Float_t)(y))/cDim + fyDim;
522 for (Int_t ix = 0; ix < fNStripX; ix++) {
524 px = fXDigPL[iMT][ix]->GetX();
525 py = fXDigPL[iMT][ix]->GetY();
531 for (Int_t ip = 0; ip < np; ip++) {
532 xMin = TMath::Min(xMin,px[ip]);
533 xMax = TMath::Max(xMax,px[ip]);
534 yMin = TMath::Min(yMin,py[ip]);
535 yMax = TMath::Max(yMax,py[ip]);
538 if (yd > (Float_t)yMin && yd < (Float_t)yMax) {
540 if (fXDigBox[iMT][ix]->GetFillStyle() == 0) {
542 fXDigBox[iMT][ix]->SetFillStyle(1001);
543 fXDigBox[iMT][ix]->SetFillColor(2);
545 sprintf(cln,"%2d",ix);
547 fXLabelL[iMT][ix]->Clear();
548 fXLabelL[iMT][ix]->AddText(cln);
549 fXLabelL[iMT][ix]->Draw();
551 fXLabelR[iMT][ix]->Clear();
552 fXLabelR[iMT][ix]->AddText(cln);
553 fXLabelR[iMT][ix]->Draw();
555 fXDigBox[iMT][ix]->SetX1(xMin);
556 fXDigBox[iMT][ix]->SetY1(yMin);
557 fXDigBox[iMT][ix]->SetX2(xMax);
558 fXDigBox[iMT][ix]->SetY2(yMax);
560 fXDigBox[iMT][ix]->Draw();
562 } else if (fXDigBox[iMT][ix]->GetFillStyle() == 1001) {
564 fXDigBox[iMT][ix]->SetFillStyle(0);
566 fXLabelL[iMT][ix]->Clear();
567 fXLabelL[iMT][ix]->Draw();
569 fXLabelR[iMT][ix]->Clear();
570 fXLabelR[iMT][ix]->Draw();
572 fXDigBox[iMT][ix]->SetX1(-fBoard->GetXCenter(iMT));
573 fXDigBox[iMT][ix]->SetY1(-fBoard->GetYCenter(iMT));
574 fXDigBox[iMT][ix]->SetX2(-fBoard->GetXCenter(iMT));
575 fXDigBox[iMT][ix]->SetY2(-fBoard->GetYCenter(iMT));
577 fXDigBox[iMT][ix]->Draw();
581 if (!fXDigBox[iMT][ix]->TestBit(kObjInCanvas))
582 fXDigBox[iMT][ix]->Draw();
584 fCanvas[iMT]->Modified();
585 fCanvas[iMT]->Update();
596 for (Int_t iy = 0; iy < fNStripY; iy++) {
598 px = fYDigPL[iMT][iy]->GetX();
599 py = fYDigPL[iMT][iy]->GetY();
605 for (Int_t ip = 0; ip < np; ip++) {
606 xMin = TMath::Min(xMin,px[ip]);
607 xMax = TMath::Max(xMax,px[ip]);
608 yMin = TMath::Min(yMin,py[ip]);
609 yMax = TMath::Max(yMax,py[ip]);
612 if (xd > (Float_t)xMin && xd < (Float_t)xMax) {
614 if (fYDigBox[iMT][iy]->GetFillStyle() == 0) {
616 fYDigBox[iMT][iy]->SetFillStyle(1001);
617 fYDigBox[iMT][iy]->SetFillColor(2);
619 sprintf(cln,"%2d",iy);
621 fYLabelL[iMT][iy]->Clear();
622 fYLabelL[iMT][iy]->AddText(cln);
623 fYLabelL[iMT][iy]->Draw();
625 fYLabelR[iMT][iy]->Clear();
626 fYLabelR[iMT][iy]->AddText(cln);
627 fYLabelR[iMT][iy]->Draw();
629 fYDigBox[iMT][iy]->SetX1(xMin);
630 fYDigBox[iMT][iy]->SetY1(yMin);
631 fYDigBox[iMT][iy]->SetX2(xMax);
632 fYDigBox[iMT][iy]->SetY2(yMax);
634 //fYDigBox[iMT][iy]->Draw();
636 } else if (fYDigBox[iMT][iy]->GetFillStyle() == 1001) {
638 fYDigBox[iMT][iy]->SetFillStyle(0);
640 fYLabelL[iMT][iy]->Clear();
641 fYLabelL[iMT][iy]->Draw();
643 fYLabelR[iMT][iy]->Clear();
644 fYLabelR[iMT][iy]->Draw();
646 fYDigBox[iMT][iy]->SetX1(-fBoard->GetXCenter(iMT));
647 fYDigBox[iMT][iy]->SetY1(-fBoard->GetYCenter(iMT));
648 fYDigBox[iMT][iy]->SetX2(-fBoard->GetXCenter(iMT));
649 fYDigBox[iMT][iy]->SetY2(-fBoard->GetYCenter(iMT));
651 //fYDigBox[iMT][iy]->Draw();
655 if (!fYDigBox[iMT][iy]->TestBit(kObjInCanvas))
656 fYDigBox[iMT][iy]->Draw();
658 fCanvas[iMT]->Modified();
659 fCanvas[iMT]->Update();
668 } // end button event
674 //__________________________________________________________________________
675 void AliMUONTriggerGUIbdmap::DoDigits()
677 /// set the board digits from GUI input (set/unset)
680 Int_t number = fBoard->GetNumber();
682 pos = fBoard->GetPosition();
683 over = fBoard->GetYOver();
684 AliMUONTriggerGUIboard *board;
686 for (Int_t imt = 0; imt < kNMT; imt++) {
688 for (Int_t ix = 0; ix < fNStripX; ix++) {
689 if (fXDigBox[imt][ix]->GetFillStyle() == 0) {
692 if (fXDigBox[imt][ix]->GetFillStyle() == 1001) {
695 fBoard->SetDigitX(imt,ix,amp);
698 for (Int_t iy = 0; iy < fNStripY; iy++) {
699 if (fYDigBox[imt][iy]->GetFillStyle() == 0) {
702 if (fYDigBox[imt][iy]->GetFillStyle() == 1001) {
705 fBoard->SetDigitY(imt,iy,amp);
708 for (Int_t io = 1; io <= over; io++) {
709 if (io == pos) continue;
710 board = (AliMUONTriggerGUIboard*)fBoards->UncheckedAt(number+io-pos);
711 board->SetDigitY(imt,iy,amp);
720 //__________________________________________________________________________
721 void AliMUONTriggerGUIbdmap::ResetDigits()
723 /// set the board digits from GUI input (set/unset)
726 Int_t number = fBoard->GetNumber();
727 AliMUONTriggerGUIboard *board;
729 pos = fBoard->GetPosition();
730 over = fBoard->GetYOver();
732 for (Int_t imt = 0; imt < kNMT; imt++) {
733 for (Int_t ix = 0; ix < fNStripX; ix++) {
734 fXDigBox[imt][ix]->SetFillStyle(0);
735 fXDigBox[imt][ix]->SetX1(-fBoard->GetXCenter(imt));
736 fXDigBox[imt][ix]->SetY1(-fBoard->GetYCenter(imt));
737 fXDigBox[imt][ix]->SetX2(-fBoard->GetXCenter(imt));
738 fXDigBox[imt][ix]->SetY2(-fBoard->GetYCenter(imt));
740 fBoard->SetDigitX(imt,ix,amp);
742 for (Int_t iy = 0; iy < fNStripY; iy++) {
743 fYDigBox[imt][iy]->SetFillStyle(0);
744 fYDigBox[imt][iy]->SetX1(-fBoard->GetXCenter(imt));
745 fYDigBox[imt][iy]->SetY1(-fBoard->GetYCenter(imt));
746 fYDigBox[imt][iy]->SetX2(-fBoard->GetXCenter(imt));
747 fYDigBox[imt][iy]->SetY2(-fBoard->GetYCenter(imt));
749 fBoard->SetDigitY(imt,iy,amp);
752 for (Int_t io = 1; io <= over; io++) {
753 if (io == pos) continue;
754 board = (AliMUONTriggerGUIboard*)fBoards->UncheckedAt(number+io-pos);
756 board->SetDigitY(imt,iy,amp);
763 fBoard->ClearXDigits();
764 fBoard->ClearYDigits();
767 for (Int_t io = 1; io <= over; io++) {
768 if (io == pos) continue;
769 board = (AliMUONTriggerGUIboard*)fBoards->UncheckedAt(number+io-pos);
770 board->ClearYDigits();
773 fXStrips->SetState(kButtonUp);
774 fYStrips->SetState(kButtonUp);
775 fEditStrips->SetState(kButtonUp);
776 fIsEditable = kFALSE;
784 //__________________________________________________________________________
785 void AliMUONTriggerGUIbdmap::HandleButtons(Int_t id)
787 /// handle the check buttons
790 TGButton *btn = (TGButton *) gTQSender;
791 id = btn->WidgetId();
795 if(fXStrips->GetState() == kButtonDown &&
796 fYStrips->GetState() == kButtonDown ) {
799 DrawStrips(kTRUE,kTRUE);
800 DrawDigits(kTRUE,kTRUE);
807 if(fXStrips->GetState() == kButtonDown &&
808 fYStrips->GetState() == kButtonUp ) {
811 DrawStrips(kTRUE,kFALSE);
812 DrawDigits(kTRUE,kFALSE);
819 if(fXStrips->GetState() == kButtonUp &&
820 fYStrips->GetState() == kButtonDown ) {
823 DrawStrips(kFALSE,kTRUE);
824 DrawDigits(kFALSE,kTRUE);
831 if(fXStrips->GetState() == kButtonUp &&
832 fYStrips->GetState() == kButtonUp ) {
844 //__________________________________________________________________________
845 void AliMUONTriggerGUIbdmap::DrawClear()
847 /// draw the frame of the board image in the canvas
849 for (Int_t i = 0; i < kNMT; i++) {
854 fCanvas[i]->Modified();
855 fCanvas[i]->Update();
861 //__________________________________________________________________________
862 void AliMUONTriggerGUIbdmap::DrawDigits(Bool_t bx, Bool_t by)
864 /// draw the digits in "x" or/and "y"
866 AliRunLoader *runLoader = fLoader->GetRunLoader();
867 gAlice = runLoader->GetAliRun();
868 AliMUON *pMUON = (AliMUON*)gAlice->GetModule("MUON");
869 const AliMUONGeometryTransformer* kGeomTransformer = pMUON->GetGeometryTransformer();
871 AliMUONTriggerGUIboard *board;
872 Int_t over, pos, number;
873 const AliMpVSegmentation* seg;
875 Int_t cathode, detElemId, ix, iy, charge;
876 Int_t chamber, np = 5;
878 Float_t xpmin, xpmax, ypmin, ypmax;
879 Float_t xg1, xg2, yg1, yg2, zg1;
880 Float_t xdw, ydw, xcw, ycw;
881 Double_t xc1, xc2, yc1, yc2;
884 Double_t xMin, xMax, yMin, yMax;
887 number = fBoard->GetNumber();
888 pos = fBoard->GetPosition();
889 over = fBoard->GetYOver();
891 fLoader->LoadDigits("READ");
892 TTree* treeD = fLoader->TreeD();
893 AliMUONVDigitStore* digitStore = AliMUONVDigitStore::Create(*treeD);
895 for (Int_t i = 0; i < kNMT; i++) {
899 fCanvas[i]->GetRange(xc1,yc1,xc2,yc2);
900 xcw = (Float_t)(0.5*(xc2-xc1));
901 ycw = (Float_t)(0.5*(yc2-yc1));
905 AliMpIntPair deRange = AliMpDEManager::GetDetElemIdRange(chamber-1);
906 TIter next(digitStore->CreateIterator(deRange.GetFirst(),deRange.GetSecond()));
909 while ( ( mdig = static_cast<AliMUONVDigit*>(next())) )
911 cathode = mdig->Cathode()+1;
915 detElemId = mdig->DetElemId();
916 charge = (Int_t)mdig->Charge();
918 Bool_t triggerBgn = kFALSE;
919 Int_t schg = (Int_t)(charge + 0.5);
920 // APPLY CONDITION ON SOFT BACKGROUND
921 Int_t tchg = schg - (Int_t(schg/10))*10;
922 if (schg<=10 || tchg>0) {
928 if (detElemId%100 != fBoard->GetDetElemId()) continue;
930 seg = AliMpSegmentation::Instance()->GetMpSegmentation(detElemId, AliMp::GetCathodType(cathode-1));
932 pad = seg->PadByIndices(AliMpIntPair(ix,iy),kTRUE);
934 //if (cathode == 1) printf("GUI x: ix %d iy %d \n",ix,iy);
935 //if (cathode == 2) printf("GUI y: ix %d iy %d \n",ix,iy);
937 // get the pad position and dimensions
938 Float_t xlocal1 = pad.Position().X();
939 Float_t ylocal1 = pad.Position().Y();
940 Float_t xlocal2 = pad.Dimensions().X();
941 Float_t ylocal2 = pad.Dimensions().Y();
943 kGeomTransformer->Local2Global(detElemId, xlocal1, ylocal1, 0, xg1, yg1, zg1);
944 // (no transformation for pad dimensions)
948 // transform in the monitor coordinate system
949 //xpmin = -(xg1+xg2);
950 //xpmax = -(xg1-xg2);
951 //ypmin = -(yg2-yg1);
952 //ypmax = +(yg2+yg1);
959 xpmin -= fXCenter[i];
960 xpmax -= fXCenter[i];
961 ypmin -= fYCenter[i];
962 ypmax -= fYCenter[i];
968 if ((xdw > ydw) && bx) {
970 //printf("X strips mdig->Cathode() = %1d \n",mdig->Cathode());
973 iX = fBoard->GetXSix();
974 iY1 = fBoard->GetXSiy1();
975 iY2 = fBoard->GetXSiy2();
976 if (ix == iX && iy >= iY1 && iy <= iY2) {
977 //printf("Digit indices (x-strip) ix = %3d iy = %3d board = %s %d chamber = %2d \n",ix,iy,fBoard->GetBoardName(),fBoard->GetNumber(),chamber);
979 xpmin += 0.01*fXWidth[i];
980 xpmax -= 0.01*fXWidth[i];
984 boxd = new TBox(xpmin,ypmin,xpmax,ypmax);
985 boxd->SetFillStyle(1001);
986 if (triggerBgn) boxd->SetFillColor(6);
987 else boxd->SetFillColor(5);
988 boxd->SetBit(kCannotPick);
991 fXDigBox[i][iy-iY1]->SetFillStyle(1001);
992 fXDigBox[i][iy-iY1]->SetFillColor(2);
993 fXDigBox[i][iy-iY1]->SetX1(xpmin);
994 fXDigBox[i][iy-iY1]->SetY1(ypmin);
995 fXDigBox[i][iy-iY1]->SetX2(xpmax);
996 fXDigBox[i][iy-iY1]->SetY2(ypmax);
997 fXDigBox[i][iy-iY1]->Draw();
999 sprintf(cln,"%2d",(iy-iY1));
1000 fXLabelL[i][iy-iY1]->Clear();
1001 fXLabelL[i][iy-iY1]->AddText(cln);
1002 fXLabelL[i][iy-iY1]->Draw();
1003 fXLabelR[i][iy-iY1]->Clear();
1004 fXLabelR[i][iy-iY1]->AddText(cln);
1005 fXLabelR[i][iy-iY1]->Draw();
1007 fBoard->SetDigitX(i,iy-iY1,charge);
1014 if ((xdw < ydw) && by) {
1016 //printf("Y strips mdig->Cathode() = %1d \n",mdig->Cathode());
1019 iX1 = fBoard->GetYSix1();
1020 iX2 = fBoard->GetYSix2();
1021 iY = fBoard->GetYSiy();
1022 if (ix >= iX1 && ix <= iX2 && iy == iY) {
1023 //printf("Digit indices (y-strip) ix = %3d iy = %3d board = %s chamber = %2d \n",ix,iy,fBoard->GetBoardName(),chamber);
1024 ypmin = -0.5*fYWidth[i];
1025 ypmax = +0.5*fYWidth[i];
1027 ypmin = -0.5*fYWidth[i];
1028 ypmax = +0.5*fYWidth[i];
1029 ypmin += 0.01*fYWidth[i];
1030 ypmax -= 0.01*fYWidth[i];
1034 boxd = new TBox(xpmin,ypmin,xpmax,ypmax);
1035 boxd->SetFillStyle(1001);
1036 if (triggerBgn) boxd->SetFillColor(6);
1037 else boxd->SetFillColor(5);
1038 boxd->SetBit(kCannotPick);
1041 fYDigBox[i][ix-iX1]->SetFillStyle(1001);
1042 fYDigBox[i][ix-iX1]->SetFillColor(2);
1043 fYDigBox[i][ix-iX1]->SetX1(xpmin);
1044 fYDigBox[i][ix-iX1]->SetY1(ypmin);
1045 fYDigBox[i][ix-iX1]->SetX2(xpmax);
1046 fYDigBox[i][ix-iX1]->SetY2(ypmax);
1047 fYDigBox[i][ix-iX1]->Draw();
1049 sprintf(cln,"%2d",(ix-iX1));
1050 fYLabelL[i][ix-iX1]->Clear();
1051 fYLabelL[i][ix-iX1]->AddText(cln);
1052 fYLabelL[i][ix-iX1]->Draw();
1053 fYLabelR[i][ix-iX1]->Clear();
1054 fYLabelR[i][ix-iX1]->AddText(cln);
1055 fYLabelR[i][ix-iX1]->Draw();
1057 fBoard->SetDigitY(i,ix-iX1,charge);
1059 // extended y-strips
1060 for (Int_t io = 1; io <= over; io++) {
1061 if (io == pos) continue;
1062 board = (AliMUONTriggerGUIboard*)fBoards->UncheckedAt(number+io-pos);
1063 board->SetDigitY(i,ix-iX1,charge);
1069 } // end digits loop
1074 for (Int_t ix = 0; ix < fNStripX; ix++) {
1075 //if (fBoard->GetXDig(i,ix) > 0) {
1076 if (fXDigBox[i][ix]->GetFillStyle() == 1001 ||
1077 fBoard->GetXDig(i,ix) > 0) {
1079 px = fXDigPL[i][ix]->GetX();
1080 py = fXDigPL[i][ix]->GetY();
1086 for (Int_t ip = 0; ip < np; ip++) {
1087 xMin = TMath::Min(xMin,px[ip]);
1088 xMax = TMath::Max(xMax,px[ip]);
1089 yMin = TMath::Min(yMin,py[ip]);
1090 yMax = TMath::Max(yMax,py[ip]);
1093 if (fXDigBox[i][ix]->GetFillStyle() == 0) {
1094 fXDigBox[i][ix]->SetFillStyle(1001);
1095 fXDigBox[i][ix]->SetFillColor(2);
1096 fXDigBox[i][ix]->SetX1(xMin);
1097 fXDigBox[i][ix]->SetY1(yMin);
1098 fXDigBox[i][ix]->SetX2(xMax);
1099 fXDigBox[i][ix]->SetY2(yMax);
1102 sprintf(cln,"%2d",ix);
1104 fXLabelL[i][ix]->Clear();
1105 fXLabelL[i][ix]->AddText(cln);
1106 fXLabelL[i][ix]->Draw();
1108 fXLabelR[i][ix]->Clear();
1109 fXLabelR[i][ix]->AddText(cln);
1110 fXLabelR[i][ix]->Draw();
1112 fXDigBox[i][ix]->Draw();
1123 for (Int_t iy = 0; iy < fNStripY; iy++) {
1124 //if (fBoard->GetYDig(i,iy) > 0) {
1125 if (fYDigBox[i][iy]->GetFillStyle() == 1001 ||
1126 fBoard->GetYDig(i,iy) > 0) {
1128 px = fYDigPL[i][iy]->GetX();
1129 py = fYDigPL[i][iy]->GetY();
1135 for (Int_t ip = 0; ip < np; ip++) {
1136 xMin = TMath::Min(xMin,px[ip]);
1137 xMax = TMath::Max(xMax,px[ip]);
1138 yMin = TMath::Min(yMin,py[ip]);
1139 yMax = TMath::Max(yMax,py[ip]);
1142 if (fYDigBox[i][iy]->GetFillStyle() == 0) {
1143 fYDigBox[i][iy]->SetFillStyle(1001);
1144 fYDigBox[i][iy]->SetFillColor(2);
1145 fYDigBox[i][iy]->SetX1(xMin);
1146 fYDigBox[i][iy]->SetY1(yMin);
1147 fYDigBox[i][iy]->SetX2(xMax);
1148 fYDigBox[i][iy]->SetY2(yMax);
1151 sprintf(cln,"%2d",iy);
1153 fYLabelL[i][iy]->Clear();
1154 fYLabelL[i][iy]->AddText(cln);
1155 fYLabelL[i][iy]->Draw();
1157 fYLabelR[i][iy]->Clear();
1158 fYLabelR[i][iy]->AddText(cln);
1159 fYLabelR[i][iy]->Draw();
1162 fYDigBox[i][iy]->Draw();
1170 fCanvas[i]->Modified();
1171 fCanvas[i]->Update();
1173 } // end canvas loop
1180 //__________________________________________________________________________
1181 void AliMUONTriggerGUIbdmap::DrawStrips(Bool_t bx, Bool_t by)
1183 /// draw the "x" or/and "y" strips
1185 AliRunLoader *runLoader = fLoader->GetRunLoader();
1186 gAlice = runLoader->GetAliRun();
1187 AliMUON *pMUON = (AliMUON*)gAlice->GetModule("MUON");
1188 const AliMUONGeometryTransformer* kGeomTransformer = pMUON->GetGeometryTransformer();
1190 const AliMpVSegmentation* seg;
1194 Float_t xg1, xg2, yg1, yg2, zg1;
1195 Float_t xlocal1, xlocal2, ylocal1, ylocal2;
1196 Int_t detElemId, ic, maxX, maxY;
1197 Float_t xdw, ydw, xpmin, xpmax, ypmin, ypmax;
1198 Float_t ptx1, ptx2, pty1, pty2;
1200 Double_t xc1, xc2, yc1, yc2;
1203 Bool_t makeLabelsX = kFALSE;
1204 Bool_t makeLabelsY = kFALSE;
1206 if (bx && !fLabelX) {
1207 makeLabelsX = kTRUE;
1211 if (by && !fLabelY) {
1212 makeLabelsY = kTRUE;
1216 for (Int_t i = 0; i < kNMT; i++) {
1220 fCanvas[i]->GetRange(xc1,yc1,xc2,yc2);
1221 xcw = (Float_t)(0.5*(xc2-xc1));
1222 ycw = (Float_t)(0.5*(yc2-yc1));
1226 for ( it.First(chamber-1); ! it.IsDone(); it.Next() ) {
1228 detElemId = it.CurrentDEId();
1230 if (detElemId%100 != fBoard->GetDetElemId()) continue;
1232 /*---------- y-pads ic = 2 ----------*/
1235 seg = AliMpSegmentation::Instance()->GetMpSegmentation(detElemId, AliMp::GetCathodType(ic-1));
1237 maxX = seg->MaxPadIndexX();
1238 maxY = seg->MaxPadIndexY();
1240 for (Int_t ix = 0; ix <= maxX; ix++) {
1241 for (Int_t iy = 0; iy <= maxY; iy++) {
1243 pad = seg->PadByIndices(AliMpIntPair(ix,iy),kFALSE);
1245 if (!pad.IsValid()) continue;
1247 // get the pad position and dimensions
1248 xlocal1 = pad.Position().X();
1249 ylocal1 = pad.Position().Y();
1250 xlocal2 = pad.Dimensions().X();
1251 ylocal2 = pad.Dimensions().Y();
1253 kGeomTransformer->Local2Global(detElemId, xlocal1, ylocal1, 0, xg1, yg1, zg1);
1254 // (no transformation for pad dimensions)
1258 // transform in the monitor coordinate system
1259 //xpmin = -(xg1+xg2);
1260 //xpmax = -(xg1-xg2);
1261 //ypmin = -(yg2-yg1);
1262 //ypmax = +(yg2+yg1);
1269 xpmin -= fXCenter[i];
1270 xpmax -= fXCenter[i];
1271 ypmin -= fYCenter[i];
1272 ypmax -= fYCenter[i];
1280 Int_t iX1, iX2, iY, ixDig;
1281 iX1 = fBoard->GetYSix1();
1282 iX2 = fBoard->GetYSix2();
1283 iY = fBoard->GetYSiy();
1284 if (ix >= iX1 && ix <= iX2 && iy == iY) {
1286 ypmin = -0.5*fYWidth[i];
1287 ypmax = +0.5*fYWidth[i];
1289 ypmin += 0.01*fYWidth[i];
1290 ypmax -= 0.01*fYWidth[i];
1295 fYDigPL[i][ixDig]->SetPoint(0,xpmin,ypmin);
1296 fYDigPL[i][ixDig]->SetPoint(1,xpmax,ypmin);
1297 fYDigPL[i][ixDig]->SetPoint(2,xpmax,ypmax);
1298 fYDigPL[i][ixDig]->SetPoint(3,xpmin,ypmax);
1299 fYDigPL[i][ixDig]->SetPoint(4,xpmin,ypmin);
1300 fYDigPL[i][ixDig]->Draw();
1302 fYDigBox[i][ixDig]->SetFillStyle(1001);
1303 fYDigBox[i][ixDig]->SetFillColor(5);
1304 fYDigBox[i][ixDig]->DrawBox(xpmin,ypmin,xpmax,ypmax);
1307 sprintf(cln,"%2d",(ix-iX1));
1311 pty1 = 1.065*ypmin - 0.04*ycw;
1312 pty2 = 1.065*ypmin + 0.04*ycw;
1313 fYLabelL[i][ix-iX1] = new TPaveText(ptx1,pty1,ptx2,pty2);
1314 fYLabelL[i][ix-iX1]->SetBorderSize(0);
1315 fYLabelL[i][ix-iX1]->SetBit(kCannotPick);
1317 pty1 = 1.065*ypmax - 0.04*ycw;
1318 pty2 = 1.065*ypmax + 0.04*ycw;
1319 fYLabelR[i][ix-iX1] = new TPaveText(ptx1,pty1,ptx2,pty2);
1320 fYLabelR[i][ix-iX1]->SetBorderSize(0);
1321 fYLabelR[i][ix-iX1]->SetBit(kCannotPick);
1332 /*---------- x-pads ic = 1 ----------*/
1335 seg = AliMpSegmentation::Instance()->GetMpSegmentation(detElemId, AliMp::GetCathodType(ic-1));
1337 maxX = seg->MaxPadIndexX();
1338 maxY = seg->MaxPadIndexY();
1340 for (Int_t ix = 0; ix <= maxX; ix++) {
1341 for (Int_t iy = 0; iy <= maxY; iy++) {
1343 pad = seg->PadByIndices(AliMpIntPair(ix,iy),kFALSE);
1345 if (!pad.IsValid()) continue;
1347 // get the pad position and dimensions
1348 xlocal1 = pad.Position().X();
1349 ylocal1 = pad.Position().Y();
1350 xlocal2 = pad.Dimensions().X();
1351 ylocal2 = pad.Dimensions().Y();
1353 kGeomTransformer->Local2Global(detElemId, xlocal1, ylocal1, 0, xg1, yg1, zg1);
1354 // (no transformation for pad dimensions)
1358 // transform in the monitor coordinate system
1359 //xpmin = -(xg1+xg2);
1360 //xpmax = -(xg1-xg2);
1361 //ypmin = -(yg2-yg1);
1362 //ypmax = +(yg2+yg1);
1369 xpmin -= fXCenter[i];
1370 xpmax -= fXCenter[i];
1371 ypmin -= fYCenter[i];
1372 ypmax -= fYCenter[i];
1379 Int_t iX, iY1, iY2, iyDig;
1380 iX = fBoard->GetXSix();
1381 iY1 = fBoard->GetXSiy1();
1382 iY2 = fBoard->GetXSiy2();
1383 if (ix == iX && iy >= iY1 && iy <= iY2) {
1385 xpmin += 0.01*fXWidth[i];
1386 xpmax -= 0.01*fXWidth[i];
1391 fXDigPL[i][iyDig]->SetPoint(0,xpmin,ypmin);
1392 fXDigPL[i][iyDig]->SetPoint(1,xpmax,ypmin);
1393 fXDigPL[i][iyDig]->SetPoint(2,xpmax,ypmax);
1394 fXDigPL[i][iyDig]->SetPoint(3,xpmin,ypmax);
1395 fXDigPL[i][iyDig]->SetPoint(4,xpmin,ypmin);
1396 fXDigPL[i][iyDig]->Draw();
1398 fXDigBox[i][iyDig]->SetFillStyle(1001);
1399 fXDigBox[i][iyDig]->SetFillColor(5);
1400 fXDigBox[i][iyDig]->DrawBox(xpmin,ypmin,xpmax,ypmax);
1403 sprintf(cln,"%2d",(iy-iY1));
1407 ptx1 = 1.065*xpmin - 0.04*xcw;
1408 ptx2 = 1.065*xpmin + 0.04*xcw;
1409 fXLabelL[i][iy-iY1] = new TPaveText(ptx1,pty1,ptx2,pty2);
1410 fXLabelL[i][iy-iY1]->SetBorderSize(0);
1411 fXLabelL[i][iy-iY1]->SetBit(kCannotPick);
1413 ptx1 = 1.065*xpmax - 0.04*xcw;
1414 ptx2 = 1.065*xpmax + 0.04*xcw;
1415 fXLabelR[i][iy-iY1] = new TPaveText(ptx1,pty1,ptx2,pty2);
1416 fXLabelR[i][iy-iY1]->SetBorderSize(0);
1417 fXLabelR[i][iy-iY1]->SetBit(kCannotPick);
1430 fCanvas[i]->Modified();
1431 fCanvas[i]->Update();
1439 //__________________________________________________________________________
1440 void AliMUONTriggerGUIbdmap::CloseWindow()
1442 /// close dialog in response to window manager close.
1448 //__________________________________________________________________________
1449 void AliMUONTriggerGUIbdmap::DoClose()
1451 /// handle Close button.
1453 fBoard->SetOpen(kFALSE);
1454 TTimer::SingleShot(150,"AliMUONTriggerGUIbdmap",this,"CloseWindow()");