1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
19 #include "AliMpDEVisu.h"
21 #include "AliMpSlatMotifMap.h"
22 #include "AliMpSt345Reader.h"
23 #include "AliMpSectorReader.h"
24 #include "AliMpSlat.h"
26 #include "AliMpSectorReader.h"
27 #include "AliMpSector.h"
29 #include "AliMpVRowSegment.h"
30 #include "AliMpVPainter.h"
31 #include "AliMpMotifPosition.h"
32 #include "AliMpMotifMap.h"
33 #include "AliMpDEIterator.h"
34 #include "AliMpDEManager.h"
35 #include "AliMpDetElement.h"
36 #include "AliMpStationType.h"
37 #include "AliMpSegmentation.h"
39 #include "AliMpDDLStore.h"
40 #include "AliMpManuStore.h"
41 #include "AliMpVPadIterator.h"
43 #include "AliMpDataStreams.h"
51 #include <TRootEmbeddedCanvas.h>
53 #include <TGComboBox.h>
54 #include <TGNumberEntry.h>
55 #include <TGTextView.h>
56 #include <TGTextEntry.h>
60 //-----------------------------------------------------------------------------
62 // -----------------------
63 // GUI for drawing segmentation
64 // motif manu and associated channels
67 //-----------------------------------------------------------------------------
73 //_________________________________________________________________
74 AliMpDEVisu::AliMpDEVisu(UInt_t w, UInt_t h)
75 : TGFrame(gClient->GetRoot(), w, h),
76 fkMainWindow(gClient->GetRoot()),
77 fMain(new TGMainFrame(gClient->GetRoot(), w, h)),
91 fCurrentPlane(AliMp::kBendingPlane),
99 /// Standard constructor
102 if ( ! AliMpCDB::LoadDDLStore() ) {
103 AliFatal("Could not access mapping from OCDB !");
106 if ( ! AliMpCDB::LoadManuStore() ) {
107 AliFatal("Could not access run-dependent mapping from OCDB !");
110 fDDLStore = AliMpDDLStore::Instance();
111 fManuStore = AliMpManuStore::Instance();
113 fTrashList.SetOwner(kFALSE);
115 // Create canvas widget
117 Int_t width = Int_t(w*0.99);
118 Int_t height = Int_t(h*0.99);
120 fEcanvas = new TRootEmbeddedCanvas("Ecanvas",fMain, width, height);
121 fEcanvas->GetCanvas()->Connect("ProcessedEvent(Int_t, Int_t, Int_t, TObject*)",
124 "HandleMovement(Int_t, Int_t, Int_t, TObject*)");
126 // Create a horizontal frame widget with buttons
127 TGHorizontalFrame *hframe = new TGHorizontalFrame(fMain,width,height/6);
129 TGTextButton *draw = new TGTextButton(hframe,"&Draw");
130 draw->Connect("Clicked()","AliMpDEVisu",this,"DrawDE()");
131 hframe->AddFrame(draw, new TGLayoutHints(kLHintsLeft | kLHintsCenterY,15,5,3,4));
133 TGTextButton *exit = new TGTextButton(hframe,"&Exit","gApplication->Terminate(0)");
134 hframe->AddFrame(exit, new TGLayoutHints(kLHintsLeft| kLHintsCenterY,5,5,3,4));
141 TGLabel* chamberLabel = new TGLabel(hframe, "Chamber :");
142 hframe->AddFrame(chamberLabel, new TGLayoutHints(kLHintsCenterX | kLHintsLeft | kLHintsCenterY, 10, 0, 20, 0));
143 fChamberCombo = new TGComboBox(hframe, kChamberCombo);
146 for(i = 0; i < 10; i++)
148 sprintf(text,"%d",i+1);
149 fChamberCombo->AddEntry(text,i);
151 fChamberCombo->Resize(40,20);
152 fChamberCombo->Select(0);
153 fChamberCombo->Associate(this);
154 hframe->AddFrame(fChamberCombo, new TGLayoutHints(kLHintsLeft, 10, 0, 9, 0));
157 TGLabel* detElemLabel = new TGLabel(hframe, "DE :");
158 hframe->AddFrame(detElemLabel, new TGLayoutHints(kLHintsCenterX | kLHintsLeft | kLHintsCenterY, 10, 0, 20, 0));
159 fDECombo = new TGComboBox(hframe, kDECombo);
162 fDECombo->Resize(80,20);
164 fDECombo->Associate(this);
165 hframe->AddFrame(fDECombo, new TGLayoutHints(kLHintsLeft, 10, 0, 9, 0));
166 fDEOccurrence.Reset(-1);
168 TGTextButton *next = new TGTextButton(hframe,"&Next");
169 next->Connect("Clicked()","AliMpDEVisu",this,"NextDE()");
170 hframe->AddFrame(next, new TGLayoutHints(kLHintsLeft | kLHintsCenterY,5,5,3,4));
173 TGLabel* detElemName = new TGLabel(hframe, "Name :");
174 hframe->AddFrame(detElemName, new TGLayoutHints(kLHintsCenterX | kLHintsLeft | kLHintsCenterY, 10, 0, 20, 0));
176 AliMpDetElement* detElem = AliMpDEManager::GetDetElement(fCurrentDetElem);
177 fCurrentDEName = detElem->GetDEName();
178 fNameDECombo = new TGComboBox(hframe, kDEName);
180 UpdateNameView(kTRUE);
181 fNameDECombo->Resize(160, 20);
182 fNameDECombo->Select(0);
183 fNameDECombo->Associate(this);
184 hframe->AddFrame(fNameDECombo, new TGLayoutHints(kLHintsLeft, 10, 0, 9, 0));
187 fPlaneButton = new TGCheckButton(hframe, "NB Plane", kPlaneType);
188 fPlaneButton->SetState(kButtonUp);
189 fPlaneButton->Associate(this);
190 hframe->AddFrame(fPlaneButton, new TGLayoutHints(kLHintsLeft, 10, 0, 9, 0));
194 TGTextButton* drawManu = new TGTextButton(hframe,"&Search");
195 drawManu->Connect("Clicked()","AliMpDEVisu",this,"DrawManuMotif(Bool_t)");
196 drawManu->SetToolTipText("Search for a given manu number");
197 hframe->AddFrame(drawManu, new TGLayoutHints(kLHintsLeft | kLHintsCenterY,15,5,3,4));
200 fNumberEntry = new TGNumberEntry(hframe, 0, 4, -1,
201 TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative,
202 TGNumberFormat::kNELLimitMinMax, 1, 1500);
203 fNumberEntry->Resize(60,20);
204 hframe->AddFrame(fNumberEntry, new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 10, 0, 9, 0));
207 TGTextButton *resetManu = new TGTextButton(hframe,"&Reset");
208 resetManu->Connect("Clicked()","AliMpDEVisu",this,"ResetManu()");
209 hframe->AddFrame(resetManu, new TGLayoutHints(kLHintsLeft | kLHintsCenterY,10,5,3,4));
211 // delete window button
212 TGTextButton* deletePopup = new TGTextButton(hframe,"&Delete_Popup");
213 deletePopup->Connect("Clicked()","AliMpDEVisu",this,"DeletePopUp()");
214 deletePopup->SetToolTipText("Delete motif popup window");
215 hframe->AddFrame(deletePopup, new TGLayoutHints(kLHintsLeft | kLHintsCenterY,15,5,3,4));
219 TGHorizontalFrame *logFrame = new TGHorizontalFrame(fMain, width/2, height/6);
221 TGLabel* logName = new TGLabel(logFrame, "Log MSG:");
222 logFrame->AddFrame(logName, new TGLayoutHints(kLHintsCenterX | kLHintsLeft | kLHintsCenterY, 10, 0, 2, 0));
224 fLogMessage = new TGTextView(logFrame, width/2, 60);
225 fLogMessage->ShowBottom();
227 logFrame->AddFrame(fLogMessage, new TGLayoutHints(kLHintsLeft, 10, 0, 2, 0));
230 TGTextButton* clearLog = new TGTextButton(logFrame,"&Clear");
231 clearLog->Connect("Clicked()","AliMpDEVisu",this,"ClearLogMessage()");
232 clearLog->SetToolTipText("Clear log message");
233 logFrame->AddFrame(clearLog, new TGLayoutHints(kLHintsLeft | kLHintsCenterY,15,5,3,4));
236 TGTextButton* saveLog = new TGTextButton(logFrame,"&Save");
237 saveLog->Connect("Clicked()","AliMpDEVisu",this,"SaveLogMessage()");
238 saveLog->SetToolTipText("Save log message into file");
239 logFrame->AddFrame(saveLog, new TGLayoutHints(kLHintsLeft | kLHintsCenterY,5,5,3,4));
242 fLogFile = new TGTextEntry(logFrame,"AliMpDEVisu.log");
243 fLogFile->SetToolTipText("Default log file name");
244 logFrame->AddFrame(fLogFile, new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 10, 0, 9, 0));
247 fZoomButton = new TGCheckButton(logFrame, new TGHotString("&Zoom Mode"), kZoomMode);
248 fZoomButton->Associate(this);
249 fZoomButton->SetState(kButtonUp);
251 logFrame->AddFrame(fZoomButton, new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 20, 0, 9, 0));
254 fMain->AddFrame(hframe, new TGLayoutHints(kLHintsLeft | kLHintsCenterY,2,2,10,10));
255 fMain->AddFrame(fEcanvas, new TGLayoutHints(kLHintsCenterX, 10,10,10,10));
257 fMain->AddFrame(logFrame, new TGLayoutHints(kLHintsLeft,2,2,2,10));
259 // Set a name to the main frame
260 fMain->SetWindowName("MUON Detection Element Visualization");
262 // Map all subwindows of main frame
263 fMain->MapSubwindows();
265 // Initialize the layout algorithm
266 fMain->Resize(fMain->GetDefaultSize());
271 // instance segmentation
272 fkSegmentation = AliMpSegmentation::Instance()->GetMpSegmentation(fCurrentDetElem, detElem->GetCathodType(fCurrentPlane));
273 fLogMessage->AddLine("Segmentation loaded");
274 fLogMessage->ShowBottom();
277 //____________________________________________________________
278 AliMpDEVisu::~AliMpDEVisu()
280 /// Clean up used widgets: frames, buttons, layouthints
282 fChamberCombo->Delete();
284 fNumberEntry->Delete();
285 fPlaneButton->Delete();
286 fNameDECombo->Delete();
287 fLogMessage->Delete();
293 //__________________________________________________________
294 void AliMpDEVisu::HandleMovement(Int_t eventType, Int_t eventX, Int_t eventY, TObject* /*select*/)
296 /// handle cursor mouvement
298 static Int_t eventXold, eventYold;
299 static Int_t eventX0, eventY0;
300 static Int_t linedrawn;
303 // enable again KeyAutoRepeat after HandleKey
304 if (eventType == kKeyPress) {
305 gVirtualX->SetKeyAutoRepeat(kTRUE);
308 fEcanvas->GetCanvas()->cd();
313 if (eventType == kButton1Down) {
314 gVirtualX->SetLineWidth(3);
315 eventX0 = eventX; eventY0 = eventY;
316 eventXold = eventX; eventYold = eventY;
320 if (eventType == kButton1Motion) {
321 if (linedrawn) gVirtualX->DrawBox(eventX0, eventY0, eventXold, eventYold, TVirtualX::kHollow);
325 gVirtualX->DrawBox(eventX0, eventY0, eventXold, eventYold, TVirtualX::kHollow);
328 if (eventType == kButton1Up)
330 if ( (eventX0 - eventX) && (eventY0 - eventY) )
332 PopUpZoom(eventX0,eventY0,eventX,eventY);
342 if (eventType == kButton1Down) {
344 // calculated in pixel
348 EventToReal(eventX,eventY,x,y);
351 AliMpPad pad = fkSegmentation->PadByPosition(x,y, false);
353 if (!pad.IsValid()) {
355 fLogMessage->AddLine(Form("PopupManuMotif: No manu for DE: %d at position (%5.2f, %5.2f)",
356 fCurrentDetElem, x, y));
357 fLogMessage->ShowBottom();
361 Int_t manu = pad.GetManuId();
363 fNumberEntry->SetNumber(manu);
366 fLogMessage->AddLine(Form("PopupManuMotif: DE: %d, manu: %d at position: %5.2f, %5.2f",
367 fCurrentDetElem, manu, x, y));
368 fLogMessage->ShowBottom();
376 //__________________________________________________________
377 void AliMpDEVisu::DrawDE(Bool_t info)
379 /// Draws function graphics in randomly choosen interval
384 fEcanvas->GetCanvas()->cd();
385 fEcanvas->GetCanvas()->SetEditable(kTRUE);
387 fNameDECombo->Select(fDEOccurrence[fCurrentDetElem]);
388 TGLBEntry* entry = fNameDECombo->GetSelectedEntry();
389 entry->SetBackgroundColor(0xDDDDDD);
391 if (AliMpDEManager::GetStationType(fCurrentDetElem) == AliMp::kStation345 ) {
397 DrawQuadrant("RSMCI");
401 fEcanvas->GetCanvas()->SetEditable(kFALSE);
405 //__________________________________________________________
406 void AliMpDEVisu::DrawManuMotif(Bool_t popup)
408 /// Draw manu motif in yellow and popup channel motif window
410 fEcanvas->GetCanvas()->SetEditable(kTRUE);
412 if (!fNumberEntry->GetIntNumber()) return;
416 if (AliMpDEManager::GetStationType(fCurrentDetElem) == AliMp::kStation345 ) {
418 sprintf(command, "%s%d", "PMCI:", (Int_t)fNumberEntry->GetIntNumber());
420 DrawSlat(command, popup);
424 sprintf(command, "%s%d", "RSMCI:", (Int_t)fNumberEntry->GetIntNumber());
426 DrawQuadrant(command, popup);
430 fEcanvas->GetCanvas()->SetEditable(kFALSE);
433 //__________________________________________________________
434 void AliMpDEVisu::DrawSlat(Option_t* option, Bool_t popup)
436 /// draw slat segmentation
438 TCanvas *canvas = fEcanvas->GetCanvas();
441 AliMpDetElement* detElem = AliMpDEManager::GetDetElement(fCurrentDetElem);
442 TString nameType = detElem->GetSegType();
444 AliMpDataStreams dataStreams;
446 AliMpSlatMotifMap mm;
448 AliMpSt345Reader reader(dataStreams,&mm);
449 AliMpSlat* slatCurrent = reader.ReadSlat(nameType.Data(), fCurrentPlane);
450 AliMpSlat* slatOther = reader.ReadSlat(nameType.Data(), AliMp::OtherPlaneType(fCurrentPlane));
452 AliMpVPainter* painter = AliMpVPainter::CreatePainter(slatCurrent);
453 painter->Draw(option);
458 slatCurrent->GetNofElectronicCards() +
459 slatOther->GetNofElectronicCards();
461 fLogMessage->AddLine(Form("DrawSlat: number of manus: %d", numberOfManu));
462 fLogMessage->ShowBottom();
465 PopUpManuMotif(slatCurrent);
469 //__________________________________________________________
470 void AliMpDEVisu::DrawQuadrant(Option_t* option, Bool_t popup)
472 /// draw quadrant segmentation
474 TCanvas *canvas = fEcanvas->GetCanvas();
477 AliMpDetElement* detElem = AliMpDEManager::GetDetElement(fCurrentDetElem);
478 AliMq::Station12Type station = detElem->GetStation12Type();
480 AliMpDataStreams dataStreams;
482 AliMpSectorReader readerCurrent(dataStreams, station, fCurrentPlane);
483 AliMpSector* sectorCurrent = readerCurrent.BuildSector();
485 AliMpSectorReader readerOther(dataStreams, station, AliMp::OtherPlaneType(fCurrentPlane));
486 AliMpSector* sectorOther = readerOther.BuildSector();
488 AliMpVPainter *painter = AliMpVPainter::CreatePainter(sectorCurrent);
489 painter->Draw(option);
494 sectorCurrent->GetMotifMap()->GetNofMotifPositions() +
495 sectorOther->GetMotifMap()->GetNofMotifPositions();
497 fLogMessage->AddLine(Form("DrawQuadrant: number of manus: %d", numberOfManu));
498 fLogMessage->ShowBottom();
501 PopUpManuMotif(sectorCurrent);
505 //______________________________________________________________________________
507 AliMpDEVisu::EventToReal(Int_t eventX, Int_t eventY,
508 Double_t& x, Double_t& y) const
510 /// estimate graphic pad sizes
512 static Double_t ulx(gPad->XtoPixel(0.01));
513 static Double_t uly(gPad->YtoPixel(0.99));
514 static Double_t brx(gPad->XtoPixel(0.99));
515 static Double_t bry(gPad->YtoPixel(0.01));
517 static Double_t padDimX = brx - ulx;
518 static Double_t padDimY = bry - uly;
520 // get DE dimension (half size)
521 Double_t deDimX(fkSegmentation->GetDimensionX()*2.0);
522 Double_t deDimY(fkSegmentation->GetDimensionY()*2.0);
524 if ( AliMpDEManager::GetStationType(fCurrentDetElem) == AliMp::kStation345 )
527 x = (eventX - ulx - padDimX/2.)/(padDimX)*deDimX;
528 y = (bry - eventY - padDimY/2.)/(padDimY)*deDimY;
533 // origin at bottom left
534 x = (eventX - ulx)/(padDimX)*deDimX;
535 y = (bry - eventY)/(padDimY)*deDimY;
540 //__________________________________________________________
541 void AliMpDEVisu::ResetManu()
543 /// reset manu search entry
544 fLogMessage->AddLine("Reset Motif Search Entry:");
545 fLogMessage->ShowBottom();
546 fNumberEntry->SetNumber(0);
550 //__________________________________________________________
551 void AliMpDEVisu::DeletePopUp()
553 /// delete motif popup windows
555 if (fTrashList.GetEntries() > 0)
557 fLogMessage->AddLine("Delete Motif PopUp Windows:");
558 fLogMessage->ShowBottom();
564 //__________________________________________________________
565 void AliMpDEVisu::SaveLogMessage()
567 /// save log message into log file
569 TString logFile = fLogFile->GetDisplayText();
570 fLogMessage->GetText()->Save(logFile.Data());
572 fLogMessage->AddLine(Form("SaveLogMessage: saving log message into logfile: %s", logFile.Data()));
573 fLogMessage->ShowBottom();
576 //__________________________________________________________
577 void AliMpDEVisu::ClearLogMessage()
579 /// clear log message
580 fLogMessage->GetText()->Clear();
581 fLogMessage->AddLine("ClearLogMessage: clear log messages:");
582 fLogMessage->ShowBottom();
585 //__________________________________________________________
586 void AliMpDEVisu::InfoDE()
588 /// info concerning the whole DE
590 AliMpDetElement* detElem = fDDLStore->GetDetElement(fCurrentDetElem);
591 Int_t ddlId = detElem->GetDdlId();
592 Int_t numberOfBus = detElem->GetNofBusPatches();
595 for (Int_t i = 0; i < detElem->GetNofBusPatches(); ++i)
596 vec[i] = detElem->GetBusPatchId(i);
598 Int_t firstBus = TMath::MinElement(detElem->GetNofBusPatches(), vec);
599 Int_t lastBus = TMath::MaxElement(detElem->GetNofBusPatches(), vec);
601 Int_t numberOfSerialManu = fManuStore->NofManus(detElem->GetId()); // number of manu with an identified serial number
603 fLogMessage->AddLine(Form("DrawDE: detection element: %d, name: %s",
604 fCurrentDetElem, fCurrentDEName.Data()));
605 fLogMessage->ShowBottom();
607 fLogMessage->AddLine(Form("DrawDE: DDL: %d, number of buspatches %d from %d to %d",
608 ddlId, numberOfBus, firstBus, lastBus));
609 fLogMessage->ShowBottom();
611 if (numberOfSerialManu != 0) { // not available yet for all DE
612 fLogMessage->AddLine(Form("DrawDE: number of manus with serial number: %d", numberOfSerialManu));
613 fLogMessage->ShowBottom();
618 //__________________________________________________________
619 Bool_t AliMpDEVisu::ProcessMessage(Long_t msg, Long_t parm1, Long_t /*parm2*/)
621 /// process message from widgets actions/entries
623 AliMpDetElement* detElem = AliMpDEManager::GetDetElement(fCurrentDetElem);
628 switch (GET_SUBMSG(msg))
636 UpdateNameView(kTRUE);
649 case kCM_CHECKBUTTON:
653 if (fPlaneButton->GetState() == kButtonDown) {
654 fCurrentPlane = AliMp::kNonBendingPlane;
655 if (fNumberEntry->GetIntNumber() && fNumberEntry->GetIntNumber() <= 1024)
656 fNumberEntry->SetNumber(fNumberEntry->GetIntNumber() + 1024);
658 fCurrentPlane = AliMp::kBendingPlane;
659 if (fNumberEntry->GetIntNumber() && fNumberEntry->GetIntNumber() > 1024)
660 fNumberEntry->SetNumber(fNumberEntry->GetIntNumber() - 1024);
663 fkSegmentation = AliMpSegmentation::Instance()
664 ->GetMpSegmentation(fCurrentDetElem, detElem->GetCathodType(fCurrentPlane));
668 if (fZoomButton->GetState() == kButtonDown)
682 //__________________________________________________________
683 void AliMpDEVisu::NextDE()
687 Int_t next = fDECombo->GetSelected() + 1;
689 if (next < fDECombo->GetNumberOfEntries())
690 fDECombo->Select(next);
698 //__________________________________________________________
699 void AliMpDEVisu::UpdateComboCH()
701 /// update Chamber/DE in respect to DE Name
703 fCurrentDEName = fNameDEComboIdx[fNameDECombo->GetSelected()];
705 AliMpDetElement* detElem = AliMpDEManager::GetDetElement(fCurrentDEName);
707 Int_t idx = AliMpDEManager::GetChamberId(detElem->GetId());
708 fChamberCombo->Select(idx);
712 idx = detElem->GetId() % 100;
713 fDECombo->Select(idx);
715 fCurrentDetElem = fDEComboIdx[fDECombo->GetSelected()];
717 fkSegmentation = AliMpSegmentation::Instance()
718 ->GetMpSegmentation(fCurrentDetElem, detElem->GetCathodType(fCurrentPlane));
721 //__________________________________________________________
722 void AliMpDEVisu::UpdateComboDE()
724 /// update DE in respect to selected chamber
726 fDECombo->RemoveAll();
732 for ( it.First(fChamberCombo->GetSelected()); ! it.IsDone(); it.Next() ) {
733 fDECombo->AddEntry(Form("%d",it.CurrentDE()->GetId()), i);
734 fDEComboIdx[i++] = it.CurrentDE()->GetId();
739 //__________________________________________________________
740 void AliMpDEVisu::UpdateNameView(Bool_t firstTime)
742 /// update DE name in respect to selected DE id.
744 fCurrentDetElem = fDEComboIdx[fDECombo->GetSelected()];
746 AliMpDetElement* detElem = AliMpDEManager::GetDetElement(fCurrentDetElem);
748 fCurrentDEName = detElem->GetDEName();
753 fNameDECombo->RemoveAll();
755 for ( it.First(fChamberCombo->GetSelected()); !it.IsDone(); it.Next() ) {
757 Int_t detElemId = it.CurrentDE()->GetId();
758 TString deName = it.CurrentDE()->GetDEName();
760 Int_t idx = fNameDECombo->GetNumberOfEntries();
761 fNameDECombo->AddEntry(deName.Data(), idx);
762 fNameDEComboIdx[idx] = deName;
763 fDEOccurrence[detElemId] = idx;
767 fNameDECombo->Select(fDEOccurrence[fCurrentDetElem]);
768 fkSegmentation = AliMpSegmentation::Instance()
769 ->GetMpSegmentation(fCurrentDetElem, detElem->GetCathodType(fCurrentPlane));
772 //______________________________________________________________________________
774 AliMpDEVisu::CreatePopupWindow(Int_t w, Int_t h, const char* windowName,
775 AliMpVPainter* painter,
778 /// Create transient frame
780 TCanvas* c = new TCanvas(windowName,windowName,-200,100,w,h);
782 Int_t n = fTrashList.GetEntries();
784 c->Connect("Closed()","AliMpDEVisu",this,Form("ClosePopupWindow(=%d)",n));
786 fTrashList.AddLast(c);
790 painter->Draw(option);
795 //__________________________________________________________
796 void AliMpDEVisu::PopUpManuMotif(AliMpSlat* slat)
798 /// pop up manu window motif painter for slat
801 AliMpMotifPosition* motifPosFound = 0x0;
802 AliMpMotifPosition* motifPos = 0x0;
805 for ( Int_t i = 0; i < slat->GetSize(); ++i ) {
807 AliMpPCB* pcb = slat->GetPCB(i);
809 for ( Int_t j = 0; j < slat->GetPCB(i)->GetSize(); ++j ) {
811 motifPos = pcb->GetMotifPosition(j);
813 manuId = motifPos->GetID();
814 if (manuId == (Int_t)fNumberEntry->GetIntNumber()) {
815 motifPosFound = motifPos;
825 InfoManuMotif(motifPosFound);
827 Double_t dimensionX(motifPosFound->GetDimensionX());
828 Double_t dimensionY(motifPosFound->GetDimensionY());
831 Int_t w = Int_t(h*dimensionX/dimensionY);
832 AliMpVPainter* painter = AliMpVPainter::CreatePainter(motifPosFound);
834 CreatePopupWindow(w,h,Form("Manu %d",fNumberEntry->GetIntNumber()),
839 //__________________________________________________________
840 void AliMpDEVisu::PopUpManuMotif(AliMpSector* sector)
842 /// pop up manu window motif painter for sector
845 AliMpMotifPosition* motifPosFound = 0x0;
846 AliMpMotifPosition* motifPos = 0x0;
849 for (Int_t iRow = 0; iRow < sector->GetNofRows(); ++iRow) {
851 AliMpRow* row = sector->GetRow(iRow);
853 for (Int_t iRowSeg = 0; iRowSeg < sector->GetRow(iRow)->GetNofRowSegments(); ++iRowSeg){
855 for (Int_t iRowSeg2 = 0; iRowSeg2 < row->GetNofRowSegments(); ++iRowSeg2) {
856 AliMpVRowSegment *rowSegment = row->GetRowSegment(iRowSeg2);
858 for (Int_t iMotif = 0; iMotif < rowSegment->GetNofMotifs(); ++iMotif){
860 Int_t motifPositionId = rowSegment->GetMotifPositionId(iMotif);
861 motifPos = rowSegment->GetRow()
862 ->GetMotifMap()->FindMotifPosition(motifPositionId);
864 manuId = motifPos->GetID();
865 if (manuId == (Int_t)fNumberEntry->GetIntNumber()) {
866 motifPosFound = motifPos;
881 InfoManuMotif(motifPosFound);
883 Double_t dimensionX(motifPosFound->GetDimensionX());
884 Double_t dimensionY(motifPosFound->GetDimensionY());
886 // Create transient frame
888 Int_t w = Int_t(h*dimensionX/dimensionY);
890 AliMpVPainter* painter = AliMpVPainter::CreatePainter(motifPosFound);
892 CreatePopupWindow(w,h,Form("Manu %d",fNumberEntry->GetIntNumber()),
898 //__________________________________________________________
899 void AliMpDEVisu::InfoManuMotif(AliMpMotifPosition* motifPos)
901 /// info for popup manu motif
904 Int_t manuId = fNumberEntry->GetIntNumber();
906 fLogMessage->AddLine(Form("PopupManuMotif: motif dimension: %5.2f, %5.2f",
907 motifPos->GetDimensionX()*2.,
908 motifPos->GetDimensionY()*2.));
910 fLogMessage->AddLine( Form("PopupManuMotif: pad dimension: %4.2f, %4.2f",
911 motifPos->GetMotif()->GetPadDimensionX(0)*2.,
912 motifPos->GetMotif()->GetPadDimensionY(0)*2. ));
914 fLogMessage->AddLine( Form("PopupManuMotif: manu: %d, serial number: %d, buspatch: %d",
916 fManuStore->GetManuSerial(fCurrentDetElem, manuId),
917 fDDLStore->GetBusPatchId(fCurrentDetElem, manuId)) );
919 fLogMessage->ShowBottom();
923 //______________________________________________________________________________
924 void AliMpDEVisu::PopUpZoom(Int_t ix0, Int_t iy0, Int_t ix1, Int_t iy1)
926 /// popup zoom window
929 EventToReal(ix0,iy0,x0,y0);
931 EventToReal(ix1,iy1,x1,y1);
933 fLogMessage->AddLine(Form("PopUpZoom: zoom positions (x0, y0: %6.2f, %6.2f), (x1, y1: %6.2f, %6.2f)",
935 fLogMessage->ShowBottom();
937 // Create transient frame
938 Int_t h = 500;//TMath::Abs(x1-x0);
939 Int_t w = 500;//TMath::Abs(y1-y0);
941 AliMpArea area((x0+x1)/2.0,(y0+y1)/2.0,
942 TMath::Abs(x1-x0)/2.0,TMath::Abs(y1-y0)/2.0);
945 if ( area.IsValid() )
947 AliMpVPadIterator* iterator = fkSegmentation->CreateIterator(area);
950 AliMpVPainter* painter = AliMpVPainter::CreatePainter(iterator);
951 CreatePopupWindow(w,h,"Zoom",painter,"");
955 AliError("could not get iterator for that area");
962 //__________________________________________________________
963 void AliMpDEVisu::ClosePopupWindow(Int_t id)
966 fEcanvas->GetCanvas()->cd();
967 fTrashList.RemoveAt(id);