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