]> git.uio.no Git - u/mrichter/AliRoot.git/blame - MUON/AliMUONTriggerGUI.cxx
No more misaligned_geometry
[u/mrichter/AliRoot.git] / MUON / AliMUONTriggerGUI.cxx
CommitLineData
905654c2 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
bae1aa70 16// $Id$
17
18/// \class AliMUONTriggerGUI
19/// Graphical User Interface utility class for the MUON trigger detector
20/// It creates, after initialisation with a data file, a sensitive map
21/// of the trigger boards
22/// \author Bogdan Vulpescu, LPC Clermont-Ferrand
905654c2 23
24#include "AliMUONTriggerGUI.h"
25#include "AliMUONTriggerGUIboard.h"
26#include "AliMUONTriggerGUIdimap.h"
27#include "AliMUONTriggerGUIbdmap.h"
28
29#include "AliMpSegmentation.h"
30#include "AliMpVSegmentation.h"
31#include "AliMpPad.h"
32#include "AliMpIntPair.h"
33#include "AliMUON.h"
905654c2 34#include "AliMpDEIterator.h"
35#include "AliMUONGeometryTransformer.h"
36#include "AliMUONTriggerCrateStore.h"
37#include "AliMUONLocalTriggerBoard.h"
38#include "AliMUONTriggerElectronics.h"
39#include "AliMUONCalibrationData.h"
40
41#include "AliRun.h"
42#include "AliRunLoader.h"
43#include "AliCDBManager.h"
44
45#include <TSystem.h>
46#include <TGLabel.h>
47#include <TGFrame.h>
48#include <TApplication.h>
49#include <TGDimension.h>
50#include <TString.h>
51#include <TGMenu.h>
52#include <TGTextEntry.h>
53#include <TGButton.h>
54#include <TFile.h>
55#include <TGImageMap.h>
56#include <TGTextBuffer.h>
57
58/// \cond CLASSIMP
59ClassImp(AliMUONTriggerGUI)
60/// \endcond
61
62//__________________________________________________________________________
63AliMUONTriggerGUI::AliMUONTriggerGUI()
64 : TObject(),
65 fMain(0),
66 fImageMap(0),
67 fTxtBuffer1(0),
68 fTxtBuffer2(0),
69 fTxtCircuit(0),
70 fRunInput(0),
71 fError(0),
72 fControl(0),
73 fCircuit(0),
74 fSkipToEventTxt(0),
75 fFileName(0),
76 fPath(0),
77 fEvString(0),
78 fChamber(0),
79 fEvent(0),
80 fEventsPerRun(0),
81 fLoader(0),
82 fRunLoader(0),
83 fCDBManager(0),
84 fCalibrationData(0),
85 fBoardsInit(0),
86 fDiMap(0),
87 fTriggerProcessor(0),
905654c2 88 fBoards(0)
89{
90 /// main GUI frame of the trigger monitor
91
92 fChamber = 0;
93 fEvent = 0;
94 fEventsPerRun = 0;
95 fRunLoader = 0;
96 fDiMap = 0;
97
98 fBoards = 0;
99 fFileName = new TString("");
100 fEvString = new TString("");
101 fPath = new TString("");
102
103 fTriggerProcessor = 0;
104
105 fCDBManager = AliCDBManager::Instance();
106 fCDBManager->SetDefaultStorage("local://$ALICE_ROOT");
107 fCalibrationData = new AliMUONCalibrationData(0); // runnumber zero
108
109 // Main frame
110
111 fMain = new TGMainFrame(gClient->GetRoot(), 750, 420);
112 fMain->Connect("CloseWindow()", "AliMUONTriggerGUI", this, "CloseWindow()");
113
114 // Menu bar
115
116 TGMenuBar *menuBar = new TGMenuBar(fMain);
117
118 // File menu
119
120 TGPopupMenu *menuFile = new TGPopupMenu(gClient->GetRoot());
121 //menuFile->AddLabel("");
122
123 menuFile->AddEntry("Run", kMFILERUN);
124 menuFile->AddEntry("Control", kMFILECNTRL);
125 menuFile->AddEntry("Exit", kMFILEEXIT);
126
127 menuFile->Connect("Activated(Int_t)", "AliMUONTriggerGUI", this, "HandleMenu(Int_t)");
128
129 // Circuit menu
130
131 TGPopupMenu *menuCircuit = new TGPopupMenu(gClient->GetRoot());
132 //menuCircuit->AddLabel("");
133
134 menuCircuit->AddEntry("Open", kMCIRCUITOPEN);
135
136 menuCircuit->Connect("Activated(Int_t)", "AliMUONTriggerGUI", this, "HandleMenu(Int_t)");
137
138 // Digits map menu
139
140 TGPopupMenu *menuMap = new TGPopupMenu(gClient->GetRoot());
141 //menuMap->AddLabel("");
142
143 menuMap->AddEntry("Digits map", kMMAPDIGITS);
144 menuMap->AddEntry("Reset digits", kMRESETDIGITS);
145
146 menuMap->Connect("Activated(Int_t)", "AliMUONTriggerGUI", this,
147 "HandleMenu(Int_t)");
148
149 // Trigger menu
150
151 TGPopupMenu *menuTrigger = new TGPopupMenu(gClient->GetRoot());
152 //menuTrigger->AddLabel("");
153
154 menuTrigger->AddEntry("Trigger DSET", kMTRIGGERDSET);
155
156 menuTrigger->Connect("Activated(Int_t)", "AliMUONTriggerGUI", this, "HandleMenu(Int_t)");
157
158 // Add menus to the menu bar
159
160 menuBar->AddPopup("File", menuFile,
161 new TGLayoutHints(kLHintsTop | kLHintsLeft, 5,5,2,2)
162 );
163
164 menuBar->AddPopup("Maps", menuMap,
165 new TGLayoutHints(kLHintsTop | kLHintsLeft, 5,5,2,2)
166 );
167
168 menuBar->AddPopup("Circuit", menuCircuit,
169 new TGLayoutHints(kLHintsTop | kLHintsLeft, 5,5,2,2)
170 );
171
172 menuBar->AddPopup("Trigger", menuTrigger,
173 new TGLayoutHints(kLHintsTop | kLHintsLeft, 5,5,2,2)
174 );
175
176 // Add menu bar to the main frame
177
178 fMain->AddFrame(menuBar,
179 new TGLayoutHints(kLHintsTop |
180 kLHintsLeft |
181 kLHintsExpandX,
182 0, 0, 1, 1)
183 );
184
185 // The image map
186
187 fImageMap = new TGImageMap(fMain,"$ALICE_ROOT/MUON/data/guimap.gif");
188
189 fImageMap->Connect("RegionClicked(Int_t)", "AliMUONTriggerGUI", this, "OpenBoard(Int_t)");
190
191 fImageMap->SetToolTipText("Map of the local boards as seen from the I.P.");
192
193 // Add image map to the main frame
194
195 fMain->AddFrame(fImageMap);
196 fMain->SetWindowName("Map of the local boards as seen from the I.P.");
197
198 // Resize the main frame
199
200 TGDimension size = fMain->GetDefaultSize();
201 fMain->Resize(size);
202
203 fMain->MapSubwindows();
204
205 fMain->MapWindow();
206
207 fBoardsInit = kFALSE;
208
209 //HandleMenu(kMFILERUN); // temporary
210
211 //InitBoards();
212 //Init();
213
214}
215
905654c2 216//__________________________________________________________________________
217void AliMUONTriggerGUI::HandleMenu(Int_t id)
218{
219 /// handles entry numbers in the available menus (EMenuIdentifiers)
220
221 TGCompositeFrame *runInput1, *runInput2, *runInput3;
222 TGCompositeFrame *control1, *control2, *circuit1, *circuit2;
223 TGLabel *runL1, *runL2, *circuitL1;
224 TGTextEntry *runText1, *runText2, *circuitText1;
225 TGTextButton *runApply, *runCancel;
226 TGTextButton *controlClose, *nextEvent, *previousEvent, *skipToEvent;
227 TGTextButton *circuitCancel, *circuitOpen;
228
f69a61cb 229 //Int_t trigInfo[kNBoards*6] = {-1};
230 //Int_t nLocalTrigger = 0;
905654c2 231
232 TString error = TString("");
233 if (id != kMFILEEXIT && id != kMFILERUN && fRunLoader == 0) {
234 error.Append("Run not initialized (Menu: File/Run)");
235 DoErrorGUI(error.Data());
236 return;
237 }
238
239 switch (id) {
240
241 case kMFILEEXIT:
242
243 printf("\nBye. \n");
244 CloseWindow();
245 break;
246
247 case kMFILERUN:
248
249 // input main frame
250
251 fRunInput = new TGTransientFrame(gClient->GetRoot(), fMain, 400, 200);
252 fRunInput->Connect("CloseWindow()", "AliMUONTriggerGUI", this, "CloseRunInput()");
253 fRunInput->DontCallClose(); // to avoid double deletions.
254
255 // use hierarchical cleaning
256 fRunInput->SetCleanup(kDeepCleanup);
257
258 fRunInput->SetWindowName("Input file and event number");
259
260 // input galice and event number frames
261
262 runInput1 = new TGCompositeFrame(fRunInput, 400, 200, kHorizontalFrame);
263 runInput2 = new TGCompositeFrame(fRunInput, 400, 200, kHorizontalFrame);
264
265 // .. with labels
266
267 runL1 = new TGLabel(runInput1, new TGString("Path to gAlice:"));
268 runL2 = new TGLabel(runInput2, new TGString("Event number:"));
269
270 // galice text entry
271
272 runText1 = new TGTextEntry(runInput1, fTxtBuffer1 = new TGTextBuffer(100));
273
274 //fPath->Append("dset"); // temporary
275 //fTxtBuffer1->AddText(0,fPath->Data()); // temporary
276
277 runText1->SetToolTipText("Enter the path to galice.root");
278 runText1->Resize(300, runText1->GetDefaultHeight());
279
280 // event number text entry
281
282 runText2 = new TGTextEntry(runInput2, fTxtBuffer2 = new TGTextBuffer(5));
283
284 fEvString->Form("%d",0);
285 fTxtBuffer2->AddText(0,fEvString->Data());
286
287 runText2->SetToolTipText("Enter the first event number to start with");
288 runText2->Resize(300, runText2->GetDefaultHeight());
289
290 // add to galice frame
291
292 runInput1->AddFrame(runL1,
293 new TGLayoutHints(kLHintsLeft |
294 kLHintsCenterY,
295 3, 5, 0, 0)
296 );
297
298 runInput1->AddFrame(runText1,
299 new TGLayoutHints(kLHintsRight |
300 kLHintsCenterY,
301 0, 2, 0, 0)
302 );
303
304 // add to event number frame
305
306 runInput2->AddFrame(runL2,
307 new TGLayoutHints(kLHintsLeft |
308 kLHintsCenterY,
309 3, 5, 0, 0)
310 );
311
312 runInput2->AddFrame(runText2,
313 new TGLayoutHints(kLHintsRight |
314 kLHintsCenterY,
315 0, 2, 0, 0)
316 );
317
318 // add input frames to main input frame
319
320 fRunInput->AddFrame(runInput1,
321 new TGLayoutHints(kLHintsTop | kLHintsExpandX, 2, 2, 3, 0));
322
323 fRunInput->AddFrame(runInput2,
324 new TGLayoutHints(kLHintsTop | kLHintsExpandX, 2, 2, 3, 0));
325
326 // frame with buttons
327
328 runInput3 = new TGCompositeFrame(fRunInput, 400, 200, kHorizontalFrame);
329
330 // buttons
331
332 runApply = new TGTextButton(runInput3, "Apply", 1);
333 runApply->Connect("Clicked()", "AliMUONTriggerGUI", this, "DoRunApply()");
334 runApply->SetToolTipText("Apply changes");
335
336 runCancel = new TGTextButton(runInput3, "Cancel", 2);
337 runCancel->Connect("Clicked()", "AliMUONTriggerGUI", this, "DoRunCancel()"); runCancel->SetToolTipText("Cancel changes");
338
339 // add buttons
340
341 runInput3->AddFrame(runApply,
342 new TGLayoutHints(kLHintsTop |
343 kLHintsLeft,
344 3, 3, 2, 2)
345 );
346
347 runInput3->AddFrame(runCancel,
348 new TGLayoutHints(kLHintsTop |
349 kLHintsLeft,
350 3, 3, 2, 2)
351 );
352
353 // add to the main input frame
354
355 fRunInput->AddFrame(runInput3,
356 new TGLayoutHints(kLHintsTop |
357 kLHintsExpandX,
358 2, 2, 3, 0)
359 );
360
361 fRunInput->MapSubwindows();
362 fRunInput->Resize();
363 fRunInput->MapWindow();
364
365 //DoRunApply(); // temporary
366
367 break;
368
369 case kMFILECNTRL:
370
371 // control main frame
372
373 fControl = new TGTransientFrame(gClient->GetRoot(), fMain, 50, 50);
374 fControl->Connect("CloseWindow()", "AliMUONTriggerGUI", this, "CloseControl()");
375 fControl->DontCallClose(); // to avoid double deletions.
376
377 // use hierarchical cleaning
378 fControl->SetCleanup(kDeepCleanup);
379
380 fControl->SetWindowName("Run controls");
381
382 // frame to hold buttons
383
384 control1 = new TGCompositeFrame(fControl, 50, 50, kVerticalFrame);
385
386 // buttons
387
388 controlClose = new TGTextButton(control1, "Close", 1);
389 controlClose->Connect("Clicked()", "AliMUONTriggerGUI", this, "DoControlClose()");
390 //controlClose->Resize(300, controlClose->GetDefaultHeight());
391
392 nextEvent = new TGTextButton(control1, "Next event", 2);
393 nextEvent->Connect("Clicked()", "AliMUONTriggerGUI", this, "DoNextEvent()");
394
395 previousEvent = new TGTextButton(control1, "Previous event", 3);
396 previousEvent->Connect("Clicked()", "AliMUONTriggerGUI", this, "DoPreviousEvent()");
397
398 // frame to hold event skip
399
400 control2 = new TGCompositeFrame(fControl, 50, 50, kHorizontalFrame);
401
402 // skip to event text field
403
404 fSkipToEventTxt = new TGTextEntry(control2, fTxtBuffer2 = new TGTextBuffer(5));
405
406 fTxtBuffer2->AddText(0,fEvString->Data());
407
408 // skip to event button
409
410 skipToEvent = new TGTextButton(control2, "Skip to event", 1);
411 skipToEvent->Connect("Clicked()", "AliMUONTriggerGUI", this, "DoSkipToEvent()");
412
413 // add to event skip frame
414
415 control2->AddFrame(fSkipToEventTxt,
416 new TGLayoutHints(kLHintsTop |
417 kLHintsRight,
418 10, 10, 5, 5)
419 );
420
421 control2->AddFrame(skipToEvent,
422 new TGLayoutHints(kLHintsTop |
423 kLHintsRight,
424 10, 10, 5, 5)
425 );
426
427 // add buttons
428
429 control1->AddFrame(controlClose,
430 new TGLayoutHints(kLHintsBottom |
431 kLHintsExpandX,
432 10, 10, 5, 5)
433 );
434
435 control1->AddFrame(nextEvent,
436 new TGLayoutHints(kLHintsBottom |
437 kLHintsExpandX,
438 10, 10, 5, 5)
439 );
440
441 control1->AddFrame(previousEvent,
442 new TGLayoutHints(kLHintsBottom |
443 kLHintsExpandX,
444 10, 10, 5, 5)
445 );
446
447 // add to the main frame
448
449 fControl->AddFrame(control1,
450 new TGLayoutHints(kLHintsBottom |
451 kLHintsLeft |
452 kLHintsCenterY,
453 3, 5, 0, 0)
454 );
455
456 fControl->AddFrame(control2,
457 new TGLayoutHints(kLHintsTop |
458 kLHintsCenterX,
459 3, 5, 0, 0)
460 );
461
462 fControl->MapSubwindows();
463 fControl->Resize();
464 fControl->MapWindow();
465
466 break;
467
468 case kMMAPDIGITS:
469
470 if (fDiMap == 0) {
471 fDiMap = new AliMUONTriggerGUIdimap(fLoader,fBoards,gClient->GetRoot(), fMain, 400, 200);
472 } else if (!fDiMap->IsOn()) {
473 fDiMap = new AliMUONTriggerGUIdimap(fLoader,fBoards,gClient->GetRoot(), fMain, 400, 200);
474 }
475
476 break;
477
478 case kMRESETDIGITS:
479
480 Int_t number, over, pos;
481 for (Int_t ib = 0; ib < kNBoards; ib++) {
482 AliMUONTriggerGUIboard *board = GetBoard(ib);
483 board->ClearXDigits();
484 board->ClearYDigits();
485 // extended y-strips
486 number = board->GetNumber();
487 pos = board->GetPosition();
488 over = board->GetYOver();
489 for (Int_t io = 1; io <= over; io++) {
490 if (io == pos) continue;
491 board = GetBoard(number+io-pos);
492 board->ClearYDigits();
493 }
494 }
495
496 break;
497
498 case kMCIRCUITOPEN:
499
500 fCircuit = new TGTransientFrame(gClient->GetRoot(), fMain, 50, 50);
501 fCircuit->Connect("CloseWindow()", "AliMUONTriggerGUI", this, "CloseCircuit()");
502 fCircuit->DontCallClose(); // to avoid double deletions.
503
504 // use hierarchical cleaning
505 fCircuit->SetCleanup(kDeepCleanup);
506
507 fCircuit->SetWindowName("Board circuit");
508
509 // sub-frames
510
511 circuit1 = new TGCompositeFrame(fCircuit, 400, 200, kHorizontalFrame);
512 circuit2 = new TGCompositeFrame(fCircuit, 400, 200, kHorizontalFrame);
513
514 // labels
515
516 circuitL1 = new TGLabel(circuit1, new TGString("Circuit number:"));
517
518 // text entry
519
520 circuitText1 = new TGTextEntry(circuit1, fTxtCircuit = new TGTextBuffer(10));
521 // buttons
522
523 circuitCancel = new TGTextButton(circuit2, "Cancel", 1);
524 circuitCancel->Connect("Clicked()", "AliMUONTriggerGUI", this, "DoCircuitCancel()");
525 //circuitCancel->Resize(100, circuitCancel->GetDefaultHeight());
526
527 circuitOpen = new TGTextButton(circuit2, "Open", 2);
528 circuitOpen->Connect("Clicked()", "AliMUONTriggerGUI", this, "DoCircuitOpen()");
529 //circuitOpen->Resize(100, circuitOpen->GetDefaultHeight());
530
531 // adding
532
533 circuit1->AddFrame(circuitL1,
534 new TGLayoutHints(kLHintsLeft |
535 kLHintsCenterY,
536 5, 5, 2, 2)
537 );
538
539 circuit1->AddFrame(circuitText1,
540 new TGLayoutHints(kLHintsRight |
541 kLHintsCenterY,
542 0, 2, 2, 2)
543 );
544
545 circuit2->AddFrame(circuitCancel,
546 new TGLayoutHints(kLHintsBottom |
547 kLHintsCenterY,
548 5, 5, 2, 2)
549 );
550
551 circuit2->AddFrame(circuitOpen,
552 new TGLayoutHints(kLHintsBottom |
553 kLHintsCenterY,
554 5, 5, 2, 2)
555 );
556
557 fCircuit->AddFrame(circuit1,
558 new TGLayoutHints(kLHintsTop | kLHintsExpandX, 2, 2, 3, 0));
559
560 fCircuit->AddFrame(circuit2,
561 new TGLayoutHints(kLHintsTop | kLHintsExpandX, 2, 2, 3, 0));
562
563 fCircuit->MapSubwindows();
564 fCircuit->Resize();
565 fCircuit->MapWindow();
566
567 break;
568
569 case kMTRIGGERDSET:
f69a61cb 570 /*
905654c2 571 cout << "Trigger with boards digits....." << endl;
572 fTriggerProcessor->FeedBoardsGUI(Boards());
573
574 nLocalTrigger = fTriggerProcessor->TriggerGUI(trigInfo,kTRUE);
575
576 cout << "Trigger done with " << nLocalTrigger << " local decisions !" << endl;
577
578 for (Int_t ilo = 0; ilo < nLocalTrigger; ilo++) {
579
580 cout << "Local decision " << ilo << endl;
581 cout << "Circuit = " << trigInfo[6*ilo+0] << endl;
582 cout << "LoStripX = " << trigInfo[6*ilo+1] << endl;
583 cout << "LoStripY = " << trigInfo[6*ilo+2] << endl;
584 cout << "LoDev = " << trigInfo[6*ilo+3] << endl;
585 cout << "LoLpt = " << trigInfo[6*ilo+4] << endl;
586 cout << "LoHpt = " << trigInfo[6*ilo+5] << endl;
587 cout << endl;
588 }
f69a61cb 589 */
905654c2 590 break;
591
592 default:
593 printf("Menu item %d selected\n", id);
594 break;
595
596 }
597
598}
599
600//__________________________________________________________________________
601void AliMUONTriggerGUI::CloseRunInput() const
602{
603 /// close the run input frame
604
605 delete fRunInput;
606
607}
608
609//__________________________________________________________________________
610void AliMUONTriggerGUI::CloseError() const
611{
612 /// close the error frame
613
614 delete fError;
615
616}
617
618//__________________________________________________________________________
619void AliMUONTriggerGUI::CloseControl() const
620{
621 /// close the event control frame
622
623 delete fControl;
624
625 //gSystem->Exec("cd $PWD/mtrun; aliroot -b -q mtsim.C");
626
627}
628
629//__________________________________________________________________________
630void AliMUONTriggerGUI::CloseCircuit() const
631{
632 /// close the circuit frame
633
634 delete fCircuit;
635
636}
637
638//__________________________________________________________________________
639void AliMUONTriggerGUI::CloseWindow()
640{
641 /// close the main frame and exit aplication
642
643 delete fRunLoader;
644 printf("\n");
645 gApplication->Terminate();
646
647}
648
649//__________________________________________________________________________
650void AliMUONTriggerGUI::DoRunApply()
651{
652 /// apply changes in the run control frame
653
654 printf("Input 1 = %s \n",fTxtBuffer1->GetString());
655
656 TString es = TString(fTxtBuffer2->GetString());
657 fEvent = es.Atoi();
658
659 printf("Input 2 = %s event = %d \n",fTxtBuffer2->GetString(),fEvent);
660
661 TString error = TString("");;
662
663 fPath->Form("%s",fTxtBuffer1->GetString());
664 fFileName->Form("%s",fTxtBuffer1->GetString());
665 printf("File location: %s \n",fFileName->Data());
666
667 if (gSystem->AccessPathName(fFileName->Data()) || !fFileName->EndsWith(".root")) {
668
669 error.Append("No galice file: ");
670 error.Append(fFileName->Data());
671 DoErrorGUI(error.Data());
672
673 } else {
674
675 TFile *ftest = new TFile(fFileName->Data(),"READ");
676 AliRun *galice = (AliRun*)ftest->Get("gAlice");
677 if (galice == 0) {
678
679 ftest->Close();
680 delete ftest;
681
682 error.Append("No gAlice in file: ");
683 error.Append(fFileName->Data());
684 DoErrorGUI(error.Data());
685
686 return;
687
688 } else {
689 ftest->Close();
690 delete ftest;
691 }
692
693 if (fRunLoader) delete fRunLoader;
694
695 fRunLoader = AliRunLoader::Open(fFileName->Data(),"MUONFolder","READ");
696
697 if (fRunLoader == 0x0) {
698
699 DoErrorGUI("No run loader !");
700
701 } else {
702
703 fRunLoader->LoadgAlice();
704 gAlice = fRunLoader->GetAliRun();
705 fEventsPerRun = gAlice->GetEventsPerRun();
706
707 fLoader = fRunLoader->GetLoader("MUONLoader");
708 fLoader->LoadDigits("READ");
709 fRunLoader->GetEvent(fEvent);
710
711 fRunInput->SendCloseMessage();
712
713 if (!fBoardsInit) {
714 InitBoards();
715 }
716
717 if (fDiMap) {
718 if (fDiMap->IsOn()) {
719 fDiMap->SetLoader(fLoader);
720 }
721 }
722
f69a61cb 723 //fTriggerProcessor = new AliMUONTriggerElectronics(fCalibrationData);
905654c2 724 }
725
726 }
727
728}
729
730//__________________________________________________________________________
731void AliMUONTriggerGUI::DoRunCancel()
732{
733 /// cancel the changes in the run control frame
734
735 printf("Input 1 = %s \n",fTxtBuffer1->GetString());
736
737 TString es = TString(fTxtBuffer2->GetString());
738 fEvent = es.Atoi();
739
740 printf("Input 2 = %s event = %d \n",fTxtBuffer2->GetString(),fEvent);
741
742 fRunInput->SendCloseMessage();
743
744}
745
746//__________________________________________________________________________
747void AliMUONTriggerGUI::DoErrorGUI(const Char_t *wt)
748{
749 /// show an error message in a new frame
750
751 fError = new TGTransientFrame(gClient->GetRoot(), fMain, 50, 50);
752 fError->Connect("CloseWindow()", "AliMUONTriggerGUI", this, "CloseError()");
753 fError->DontCallClose(); // to avoid double deletions.
754
755 // use hierarchical cleaning
756 fError->SetCleanup(kDeepCleanup);
757
758 fError->SetWindowName("Error !");
759
760 TGCompositeFrame *fW = new TGCompositeFrame(fError, 50, 50, kVerticalFrame);
761
762 TGTextButton *fErrorOK = new TGTextButton(fW, "&Ok", 1);
763 fErrorOK->Connect("Clicked()", "AliMUONTriggerGUI", this, "DoErrorOK()");
764
765 fW->AddFrame(fErrorOK,
766 new TGLayoutHints(kLHintsBottom |
767 kLHintsCenterX,
768 5, 5, 5, 5)
769 );
770
771 TGLabel *fWL = new TGLabel(fW, new TGString(wt));
772
773 fW->AddFrame(fWL,
774 new TGLayoutHints(kLHintsTop |
775 kLHintsCenterX,
776 5, 5, 5, 5)
777 );
778
779 fError->AddFrame(fW,
780 new TGLayoutHints(kLHintsLeft |
781 kLHintsCenterY,
782 5, 5, 5, 5)
783 );
784
785 fError->MapSubwindows();
786 fError->Resize();
787 fError->MapWindow();
788
789}
790
791//__________________________________________________________________________
792void AliMUONTriggerGUI::DoNextEvent()
793{
794 /// load next event from the file
795
796 TString error = TString("");
797
798 if (fEvent < (fEventsPerRun-1)) {
799 fEvent++;
800 fRunLoader->GetEvent(fEvent);
801
802 fEvString->Form("%d",fEvent);
803 fTxtBuffer2->RemoveText(0,5);
804 fTxtBuffer2->AddText(0,fEvString->Data());
805 fSkipToEventTxt->SetFocus();
806
807 } else {
808 error.Form("Only %d event(s) in the run !",fEventsPerRun);
809 DoErrorGUI(error.Data());
810 }
811
812}
813
814//__________________________________________________________________________
815void AliMUONTriggerGUI::DoPreviousEvent()
816{
817 /// load previous event from the input file
818
819 TString error = TString("");
820
821 if (fEvent > 0) {
822 fEvent--;
823 fRunLoader->GetEvent(fEvent);
824
825 fEvString->Form("%d",fEvent);
826 fTxtBuffer2->RemoveText(0,5);
827 fTxtBuffer2->AddText(0,fEvString->Data());
828 fSkipToEventTxt->SetFocus();
829
830 } else {
831 error.Form("Already at event 0 !");
832 DoErrorGUI(error.Data());
833 }
834
835}
836
837//__________________________________________________________________________
838void AliMUONTriggerGUI::DoSkipToEvent()
839{
840 /// skip to event -input- from the input file
841
842 TString error = TString("");
843
844 TString es = TString(fTxtBuffer2->GetString());
845 fEvent = es.Atoi();
846
847 if (fEvent < 0 || fEvent > (fEventsPerRun-1)) {
848 error.Form("Event number out of range !");
849 DoErrorGUI(error.Data());
850 } else {
851 fRunLoader->GetEvent(fEvent);
852 /*
853 fRunLoader->LoadKinematics();
854
855 AliStack* stack = gAlice->Stack();
856 Int_t nParticles = stack->GetNtrack();
857 Int_t nPrimaries = stack->GetNprimary();
858
859 TParticle *part;
860 Int_t nMuons = 0;
861 Int_t pdgCode;
862 Double_t px, py, pz, theta, phi;
863 for (Int_t i = 0; i < nPrimaries; i++) {
864 part = stack->Particle(i);
865 if (!part) continue;
866 if (TMath::Abs(part->GetPdgCode()) == 13) {
867 nMuons++;
868 pdgCode = part->GetPdgCode();
869 px = part->Px();
870 py = part->Py();
871 pz = part->Pz();
872 theta = part->Theta();
873 phi = part->Phi();
874 printf("Kine %d px %f py %f pz %f th %f ph %f \n",pdgCode,px,py,pz,theta,phi);
875 }
876 }
877 */
878 }
879
880}
881
882//__________________________________________________________________________
883void AliMUONTriggerGUI::DoErrorOK()
884{
885 /// close the error frame
886
887 fError->SendCloseMessage();
888
889}
890
891//__________________________________________________________________________
892void AliMUONTriggerGUI::DoControlClose()
893{
894 /// close the event control frame
895
896 fControl->SendCloseMessage();
897
898}
899
900//__________________________________________________________________________
901void AliMUONTriggerGUI::DoCircuitCancel()
902{
903 /// close the circuit frame
904
905 fCircuit->SendCloseMessage();
906
907}
908
909//__________________________________________________________________________
910void AliMUONTriggerGUI::DoCircuitOpen()
911{
912 /// open a circuit
913
914 TString cs = TString(fTxtCircuit->GetString());
915 Int_t icirc = cs.Atoi();
916
917 AliMUONTriggerGUIboard *board;
918
919 for (Int_t ib = 0; ib < kNBoards; ib++) {
920
921 board = GetBoard(ib);
922
923 if (board->GetIdCircuit() == icirc) {
924
925 OpenBoard(ib);
926
927 if (fDiMap) {
928 if (fDiMap->IsOn()) {
929 fDiMap->SelectBoard(ib);
930 }
931 }
932
933 fCircuit->SendCloseMessage();
934 return;
935 }
936
937 }
938
939}
940
941//__________________________________________________________________________
942AliMUONTriggerGUIboard* AliMUONTriggerGUI::GetBoard(Int_t id) const
943{
944 /// return board with "id"
945
946 if (fBoards == 0) return 0;
947 void * b = fBoards->UncheckedAt(id);
948 if (b == 0) return 0;
949
950 return (AliMUONTriggerGUIboard*)b;
951
952}
953
954//__________________________________________________________________________
955void AliMUONTriggerGUI::OpenBoard(Int_t id)
956{
957 /// open board with "id" in a new frame
958
959 AliMUONTriggerGUIboard *board = GetBoard(id);
960 UShort_t status = board->GetStatus();
961 board->SetOpen(kTRUE);
962
963 AliMUONTriggerGUIbdmap *bf;
964 Char_t text[200];
965
966 bf = new AliMUONTriggerGUIbdmap(gClient->GetRoot(), fMain, 400, 200);
967
968 if (status & kGood) {
969 sprintf(text,"%s (Circuit %4d) status : working",
970 board->GetBoardName(),board->GetIdCircuit());
971 }
972
973 if (status & kWithProblems) {
974 sprintf(text,"%s (Circuit %4d) status : has problems...",
975 board->GetBoardName(),board->GetIdCircuit());
976 }
977
978 if (status & kNotWorking) {
979 sprintf(text,"%s (Circuit %4d) status : not working",
980 board->GetBoardName(),board->GetIdCircuit());
981 }
982
983 if (status & kUnknown) {
984 sprintf(text,"%s (Circuit %4d) status : unknown",
985 board->GetBoardName(),board->GetIdCircuit());
986 }
987
988 bf->SetName(text);
989 bf->SetBoard(Boards(),id);
990 bf->SetLoader(fLoader);
991 bf->Init();
992
993 bf->Show();
994
995 if (fDiMap) {
996 if (fDiMap->IsOn()) {
997 fDiMap->SelectBoard(id);
998 }
999 }
1000
1001}
1002
1003//__________________________________________________________________________
1004void AliMUONTriggerGUI::Init()
1005{
1006 /// initialize the main GUI frame
1007
1008 if (!fBoardsInit) {
1009 InitBoards();
1010 }
1011
1012 /*
1013 AliMUONTriggerGUIboard *board;
1014 for (Int_t ib = 0; ib < kNBoards; ib++) {
1015 board = GetBoard(ib);
1016 board->Dump();
1017 }
1018 */
1019}
1020
1021//__________________________________________________________________________
1022void AliMUONTriggerGUI::InitBoards()
1023{
1024 /// create board objects and define the sensitive regions in the image map
1025
1026 fBoardsInit = kTRUE;
1027
1028 AliMUONTriggerCrateStore* crateManager = new AliMUONTriggerCrateStore();
1029 crateManager->ReadFromFile();
1030
1031 Int_t nPixelX = 700;
1032 Int_t nPixelY = 676;
1033
1034 Int_t nPixelBorderX = 40; // to guess...
1035 Int_t nPixelBorderY = 40; // to guess...
1036
1037 Float_t boardsX = 2*257.00; // cm
1038 Float_t boardsY = 2*306.61; // cm
1039
1040 FILE *fmap;
1041
1042 Int_t side, col, line, nbx, detElemId = 0;
1043 UShort_t status = 1;
1044 Float_t xCenter, yCenter, zCenter, xWidth, yWidth;
1045 Float_t xc, yc;
1046 Char_t name[8], text[200];
1047 Int_t x, y;
1048 UInt_t w, h;
1049 Int_t xp[5];
1050 Int_t yp[5];
1051 TString mapspath = gSystem->Getenv("ALICE_ROOT");
1052 mapspath.Append("/MUON/data");
1053
1054 TGRegion *reg;
1055 AliMUONTriggerGUIboard *board;
1056
1057 // regions for the image map
1058
1059 sprintf(text,"%s/guimapp11.txt",mapspath.Data());
1060 fmap = fopen(text,"r");
1061
1062 for (Int_t ib = 0; ib < kNBoards; ib++) {
1063
1064 fscanf(fmap,"%d %d %d %d %f %f %f %f %f %s \n",&side,&col,&line,&nbx,&xCenter,&yCenter,&xWidth,&yWidth,&zCenter,&name[0]);
1065
1066 //printf("%d %d %d %d %f %f %f %f %f %s \n",side,col,line,nbx,xCenter,yCenter,xWidth,yWidth,zCenter,name);
1067
1068 board = new AliMUONTriggerGUIboard(ib,name);
1069
1070 status = 1;
1071 board->SetStatus(status);
1072
1073 // calculate detElemId%100
1074 // side=0 left
1075 // side=1 right
1076 // ALICE SC
1077 if (side == 0) detElemId = 14 - line;
1078 if (side == 1 && line < 5) detElemId = 13 + line;
1079 if (side == 1 && line >= 5) detElemId = line - 5;
1080
1081 board->SetDetElemId(detElemId);
1082
1083 Boards()->Add(board);
1084
1085 xc = xCenter;
1086 yc = yCenter;
1087
1088 x = (Int_t)(nPixelX/2 + xc * (nPixelX - 2*nPixelBorderX)/boardsX);
1089 y = (Int_t)(nPixelY/2 - yc * (nPixelY - 2*nPixelBorderY)/boardsY);
1090
1091 if (x < 0) x = 0;
1092 if (y < 0) y = 0;
1093
1094 w = (UInt_t)(xWidth*(nPixelX-2*nPixelBorderX)/boardsX);
1095 h = (UInt_t)(yWidth*(nPixelY-2*nPixelBorderY)/boardsY);
1096
1097 xp[0] = x-w/2;
1098 xp[1] = x+w/2;
1099 xp[2] = x+w/2;
1100 xp[3] = x-w/2;
1101 xp[4] = x-w/2;
1102
1103 yp[0] = y-h/2;
1104 yp[1] = y-h/2;
1105 yp[2] = y+h/2;
1106 yp[3] = y+h/2;
1107 yp[4] = y-h/2;
1108
1109 reg = new TGRegion(5,xp,yp);
1110 fImageMap->AddRegion(*reg, ib);
1111
1112 if (status & kGood) {
1113 sprintf(text,"%s working",name);
1114 }
1115 if (status & kWithProblems) {
1116 sprintf(text,"%s has problems...",name);
1117 }
1118 if (status & kNotWorking) {
1119 sprintf(text,"%s not working",name);
1120 }
1121 if (status & kUnknown) {
1122 sprintf(text,"%s status unknown",name);
1123 }
1124
1125 //fImageMap->SetToolTipText(ib, text);
1126
1127 }
1128
1129 fclose(fmap);
1130
1131 // MT position and dimension in board
1132
1133 for (Int_t imt = 0; imt < kNMT; imt++) {
1134
1135 sprintf(text,"%s/guimapp%2d.txt",mapspath.Data(),11+imt);
1136
1137 fmap = fopen(text,"r");
1138
1139 for (Int_t ib = 0; ib < kNBoards; ib++) {
1140
1141 fscanf(fmap,"%d %d %d %d %f %f %f %f %f %s \n",&side,&col,&line,&nbx,&xCenter,&yCenter,&xWidth,&yWidth,&zCenter,&name[0]);
1142
1143 board = GetBoard(ib);
1144 board->SetDimensions(imt,xCenter,yCenter,zCenter,xWidth,yWidth);
1145
1146 }
1147
1148 fclose(fmap);
1149
1150 }
1151
1152 // MT x-strips indices and circuit number
1153 Int_t ix, iy1, iy2, sIx, sIy1, cathode, icirc;
1154 sprintf(text,"%s/guimapix11.txt",mapspath.Data());
1155
1156 fmap = fopen(text,"r");
1157
1158 for (Int_t ib = 0; ib < kNBoards; ib++) {
1159
1160 fscanf(fmap,"%d %d %d %d %d %d %d %s \n",&side,&col,&line,&nbx,&ix,&iy1,&iy2,&name[0]);
1161
1162 board = GetBoard(ib);
1163 board->SetXSindex(ix,iy1,iy2);
1164
1165 // set the circuit number
1166 detElemId = board->GetDetElemId();
1167 detElemId += 100 * 11;
1168 cathode = 0;
1169 sIx = board->GetXSix();
1170 sIy1 = board->GetXSiy1();
1171 const AliMpVSegmentation* seg =
1172 AliMpSegmentation::Instance()->GetMpSegmentation(detElemId,AliMp::GetCathodType(cathode));
1173
1174 AliMpPad pad = seg->PadByIndices(AliMpIntPair(sIx,sIy1),kTRUE);
1175 AliMpIntPair location = pad.GetLocation(0);
1176
1177 Int_t nboard = location.GetFirst();
1178 AliMUONLocalTriggerBoard* b = crateManager->LocalBoard(nboard);
1179 icirc = b->GetNumber();
1180 board->SetBoardName((Char_t*)b->GetName());
1181 board->SetIdCircuit(icirc);
1182
1183 TString crateName = b->GetCrate();
1184
1185 sprintf(text,"%s (crate %s circuit %3d, number %3d)",board->GetBoardName(),crateName.Data(),icirc,ib);
1186 fImageMap->SetToolTipText(ib, text);
1187
1188 }
1189
1190 fclose(fmap);
1191
1192 // MT y-strips indices
1193 Int_t ix1, ix2, iy;
1194
1195 sprintf(text,"%s/guimapiy11.txt",mapspath.Data());
1196
1197 fmap = fopen(text,"r");
1198
1199 for (Int_t ib = 0; ib < kNBoards; ib++) {
1200
1201 fscanf(fmap,"%d %d %d %d %d %d %d %s \n",&side,&col,&line,&nbx,&ix1,&ix2,&iy,&name[0]);
1202
1203 board = GetBoard(ib);
1204 board->SetYSindex(ix1,ix2,iy);
1205
1206 }
1207
1208 fclose(fmap);
1209
1210 // Extended y-strips over neighbouring boards
1211
1212 sprintf(text,"%s/guimapp11.txt",mapspath.Data());
1213
1214 fmap = fopen(text,"r");
1215
1216 for (Int_t ib = 0; ib < kNBoards; ib++) {
1217
1218 fscanf(fmap,"%d %d %d %d %f %f %f %f %f %s \n",&side,&col,&line,&nbx,&xCenter,&yCenter,&xWidth,&yWidth,&zCenter,&name[0]);
1219
1220 board = GetBoard(ib);
1221
1222 board->SetPosition(nbx);
1223
1224 if ((col == 2 || col == 3) && (line >= 4 && line <= 6)) {
1225 board->SetYOver(4);
1226 } else
1227
1228 if (col == 1 && (line == 4 || line == 6)) {
1229 board->SetYOver(3);
1230 } else
1231
1232 if (col == 7 || line == 1 || line == 9) {
1233 board->SetYOver(1);
1234 } else
1235
1236 {
1237 board->SetYOver(2);
1238 }
1239
1240 }
1241
1242 fclose(fmap);
1243
1244 // Set coordinates of strips boxes
1245
1246 for (Int_t ib = 0; ib < kNBoards; ib++) {
1247
1248 board = GetBoard(ib);
1249 SetStripBoxes(board);
1250
1251 }
1252
1253}
1254
1255//__________________________________________________________________________
1256void AliMUONTriggerGUI::SetStripBoxes(AliMUONTriggerGUIboard *board)
1257{
1258 /// set coordinates of strip boxes
1259
1260 gAlice = fRunLoader->GetAliRun();
1261 AliMUON *pMUON = (AliMUON*)gAlice->GetModule("MUON");
1262 const AliMUONGeometryTransformer* kGeomTransformer = pMUON->GetGeometryTransformer();
1263
1264 const AliMpVSegmentation* seg;
1265 AliMpPad pad;
1266 AliMpDEIterator it;
1267
1268 Int_t chamber, detElemId, maxX, maxY, ic;
1269 Float_t xpmin, xpmax, ypmin, ypmax;
1270 Float_t xg1, xg2, yg1, yg2, zg1;
1271 Float_t xlocal1, xlocal2, ylocal1, ylocal2;
1272 Float_t xCenter, yCenter, xWidth, yWidth;
1273
1274 for (Int_t i = 0; i < kNMT; i++) {
1275
1276 chamber = 11+i;
1277
1278 xCenter = board->GetXCenter(i);
1279 yCenter = board->GetYCenter(i);
1280 xWidth = board->GetXWidth(i);
1281 yWidth = board->GetYWidth(i);
1282
1283 for ( it.First(chamber-1); ! it.IsDone(); it.Next() ) {
1284
1285 detElemId = it.CurrentDEId();
1286
1287 if (detElemId%100 != board->GetDetElemId()) continue;
1288
1289 /*---------- y-pads ic = 2 ----------*/
1290 ic = 2;
1291
1292 seg = AliMpSegmentation::Instance()->GetMpSegmentation(detElemId, AliMp::GetCathodType(ic-1));
1293
1294 maxX = seg->MaxPadIndexX();
1295 maxY = seg->MaxPadIndexY();
1296
1297 for (Int_t ix = 0; ix <= maxX; ix++) {
1298 for (Int_t iy = 0; iy <= maxY; iy++) {
1299
1300 pad = seg->PadByIndices(AliMpIntPair(ix,iy),kFALSE);
1301
1302 if (!pad.IsValid()) continue;
1303
1304 // get the pad position and dimensions
1305 xlocal1 = pad.Position().X();
1306 ylocal1 = pad.Position().Y();
1307 xlocal2 = pad.Dimensions().X();
1308 ylocal2 = pad.Dimensions().Y();
1309
1310 kGeomTransformer->Local2Global(detElemId, xlocal1, ylocal1, 0, xg1, yg1, zg1);
1311 // (no transformation for pad dimensions)
1312 xg2 = xlocal2;
1313 yg2 = ylocal2;
1314
1315 // transform in the monitor coordinate system
1316 //xpmin = -(xg1+xg2);
1317 //xpmax = -(xg1-xg2);
1318 //ypmin = -(yg2-yg1);
1319 //ypmax = +(yg2+yg1);
1320 // ALICE SC
1321 xpmin = +(xg1-xg2);
1322 xpmax = +(xg1+xg2);
1323 ypmin = -(yg2-yg1);
1324 ypmax = +(yg2+yg1);
1325
1326 xpmin -= xCenter;
1327 xpmax -= xCenter;
1328 ypmin -= yCenter;
1329 ypmax -= yCenter;
1330
1331 Int_t iX1, iX2, iY, ixDig;
1332 iX1 = board->GetYSix1();
1333 iX2 = board->GetYSix2();
1334 iY = board->GetYSiy();
1335 if (ix >= iX1 && ix <= iX2 && iy == iY) {
1336
1337 ypmin = -0.5*yWidth;
1338 ypmax = +0.5*yWidth;
1339
1340 ixDig = ix - iX1;
1341
1342 board->SetYDigBox(i,ixDig,(Double_t)xpmin,(Double_t)ypmin,
1343 (Double_t)xpmax,(Double_t)ypmax);
1344
1345 }
1346
1347 } // end maxY
1348 } // end maxX
1349
1350 /*---------- x-pads ic = 1 ----------*/
1351 ic = 1;
1352
1353 seg = AliMpSegmentation::Instance()->GetMpSegmentation(detElemId, AliMp::GetCathodType(ic-1));
1354
1355 maxX = seg->MaxPadIndexX();
1356 maxY = seg->MaxPadIndexY();
1357
1358 for (Int_t ix = 0; ix <= maxX; ix++) {
1359 for (Int_t iy = 0; iy <= maxY; iy++) {
1360
1361 pad = seg->PadByIndices(AliMpIntPair(ix,iy),kFALSE);
1362
1363 if (!pad.IsValid()) continue;
1364
1365 // get the pad position and dimensions
1366 xlocal1 = pad.Position().X();
1367 ylocal1 = pad.Position().Y();
1368 xlocal2 = pad.Dimensions().X();
1369 ylocal2 = pad.Dimensions().Y();
1370
1371 kGeomTransformer->Local2Global(detElemId, xlocal1, ylocal1, 0, xg1, yg1, zg1);
1372 // (no transformation for pad dimensions)
1373 xg2 = xlocal2;
1374 yg2 = ylocal2;
1375
1376 // transform in the monitor coordinate system
1377 //xpmin = -(xg1+xg2);
1378 //xpmax = -(xg1-xg2);
1379 //ypmin = -(yg2-yg1);
1380 //ypmax = +(yg2+yg1);
1381 // ALICE SC
1382 xpmin = +(xg1+xg2);
1383 xpmax = +(xg1-xg2);
1384 ypmin = -(yg2-yg1);
1385 ypmax = +(yg2+yg1);
1386
1387 xpmin -= xCenter;
1388 xpmax -= xCenter;
1389 ypmin -= yCenter;
1390 ypmax -= yCenter;
1391
1392 Int_t iX, iY1, iY2, iyDig;
1393 iX = board->GetXSix();
1394 iY1 = board->GetXSiy1();
1395 iY2 = board->GetXSiy2();
1396 if (ix == iX && iy >= iY1 && iy <= iY2) {
1397
1398 iyDig = iy - iY1;
1399
1400 board->SetXDigBox(i,iyDig,(Double_t)xpmin,(Double_t)ypmin,
1401 (Double_t)xpmax,(Double_t)ypmax);
1402
1403 }
1404
1405 } // end maxY
1406 } // end maxX
1407
1408 } // end detElemId
1409
1410 } // end kNMT loop
1411
1412}
1413