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"
52 #include <TRootEmbeddedCanvas.h>
54 #include <TGComboBox.h>
55 #include <TGNumberEntry.h>
56 #include <TGTextView.h>
57 #include <TGTextEntry.h>
61 //-----------------------------------------------------------------------------
63 // -----------------------
64 // GUI for drawing segmentation
65 // motif manu and associated channels
68 //-----------------------------------------------------------------------------
74 //_________________________________________________________________
75 AliMpDEVisu::AliMpDEVisu(UInt_t w, UInt_t h)
76 : TGFrame(gClient->GetRoot(), w, h),
77 fkMainWindow(gClient->GetRoot()),
78 fMain(new TGMainFrame(gClient->GetRoot(), w, h)),
92 fCurrentPlane(AliMp::kBendingPlane),
100 /// Standard constructor
103 if ( ! AliMpCDB::LoadDDLStore() ) {
104 AliFatal("Could not access mapping from OCDB !");
107 if ( ! AliMpCDB::LoadManuStore() ) {
108 AliFatal("Could not access run-dependent mapping from OCDB !");
111 fDDLStore = AliMpDDLStore::Instance();
112 fManuStore = AliMpManuStore::Instance();
114 fTrashList.SetOwner(kFALSE);
116 // Create canvas widget
118 Int_t width = Int_t(w*0.99);
119 Int_t height = Int_t(h*0.99);
121 fEcanvas = new TRootEmbeddedCanvas("Ecanvas",fMain, width, height);
122 fEcanvas->GetCanvas()->Connect("ProcessedEvent(Int_t, Int_t, Int_t, TObject*)",
125 "HandleMovement(Int_t, Int_t, Int_t, TObject*)");
127 // Create a horizontal frame widget with buttons
128 TGHorizontalFrame *hframe = new TGHorizontalFrame(fMain,width,height/6);
130 TGTextButton *draw = new TGTextButton(hframe,"&Draw");
131 draw->Connect("Clicked()","AliMpDEVisu",this,"DrawDE()");
132 hframe->AddFrame(draw, new TGLayoutHints(kLHintsLeft | kLHintsCenterY,15,5,3,4));
134 TGTextButton *exit = new TGTextButton(hframe,"&Exit","gApplication->Terminate(0)");
135 hframe->AddFrame(exit, new TGLayoutHints(kLHintsLeft| kLHintsCenterY,5,5,3,4));
142 TGLabel* chamberLabel = new TGLabel(hframe, "Chamber :");
143 hframe->AddFrame(chamberLabel, new TGLayoutHints(kLHintsCenterX | kLHintsLeft | kLHintsCenterY, 10, 0, 20, 0));
144 fChamberCombo = new TGComboBox(hframe, kChamberCombo);
147 for(i = 0; i < 10; i++)
149 sprintf(text,"%d",i+1);
150 fChamberCombo->AddEntry(text,i);
152 fChamberCombo->Resize(40,20);
153 fChamberCombo->Select(0);
154 fChamberCombo->Associate(this);
155 hframe->AddFrame(fChamberCombo, new TGLayoutHints(kLHintsLeft, 10, 0, 9, 0));
158 TGLabel* detElemLabel = new TGLabel(hframe, "DE :");
159 hframe->AddFrame(detElemLabel, new TGLayoutHints(kLHintsCenterX | kLHintsLeft | kLHintsCenterY, 10, 0, 20, 0));
160 fDECombo = new TGComboBox(hframe, kDECombo);
163 fDECombo->Resize(80,20);
165 fDECombo->Associate(this);
166 hframe->AddFrame(fDECombo, new TGLayoutHints(kLHintsLeft, 10, 0, 9, 0));
167 fDEOccurrence.Reset(-1);
169 TGTextButton *next = new TGTextButton(hframe,"&Next");
170 next->Connect("Clicked()","AliMpDEVisu",this,"NextDE()");
171 hframe->AddFrame(next, new TGLayoutHints(kLHintsLeft | kLHintsCenterY,5,5,3,4));
174 TGLabel* detElemName = new TGLabel(hframe, "Name :");
175 hframe->AddFrame(detElemName, new TGLayoutHints(kLHintsCenterX | kLHintsLeft | kLHintsCenterY, 10, 0, 20, 0));
177 AliMpDetElement* detElem = AliMpDEManager::GetDetElement(fCurrentDetElem);
178 fCurrentDEName = detElem->GetDEName();
179 fNameDECombo = new TGComboBox(hframe, kDEName);
181 UpdateNameView(kTRUE);
182 fNameDECombo->Resize(160, 20);
183 fNameDECombo->Select(0);
184 fNameDECombo->Associate(this);
185 hframe->AddFrame(fNameDECombo, new TGLayoutHints(kLHintsLeft, 10, 0, 9, 0));
188 fPlaneButton = new TGCheckButton(hframe, "NB Plane", kPlaneType);
189 fPlaneButton->SetState(kButtonUp);
190 fPlaneButton->Associate(this);
191 hframe->AddFrame(fPlaneButton, new TGLayoutHints(kLHintsLeft, 10, 0, 9, 0));
195 TGTextButton* drawManu = new TGTextButton(hframe,"&Search");
196 drawManu->Connect("Clicked()","AliMpDEVisu",this,"DrawManuMotif(Bool_t)");
197 drawManu->SetToolTipText("Search for a given manu number");
198 hframe->AddFrame(drawManu, new TGLayoutHints(kLHintsLeft | kLHintsCenterY,15,5,3,4));
201 fNumberEntry = new TGNumberEntry(hframe, 0, 4, -1,
202 TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative,
203 TGNumberFormat::kNELLimitMinMax, 1, 1500);
204 fNumberEntry->Resize(60,20);
205 hframe->AddFrame(fNumberEntry, new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 10, 0, 9, 0));
208 TGTextButton *resetManu = new TGTextButton(hframe,"&Reset");
209 resetManu->Connect("Clicked()","AliMpDEVisu",this,"ResetManu()");
210 hframe->AddFrame(resetManu, new TGLayoutHints(kLHintsLeft | kLHintsCenterY,10,5,3,4));
212 // delete window button
213 TGTextButton* deletePopup = new TGTextButton(hframe,"&Delete_Popup");
214 deletePopup->Connect("Clicked()","AliMpDEVisu",this,"DeletePopUp()");
215 deletePopup->SetToolTipText("Delete motif popup window");
216 hframe->AddFrame(deletePopup, new TGLayoutHints(kLHintsLeft | kLHintsCenterY,15,5,3,4));
220 TGHorizontalFrame *logFrame = new TGHorizontalFrame(fMain, width/2, height/6);
222 TGLabel* logName = new TGLabel(logFrame, "Log MSG:");
223 logFrame->AddFrame(logName, new TGLayoutHints(kLHintsCenterX | kLHintsLeft | kLHintsCenterY, 10, 0, 2, 0));
225 fLogMessage = new TGTextView(logFrame, width/2, 60);
226 fLogMessage->ShowBottom();
228 logFrame->AddFrame(fLogMessage, new TGLayoutHints(kLHintsLeft, 10, 0, 2, 0));
231 TGTextButton* clearLog = new TGTextButton(logFrame,"&Clear");
232 clearLog->Connect("Clicked()","AliMpDEVisu",this,"ClearLogMessage()");
233 clearLog->SetToolTipText("Clear log message");
234 logFrame->AddFrame(clearLog, new TGLayoutHints(kLHintsLeft | kLHintsCenterY,15,5,3,4));
237 TGTextButton* saveLog = new TGTextButton(logFrame,"&Save");
238 saveLog->Connect("Clicked()","AliMpDEVisu",this,"SaveLogMessage()");
239 saveLog->SetToolTipText("Save log message into file");
240 logFrame->AddFrame(saveLog, new TGLayoutHints(kLHintsLeft | kLHintsCenterY,5,5,3,4));
243 fLogFile = new TGTextEntry(logFrame,"AliMpDEVisu.log");
244 fLogFile->SetToolTipText("Default log file name");
245 logFrame->AddFrame(fLogFile, new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 10, 0, 9, 0));
248 fZoomButton = new TGCheckButton(logFrame, new TGHotString("&Zoom Mode"), kZoomMode);
249 fZoomButton->Associate(this);
250 fZoomButton->SetState(kButtonUp);
252 logFrame->AddFrame(fZoomButton, new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 20, 0, 9, 0));
255 fMain->AddFrame(hframe, new TGLayoutHints(kLHintsLeft | kLHintsCenterY,2,2,10,10));
256 fMain->AddFrame(fEcanvas, new TGLayoutHints(kLHintsCenterX, 10,10,10,10));
258 fMain->AddFrame(logFrame, new TGLayoutHints(kLHintsLeft,2,2,2,10));
260 // Set a name to the main frame
261 fMain->SetWindowName("MUON Detection Element Visualization");
263 // Map all subwindows of main frame
264 fMain->MapSubwindows();
266 // Initialize the layout algorithm
267 fMain->Resize(fMain->GetDefaultSize());
272 // instance segmentation
273 fkSegmentation = AliMpSegmentation::Instance()->GetMpSegmentation(fCurrentDetElem, detElem->GetCathodType(fCurrentPlane));
274 fLogMessage->AddLine("Segmentation loaded");
275 fLogMessage->ShowBottom();
278 //____________________________________________________________
279 AliMpDEVisu::~AliMpDEVisu()
281 /// Clean up used widgets: frames, buttons, layouthints
283 fChamberCombo->Delete();
285 fNumberEntry->Delete();
286 fPlaneButton->Delete();
287 fNameDECombo->Delete();
288 fLogMessage->Delete();
294 //__________________________________________________________
295 void AliMpDEVisu::HandleMovement(Int_t eventType, Int_t eventX, Int_t eventY, TObject* /*select*/)
297 /// handle cursor mouvement
299 static Int_t eventXold, eventYold;
300 static Int_t eventX0, eventY0;
301 static Int_t linedrawn;
304 // enable again KeyAutoRepeat after HandleKey
305 if (eventType == kKeyPress) {
306 gVirtualX->SetKeyAutoRepeat(kTRUE);
309 fEcanvas->GetCanvas()->cd();
314 if (eventType == kButton1Down) {
315 gVirtualX->SetLineWidth(3);
316 eventX0 = eventX; eventY0 = eventY;
317 eventXold = eventX; eventYold = eventY;
321 if (eventType == kButton1Motion) {
322 if (linedrawn) gVirtualX->DrawBox(eventX0, eventY0, eventXold, eventYold, TVirtualX::kHollow);
326 gVirtualX->DrawBox(eventX0, eventY0, eventXold, eventYold, TVirtualX::kHollow);
329 if (eventType == kButton1Up)
331 if ( (eventX0 - eventX) && (eventY0 - eventY) )
333 PopUpZoom(eventX0,eventY0,eventX,eventY);
343 if (eventType == kButton1Down) {
345 // calculated in pixel
349 EventToReal(eventX,eventY,x,y);
352 AliMpPad pad = fkSegmentation->PadByPosition(TVector2(x,y), false);
354 if (!pad.IsValid()) {
356 fLogMessage->AddLine(Form("PopupManuMotif: No manu for DE: %d at position (%5.2f, %5.2f)",
357 fCurrentDetElem, x, y));
358 fLogMessage->ShowBottom();
362 Int_t manu = pad.GetLocation().GetFirst();
364 fNumberEntry->SetNumber(manu);
367 fLogMessage->AddLine(Form("PopupManuMotif: DE: %d, manu: %d at position: %5.2f, %5.2f",
368 fCurrentDetElem, manu, x, y));
369 fLogMessage->ShowBottom();
377 //__________________________________________________________
378 void AliMpDEVisu::DrawDE(Bool_t info)
380 /// Draws function graphics in randomly choosen interval
385 fEcanvas->GetCanvas()->cd();
386 fEcanvas->GetCanvas()->SetEditable(kTRUE);
388 fNameDECombo->Select(fDEOccurrence[fCurrentDetElem]);
389 TGLBEntry* entry = fNameDECombo->GetSelectedEntry();
390 entry->SetBackgroundColor(0xDDDDDD);
392 if (AliMpDEManager::GetStationType(fCurrentDetElem) == AliMp::kStation345 ) {
398 DrawQuadrant("RSMCI");
402 fEcanvas->GetCanvas()->SetEditable(kFALSE);
406 //__________________________________________________________
407 void AliMpDEVisu::DrawManuMotif(Bool_t popup)
409 /// Draw manu motif in yellow and popup channel motif window
411 fEcanvas->GetCanvas()->SetEditable(kTRUE);
413 if (!fNumberEntry->GetIntNumber()) return;
417 if (AliMpDEManager::GetStationType(fCurrentDetElem) == AliMp::kStation345 ) {
419 sprintf(command, "%s%d", "PMCI:", (Int_t)fNumberEntry->GetIntNumber());
421 DrawSlat(command, popup);
425 sprintf(command, "%s%d", "RSMCI:", (Int_t)fNumberEntry->GetIntNumber());
427 DrawQuadrant(command, popup);
431 fEcanvas->GetCanvas()->SetEditable(kFALSE);
434 //__________________________________________________________
435 void AliMpDEVisu::DrawSlat(Option_t* option, Bool_t popup)
437 /// draw slat segmentation
439 TCanvas *canvas = fEcanvas->GetCanvas();
442 AliMpDetElement* detElem = AliMpDEManager::GetDetElement(fCurrentDetElem);
443 TString nameType = detElem->GetSegType();
445 AliMpDataStreams dataStreams;
447 AliMpSlatMotifMap mm;
449 AliMpSt345Reader reader(dataStreams,&mm);
450 AliMpSlat* slatCurrent = reader.ReadSlat(nameType.Data(), fCurrentPlane);
451 AliMpSlat* slatOther = reader.ReadSlat(nameType.Data(), AliMp::OtherPlaneType(fCurrentPlane));
453 AliMpVPainter* painter = AliMpVPainter::CreatePainter(slatCurrent);
454 painter->Draw(option);
459 slatCurrent->GetNofElectronicCards() +
460 slatOther->GetNofElectronicCards();
462 fLogMessage->AddLine(Form("DrawSlat: number of manus: %d", numberOfManu));
463 fLogMessage->ShowBottom();
466 PopUpManuMotif(slatCurrent);
470 //__________________________________________________________
471 void AliMpDEVisu::DrawQuadrant(Option_t* option, Bool_t popup)
473 /// draw quadrant segmentation
475 TCanvas *canvas = fEcanvas->GetCanvas();
478 AliMpDetElement* detElem = AliMpDEManager::GetDetElement(fCurrentDetElem);
479 AliMq::Station12Type station = detElem->GetStation12Type();
481 AliMpDataStreams dataStreams;
483 AliMpSectorReader readerCurrent(dataStreams, station, fCurrentPlane);
484 AliMpSector* sectorCurrent = readerCurrent.BuildSector();
486 AliMpSectorReader readerOther(dataStreams, station, AliMp::OtherPlaneType(fCurrentPlane));
487 AliMpSector* sectorOther = readerOther.BuildSector();
489 AliMpVPainter *painter = AliMpVPainter::CreatePainter(sectorCurrent);
490 painter->Draw(option);
495 sectorCurrent->GetMotifMap()->GetNofMotifPositions() +
496 sectorOther->GetMotifMap()->GetNofMotifPositions();
498 fLogMessage->AddLine(Form("DrawQuadrant: number of manus: %d", numberOfManu));
499 fLogMessage->ShowBottom();
502 PopUpManuMotif(sectorCurrent);
506 //______________________________________________________________________________
508 AliMpDEVisu::EventToReal(Int_t eventX, Int_t eventY, Double_t& x, Double_t& y) const
510 /// estimate graphic pad sizes
512 static TVector2 ul(gPad->XtoPixel(0.01), gPad->YtoPixel(0.99));
513 static TVector2 br(gPad->XtoPixel(0.99), gPad->YtoPixel(0.01));
515 static TVector2 padDim = br - ul;
517 // get DE dimension (half size)
518 TVector2 deDim(fkSegmentation->Dimensions()*2.0);
522 if (AliMpDEManager::GetStationType(fCurrentDetElem) == AliMp::kStation345 )
525 x = (eventX - ul.X() - padDim.X()/2.)/(padDim.X())*deDim.X();
526 y = (br.Y() - eventY - padDim.Y()/2.)/(padDim.Y())*deDim.Y();
531 // origin at bottom left
532 x = (eventX - ul.X())/(padDim.X())*deDim.X();
533 y = (br.Y() - eventY)/(padDim.Y())*deDim.Y();
538 //__________________________________________________________
539 void AliMpDEVisu::ResetManu()
541 /// reset manu search entry
542 fLogMessage->AddLine("Reset Motif Search Entry:");
543 fLogMessage->ShowBottom();
544 fNumberEntry->SetNumber(0);
548 //__________________________________________________________
549 void AliMpDEVisu::DeletePopUp()
551 /// delete motif popup windows
553 if (fTrashList.GetEntries() > 0)
555 fLogMessage->AddLine("Delete Motif PopUp Windows:");
556 fLogMessage->ShowBottom();
562 //__________________________________________________________
563 void AliMpDEVisu::SaveLogMessage()
565 /// save log message into log file
567 TString logFile = fLogFile->GetDisplayText();
568 fLogMessage->GetText()->Save(logFile.Data());
570 fLogMessage->AddLine(Form("SaveLogMessage: saving log message into logfile: %s", logFile.Data()));
571 fLogMessage->ShowBottom();
574 //__________________________________________________________
575 void AliMpDEVisu::ClearLogMessage()
577 /// clear log message
578 fLogMessage->GetText()->Clear();
579 fLogMessage->AddLine("ClearLogMessage: clear log messages:");
580 fLogMessage->ShowBottom();
583 //__________________________________________________________
584 void AliMpDEVisu::InfoDE()
586 /// info concerning the whole DE
588 AliMpDetElement* detElem = fDDLStore->GetDetElement(fCurrentDetElem);
589 Int_t ddlId = detElem->GetDdlId();
590 Int_t numberOfBus = detElem->GetNofBusPatches();
593 for (Int_t i = 0; i < detElem->GetNofBusPatches(); ++i)
594 vec[i] = detElem->GetBusPatchId(i);
596 Int_t firstBus = TMath::MinElement(detElem->GetNofBusPatches(), vec);
597 Int_t lastBus = TMath::MaxElement(detElem->GetNofBusPatches(), vec);
599 Int_t numberOfSerialManu = fManuStore->NofManus(detElem->GetId()); // number of manu with an identified serial number
601 fLogMessage->AddLine(Form("DrawDE: detection element: %d, name: %s",
602 fCurrentDetElem, fCurrentDEName.Data()));
603 fLogMessage->ShowBottom();
605 fLogMessage->AddLine(Form("DrawDE: DDL: %d, number of buspatches %d from %d to %d",
606 ddlId, numberOfBus, firstBus, lastBus));
607 fLogMessage->ShowBottom();
609 if (numberOfSerialManu != 0) { // not available yet for all DE
610 fLogMessage->AddLine(Form("DrawDE: number of manus with serial number: %d", numberOfSerialManu));
611 fLogMessage->ShowBottom();
616 //__________________________________________________________
617 Bool_t AliMpDEVisu::ProcessMessage(Long_t msg, Long_t parm1, Long_t /*parm2*/)
619 /// process message from widgets actions/entries
621 AliMpDetElement* detElem = AliMpDEManager::GetDetElement(fCurrentDetElem);
626 switch (GET_SUBMSG(msg))
634 UpdateNameView(kTRUE);
647 case kCM_CHECKBUTTON:
651 if (fPlaneButton->GetState() == kButtonDown) {
652 fCurrentPlane = AliMp::kNonBendingPlane;
653 if (fNumberEntry->GetIntNumber() && fNumberEntry->GetIntNumber() <= 1024)
654 fNumberEntry->SetNumber(fNumberEntry->GetIntNumber() + 1024);
656 fCurrentPlane = AliMp::kBendingPlane;
657 if (fNumberEntry->GetIntNumber() && fNumberEntry->GetIntNumber() > 1024)
658 fNumberEntry->SetNumber(fNumberEntry->GetIntNumber() - 1024);
661 fkSegmentation = AliMpSegmentation::Instance()
662 ->GetMpSegmentation(fCurrentDetElem, detElem->GetCathodType(fCurrentPlane));
666 if (fZoomButton->GetState() == kButtonDown)
680 //__________________________________________________________
681 void AliMpDEVisu::NextDE()
685 Int_t next = fDECombo->GetSelected() + 1;
687 if (next < fDECombo->GetNumberOfEntries())
688 fDECombo->Select(next);
696 //__________________________________________________________
697 void AliMpDEVisu::UpdateComboCH()
699 /// update Chamber/DE in respect to DE Name
701 fCurrentDEName = fNameDEComboIdx[fNameDECombo->GetSelected()];
703 AliMpDetElement* detElem = AliMpDEManager::GetDetElement(fCurrentDEName);
705 Int_t idx = AliMpDEManager::GetChamberId(detElem->GetId());
706 fChamberCombo->Select(idx);
710 idx = detElem->GetId() % 100;
711 fDECombo->Select(idx);
713 fCurrentDetElem = fDEComboIdx[fDECombo->GetSelected()];
715 fkSegmentation = AliMpSegmentation::Instance()
716 ->GetMpSegmentation(fCurrentDetElem, detElem->GetCathodType(fCurrentPlane));
719 //__________________________________________________________
720 void AliMpDEVisu::UpdateComboDE()
722 /// update DE in respect to selected chamber
724 fDECombo->RemoveAll();
730 for ( it.First(fChamberCombo->GetSelected()); ! it.IsDone(); it.Next() ) {
731 fDECombo->AddEntry(Form("%d",it.CurrentDE()->GetId()), i);
732 fDEComboIdx[i++] = it.CurrentDE()->GetId();
737 //__________________________________________________________
738 void AliMpDEVisu::UpdateNameView(Bool_t firstTime)
740 /// update DE name in respect to selected DE id.
742 fCurrentDetElem = fDEComboIdx[fDECombo->GetSelected()];
744 AliMpDetElement* detElem = AliMpDEManager::GetDetElement(fCurrentDetElem);
746 fCurrentDEName = detElem->GetDEName();
751 fNameDECombo->RemoveAll();
753 for ( it.First(fChamberCombo->GetSelected()); !it.IsDone(); it.Next() ) {
755 Int_t detElemId = it.CurrentDE()->GetId();
756 TString deName = it.CurrentDE()->GetDEName();
758 Int_t idx = fNameDECombo->GetNumberOfEntries();
759 fNameDECombo->AddEntry(deName.Data(), idx);
760 fNameDEComboIdx[idx] = deName;
761 fDEOccurrence[detElemId] = idx;
765 fNameDECombo->Select(fDEOccurrence[fCurrentDetElem]);
766 fkSegmentation = AliMpSegmentation::Instance()
767 ->GetMpSegmentation(fCurrentDetElem, detElem->GetCathodType(fCurrentPlane));
770 //______________________________________________________________________________
772 AliMpDEVisu::CreatePopupWindow(Int_t w, Int_t h, const char* windowName,
773 AliMpVPainter* painter,
776 /// Create transient frame
778 TCanvas* c = new TCanvas(windowName,windowName,-200,100,w,h);
780 Int_t n = fTrashList.GetEntries();
782 c->Connect("Closed()","AliMpDEVisu",this,Form("ClosePopupWindow(=%d)",n));
784 fTrashList.AddLast(c);
788 painter->Draw(option);
793 //__________________________________________________________
794 void AliMpDEVisu::PopUpManuMotif(AliMpSlat* slat)
796 /// pop up manu window motif painter for slat
799 AliMpMotifPosition* motifPosFound = 0x0;
800 AliMpMotifPosition* motifPos = 0x0;
803 for ( Int_t i = 0; i < slat->GetSize(); ++i ) {
805 AliMpPCB* pcb = slat->GetPCB(i);
807 for ( Int_t j = 0; j < slat->GetPCB(i)->GetSize(); ++j ) {
809 motifPos = pcb->GetMotifPosition(j);
811 manuId = motifPos->GetID();
812 if (manuId == (Int_t)fNumberEntry->GetIntNumber()) {
813 motifPosFound = motifPos;
823 InfoManuMotif(motifPosFound);
825 TVector2 dimension(motifPosFound->Dimensions());
828 Int_t w = Int_t(h*dimension.X()/dimension.Y());
829 AliMpVPainter* painter = AliMpVPainter::CreatePainter(motifPosFound);
831 CreatePopupWindow(w,h,Form("Manu %d",fNumberEntry->GetIntNumber()),
836 //__________________________________________________________
837 void AliMpDEVisu::PopUpManuMotif(AliMpSector* sector)
839 /// pop up manu window motif painter for sector
842 AliMpMotifPosition* motifPosFound = 0x0;
843 AliMpMotifPosition* motifPos = 0x0;
846 for (Int_t iRow = 0; iRow < sector->GetNofRows(); ++iRow) {
848 AliMpRow* row = sector->GetRow(iRow);
850 for (Int_t iRowSeg = 0; iRowSeg < sector->GetRow(iRow)->GetNofRowSegments(); ++iRowSeg){
852 for (Int_t iRowSeg2 = 0; iRowSeg2 < row->GetNofRowSegments(); ++iRowSeg2) {
853 AliMpVRowSegment *rowSegment = row->GetRowSegment(iRowSeg2);
855 for (Int_t iMotif = 0; iMotif < rowSegment->GetNofMotifs(); ++iMotif){
857 Int_t motifPositionId = rowSegment->GetMotifPositionId(iMotif);
858 motifPos = rowSegment->GetRow()
859 ->GetMotifMap()->FindMotifPosition(motifPositionId);
861 manuId = motifPos->GetID();
862 if (manuId == (Int_t)fNumberEntry->GetIntNumber()) {
863 motifPosFound = motifPos;
878 InfoManuMotif(motifPosFound);
880 TVector2 dimension(motifPosFound->Dimensions());
882 // Create transient frame
884 Int_t w = Int_t(h*dimension.X()/dimension.Y());
886 AliMpVPainter* painter = AliMpVPainter::CreatePainter(motifPosFound);
888 CreatePopupWindow(w,h,Form("Manu %d",fNumberEntry->GetIntNumber()),
894 //__________________________________________________________
895 void AliMpDEVisu::InfoManuMotif(AliMpMotifPosition* motifPos)
897 /// info for popup manu motif
900 Int_t manuId = fNumberEntry->GetIntNumber();
901 TVector2 dimension(motifPos->Dimensions());
902 fLogMessage->AddLine(Form("PopupManuMotif: motif dimension: %5.2f, %5.2f",
903 dimension.X()*2., dimension.Y()*2.));
905 fLogMessage->AddLine( Form("PopupManuMotif: pad dimension: %4.2f, %4.2f",
906 motifPos->GetMotif()->GetPadDimensions(0).X()*2.,
907 motifPos->GetMotif()->GetPadDimensions(0).Y()*2. ));
909 fLogMessage->AddLine( Form("PopupManuMotif: manu: %d, serial number: %d, buspatch: %d",
911 fManuStore->GetManuSerial(fCurrentDetElem, manuId),
912 fDDLStore->GetBusPatchId(fCurrentDetElem, manuId)) );
914 fLogMessage->ShowBottom();
918 //______________________________________________________________________________
919 void AliMpDEVisu::PopUpZoom(Int_t ix0, Int_t iy0, Int_t ix1, Int_t iy1)
921 /// popup zoom window
924 EventToReal(ix0,iy0,x0,y0);
926 EventToReal(ix1,iy1,x1,y1);
928 fLogMessage->AddLine(Form("PopUpZoom: zoom positions (x0, y0: %6.2f, %6.2f), (x1, y1: %6.2f, %6.2f)",
930 fLogMessage->ShowBottom();
932 // Create transient frame
933 Int_t h = 500;//TMath::Abs(x1-x0);
934 Int_t w = 500;//TMath::Abs(y1-y0);
936 AliMpArea area(TVector2((x0+x1)/2.0,(y0+y1)/2.0),
937 TVector2(TMath::Abs(x1-x0)/2.0,TMath::Abs(y1-y0)/2.0));
940 if ( area.IsValid() )
942 AliMpVPadIterator* iterator = fkSegmentation->CreateIterator(area);
945 AliMpVPainter* painter = AliMpVPainter::CreatePainter(iterator);
946 CreatePopupWindow(w,h,"Zoom",painter,"");
950 AliError("could not get iterator for that area");
957 //__________________________________________________________
958 void AliMpDEVisu::ClosePopupWindow(Int_t id)
961 fEcanvas->GetCanvas()->cd();
962 fTrashList.RemoveAt(id);