]> git.uio.no Git - u/mrichter/AliRoot.git/blame - MUON/MUONmpgraphics/AliMpDEVisu.cxx
Double check if SM is running added. Some redundant output removed from SM
[u/mrichter/AliRoot.git] / MUON / MUONmpgraphics / AliMpDEVisu.cxx
CommitLineData
215d5755 1/**************************************************************************
2* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3* *
4* Author: The ALICE Off-line Project. *
5* Contributors are mentioned in the code where appropriate. *
6* *
7* Permission to use, copy, modify and distribute this software and its *
8* documentation strictly for non-commercial purposes is hereby granted *
9* without fee, provided that the above copyright notice appears in all *
10* copies and that both the copyright notice and this permission notice *
11* appear in the supporting documentation. The authors make no claims *
12* about the suitability of this software for any purpose. It is *
13* provided "as is" without express or implied warranty. *
14**************************************************************************/
15
16// $Id$
17// $MpId$
18
19#include "AliMpDEVisu.h"
e4d2775e 20
21#include "AliMpSlatMotifMap.h"
22#include "AliMpSt345Reader.h"
23#include "AliMpSectorReader.h"
24#include "AliMpSlat.h"
25#include "AliMpPCB.h"
e4d2775e 26#include "AliMpSectorReader.h"
27#include "AliMpSector.h"
28#include "AliMpRow.h"
29#include "AliMpVRowSegment.h"
e4d2775e 30#include "AliMpVPainter.h"
e4d2775e 31#include "AliMpMotifPosition.h"
32#include "AliMpMotifMap.h"
e4d2775e 33#include "AliMpDEIterator.h"
34#include "AliMpDEManager.h"
35#include "AliMpDetElement.h"
36#include "AliMpStationType.h"
37#include "AliMpSegmentation.h"
38#include "AliMpPad.h"
39#include "AliMpDDLStore.h"
ab167304 40#include "AliMpManuStore.h"
215d5755 41#include "AliMpVPadIterator.h"
37ec2d4a 42#include "AliMpCDB.h"
ab167304 43#include "AliMpDataStreams.h"
e4d2775e 44
215d5755 45#include "AliLog.h"
46
47#include <TMath.h>
48#include <TString.h>
215d5755 49#include <TCanvas.h>
50#include <TGButton.h>
51#include <TRootEmbeddedCanvas.h>
52#include <TGLabel.h>
53#include <TGComboBox.h>
54#include <TGNumberEntry.h>
55#include <TGTextView.h>
56#include <TGTextEntry.h>
e4d2775e 57
290882e9 58#include <cstdio>
59
e4d2775e 60// Category: graphics
3d1463c8 61
62//-----------------------------------------------------------------------------
e4d2775e 63// Class AliMpDEVisu
64// -----------------------
65// GUI for drawing segmentation
66// motif manu and associated channels
67// date: 2007/01/26
68// Author: Ch. Finck
3d1463c8 69//-----------------------------------------------------------------------------
e4d2775e 70
71/// \cond CLASSIMP
72ClassImp(AliMpDEVisu)
73/// \endcond
74
75//_________________________________________________________________
76AliMpDEVisu::AliMpDEVisu(UInt_t w, UInt_t h)
215d5755 77: TGFrame(gClient->GetRoot(), w, h),
78 fkMainWindow(gClient->GetRoot()),
79 fMain(new TGMainFrame(gClient->GetRoot(), w, h)),
80 fEcanvas(0x0),
81 fChamberCombo(0x0),
82 fDECombo(0x0),
83 fNumberEntry(0x0),
84 fPlaneButton(0x0),
85 fZoomButton(0x0),
d58f6c58 86 fNameDECombo(0x0),
215d5755 87 fLogMessage(0x0),
88 fLogFile(0x0),
89 fTrashList(0x0),
90 fDEComboIdx(),
d58f6c58 91 fNameDEComboIdx(),
92 fDEOccurrence(1026),
215d5755 93 fCurrentPlane(AliMp::kBendingPlane),
94 fCurrentDetElem(100),
95 fCurrentDEName(),
7d5d0cc5 96 fkSegmentation(),
4a3224ff 97 fDDLStore(0x0),
ab167304 98 fManuStore(0x0),
215d5755 99 fZoomMode(false)
e4d2775e 100{
215d5755 101/// Standard constructor
e4d2775e 102
37ec2d4a 103 // Load mapping
331a617a 104 if ( ! AliMpCDB::LoadDDLStore() ) {
37ec2d4a 105 AliFatal("Could not access mapping from OCDB !");
106 }
37ec2d4a 107
ab167304 108 if ( ! AliMpCDB::LoadManuStore() ) {
109 AliFatal("Could not access run-dependent mapping from OCDB !");
110 }
37ec2d4a 111
ab167304 112 fDDLStore = AliMpDDLStore::Instance();
113 fManuStore = AliMpManuStore::Instance();
37ec2d4a 114
215d5755 115 fTrashList.SetOwner(kFALSE);
116
117 // Create canvas widget
118
119 Int_t width = Int_t(w*0.99);
120 Int_t height = Int_t(h*0.99);
121
122 fEcanvas = new TRootEmbeddedCanvas("Ecanvas",fMain, width, height);
123 fEcanvas->GetCanvas()->Connect("ProcessedEvent(Int_t, Int_t, Int_t, TObject*)",
124 "AliMpDEVisu",
125 this,
126 "HandleMovement(Int_t, Int_t, Int_t, TObject*)");
127
128 // Create a horizontal frame widget with buttons
129 TGHorizontalFrame *hframe = new TGHorizontalFrame(fMain,width,height/6);
130
131 TGTextButton *draw = new TGTextButton(hframe,"&Draw");
132 draw->Connect("Clicked()","AliMpDEVisu",this,"DrawDE()");
133 hframe->AddFrame(draw, new TGLayoutHints(kLHintsLeft | kLHintsCenterY,15,5,3,4));
134
135 TGTextButton *exit = new TGTextButton(hframe,"&Exit","gApplication->Terminate(0)");
136 hframe->AddFrame(exit, new TGLayoutHints(kLHintsLeft| kLHintsCenterY,5,5,3,4));
137
138
139 Int_t i = 0;
140 Char_t text[20];
141
142 // chamber label
143 TGLabel* chamberLabel = new TGLabel(hframe, "Chamber :");
144 hframe->AddFrame(chamberLabel, new TGLayoutHints(kLHintsCenterX | kLHintsLeft | kLHintsCenterY, 10, 0, 20, 0));
145 fChamberCombo = new TGComboBox(hframe, kChamberCombo);
146
147 fDEComboIdx.Set(26);
148 for(i = 0; i < 10; i++)
149 {
290882e9 150 snprintf(text,20,"%d",i+1);
215d5755 151 fChamberCombo->AddEntry(text,i);
152 }
153 fChamberCombo->Resize(40,20);
154 fChamberCombo->Select(0);
155 fChamberCombo->Associate(this);
156 hframe->AddFrame(fChamberCombo, new TGLayoutHints(kLHintsLeft, 10, 0, 9, 0));
157
158 // DE label
159 TGLabel* detElemLabel = new TGLabel(hframe, "DE :");
160 hframe->AddFrame(detElemLabel, new TGLayoutHints(kLHintsCenterX | kLHintsLeft | kLHintsCenterY, 10, 0, 20, 0));
161 fDECombo = new TGComboBox(hframe, kDECombo);
162 UpdateComboDE();
163
164 fDECombo->Resize(80,20);
165 fDECombo->Select(0);
166 fDECombo->Associate(this);
167 hframe->AddFrame(fDECombo, new TGLayoutHints(kLHintsLeft, 10, 0, 9, 0));
d58f6c58 168 fDEOccurrence.Reset(-1);
169
215d5755 170 TGTextButton *next = new TGTextButton(hframe,"&Next");
171 next->Connect("Clicked()","AliMpDEVisu",this,"NextDE()");
172 hframe->AddFrame(next, new TGLayoutHints(kLHintsLeft | kLHintsCenterY,5,5,3,4));
173
174 // DE name
175 TGLabel* detElemName = new TGLabel(hframe, "Name :");
176 hframe->AddFrame(detElemName, new TGLayoutHints(kLHintsCenterX | kLHintsLeft | kLHintsCenterY, 10, 0, 20, 0));
177
178 AliMpDetElement* detElem = AliMpDEManager::GetDetElement(fCurrentDetElem);
179 fCurrentDEName = detElem->GetDEName();
d58f6c58 180 fNameDECombo = new TGComboBox(hframe, kDEName);
181
09840862 182 UpdateNameView(kTRUE);
d58f6c58 183 fNameDECombo->Resize(160, 20);
184 fNameDECombo->Select(0);
185 fNameDECombo->Associate(this);
186 hframe->AddFrame(fNameDECombo, new TGLayoutHints(kLHintsLeft, 10, 0, 9, 0));
215d5755 187
188 // plane type
189 fPlaneButton = new TGCheckButton(hframe, "NB Plane", kPlaneType);
190 fPlaneButton->SetState(kButtonUp);
191 fPlaneButton->Associate(this);
192 hframe->AddFrame(fPlaneButton, new TGLayoutHints(kLHintsLeft, 10, 0, 9, 0));
193
194
195 // button motif
196 TGTextButton* drawManu = new TGTextButton(hframe,"&Search");
197 drawManu->Connect("Clicked()","AliMpDEVisu",this,"DrawManuMotif(Bool_t)");
198 drawManu->SetToolTipText("Search for a given manu number");
199 hframe->AddFrame(drawManu, new TGLayoutHints(kLHintsLeft | kLHintsCenterY,15,5,3,4));
200
201 // entry manu
202 fNumberEntry = new TGNumberEntry(hframe, 0, 4, -1,
203 TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative,
204 TGNumberFormat::kNELLimitMinMax, 1, 1500);
205 fNumberEntry->Resize(60,20);
206 hframe->AddFrame(fNumberEntry, new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 10, 0, 9, 0));
207
208 // reset button
209 TGTextButton *resetManu = new TGTextButton(hframe,"&Reset");
210 resetManu->Connect("Clicked()","AliMpDEVisu",this,"ResetManu()");
211 hframe->AddFrame(resetManu, new TGLayoutHints(kLHintsLeft | kLHintsCenterY,10,5,3,4));
212
213 // delete window button
214 TGTextButton* deletePopup = new TGTextButton(hframe,"&Delete_Popup");
215 deletePopup->Connect("Clicked()","AliMpDEVisu",this,"DeletePopUp()");
216 deletePopup->SetToolTipText("Delete motif popup window");
217 hframe->AddFrame(deletePopup, new TGLayoutHints(kLHintsLeft | kLHintsCenterY,15,5,3,4));
218
219
220 // log mesg
221 TGHorizontalFrame *logFrame = new TGHorizontalFrame(fMain, width/2, height/6);
222
223 TGLabel* logName = new TGLabel(logFrame, "Log MSG:");
224 logFrame->AddFrame(logName, new TGLayoutHints(kLHintsCenterX | kLHintsLeft | kLHintsCenterY, 10, 0, 2, 0));
225
226 fLogMessage = new TGTextView(logFrame, width/2, 60);
227 fLogMessage->ShowBottom();
228
229 logFrame->AddFrame(fLogMessage, new TGLayoutHints(kLHintsLeft, 10, 0, 2, 0));
230
231 // clear log mesg
e4d2775e 232 TGTextButton* clearLog = new TGTextButton(logFrame,"&Clear");
215d5755 233 clearLog->Connect("Clicked()","AliMpDEVisu",this,"ClearLogMessage()");
234 clearLog->SetToolTipText("Clear log message");
235 logFrame->AddFrame(clearLog, new TGLayoutHints(kLHintsLeft | kLHintsCenterY,15,5,3,4));
236
237 // save log mesg
238 TGTextButton* saveLog = new TGTextButton(logFrame,"&Save");
239 saveLog->Connect("Clicked()","AliMpDEVisu",this,"SaveLogMessage()");
240 saveLog->SetToolTipText("Save log message into file");
241 logFrame->AddFrame(saveLog, new TGLayoutHints(kLHintsLeft | kLHintsCenterY,5,5,3,4));
242
243 // log file name
244 fLogFile = new TGTextEntry(logFrame,"AliMpDEVisu.log");
245 fLogFile->SetToolTipText("Default log file name");
246 logFrame->AddFrame(fLogFile, new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 10, 0, 9, 0));
247
248 // zoom mode
249 fZoomButton = new TGCheckButton(logFrame, new TGHotString("&Zoom Mode"), kZoomMode);
250 fZoomButton->Associate(this);
251 fZoomButton->SetState(kButtonUp);
e4d2775e 252
215d5755 253 logFrame->AddFrame(fZoomButton, new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 20, 0, 9, 0));
254
255 // frame
256 fMain->AddFrame(hframe, new TGLayoutHints(kLHintsLeft | kLHintsCenterY,2,2,10,10));
257 fMain->AddFrame(fEcanvas, new TGLayoutHints(kLHintsCenterX, 10,10,10,10));
258
259 fMain->AddFrame(logFrame, new TGLayoutHints(kLHintsLeft,2,2,2,10));
260
261 // Set a name to the main frame
262 fMain->SetWindowName("MUON Detection Element Visualization");
263
264 // Map all subwindows of main frame
265 fMain->MapSubwindows();
266
267 // Initialize the layout algorithm
268 fMain->Resize(fMain->GetDefaultSize());
269
270 // Map main frame
271 fMain->MapWindow();
272
273 // instance segmentation
7d5d0cc5 274 fkSegmentation = AliMpSegmentation::Instance()->GetMpSegmentation(fCurrentDetElem, detElem->GetCathodType(fCurrentPlane));
215d5755 275 fLogMessage->AddLine("Segmentation loaded");
276 fLogMessage->ShowBottom();
e4d2775e 277}
278
279//____________________________________________________________
280AliMpDEVisu::~AliMpDEVisu()
281{
215d5755 282 /// Clean up used widgets: frames, buttons, layouthints
283
284 fChamberCombo->Delete();
285 fDECombo->Delete();
286 fNumberEntry->Delete();
287 fPlaneButton->Delete();
d58f6c58 288 fNameDECombo->Delete();
215d5755 289 fLogMessage->Delete();
290 fLogFile->Delete();
291 fMain->Cleanup();
292 delete fMain;
e4d2775e 293}
294
295//__________________________________________________________
296void AliMpDEVisu::HandleMovement(Int_t eventType, Int_t eventX, Int_t eventY, TObject* /*select*/)
297{
215d5755 298 /// handle cursor mouvement
299
300 static Int_t eventXold, eventYold;
301 static Int_t eventX0, eventY0;
302 static Int_t linedrawn;
303
e4d2775e 304
215d5755 305 // enable again KeyAutoRepeat after HandleKey
306 if (eventType == kKeyPress) {
307 gVirtualX->SetKeyAutoRepeat(kTRUE);
308 }
e4d2775e 309
215d5755 310 fEcanvas->GetCanvas()->cd();
e4d2775e 311
215d5755 312 // zoom mode
313 if (fZoomMode) {
314
315 if (eventType == kButton1Down) {
316 gVirtualX->SetLineWidth(3);
317 eventX0 = eventX; eventY0 = eventY;
318 eventXold = eventX; eventYold = eventY;
319 linedrawn = 0;
320 }
321
322 if (eventType == kButton1Motion) {
323 if (linedrawn) gVirtualX->DrawBox(eventX0, eventY0, eventXold, eventYold, TVirtualX::kHollow);
324 eventXold = eventX;
325 eventYold = eventY;
326 linedrawn = 1;
327 gVirtualX->DrawBox(eventX0, eventY0, eventXold, eventYold, TVirtualX::kHollow);
328 }
329
330 if (eventType == kButton1Up)
331 {
332 if ( (eventX0 - eventX) && (eventY0 - eventY) )
333 {
334 PopUpZoom(eventX0,eventY0,eventX,eventY);
335 linedrawn=1;
336 }
337 }
338
339
340 } else {
341
342 // click mode
343
344 if (eventType == kButton1Down) {
345
346 // calculated in pixel
e4d2775e 347 Double_t x = 0.;
348 Double_t y = 0.;
215d5755 349
350 EventToReal(eventX,eventY,x,y);
351
352 // get manu
6e97fbb8 353 AliMpPad pad = fkSegmentation->PadByPosition(x,y, false);
215d5755 354
e4d2775e 355 if (!pad.IsValid()) {
215d5755 356
357 fLogMessage->AddLine(Form("PopupManuMotif: No manu for DE: %d at position (%5.2f, %5.2f)",
358 fCurrentDetElem, x, y));
359 fLogMessage->ShowBottom();
360 return;
e4d2775e 361 }
215d5755 362
168e9c4d 363 Int_t manu = pad.GetManuId();
215d5755 364
e4d2775e 365 fNumberEntry->SetNumber(manu);
215d5755 366
367
368 fLogMessage->AddLine(Form("PopupManuMotif: DE: %d, manu: %d at position: %5.2f, %5.2f",
369 fCurrentDetElem, manu, x, y));
e4d2775e 370 fLogMessage->ShowBottom();
215d5755 371
e4d2775e 372 DrawManuMotif(true);
215d5755 373
e4d2775e 374 }
215d5755 375 }
e4d2775e 376}
377
378//__________________________________________________________
215d5755 379void AliMpDEVisu::DrawDE(Bool_t info)
e4d2775e 380{
215d5755 381 /// Draws function graphics in randomly choosen interval
382
383 if (info)
e4d2775e 384 InfoDE();
215d5755 385
386 fEcanvas->GetCanvas()->cd();
387 fEcanvas->GetCanvas()->SetEditable(kTRUE);
388
09840862 389 fNameDECombo->Select(fDEOccurrence[fCurrentDetElem]);
390 TGLBEntry* entry = fNameDECombo->GetSelectedEntry();
391 entry->SetBackgroundColor(0xDDDDDD);
392
215d5755 393 if (AliMpDEManager::GetStationType(fCurrentDetElem) == AliMp::kStation345 ) {
e4d2775e 394
215d5755 395 DrawSlat("PMCI");
396
397 } else {
398
399 DrawQuadrant("RSMCI");
400
401 }
402 DeletePopUp();
403 fEcanvas->GetCanvas()->SetEditable(kFALSE);
404
e4d2775e 405}
406
407//__________________________________________________________
408void AliMpDEVisu::DrawManuMotif(Bool_t popup)
409{
71a2d3aa 410 /// Draw manu motif in yellow and popup channel motif window
e4d2775e 411
215d5755 412 fEcanvas->GetCanvas()->SetEditable(kTRUE);
413
414 if (!fNumberEntry->GetIntNumber()) return;
415
416 Char_t command[255];
417
418 if (AliMpDEManager::GetStationType(fCurrentDetElem) == AliMp::kStation345 ) {
419
290882e9 420 snprintf(command, 255, "%s%d", "PMCI:", (Int_t)fNumberEntry->GetIntNumber());
215d5755 421
422 DrawSlat(command, popup);
423
424 } else {
425
290882e9 426 snprintf(command, 255, "%s%d", "RSMCI:", (Int_t)fNumberEntry->GetIntNumber());
215d5755 427
428 DrawQuadrant(command, popup);
429
430 }
431
432 fEcanvas->GetCanvas()->SetEditable(kFALSE);
e4d2775e 433}
434
435//__________________________________________________________
436void AliMpDEVisu::DrawSlat(Option_t* option, Bool_t popup)
437{
215d5755 438 /// draw slat segmentation
439
440 TCanvas *canvas = fEcanvas->GetCanvas();
441 canvas->Clear();
442
443 AliMpDetElement* detElem = AliMpDEManager::GetDetElement(fCurrentDetElem);
444 TString nameType = detElem->GetSegType();
ab167304 445
446 AliMpDataStreams dataStreams;
447
183279c1 448 AliMpSlatMotifMap mm;
449
21027e5a 450 AliMpSt345Reader reader(&mm);
451 AliMpSlat* slatCurrent = reader.ReadSlat(dataStreams,nameType.Data(), fCurrentPlane);
452 AliMpSlat* slatOther = reader.ReadSlat(dataStreams,nameType.Data(), AliMp::OtherPlaneType(fCurrentPlane));
215d5755 453
454 AliMpVPainter* painter = AliMpVPainter::CreatePainter(slatCurrent);
455 painter->Draw(option);
456
457 canvas->Update();
458
459 Int_t numberOfManu =
460 slatCurrent->GetNofElectronicCards() +
461 slatOther->GetNofElectronicCards();
462
463 fLogMessage->AddLine(Form("DrawSlat: number of manus: %d", numberOfManu));
464 fLogMessage->ShowBottom();
465
466 if (popup)
467 PopUpManuMotif(slatCurrent);
e4d2775e 468
e4d2775e 469}
470
471//__________________________________________________________
215d5755 472void AliMpDEVisu::DrawQuadrant(Option_t* option, Bool_t popup)
e4d2775e 473{
215d5755 474 /// draw quadrant segmentation
475
476 TCanvas *canvas = fEcanvas->GetCanvas();
477 canvas->Clear();
478
479 AliMpDetElement* detElem = AliMpDEManager::GetDetElement(fCurrentDetElem);
4e51cfd2 480 AliMq::Station12Type station = detElem->GetStation12Type();
e4d2775e 481
ab167304 482 AliMpDataStreams dataStreams;
483
21027e5a 484 AliMpSectorReader readerCurrent(station, fCurrentPlane);
485 AliMpSector* sectorCurrent = readerCurrent.BuildSector(dataStreams);
215d5755 486
21027e5a 487 AliMpSectorReader readerOther(station, AliMp::OtherPlaneType(fCurrentPlane));
488 AliMpSector* sectorOther = readerOther.BuildSector(dataStreams);
215d5755 489
490 AliMpVPainter *painter = AliMpVPainter::CreatePainter(sectorCurrent);
491 painter->Draw(option);
492
493 canvas->Update();
494
495 Int_t numberOfManu =
e4d2775e 496 sectorCurrent->GetMotifMap()->GetNofMotifPositions() +
497 sectorOther->GetMotifMap()->GetNofMotifPositions();
e4d2775e 498
215d5755 499 fLogMessage->AddLine(Form("DrawQuadrant: number of manus: %d", numberOfManu));
500 fLogMessage->ShowBottom();
501
502 if (popup)
503 PopUpManuMotif(sectorCurrent);
504
505}
506
507//______________________________________________________________________________
508void
6e97fbb8 509AliMpDEVisu::EventToReal(Int_t eventX, Int_t eventY,
510 Double_t& x, Double_t& y) const
215d5755 511{
512 /// estimate graphic pad sizes
e4d2775e 513
6e97fbb8 514 static Double_t ulx(gPad->XtoPixel(0.01));
515 static Double_t uly(gPad->YtoPixel(0.99));
516 static Double_t brx(gPad->XtoPixel(0.99));
517 static Double_t bry(gPad->YtoPixel(0.01));
e4d2775e 518
6e97fbb8 519 static Double_t padDimX = brx - ulx;
520 static Double_t padDimY = bry - uly;
215d5755 521
522 // get DE dimension (half size)
6e97fbb8 523 Double_t deDimX(fkSegmentation->GetDimensionX()*2.0);
524 Double_t deDimY(fkSegmentation->GetDimensionY()*2.0);
215d5755 525
6e97fbb8 526 if ( AliMpDEManager::GetStationType(fCurrentDetElem) == AliMp::kStation345 )
215d5755 527 {
528 // origin at center
6e97fbb8 529 x = (eventX - ulx - padDimX/2.)/(padDimX)*deDimX;
530 y = (bry - eventY - padDimY/2.)/(padDimY)*deDimY;
215d5755 531
532 }
533 else
534 {
535 // origin at bottom left
6e97fbb8 536 x = (eventX - ulx)/(padDimX)*deDimX;
537 y = (bry - eventY)/(padDimY)*deDimY;
215d5755 538 }
539
e4d2775e 540}
541
542//__________________________________________________________
543void AliMpDEVisu::ResetManu()
544{
215d5755 545 /// reset manu search entry
546 fLogMessage->AddLine("Reset Motif Search Entry:");
547 fLogMessage->ShowBottom();
548 fNumberEntry->SetNumber(0);
549
e4d2775e 550}
551
552//__________________________________________________________
553void AliMpDEVisu::DeletePopUp()
554{
555/// delete motif popup windows
215d5755 556
557 if (fTrashList.GetEntries() > 0)
558 {
559 fLogMessage->AddLine("Delete Motif PopUp Windows:");
560 fLogMessage->ShowBottom();
561
562 fTrashList.Delete();
563 }
e4d2775e 564}
565
566//__________________________________________________________
567void AliMpDEVisu::SaveLogMessage()
568{
215d5755 569 /// save log message into log file
570
571 TString logFile = fLogFile->GetDisplayText();
572 fLogMessage->GetText()->Save(logFile.Data());
e4d2775e 573
215d5755 574 fLogMessage->AddLine(Form("SaveLogMessage: saving log message into logfile: %s", logFile.Data()));
575 fLogMessage->ShowBottom();
e4d2775e 576}
577
578//__________________________________________________________
579void AliMpDEVisu::ClearLogMessage()
580{
215d5755 581 /// clear log message
582 fLogMessage->GetText()->Clear();
583 fLogMessage->AddLine("ClearLogMessage: clear log messages:");
584 fLogMessage->ShowBottom();
e4d2775e 585}
586
587//__________________________________________________________
588void AliMpDEVisu::InfoDE()
589{
215d5755 590 /// info concerning the whole DE
591
592 AliMpDetElement* detElem = fDDLStore->GetDetElement(fCurrentDetElem);
593 Int_t ddlId = detElem->GetDdlId();
594 Int_t numberOfBus = detElem->GetNofBusPatches();
595
596 Int_t vec[24];
597 for (Int_t i = 0; i < detElem->GetNofBusPatches(); ++i)
598 vec[i] = detElem->GetBusPatchId(i);
e4d2775e 599
215d5755 600 Int_t firstBus = TMath::MinElement(detElem->GetNofBusPatches(), vec);
601 Int_t lastBus = TMath::MaxElement(detElem->GetNofBusPatches(), vec);
602
ab167304 603 Int_t numberOfSerialManu = fManuStore->NofManus(detElem->GetId()); // number of manu with an identified serial number
215d5755 604
605 fLogMessage->AddLine(Form("DrawDE: detection element: %d, name: %s",
606 fCurrentDetElem, fCurrentDEName.Data()));
607 fLogMessage->ShowBottom();
608
609 fLogMessage->AddLine(Form("DrawDE: DDL: %d, number of buspatches %d from %d to %d",
610 ddlId, numberOfBus, firstBus, lastBus));
611 fLogMessage->ShowBottom();
612
613 if (numberOfSerialManu != 0) { // not available yet for all DE
614 fLogMessage->AddLine(Form("DrawDE: number of manus with serial number: %d", numberOfSerialManu));
e4d2775e 615 fLogMessage->ShowBottom();
215d5755 616 }
617
e4d2775e 618}
619
620//__________________________________________________________
621Bool_t AliMpDEVisu::ProcessMessage(Long_t msg, Long_t parm1, Long_t /*parm2*/)
622{
215d5755 623 /// process message from widgets actions/entries
e4d2775e 624
215d5755 625 AliMpDetElement* detElem = AliMpDEManager::GetDetElement(fCurrentDetElem);
626
627 switch(GET_MSG(msg))
628 {
e4d2775e 629 case kC_COMMAND:
630 switch (GET_SUBMSG(msg))
631 {
215d5755 632 case kCM_COMBOBOX:
633
634 switch (parm1)
635 {
636 case kChamberCombo:
637 UpdateComboDE();
09840862 638 UpdateNameView(kTRUE);
215d5755 639 break;
640
641 case kDECombo:
642 UpdateNameView();
643 break;
d58f6c58 644
645 case kDEName:
646 UpdateComboCH();
647 break;
215d5755 648 }
649 break;
650
651 case kCM_CHECKBUTTON:
652 switch (parm1)
653 {
654 case kPlaneType:
655 if (fPlaneButton->GetState() == kButtonDown) {
656 fCurrentPlane = AliMp::kNonBendingPlane;
657 if (fNumberEntry->GetIntNumber() && fNumberEntry->GetIntNumber() <= 1024)
658 fNumberEntry->SetNumber(fNumberEntry->GetIntNumber() + 1024);
659 } else {
660 fCurrentPlane = AliMp::kBendingPlane;
661 if (fNumberEntry->GetIntNumber() && fNumberEntry->GetIntNumber() > 1024)
662 fNumberEntry->SetNumber(fNumberEntry->GetIntNumber() - 1024);
663 }
664 DrawDE();
7d5d0cc5 665 fkSegmentation = AliMpSegmentation::Instance()
215d5755 666 ->GetMpSegmentation(fCurrentDetElem, detElem->GetCathodType(fCurrentPlane));
667 break;
668
669 case kZoomMode:
670 if (fZoomButton->GetState() == kButtonDown)
671 fZoomMode = true;
672 else
673 fZoomMode = false;
674 break;
675 }
676 break;
677
e4d2775e 678 }
679 break;
215d5755 680 }
681 return true;
e4d2775e 682}
683
97c15de5 684//__________________________________________________________
685void AliMpDEVisu::NextDE()
686{
215d5755 687 /// select next DE
688
689 Int_t next = fDECombo->GetSelected() + 1;
690
691 if (next < fDECombo->GetNumberOfEntries())
692 fDECombo->Select(next);
693 else
694 fDECombo->Select(0);
695
696 UpdateNameView();
697 DrawDE();
97c15de5 698}
699
d58f6c58 700//__________________________________________________________
701void AliMpDEVisu::UpdateComboCH()
702{
703 /// update Chamber/DE in respect to DE Name
704
705 fCurrentDEName = fNameDEComboIdx[fNameDECombo->GetSelected()];
706
707 AliMpDetElement* detElem = AliMpDEManager::GetDetElement(fCurrentDEName);
708
09840862 709 Int_t idx = AliMpDEManager::GetChamberId(detElem->GetId());
710 fChamberCombo->Select(idx);
d58f6c58 711
712 UpdateComboDE();
713
09840862 714 idx = detElem->GetId() % 100;
715 fDECombo->Select(idx);
d58f6c58 716
717 fCurrentDetElem = fDEComboIdx[fDECombo->GetSelected()];
718
7d5d0cc5 719 fkSegmentation = AliMpSegmentation::Instance()
d58f6c58 720 ->GetMpSegmentation(fCurrentDetElem, detElem->GetCathodType(fCurrentPlane));
721}
722
e4d2775e 723//__________________________________________________________
724void AliMpDEVisu::UpdateComboDE()
725{
215d5755 726 /// update DE in respect to selected chamber
727
728 fDECombo->RemoveAll();
729
730 AliMpDEIterator it;
731 Int_t i = 0;
732 fDEComboIdx.Reset();
215d5755 733
734 for ( it.First(fChamberCombo->GetSelected()); ! it.IsDone(); it.Next() ) {
d58f6c58 735 fDECombo->AddEntry(Form("%d",it.CurrentDE()->GetId()), i);
215d5755 736 fDEComboIdx[i++] = it.CurrentDE()->GetId();
737 }
738 fDECombo->Select(0);
e4d2775e 739}
740
741//__________________________________________________________
09840862 742void AliMpDEVisu::UpdateNameView(Bool_t firstTime)
e4d2775e 743{
215d5755 744 /// update DE name in respect to selected DE id.
d58f6c58 745
215d5755 746 fCurrentDetElem = fDEComboIdx[fDECombo->GetSelected()];
d58f6c58 747
215d5755 748 AliMpDetElement* detElem = AliMpDEManager::GetDetElement(fCurrentDetElem);
d58f6c58 749
215d5755 750 fCurrentDEName = detElem->GetDEName();
e4d2775e 751
09840862 752 if (firstTime) {
753 AliMpDEIterator it;
754
755 fNameDECombo->RemoveAll();
756
757 for ( it.First(fChamberCombo->GetSelected()); !it.IsDone(); it.Next() ) {
758
759 Int_t detElemId = it.CurrentDE()->GetId();
760 TString deName = it.CurrentDE()->GetDEName();
761
762 Int_t idx = fNameDECombo->GetNumberOfEntries();
763 fNameDECombo->AddEntry(deName.Data(), idx);
764 fNameDEComboIdx[idx] = deName;
765 fDEOccurrence[detElemId] = idx;
766 }
d58f6c58 767 }
768
769 fNameDECombo->Select(fDEOccurrence[fCurrentDetElem]);
7d5d0cc5 770 fkSegmentation = AliMpSegmentation::Instance()
215d5755 771 ->GetMpSegmentation(fCurrentDetElem, detElem->GetCathodType(fCurrentPlane));
772}
e4d2775e 773
215d5755 774//______________________________________________________________________________
775void
776AliMpDEVisu::CreatePopupWindow(Int_t w, Int_t h, const char* windowName,
777 AliMpVPainter* painter,
778 const char* option)
779{
71a2d3aa 780 /// Create transient frame
215d5755 781
782 TCanvas* c = new TCanvas(windowName,windowName,-200,100,w,h);
e4d2775e 783
215d5755 784 Int_t n = fTrashList.GetEntries();
785
786 c->Connect("Closed()","AliMpDEVisu",this,Form("ClosePopupWindow(=%d)",n));
787
788 fTrashList.AddLast(c);
789
790 c->Draw();
791
792 painter->Draw(option);
793
794 c->Update();
e4d2775e 795}
796
797//__________________________________________________________
798void AliMpDEVisu::PopUpManuMotif(AliMpSlat* slat)
799{
215d5755 800 /// pop up manu window motif painter for slat
801
802 // motif painter
803 AliMpMotifPosition* motifPosFound = 0x0;
804 AliMpMotifPosition* motifPos = 0x0;
805 Int_t manuId = 0;
e4d2775e 806
630711ed 807 for ( Int_t i = 0; i < slat->GetSize(); ++i ) {
215d5755 808
e4d2775e 809 AliMpPCB* pcb = slat->GetPCB(i);
215d5755 810
630711ed 811 for ( Int_t j = 0; j < slat->GetPCB(i)->GetSize(); ++j ) {
e4d2775e 812
97c15de5 813 motifPos = pcb->GetMotifPosition(j);
e4d2775e 814
215d5755 815 manuId = motifPos->GetID();
e4d2775e 816 if (manuId == (Int_t)fNumberEntry->GetIntNumber()) {
215d5755 817 motifPosFound = motifPos;
818 break;
e4d2775e 819 }
820 }
821 if (motifPosFound)
215d5755 822 break;
e4d2775e 823 }
97c15de5 824
215d5755 825 if(motifPosFound)
826 {
827 InfoManuMotif(motifPosFound);
97c15de5 828
6e97fbb8 829 Double_t dimensionX(motifPosFound->GetDimensionX());
830 Double_t dimensionY(motifPosFound->GetDimensionY());
97c15de5 831
215d5755 832 Int_t h = 500;
6e97fbb8 833 Int_t w = Int_t(h*dimensionX/dimensionY);
215d5755 834 AliMpVPainter* painter = AliMpVPainter::CreatePainter(motifPosFound);
835
1130977f 836 CreatePopupWindow(w,h,Form("Manu %ld",fNumberEntry->GetIntNumber()),
215d5755 837 painter,"ZT");
838 }
e4d2775e 839}
215d5755 840
e4d2775e 841//__________________________________________________________
842void AliMpDEVisu::PopUpManuMotif(AliMpSector* sector)
843{
215d5755 844 /// pop up manu window motif painter for sector
845
846 // motif painter
847 AliMpMotifPosition* motifPosFound = 0x0;
848 AliMpMotifPosition* motifPos = 0x0;
849 Int_t manuId = 0;
97c15de5 850
215d5755 851 for (Int_t iRow = 0; iRow < sector->GetNofRows(); ++iRow) {
852
853 AliMpRow* row = sector->GetRow(iRow);
854
855 for (Int_t iRowSeg = 0; iRowSeg < sector->GetRow(iRow)->GetNofRowSegments(); ++iRowSeg){
856
bf0d3528 857 for (Int_t iRowSeg2 = 0; iRowSeg2 < row->GetNofRowSegments(); ++iRowSeg2) {
858 AliMpVRowSegment *rowSegment = row->GetRowSegment(iRowSeg2);
215d5755 859
860 for (Int_t iMotif = 0; iMotif < rowSegment->GetNofMotifs(); ++iMotif){
861
862 Int_t motifPositionId = rowSegment->GetMotifPositionId(iMotif);
863 motifPos = rowSegment->GetRow()
864 ->GetMotifMap()->FindMotifPosition(motifPositionId);
865
866 manuId = motifPos->GetID();
867 if (manuId == (Int_t)fNumberEntry->GetIntNumber()) {
868 motifPosFound = motifPos;
869 break;
870 }
871 }
872 if (motifPosFound)
873 break;
874 }
875 }
876 if (motifPosFound)
877 break;
878 }
879
880 if(motifPosFound)
881 {
e4d2775e 882
215d5755 883 InfoManuMotif(motifPosFound);
e4d2775e 884
6e97fbb8 885 Double_t dimensionX(motifPosFound->GetDimensionX());
886 Double_t dimensionY(motifPosFound->GetDimensionY());
e4d2775e 887
215d5755 888 // Create transient frame
889 Int_t h = 400;
6e97fbb8 890 Int_t w = Int_t(h*dimensionX/dimensionY);
e4d2775e 891
215d5755 892 AliMpVPainter* painter = AliMpVPainter::CreatePainter(motifPosFound);
893
1130977f 894 CreatePopupWindow(w,h,Form("Manu %ld",fNumberEntry->GetIntNumber()),
215d5755 895 painter,"ZT");
896
897 }
898}
e4d2775e 899
215d5755 900//__________________________________________________________
901void AliMpDEVisu::InfoManuMotif(AliMpMotifPosition* motifPos)
902{
903/// info for popup manu motif
e4d2775e 904
215d5755 905 // log message
906 Int_t manuId = fNumberEntry->GetIntNumber();
6e97fbb8 907
215d5755 908 fLogMessage->AddLine(Form("PopupManuMotif: motif dimension: %5.2f, %5.2f",
6e97fbb8 909 motifPos->GetDimensionX()*2.,
910 motifPos->GetDimensionY()*2.));
215d5755 911
912 fLogMessage->AddLine( Form("PopupManuMotif: pad dimension: %4.2f, %4.2f",
6e97fbb8 913 motifPos->GetMotif()->GetPadDimensionX(0)*2.,
914 motifPos->GetMotif()->GetPadDimensionY(0)*2. ));
e4d2775e 915
215d5755 916 fLogMessage->AddLine( Form("PopupManuMotif: manu: %d, serial number: %d, buspatch: %d",
ab167304 917 manuId,
918 fManuStore->GetManuSerial(fCurrentDetElem, manuId),
919 fDDLStore->GetBusPatchId(fCurrentDetElem, manuId)) );
97c15de5 920
215d5755 921 fLogMessage->ShowBottom();
e4d2775e 922
215d5755 923}
e4d2775e 924
215d5755 925//______________________________________________________________________________
926void AliMpDEVisu::PopUpZoom(Int_t ix0, Int_t iy0, Int_t ix1, Int_t iy1)
927{
928 /// popup zoom window
e4d2775e 929
215d5755 930 Double_t x0,y0;
931 EventToReal(ix0,iy0,x0,y0);
932 Double_t x1,y1;
933 EventToReal(ix1,iy1,x1,y1);
e4d2775e 934
215d5755 935 fLogMessage->AddLine(Form("PopUpZoom: zoom positions (x0, y0: %6.2f, %6.2f), (x1, y1: %6.2f, %6.2f)",
936 x0, y0, x1, y1));
937 fLogMessage->ShowBottom();
938
939 // Create transient frame
940 Int_t h = 500;//TMath::Abs(x1-x0);
941 Int_t w = 500;//TMath::Abs(y1-y0);
e4d2775e 942
6e97fbb8 943 AliMpArea area((x0+x1)/2.0,(y0+y1)/2.0,
944 TMath::Abs(x1-x0)/2.0,TMath::Abs(y1-y0)/2.0);
215d5755 945// area.Print();
946
947 if ( area.IsValid() )
948 {
7d5d0cc5 949 AliMpVPadIterator* iterator = fkSegmentation->CreateIterator(area);
215d5755 950 if (iterator)
951 {
952 AliMpVPainter* painter = AliMpVPainter::CreatePainter(iterator);
953 CreatePopupWindow(w,h,"Zoom",painter,"");
e4d2775e 954 }
215d5755 955 else
956 {
957 AliError("could not get iterator for that area");
e4d2775e 958 }
215d5755 959
960 delete iterator;
961 }
97c15de5 962}
963
964//__________________________________________________________
215d5755 965void AliMpDEVisu::ClosePopupWindow(Int_t id)
97c15de5 966{
215d5755 967 /// close signal
968 fEcanvas->GetCanvas()->cd();
969 fTrashList.RemoveAt(id);
e4d2775e 970}