]>
Commit | Line | Data |
---|---|---|
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 | |
59 | ClassImp(AliMUONTriggerGUI) | |
60 | /// \endcond | |
61 | ||
62 | //__________________________________________________________________________ | |
63 | AliMUONTriggerGUI::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 | //__________________________________________________________________________ |
217 | void 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 | //__________________________________________________________________________ | |
601 | void AliMUONTriggerGUI::CloseRunInput() const | |
602 | { | |
603 | /// close the run input frame | |
604 | ||
605 | delete fRunInput; | |
606 | ||
607 | } | |
608 | ||
609 | //__________________________________________________________________________ | |
610 | void AliMUONTriggerGUI::CloseError() const | |
611 | { | |
612 | /// close the error frame | |
613 | ||
614 | delete fError; | |
615 | ||
616 | } | |
617 | ||
618 | //__________________________________________________________________________ | |
619 | void 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 | //__________________________________________________________________________ | |
630 | void AliMUONTriggerGUI::CloseCircuit() const | |
631 | { | |
632 | /// close the circuit frame | |
633 | ||
634 | delete fCircuit; | |
635 | ||
636 | } | |
637 | ||
638 | //__________________________________________________________________________ | |
639 | void 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 | //__________________________________________________________________________ | |
650 | void 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 | //__________________________________________________________________________ | |
731 | void 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 | //__________________________________________________________________________ | |
747 | void 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 | //__________________________________________________________________________ | |
792 | void 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 | //__________________________________________________________________________ | |
815 | void 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 | //__________________________________________________________________________ | |
838 | void 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 | //__________________________________________________________________________ | |
883 | void AliMUONTriggerGUI::DoErrorOK() | |
884 | { | |
885 | /// close the error frame | |
886 | ||
887 | fError->SendCloseMessage(); | |
888 | ||
889 | } | |
890 | ||
891 | //__________________________________________________________________________ | |
892 | void AliMUONTriggerGUI::DoControlClose() | |
893 | { | |
894 | /// close the event control frame | |
895 | ||
896 | fControl->SendCloseMessage(); | |
897 | ||
898 | } | |
899 | ||
900 | //__________________________________________________________________________ | |
901 | void AliMUONTriggerGUI::DoCircuitCancel() | |
902 | { | |
903 | /// close the circuit frame | |
904 | ||
905 | fCircuit->SendCloseMessage(); | |
906 | ||
907 | } | |
908 | ||
909 | //__________________________________________________________________________ | |
910 | void 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 | //__________________________________________________________________________ | |
942 | AliMUONTriggerGUIboard* 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 | //__________________________________________________________________________ | |
955 | void 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 | //__________________________________________________________________________ | |
1004 | void 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 | //__________________________________________________________________________ | |
1022 | void 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 | //__________________________________________________________________________ | |
1256 | void 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 |