// ------------------------------------------------------------------------- // ----- CbmVisMuchSectorFrame source file ----- // ----- Created 14/03/07 by E. Kryshen ----- // ------------------------------------------------------------------------- #include #include "TClass.h" #include "CbmVisMuchSectorFrame.h" #include "TClonesArray.h" #include "TCanvas.h" #include "TRootEmbeddedCanvas.h" #include "TGWindow.h" #include "TGFrame.h" #include "TGStatusBar.h" #include "TGSlider.h" #include "TGCanvas.h" #include "TGComboBox.h" #include "CbmMuchDigi.h" #include "CbmMuchDigiMatch.h" #include "CbmMuchSector.h" #include "CbmVisMuch.h" #include "CbmVisMuchSector.h" #include "CbmVisPad.h" #include "CbmMuchPad.h" #include "CbmVisPoint.h" #include "CbmVisHit.h" #include "CbmVisMuchCluster.h" using std::map; // ------------------------------------------------------------------------- CbmVisMuchSectorFrame::CbmVisMuchSectorFrame(CbmVisMuchSector* sec, CbmVisMuch* display){ fNHits = 0; fNPoints = 0; fPlineSize = 0; fGSector = sec; fSector = sec->GetSector(); fDisplay = display; fStationNr = fSector->GetStationNr(); fSectorNr = fSector->GetSectorNr(); Double_t x0, y0, lx, ly; lx = fSector->GetLx(); ly = fSector->GetLy(); x0 = fSector->GetX0(); y0 = fSector->GetY0(); Double_t l = 2*sqrt(lx*lx+ly*ly)/2; fMain = new TGMainFrame(gClient->GetRoot(),800,800,kVerticalFrame); fMain->Connect("CloseWindow()", "CbmVisMuchSectorFrame", this, "CloseWindow()"); fScale = new TGComboBox(fMain,1); for (Int_t i=1;i<=3;i++) fScale->AddEntry(Form("x %i",Int_t(pow(2.,i-1))),i); fScale->Resize(90,20); fScale->Connect("Selected(Int_t)","CbmVisMuchSectorFrame", this,"DoScale(Int_t)"); fScale->Select(1,kFALSE); Int_t parts[] = {15,70,15}; fStatusBar = new TGStatusBar(fMain,50,10,kHorizontalFrame); fStatusBar->SetParts(parts,3); fGCanvas = new TGCanvas(fMain,600,600); TGCompositeFrame* container = new TGCompositeFrame(fGCanvas->GetViewPort(),10, 10, kHorizontalFrame,TGFrame::GetWhitePixel()); fGCanvas->SetContainer(container); fECanvas = new TRootEmbeddedCanvas(0,container,600,600); fGCanvas->AddFrame(fECanvas,new TGLayoutHints(kLHintsCenterX|kLHintsCenterY,0,0,0,0)); fCanvas = fECanvas->GetCanvas(); fCanvas->SetBorderMode(0); fCanvas->SetBit(kNoContextMenu); fCanvas->cd(); fCanvas->Clear(); fCanvas->Range(x0-l,y0-l,x0+l,y0+l); // fCanvas->Range(-100,-100,100,100); // sec->SetFillColor(10); // sec->Draw("f"); // sec->Draw(); fGSector->CreatePads(); fStatusBar->SetText(Form("Occupancy:%4.1f",100*fGSector->CalcOccupancy()),0); fCanvas->Connect("ProcessedEvent(Int_t,Int_t,Int_t,TObject*)", "CbmVisMuchSectorFrame", this,"HandleEmbeddedCanvas(Int_t,Int_t,Int_t,TObject*)"); fMain->AddFrame(fScale ,new TGLayoutHints(kLHintsTop|kLHintsLeft,3,3,3,3)); fMain->AddFrame(fGCanvas ,new TGLayoutHints(kLHintsExpandX|kLHintsExpandY,3,3,3,3)); fMain->AddFrame(fStatusBar,new TGLayoutHints(kLHintsBottom|kLHintsLeft |kLHintsExpandX,0,0,2,0)); fMain->MapSubwindows(); fMain->Resize(); TString wname = Form("Station %i: Sector %i at (%.2f,%.2f) cm, size: (%.1f,%.1f)cm", fStationNr,fSectorNr,x0,y0,lx,ly); fMain->SetWindowName(wname); fMain->MapWindow(); TGHScrollBar* hbar = fGCanvas->GetHScrollbar(); TGVScrollBar* vbar = fGCanvas->GetVScrollbar(); Int_t hpsize = hbar->GetPageSize(); Int_t hrange2 = hbar->GetRange(); Int_t vpsize = vbar->GetPageSize(); Int_t vrange2 = vbar->GetRange(); hbar->SetPosition((hrange2-hpsize)/2); vbar->SetPosition((vrange2-vpsize)/2); UpdateSector(); } // ------------------------------------------------------------------------- // ------------------------------------------------------------------------- CbmVisMuchSectorFrame::~CbmVisMuchSectorFrame(){ if (fScale) delete fScale; if (fStatusBar) delete fStatusBar; if (fGCanvas) delete fGCanvas; if (fECanvas) delete fECanvas; fDisplay->GetOpenSectors()->Remove(this); } // ------------------------------------------------------------------------- // ------------------------------------------------------------------------- void CbmVisMuchSectorFrame::CloseWindow(){ delete this; } // ------------------------------------------------------------------------- // ------------------------------------------------------------------------- void CbmVisMuchSectorFrame::DoScale(Int_t scale){ TGHScrollBar* hbar = fGCanvas->GetHScrollbar(); TGVScrollBar* vbar = fGCanvas->GetVScrollbar(); Int_t hpsize = hbar->GetPageSize(); Int_t hpos = hbar->GetPosition(); Int_t hrange1 = hbar->GetRange(); Int_t vpsize = vbar->GetPageSize(); Int_t vpos = vbar->GetPosition(); Int_t vrange1 = vbar->GetRange(); Double_t norm=500; Int_t s = Int_t( norm*pow(2.,(Double_t)scale-1.)); fECanvas->SetWidth (s); fECanvas->SetHeight(s); fGCanvas->MapSubwindows(); Int_t hrange2 = hbar->GetRange(); Int_t vrange2 = vbar->GetRange(); Double_t hratio = (Double_t)hrange2/(Double_t)hrange1; Double_t vratio = (Double_t)vrange2/(Double_t)vrange1; hbar->SetPosition(Int_t(hratio*(hpos+hpsize/2)-hpsize/2)); vbar->SetPosition(Int_t(vratio*(vpos+vpsize/2)-vpsize/2)); } // ------------------------------------------------------------------------- // ------------------------------------------------------------------------- void CbmVisMuchSectorFrame::HandleEmbeddedCanvas(Int_t event, Int_t px, Int_t py, TObject *sel) { Double_t x=fCanvas->AbsPixeltoX(px); Double_t y=fCanvas->AbsPixeltoY(py); TString selName = sel->IsA()->GetName(); if (event == kButton1Down) { if (!strcmp(selName,"CbmVisPad")) { CbmVisPad* vpad = (CbmVisPad*) sel; Int_t id = vpad->GetDigiId(); if (id<0) return; TClonesArray* digiMatches = fDisplay->GetDigiMatches(); CbmMuchDigiMatch* match = (CbmMuchDigiMatch*) digiMatches->At(id); Int_t clusterId = match->GetCluster(); TClonesArray* visClusters = fDisplay->GetVisClusters(); CbmVisMuchCluster* cluster = (CbmVisMuchCluster*) visClusters->At(clusterId); cluster->PrintInfo(); cluster->DrawHisto(); } } if (event == kButton3Down) { if (!strcmp(selName,"CbmVisPad")) { CbmVisPad* vpad = (CbmVisPad*) sel; CbmMuchSector* sector = vpad->GetSector(); CbmMuchPad* mpad = sector->GetPad(vpad->GetChannel()); map, CbmMuchPad*> neighbours=mpad->GetNeighbours(); map, CbmMuchPad*>::iterator it; fPlineSize = neighbours.size(); // fPline = new TPolyLine[fPlineSize]; printf("%i\n",fPlineSize); Int_t i=0; for(it=neighbours.begin(); it!=neighbours.end(); it++){ CbmMuchPad* pad = (*it).second; fStatusBar->SetText(Form("%i",pad->GetChannel()),2); printf("%i\n",pad->GetChannel()); fCanvas->SetEditable(kTRUE); fCanvas->cd(); TPolyLine pline = pad->GetPadPolygon(); // fPline[i] = ; // fPline[i].SetFillColor(kGreen); // fPline[i].Draw("f"); fCanvas->Update(); fCanvas->SetEditable(kFALSE); i++; } } } if (event == kButton3Up && fPlineSize>0) { // delete [] fPline; // fPlineSize = 0; } if (event == kMouseMotion){ fStatusBar->SetText(Form("(%.2f,%.2f)",x,y),2); if (!strcmp(selName,"CbmVisPoint")) { CbmVisPoint* vpoint = (CbmVisPoint*) sel; fStatusBar->SetText(vpoint->GetInfo(),1); } else if (!strcmp(selName,"CbmVisHit")) { CbmVisHit* vhit = (CbmVisHit*) sel; fStatusBar->SetText(vhit->GetInfo(),1); } else if (!strcmp(selName,"CbmVisPad")) { CbmVisPad* vpad = (CbmVisPad*) sel; fStatusBar->SetText(vpad->GetInfo(),1); } else { fStatusBar->SetText("",1); } } } // ------------------------------------------------------------------------- // ------------------------------------------------------------------------- void CbmVisMuchSectorFrame::DrawHits(){ fNHits=0; TClonesArray* hits = fDisplay->GetVisHits(fStationNr); for (Int_t i=0;iGetEntriesFast();i++){ CbmVisHit* hit = (CbmVisHit*) hits->At(i); hit->Draw(); fNHits++; } } // ------------------------------------------------------------------------- // ------------------------------------------------------------------------- void CbmVisMuchSectorFrame::DrawPoints(){ fNPoints=0; TClonesArray* points = fDisplay->GetVisPoints(fStationNr); for (Int_t i=0;iGetEntriesFast();i++){ CbmVisPoint* point = (CbmVisPoint*) points->At(i); point->DrawSpread(); // point->GetMarkerIn()->Draw(); // point->GetMarkerOut()->Draw(); fNPoints++; } } // ------------------------------------------------------------------------- // ------------------------------------------------------------------------- void CbmVisMuchSectorFrame::UpdateSector(){ fCanvas->SetEditable(kTRUE); fCanvas->cd(); fGSector->DrawNeighbours(); fGSector->DrawFull(1); DrawPoints(); DrawHits(); fCanvas->Update(); fCanvas->SetEditable(kFALSE); fStatusBar->SetText(Form("Occupancy:%4.1f",100*fGSector->GetOccupancy()),0); } // ------------------------------------------------------------------------- ClassImp(CbmVisMuchSectorFrame)