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