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>
40 #include "AliMUONVDigit.h"
41 #include "AliMpVSegmentation.h"
42 #include "AliMpSegmentation.h"
43 #include "AliMUONGeometryTransformer.h"
44 #include "AliMpDEIterator.h"
45 #include "AliMUONLocalTrigger.h"
46 #include "AliMUONLocalTriggerBoard.h"
47 #include "AliMUONTriggerCrateStore.h"
48 #include "AliMUONMCDataInterface.h"
49 #include "AliMUONVTriggerStore.h"
50 #include "AliMUONVDigitStore.h"
51 #include "AliMpDEManager.h"
53 #include "AliMUONTriggerGUIboard.h"
54 #include "AliMUONTriggerGUIbdmap.h"
57 ClassImp(AliMUONTriggerGUIbdmap)
60 //__________________________________________________________________________
61 AliMUONTriggerGUIbdmap::AliMUONTriggerGUIbdmap(const TGWindow *p, const TGWindow *main, UInt_t w, UInt_t h)
80 fCalibrationData(0x0),
85 gStyle->SetPadLeftMargin(0.05);
86 gStyle->SetPadRightMargin(0.05);
87 gStyle->SetPadTopMargin(0.05);
88 gStyle->SetPadBottomMargin(0.05);
90 fMain = new TGTransientFrame(p, main, w, h, kVerticalFrame);
91 fMain->Connect("CloseWindow()", "AliMUONTriggerGUIbdmap", this, "CloseWindow()");
92 fMain->DontCallClose(); // to avoid double deletions.
94 // use hierarchical cleaning
95 fMain->SetCleanup(kDeepCleanup);
97 fMain->ChangeOptions((fMain->GetOptions() & ~kVerticalFrame) | kHorizontalFrame);
99 // strips/digits canvases
103 TRootEmbeddedCanvas *recanvas[4];
105 for (Int_t i = 0; i < kNMT; i++) {
107 sprintf(ecname,"%1d",i+1);
108 recanvas[i] = new TRootEmbeddedCanvas(ecname,fMain,fCanvasSize,fCanvasSize);
110 fCanvas[i] = recanvas[i]->GetCanvas();
112 fCanvas[i]->SetBorderMode(0);
113 fCanvas[i]->SetBit(kNoContextMenu);
115 fCanvas[i]->Connect("ProcessedEvent(Int_t,Int_t,Int_t,TObject*)",
116 "AliMUONTriggerGUIbdmap",this,
117 "EditStrips(Int_t,Int_t,Int_t,TObject*)");
119 fMain->AddFrame(recanvas[i],
121 new TGTableLayoutHints(2,5,2,6,
122 kLHintsExpandX|kLHintsExpandY |
123 kLHintsShrinkX|kLHintsShrinkY |
124 kLHintsFillX|kLHintsFillY)
126 new TGLayoutHints(kLHintsTop |
133 //TGDimension size = fMain->GetDefaultSize();
134 //fMain->Resize(size);
138 TGCompositeFrame *cf0 = new TGCompositeFrame(fMain, 60, 20, kVerticalFrame);
140 TGCompositeFrame *cf1 = new TGCompositeFrame(cf0, 60, 20, kVerticalFrame | kFixedWidth);
142 cf1->AddFrame(fXStrips = new TGCheckButton(cf1, "Draw X strips and digits", 1),
143 new TGLayoutHints(kLHintsTop |
148 cf1->Resize(fXStrips->GetDefaultWidth()+10, fMain->GetDefaultHeight());
150 cf1->AddFrame(fYStrips = new TGCheckButton(cf1, "Draw Y strips and digits", 2),
151 new TGLayoutHints(kLHintsTop |
156 cf1->Resize(fYStrips->GetDefaultWidth()+10, fMain->GetDefaultHeight());
158 cf1->AddFrame(fEditStrips = new TGCheckButton(cf1, "Set/unset strips", 3),
159 new TGLayoutHints(kLHintsTop |
164 fXStrips->Connect("Clicked()", "AliMUONTriggerGUIbdmap", this, "HandleButtons()");
165 fYStrips->Connect("Clicked()", "AliMUONTriggerGUIbdmap", this, "HandleButtons()");
166 fEditStrips->Connect("Clicked()", "AliMUONTriggerGUIbdmap", this, "HandleEditButton()");
169 new TGLayoutHints(kLHintsTop |
174 TGCompositeFrame *cf2 = new TGCompositeFrame(cf0, 60, 20, kHorizontalFrame | kFixedWidth);
176 TGTextButton *digitsButton = new TGTextButton(cf2, "Digits", 4);
177 digitsButton->Connect("Clicked()", "AliMUONTriggerGUIbdmap", this, "DoDigits()");
179 //cf2->Resize(digitsButton->GetDefaultWidth()+40, fMain->GetDefaultHeight());
181 cf2->AddFrame(digitsButton,
182 new TGLayoutHints(kLHintsTop |
188 TGTextButton *dresetButton = new TGTextButton(cf2, "Reset", 5);
189 dresetButton->Connect("Clicked()", "AliMUONTriggerGUIbdmap", this, "ResetDigits()");
191 //cf2->Resize(dresetButton->GetDefaultWidth()+40, fMain->GetDefaultHeight());
193 cf2->AddFrame(dresetButton,
194 new TGLayoutHints(kLHintsTop |
200 TGTextButton *closeButton = new TGTextButton(cf2, "Close", 6);
201 closeButton->Connect("Clicked()", "AliMUONTriggerGUIbdmap", this, "DoClose()");
203 //cf2->Resize(closeButton->GetDefaultWidth()+40, fMain->GetDefaultHeight());
205 cf2->AddFrame(closeButton,
206 new TGLayoutHints(kLHintsTop |
213 new TGLayoutHints(kLHintsTop |
218 // editor window for the local trigger
220 TGCompositeFrame *cf3 = new TGCompositeFrame(cf0, 60, 20, kVerticalFrame | kFixedWidth);
222 fLocTrigE = new TGTextEdit(cf3, 100, 100, kSunkenFrame | kDoubleBorder);
223 cf3->AddFrame(fLocTrigE,
224 new TGLayoutHints(kLHintsExpandX |
230 new TGLayoutHints(kLHintsTop |
236 new TGLayoutHints(kLHintsTop |
241 fIsEditable = kFALSE;
245 fMain->MapSubwindows();
248 fMain->CenterOnParent();
250 //fMain->MapWindow();
251 //gClient->WaitFor(fMain);
255 //__________________________________________________________________________
256 AliMUONTriggerGUIbdmap::~AliMUONTriggerGUIbdmap()
260 fMain->DeleteWindow();
264 //__________________________________________________________________________
265 void AliMUONTriggerGUIbdmap::Show()
267 /// map the main frame
274 //__________________________________________________________________________
275 void AliMUONTriggerGUIbdmap::LocalTriggerInfo()
277 /// print the local trigger
282 sprintf(buffer,"Local trigger info\n");
283 fLocTrigE->LoadBuffer(buffer);
285 AliRunLoader *runLoader = fLoader->GetRunLoader();
286 gAlice = runLoader->GetAliRun();
288 AliMUONVTriggerStore *triggerStore = fMCDataInterface->TriggerStore(runLoader->GetEventNumber());
290 Int_t circuitNumber = fBoard->GetIdCircuit();
292 UShort_t x2m, x2u, x2d;
294 Int_t loStripX, loStripY, loDev, loCircuit, iStripX, iStripY, loLpt, loHpt;
295 AliMUONLocalTrigger *mlt;
297 TIter next(triggerStore->CreateLocalIterator());
299 while ( ( mlt = static_cast<AliMUONLocalTrigger*>(next()) ) )
301 loCircuit = mlt->LoCircuit();
303 if (loCircuit == circuitNumber) {
305 AliMUONLocalTriggerBoard* ltb = fCrateManager->LocalBoard(loCircuit);
306 x2d = ltb->GetSwitch(0);
307 x2m = ltb->GetSwitch(1);
308 x2u = ltb->GetSwitch(2);
310 loStripX = mlt->LoStripX();
311 loStripY = mlt->LoStripY();
312 loDev = mlt->LoDev();
313 loLpt = mlt->LoLpt();
314 loHpt = mlt->LoHpt();
316 iStripX = loStripX/2;
317 if ((x2u == 1 || x2m == 1 || x2d == 1) && x2m == 1) {
318 iStripY = loStripY/2;
323 sprintf(buffer,"Circuit = %03d",loCircuit);
324 txt.LoadBuffer(buffer);
325 fLocTrigE->AddText(&txt);
327 sprintf(buffer,"LoStripX = %2d",loStripX);
328 txt.LoadBuffer(buffer);
329 fLocTrigE->AddText(&txt);
331 sprintf(buffer,"LoStripY = %2d",loStripY);
332 txt.LoadBuffer(buffer);
333 fLocTrigE->AddText(&txt);
335 sprintf(buffer,"LoDev = %2d",loDev);
336 txt.LoadBuffer(buffer);
337 fLocTrigE->AddText(&txt);
339 sprintf(buffer,"--------------------");
340 txt.LoadBuffer(buffer);
341 fLocTrigE->AddText(&txt);
343 sprintf(buffer,"X-strip = %2d ( %2d )",iStripX,(loStripX+loDev+1)/2);
344 txt.LoadBuffer(buffer);
345 fLocTrigE->AddText(&txt);
347 sprintf(buffer,"Y-strip = %2d",iStripY);
348 txt.LoadBuffer(buffer);
349 fLocTrigE->AddText(&txt);
351 sprintf(buffer,"--------------------");
352 txt.LoadBuffer(buffer);
353 fLocTrigE->AddText(&txt);
355 sprintf(buffer,"LoLpt = %2d",loLpt);
356 txt.LoadBuffer(buffer);
357 fLocTrigE->AddText(&txt);
359 sprintf(buffer,"LoHpt = %2d",loHpt);
360 txt.LoadBuffer(buffer);
361 fLocTrigE->AddText(&txt);
371 //__________________________________________________________________________
372 void AliMUONTriggerGUIbdmap::Init()
374 /// initialize the boards in the four MT
376 TString mapspath = gSystem->Getenv("ALICE_ROOT");
377 mapspath.Append("/MUON/data");
379 TString mapName[kNMT];
380 mapName[0] = TString(mapspath.Data());
381 mapName[1] = TString(mapspath.Data());
382 mapName[2] = TString(mapspath.Data());
383 mapName[3] = TString(mapspath.Data());
384 mapName[0].Append("/guimapp11.txt");
385 mapName[1].Append("/guimapp12.txt");
386 mapName[2].Append("/guimapp13.txt");
387 mapName[3].Append("/guimapp14.txt");
389 Int_t side, col, line, nbx;
390 Float_t xCenter, yCenter, zCenter, xWidth, yWidth;
394 for (Int_t i = 0; i < kNMT; i++) {
396 fmap = fopen(mapName[i].Data(),"r");
398 for (Int_t ib = 0; ib < kNBoards; ib++) {
400 fscanf(fmap,"%d %d %d %d %f %f %f %f %f %s \n",&side,&col,&line,&nbx,&xCenter,&yCenter,&xWidth,&yWidth,&zCenter,&name[0]);
403 sprintf(name,"LC%1dL%1dB%1d%1d",col,line,2*nbx-1,2*nbx);
406 sprintf(name,"RC%1dL%1dB%1d%1d",col,line,2*nbx-1,2*nbx);
409 if (strncmp(name,fBoard->GetBoardName(),7) == 0) {
412 fXCenter[i] = xCenter;
413 fYCenter[i] = yCenter;
425 for (Int_t i = 0; i < kNMT; i++) {
426 xw = 1.20*fXWidth[i];
427 yw = 1.20*fYWidth[i];
428 fCanvas[i]->Range(-xw/2,-yw/2,+xw/2,+yw/2);
429 for (Int_t is = 0; is < kNS; is++) {
431 fXDigPL[i][is] = new TPolyLine(5);
432 fYDigPL[i][is] = new TPolyLine(5);
433 fXDigPL[i][is]->SetBit(kCannotPick);
434 fYDigPL[i][is]->SetBit(kCannotPick);
435 fXDigPL[i][is]->SetLineColor(4);
436 fYDigPL[i][is]->SetLineColor(4);
438 fXDigBox[i][is] = new TBox(0,0,0,0);
439 fYDigBox[i][is] = new TBox(0,0,0,0);
440 fXDigBox[i][is]->SetBit(kCannotPick);
441 fYDigBox[i][is]->SetBit(kCannotPick);
442 fXDigBox[i][is]->SetFillStyle(0);
443 fYDigBox[i][is]->SetFillStyle(0);
444 fXDigBox[i][is]->SetLineColor(4);
445 fYDigBox[i][is]->SetLineColor(4);
459 fNStripX = fBoard->GetXSiy2() - fBoard->GetXSiy1() + 1;
460 fNStripY = fBoard->GetYSix2() - fBoard->GetYSix1() + 1;
464 //__________________________________________________________________________
465 void AliMUONTriggerGUIbdmap::HandleEditButton()
467 /// handle the editable check button
469 if (((fXOn && !fYOn) || (!fXOn && fYOn)) &&
470 (fEditStrips->GetState() == kButtonDown)) {
473 fIsEditable = kFALSE;
478 //__________________________________________________________________________
479 void AliMUONTriggerGUIbdmap::EditStrips(Int_t event, Int_t x, Int_t y, TObject *sel)
486 Double_t xf1, yf1, xf2, yf2;
488 Double_t xMin, xMax, yMin, yMax;
489 Float_t xd, yd, fxDim, fyDim, cDim;
492 cDim = (Float_t)fCanvasSize;
494 // the (x,y) event does not really go up to the canvas size...
499 if (event == kButton1Down) {
501 cs = TString(sel->GetName());
506 fCanvas[iMT]->GetRange(xf1,yf1,xf2,yf2);
507 fxDim = (Float_t)xf2;
508 fyDim = (Float_t)yf2;
510 //xd = fxDim*(+2.0*(Float_t)(x)/cDim - 1.0);
511 //yd = fyDim*(-2.0*(Float_t)(y)/cDim + 1.0);
513 xd = +(2.0*fxDim*(Float_t)(x))/cDim - fxDim;
514 yd = -(2.0*fyDim*(Float_t)(y))/cDim + fyDim;
518 for (Int_t ix = 0; ix < fNStripX; ix++) {
520 px = fXDigPL[iMT][ix]->GetX();
521 py = fXDigPL[iMT][ix]->GetY();
527 for (Int_t ip = 0; ip < np; ip++) {
528 xMin = TMath::Min(xMin,px[ip]);
529 xMax = TMath::Max(xMax,px[ip]);
530 yMin = TMath::Min(yMin,py[ip]);
531 yMax = TMath::Max(yMax,py[ip]);
534 if (yd > (Float_t)yMin && yd < (Float_t)yMax) {
536 if (fXDigBox[iMT][ix]->GetFillStyle() == 0) {
538 fXDigBox[iMT][ix]->SetFillStyle(1001);
539 fXDigBox[iMT][ix]->SetFillColor(2);
541 sprintf(cln,"%2d",ix);
543 fXLabelL[iMT][ix]->Clear();
544 fXLabelL[iMT][ix]->AddText(cln);
545 fXLabelL[iMT][ix]->Draw();
547 fXLabelR[iMT][ix]->Clear();
548 fXLabelR[iMT][ix]->AddText(cln);
549 fXLabelR[iMT][ix]->Draw();
551 fXDigBox[iMT][ix]->SetX1(xMin);
552 fXDigBox[iMT][ix]->SetY1(yMin);
553 fXDigBox[iMT][ix]->SetX2(xMax);
554 fXDigBox[iMT][ix]->SetY2(yMax);
556 fXDigBox[iMT][ix]->Draw();
558 } else if (fXDigBox[iMT][ix]->GetFillStyle() == 1001) {
560 fXDigBox[iMT][ix]->SetFillStyle(0);
562 fXLabelL[iMT][ix]->Clear();
563 fXLabelL[iMT][ix]->Draw();
565 fXLabelR[iMT][ix]->Clear();
566 fXLabelR[iMT][ix]->Draw();
568 fXDigBox[iMT][ix]->SetX1(-fBoard->GetXCenter(iMT));
569 fXDigBox[iMT][ix]->SetY1(-fBoard->GetYCenter(iMT));
570 fXDigBox[iMT][ix]->SetX2(-fBoard->GetXCenter(iMT));
571 fXDigBox[iMT][ix]->SetY2(-fBoard->GetYCenter(iMT));
573 fXDigBox[iMT][ix]->Draw();
577 if (!fXDigBox[iMT][ix]->TestBit(kObjInCanvas))
578 fXDigBox[iMT][ix]->Draw();
580 fCanvas[iMT]->Modified();
581 fCanvas[iMT]->Update();
592 for (Int_t iy = 0; iy < fNStripY; iy++) {
594 px = fYDigPL[iMT][iy]->GetX();
595 py = fYDigPL[iMT][iy]->GetY();
601 for (Int_t ip = 0; ip < np; ip++) {
602 xMin = TMath::Min(xMin,px[ip]);
603 xMax = TMath::Max(xMax,px[ip]);
604 yMin = TMath::Min(yMin,py[ip]);
605 yMax = TMath::Max(yMax,py[ip]);
608 if (xd > (Float_t)xMin && xd < (Float_t)xMax) {
610 if (fYDigBox[iMT][iy]->GetFillStyle() == 0) {
612 fYDigBox[iMT][iy]->SetFillStyle(1001);
613 fYDigBox[iMT][iy]->SetFillColor(2);
615 sprintf(cln,"%2d",iy);
617 fYLabelL[iMT][iy]->Clear();
618 fYLabelL[iMT][iy]->AddText(cln);
619 fYLabelL[iMT][iy]->Draw();
621 fYLabelR[iMT][iy]->Clear();
622 fYLabelR[iMT][iy]->AddText(cln);
623 fYLabelR[iMT][iy]->Draw();
625 fYDigBox[iMT][iy]->SetX1(xMin);
626 fYDigBox[iMT][iy]->SetY1(yMin);
627 fYDigBox[iMT][iy]->SetX2(xMax);
628 fYDigBox[iMT][iy]->SetY2(yMax);
630 //fYDigBox[iMT][iy]->Draw();
632 } else if (fYDigBox[iMT][iy]->GetFillStyle() == 1001) {
634 fYDigBox[iMT][iy]->SetFillStyle(0);
636 fYLabelL[iMT][iy]->Clear();
637 fYLabelL[iMT][iy]->Draw();
639 fYLabelR[iMT][iy]->Clear();
640 fYLabelR[iMT][iy]->Draw();
642 fYDigBox[iMT][iy]->SetX1(-fBoard->GetXCenter(iMT));
643 fYDigBox[iMT][iy]->SetY1(-fBoard->GetYCenter(iMT));
644 fYDigBox[iMT][iy]->SetX2(-fBoard->GetXCenter(iMT));
645 fYDigBox[iMT][iy]->SetY2(-fBoard->GetYCenter(iMT));
647 //fYDigBox[iMT][iy]->Draw();
651 if (!fYDigBox[iMT][iy]->TestBit(kObjInCanvas))
652 fYDigBox[iMT][iy]->Draw();
654 fCanvas[iMT]->Modified();
655 fCanvas[iMT]->Update();
664 } // end button event
670 //__________________________________________________________________________
671 void AliMUONTriggerGUIbdmap::DoDigits()
673 /// set the board digits from GUI input (set/unset)
676 Int_t number = fBoard->GetNumber();
678 pos = fBoard->GetPosition();
679 over = fBoard->GetYOver();
680 AliMUONTriggerGUIboard *board;
682 for (Int_t imt = 0; imt < kNMT; imt++) {
684 for (Int_t ix = 0; ix < fNStripX; ix++) {
685 if (fXDigBox[imt][ix]->GetFillStyle() == 0) {
688 if (fXDigBox[imt][ix]->GetFillStyle() == 1001) {
691 fBoard->SetDigitX(imt,ix,amp);
694 for (Int_t iy = 0; iy < fNStripY; iy++) {
695 if (fYDigBox[imt][iy]->GetFillStyle() == 0) {
698 if (fYDigBox[imt][iy]->GetFillStyle() == 1001) {
701 fBoard->SetDigitY(imt,iy,amp);
704 for (Int_t io = 1; io <= over; io++) {
705 if (io == pos) continue;
706 board = (AliMUONTriggerGUIboard*)fBoards->UncheckedAt(number+io-pos);
707 board->SetDigitY(imt,iy,amp);
716 //__________________________________________________________________________
717 void AliMUONTriggerGUIbdmap::ResetDigits()
719 /// set the board digits from GUI input (set/unset)
722 Int_t number = fBoard->GetNumber();
723 AliMUONTriggerGUIboard *board;
725 pos = fBoard->GetPosition();
726 over = fBoard->GetYOver();
728 for (Int_t imt = 0; imt < kNMT; imt++) {
729 for (Int_t ix = 0; ix < fNStripX; ix++) {
730 fXDigBox[imt][ix]->SetFillStyle(0);
731 fXDigBox[imt][ix]->SetX1(-fBoard->GetXCenter(imt));
732 fXDigBox[imt][ix]->SetY1(-fBoard->GetYCenter(imt));
733 fXDigBox[imt][ix]->SetX2(-fBoard->GetXCenter(imt));
734 fXDigBox[imt][ix]->SetY2(-fBoard->GetYCenter(imt));
736 fBoard->SetDigitX(imt,ix,amp);
738 for (Int_t iy = 0; iy < fNStripY; iy++) {
739 fYDigBox[imt][iy]->SetFillStyle(0);
740 fYDigBox[imt][iy]->SetX1(-fBoard->GetXCenter(imt));
741 fYDigBox[imt][iy]->SetY1(-fBoard->GetYCenter(imt));
742 fYDigBox[imt][iy]->SetX2(-fBoard->GetXCenter(imt));
743 fYDigBox[imt][iy]->SetY2(-fBoard->GetYCenter(imt));
745 fBoard->SetDigitY(imt,iy,amp);
748 for (Int_t io = 1; io <= over; io++) {
749 if (io == pos) continue;
750 board = (AliMUONTriggerGUIboard*)fBoards->UncheckedAt(number+io-pos);
752 board->SetDigitY(imt,iy,amp);
759 fBoard->ClearXDigits();
760 fBoard->ClearYDigits();
763 for (Int_t io = 1; io <= over; io++) {
764 if (io == pos) continue;
765 board = (AliMUONTriggerGUIboard*)fBoards->UncheckedAt(number+io-pos);
766 board->ClearYDigits();
769 fXStrips->SetState(kButtonUp);
770 fYStrips->SetState(kButtonUp);
771 fEditStrips->SetState(kButtonUp);
772 fIsEditable = kFALSE;
780 //__________________________________________________________________________
781 void AliMUONTriggerGUIbdmap::HandleButtons(Int_t id)
783 /// handle the check buttons
786 TGButton *btn = (TGButton *) gTQSender;
787 id = btn->WidgetId();
791 if(fXStrips->GetState() == kButtonDown &&
792 fYStrips->GetState() == kButtonDown ) {
795 DrawStrips(kTRUE,kTRUE);
796 DrawDigits(kTRUE,kTRUE);
803 if(fXStrips->GetState() == kButtonDown &&
804 fYStrips->GetState() == kButtonUp ) {
807 DrawStrips(kTRUE,kFALSE);
808 DrawDigits(kTRUE,kFALSE);
815 if(fXStrips->GetState() == kButtonUp &&
816 fYStrips->GetState() == kButtonDown ) {
819 DrawStrips(kFALSE,kTRUE);
820 DrawDigits(kFALSE,kTRUE);
827 if(fXStrips->GetState() == kButtonUp &&
828 fYStrips->GetState() == kButtonUp ) {
840 //__________________________________________________________________________
841 void AliMUONTriggerGUIbdmap::DrawClear()
843 /// draw the frame of the board image in the canvas
845 for (Int_t i = 0; i < kNMT; i++) {
850 fCanvas[i]->Modified();
851 fCanvas[i]->Update();
857 //__________________________________________________________________________
858 void AliMUONTriggerGUIbdmap::DrawDigits(Bool_t bx, Bool_t by)
860 /// draw the digits in "x" or/and "y"
862 AliRunLoader *runLoader = fLoader->GetRunLoader();
863 gAlice = runLoader->GetAliRun();
864 AliMUON *pMUON = (AliMUON*)gAlice->GetModule("MUON");
865 const AliMUONGeometryTransformer* kGeomTransformer = pMUON->GetGeometryTransformer();
867 AliMUONTriggerGUIboard *board;
868 Int_t over, pos, number;
869 const AliMpVSegmentation* seg;
871 Int_t cathode, detElemId, ix, iy, charge;
872 Int_t chamber, np = 5;
874 Float_t xpmin, xpmax, ypmin, ypmax;
875 Float_t xg1, xg2, yg1, yg2, zg1;
876 Float_t xdw, ydw, xcw, ycw;
877 Double_t xc1, xc2, yc1, yc2;
880 Double_t xMin, xMax, yMin, yMax;
883 number = fBoard->GetNumber();
884 pos = fBoard->GetPosition();
885 over = fBoard->GetYOver();
887 AliMUONVDigitStore *digitStore = fMCDataInterface->DigitStore(runLoader->GetEventNumber());
889 for (Int_t i = 0; i < kNMT; i++) {
893 fCanvas[i]->GetRange(xc1,yc1,xc2,yc2);
894 xcw = (Float_t)(0.5*(xc2-xc1));
895 ycw = (Float_t)(0.5*(yc2-yc1));
899 AliMpIntPair deRange = AliMpDEManager::GetDetElemIdRange(chamber-1);
900 TIter next(digitStore->CreateIterator(deRange.GetFirst(),deRange.GetSecond()));
903 while ( ( mdig = static_cast<AliMUONVDigit*>(next())) )
905 cathode = mdig->Cathode()+1;
909 detElemId = mdig->DetElemId();
910 charge = (Int_t)mdig->Charge();
912 Bool_t triggerBgn = kFALSE;
913 Int_t schg = (Int_t)(charge + 0.5);
914 // APPLY CONDITION ON SOFT BACKGROUND
915 Int_t tchg = schg - (Int_t(schg/10))*10;
916 if (schg<=10 || tchg>0) {
922 if (detElemId%100 != fBoard->GetDetElemId()) continue;
924 seg = AliMpSegmentation::Instance()->GetMpSegmentation(detElemId, AliMp::GetCathodType(cathode-1));
926 pad = seg->PadByIndices(AliMpIntPair(ix,iy),kTRUE);
928 //if (cathode == 1) printf("GUI x: ix %d iy %d \n",ix,iy);
929 //if (cathode == 2) printf("GUI y: ix %d iy %d \n",ix,iy);
931 // get the pad position and dimensions
932 Float_t xlocal1 = pad.Position().X();
933 Float_t ylocal1 = pad.Position().Y();
934 Float_t xlocal2 = pad.Dimensions().X();
935 Float_t ylocal2 = pad.Dimensions().Y();
937 kGeomTransformer->Local2Global(detElemId, xlocal1, ylocal1, 0, xg1, yg1, zg1);
938 // (no transformation for pad dimensions)
942 // transform in the monitor coordinate system
943 //xpmin = -(xg1+xg2);
944 //xpmax = -(xg1-xg2);
945 //ypmin = -(yg2-yg1);
946 //ypmax = +(yg2+yg1);
953 xpmin -= fXCenter[i];
954 xpmax -= fXCenter[i];
955 ypmin -= fYCenter[i];
956 ypmax -= fYCenter[i];
962 if ((xdw > ydw) && bx) {
964 //printf("X strips mdig->Cathode() = %1d \n",mdig->Cathode());
967 iX = fBoard->GetXSix();
968 iY1 = fBoard->GetXSiy1();
969 iY2 = fBoard->GetXSiy2();
970 if (ix == iX && iy >= iY1 && iy <= iY2) {
971 //printf("Digit indices (x-strip) ix = %3d iy = %3d board = %s %d chamber = %2d \n",ix,iy,fBoard->GetBoardName(),fBoard->GetNumber(),chamber);
973 xpmin += 0.01*fXWidth[i];
974 xpmax -= 0.01*fXWidth[i];
978 boxd = new TBox(xpmin,ypmin,xpmax,ypmax);
979 boxd->SetFillStyle(1001);
980 if (triggerBgn) boxd->SetFillColor(6);
981 else boxd->SetFillColor(5);
982 boxd->SetBit(kCannotPick);
985 fXDigBox[i][iy-iY1]->SetFillStyle(1001);
986 fXDigBox[i][iy-iY1]->SetFillColor(2);
987 fXDigBox[i][iy-iY1]->SetX1(xpmin);
988 fXDigBox[i][iy-iY1]->SetY1(ypmin);
989 fXDigBox[i][iy-iY1]->SetX2(xpmax);
990 fXDigBox[i][iy-iY1]->SetY2(ypmax);
991 fXDigBox[i][iy-iY1]->Draw();
993 sprintf(cln,"%2d",(iy-iY1));
994 fXLabelL[i][iy-iY1]->Clear();
995 fXLabelL[i][iy-iY1]->AddText(cln);
996 fXLabelL[i][iy-iY1]->Draw();
997 fXLabelR[i][iy-iY1]->Clear();
998 fXLabelR[i][iy-iY1]->AddText(cln);
999 fXLabelR[i][iy-iY1]->Draw();
1001 fBoard->SetDigitX(i,iy-iY1,charge);
1008 if ((xdw < ydw) && by) {
1010 //printf("Y strips mdig->Cathode() = %1d \n",mdig->Cathode());
1013 iX1 = fBoard->GetYSix1();
1014 iX2 = fBoard->GetYSix2();
1015 iY = fBoard->GetYSiy();
1016 if (ix >= iX1 && ix <= iX2 && iy == iY) {
1017 //printf("Digit indices (y-strip) ix = %3d iy = %3d board = %s chamber = %2d \n",ix,iy,fBoard->GetBoardName(),chamber);
1018 ypmin = -0.5*fYWidth[i];
1019 ypmax = +0.5*fYWidth[i];
1021 ypmin = -0.5*fYWidth[i];
1022 ypmax = +0.5*fYWidth[i];
1023 ypmin += 0.01*fYWidth[i];
1024 ypmax -= 0.01*fYWidth[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 fYDigBox[i][ix-iX1]->SetFillStyle(1001);
1036 fYDigBox[i][ix-iX1]->SetFillColor(2);
1037 fYDigBox[i][ix-iX1]->SetX1(xpmin);
1038 fYDigBox[i][ix-iX1]->SetY1(ypmin);
1039 fYDigBox[i][ix-iX1]->SetX2(xpmax);
1040 fYDigBox[i][ix-iX1]->SetY2(ypmax);
1041 fYDigBox[i][ix-iX1]->Draw();
1043 sprintf(cln,"%2d",(ix-iX1));
1044 fYLabelL[i][ix-iX1]->Clear();
1045 fYLabelL[i][ix-iX1]->AddText(cln);
1046 fYLabelL[i][ix-iX1]->Draw();
1047 fYLabelR[i][ix-iX1]->Clear();
1048 fYLabelR[i][ix-iX1]->AddText(cln);
1049 fYLabelR[i][ix-iX1]->Draw();
1051 fBoard->SetDigitY(i,ix-iX1,charge);
1053 // extended y-strips
1054 for (Int_t io = 1; io <= over; io++) {
1055 if (io == pos) continue;
1056 board = (AliMUONTriggerGUIboard*)fBoards->UncheckedAt(number+io-pos);
1057 board->SetDigitY(i,ix-iX1,charge);
1063 } // end digits loop
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 sprintf(cln,"%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 sprintf(cln,"%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();
1156 fYDigBox[i][iy]->Draw();
1164 fCanvas[i]->Modified();
1165 fCanvas[i]->Update();
1167 } // end canvas loop
1173 //__________________________________________________________________________
1174 void AliMUONTriggerGUIbdmap::DrawStrips(Bool_t bx, Bool_t by)
1176 /// draw the "x" or/and "y" strips
1178 AliRunLoader *runLoader = fLoader->GetRunLoader();
1179 gAlice = runLoader->GetAliRun();
1180 AliMUON *pMUON = (AliMUON*)gAlice->GetModule("MUON");
1181 const AliMUONGeometryTransformer* kGeomTransformer = pMUON->GetGeometryTransformer();
1183 const AliMpVSegmentation* seg;
1187 Float_t xg1, xg2, yg1, yg2, zg1;
1188 Float_t xlocal1, xlocal2, ylocal1, ylocal2;
1189 Int_t detElemId, ic, maxX, maxY;
1190 Float_t xdw, ydw, xpmin, xpmax, ypmin, ypmax;
1191 Float_t ptx1, ptx2, pty1, pty2;
1193 Double_t xc1, xc2, yc1, yc2;
1196 Bool_t makeLabelsX = kFALSE;
1197 Bool_t makeLabelsY = kFALSE;
1199 if (bx && !fLabelX) {
1200 makeLabelsX = kTRUE;
1204 if (by && !fLabelY) {
1205 makeLabelsY = kTRUE;
1209 for (Int_t i = 0; i < kNMT; i++) {
1213 fCanvas[i]->GetRange(xc1,yc1,xc2,yc2);
1214 xcw = (Float_t)(0.5*(xc2-xc1));
1215 ycw = (Float_t)(0.5*(yc2-yc1));
1219 for ( it.First(chamber-1); ! it.IsDone(); it.Next() ) {
1221 detElemId = it.CurrentDEId();
1223 if (detElemId%100 != fBoard->GetDetElemId()) continue;
1225 /*---------- y-pads ic = 2 ----------*/
1228 seg = AliMpSegmentation::Instance()->GetMpSegmentation(detElemId, AliMp::GetCathodType(ic-1));
1230 maxX = seg->MaxPadIndexX();
1231 maxY = seg->MaxPadIndexY();
1233 for (Int_t ix = 0; ix <= maxX; ix++) {
1234 for (Int_t iy = 0; iy <= maxY; iy++) {
1236 pad = seg->PadByIndices(AliMpIntPair(ix,iy),kFALSE);
1238 if (!pad.IsValid()) continue;
1240 // get the pad position and dimensions
1241 xlocal1 = pad.Position().X();
1242 ylocal1 = pad.Position().Y();
1243 xlocal2 = pad.Dimensions().X();
1244 ylocal2 = pad.Dimensions().Y();
1246 kGeomTransformer->Local2Global(detElemId, xlocal1, ylocal1, 0, xg1, yg1, zg1);
1247 // (no transformation for pad dimensions)
1251 // transform in the monitor coordinate system
1252 //xpmin = -(xg1+xg2);
1253 //xpmax = -(xg1-xg2);
1254 //ypmin = -(yg2-yg1);
1255 //ypmax = +(yg2+yg1);
1262 xpmin -= fXCenter[i];
1263 xpmax -= fXCenter[i];
1264 ypmin -= fYCenter[i];
1265 ypmax -= fYCenter[i];
1273 Int_t iX1, iX2, iY, ixDig;
1274 iX1 = fBoard->GetYSix1();
1275 iX2 = fBoard->GetYSix2();
1276 iY = fBoard->GetYSiy();
1277 if (ix >= iX1 && ix <= iX2 && iy == iY) {
1279 ypmin = -0.5*fYWidth[i];
1280 ypmax = +0.5*fYWidth[i];
1282 ypmin += 0.01*fYWidth[i];
1283 ypmax -= 0.01*fYWidth[i];
1288 fYDigPL[i][ixDig]->SetPoint(0,xpmin,ypmin);
1289 fYDigPL[i][ixDig]->SetPoint(1,xpmax,ypmin);
1290 fYDigPL[i][ixDig]->SetPoint(2,xpmax,ypmax);
1291 fYDigPL[i][ixDig]->SetPoint(3,xpmin,ypmax);
1292 fYDigPL[i][ixDig]->SetPoint(4,xpmin,ypmin);
1293 fYDigPL[i][ixDig]->Draw();
1295 fYDigBox[i][ixDig]->SetFillStyle(1001);
1296 fYDigBox[i][ixDig]->SetFillColor(5);
1297 fYDigBox[i][ixDig]->DrawBox(xpmin,ypmin,xpmax,ypmax);
1300 sprintf(cln,"%2d",(ix-iX1));
1304 pty1 = 1.065*ypmin - 0.04*ycw;
1305 pty2 = 1.065*ypmin + 0.04*ycw;
1306 fYLabelL[i][ix-iX1] = new TPaveText(ptx1,pty1,ptx2,pty2);
1307 fYLabelL[i][ix-iX1]->SetBorderSize(0);
1308 fYLabelL[i][ix-iX1]->SetBit(kCannotPick);
1310 pty1 = 1.065*ypmax - 0.04*ycw;
1311 pty2 = 1.065*ypmax + 0.04*ycw;
1312 fYLabelR[i][ix-iX1] = new TPaveText(ptx1,pty1,ptx2,pty2);
1313 fYLabelR[i][ix-iX1]->SetBorderSize(0);
1314 fYLabelR[i][ix-iX1]->SetBit(kCannotPick);
1325 /*---------- x-pads ic = 1 ----------*/
1328 seg = AliMpSegmentation::Instance()->GetMpSegmentation(detElemId, AliMp::GetCathodType(ic-1));
1330 maxX = seg->MaxPadIndexX();
1331 maxY = seg->MaxPadIndexY();
1333 for (Int_t ix = 0; ix <= maxX; ix++) {
1334 for (Int_t iy = 0; iy <= maxY; iy++) {
1336 pad = seg->PadByIndices(AliMpIntPair(ix,iy),kFALSE);
1338 if (!pad.IsValid()) continue;
1340 // get the pad position and dimensions
1341 xlocal1 = pad.Position().X();
1342 ylocal1 = pad.Position().Y();
1343 xlocal2 = pad.Dimensions().X();
1344 ylocal2 = pad.Dimensions().Y();
1346 kGeomTransformer->Local2Global(detElemId, xlocal1, ylocal1, 0, xg1, yg1, zg1);
1347 // (no transformation for pad dimensions)
1351 // transform in the monitor coordinate system
1352 //xpmin = -(xg1+xg2);
1353 //xpmax = -(xg1-xg2);
1354 //ypmin = -(yg2-yg1);
1355 //ypmax = +(yg2+yg1);
1362 xpmin -= fXCenter[i];
1363 xpmax -= fXCenter[i];
1364 ypmin -= fYCenter[i];
1365 ypmax -= fYCenter[i];
1372 Int_t iX, iY1, iY2, iyDig;
1373 iX = fBoard->GetXSix();
1374 iY1 = fBoard->GetXSiy1();
1375 iY2 = fBoard->GetXSiy2();
1376 if (ix == iX && iy >= iY1 && iy <= iY2) {
1378 xpmin += 0.01*fXWidth[i];
1379 xpmax -= 0.01*fXWidth[i];
1384 fXDigPL[i][iyDig]->SetPoint(0,xpmin,ypmin);
1385 fXDigPL[i][iyDig]->SetPoint(1,xpmax,ypmin);
1386 fXDigPL[i][iyDig]->SetPoint(2,xpmax,ypmax);
1387 fXDigPL[i][iyDig]->SetPoint(3,xpmin,ypmax);
1388 fXDigPL[i][iyDig]->SetPoint(4,xpmin,ypmin);
1389 fXDigPL[i][iyDig]->Draw();
1391 fXDigBox[i][iyDig]->SetFillStyle(1001);
1392 fXDigBox[i][iyDig]->SetFillColor(5);
1393 fXDigBox[i][iyDig]->DrawBox(xpmin,ypmin,xpmax,ypmax);
1396 sprintf(cln,"%2d",(iy-iY1));
1400 ptx1 = 1.065*xpmin - 0.04*xcw;
1401 ptx2 = 1.065*xpmin + 0.04*xcw;
1402 fXLabelL[i][iy-iY1] = new TPaveText(ptx1,pty1,ptx2,pty2);
1403 fXLabelL[i][iy-iY1]->SetBorderSize(0);
1404 fXLabelL[i][iy-iY1]->SetBit(kCannotPick);
1406 ptx1 = 1.065*xpmax - 0.04*xcw;
1407 ptx2 = 1.065*xpmax + 0.04*xcw;
1408 fXLabelR[i][iy-iY1] = new TPaveText(ptx1,pty1,ptx2,pty2);
1409 fXLabelR[i][iy-iY1]->SetBorderSize(0);
1410 fXLabelR[i][iy-iY1]->SetBit(kCannotPick);
1423 fCanvas[i]->Modified();
1424 fCanvas[i]->Update();
1432 //__________________________________________________________________________
1433 void AliMUONTriggerGUIbdmap::CloseWindow()
1435 /// close dialog in response to window manager close.
1441 //__________________________________________________________________________
1442 void AliMUONTriggerGUIbdmap::DoClose()
1444 /// handle Close button.
1446 fBoard->SetOpen(kFALSE);
1447 TTimer::SingleShot(150,"AliMUONTriggerGUIbdmap",this,"CloseWindow()");