// ------------------------------------------------------------------------- // ----- CbmVisMuchStationFrame source file ----- // ----- Created 26/03/07 by E. Kryshen ----- // ------------------------------------------------------------------------- #include #include "TClass.h" #include "TCanvas.h" #include "TObjArray.h" #include "TRootEmbeddedCanvas.h" #include "TArc.h" #include "TGFrame.h" #include "TGComboBox.h" #include "TGCanvas.h" #include "TGButton.h" #include "TGScrollBar.h" #include "TGNumberEntry.h" #include "TGButton.h" #include "TGLabel.h" #include "TGStatusBar.h" #include "CbmMuchDigiScheme.h" #include "CbmMuchStation.h" #include "CbmMuchSector.h" #include "CbmVisMuch.h" #include "CbmVisMuchStationFrame.h" #include "CbmVisMuchSector.h" #include "CbmVisMuchSectorFrame.h" #include "CbmVisPoint.h" #include "CbmVisHit.h" CbmVisMuchStationFrame::CbmVisMuchStationFrame(const TGWindow *p, CbmVisMuch* display): /*FOLD00*/ TGHorizontalFrame(p) { fECanvasW=500; fECanvasH=500; fRangeX = 200.; fRangeY = 200.; //cout << "fScaleX=" << fScaleX << endl; //cout << "fScaleY=" << fScaleY << endl; fDisplay = display; fSectors = new TObjArray(); fDigiScheme = fDisplay->GetDigiScheme(); fMain = new TGVerticalFrame(this,100,100); fStationCombo = new TGComboBox(fMain); fNstations = fDigiScheme->GetNStations(); fStationNr = 1; for (Int_t i=1;i<=fNstations;i++) fStationCombo->AddEntry(Form("Station %i",i),i); fStationCombo->Resize(85, 20); fStationCombo->Connect("Selected(Int_t)","CbmVisMuchStationFrame",this,"UpdateStation(Int_t)"); fStationCombo->Select(fStationNr,kFALSE); // Create scale frame fScaleFrame = new TGHorizontalFrame(this,100,10); fScaleLabel = new TGLabel(fScaleFrame,"Scale"); fScaleBox = new TGComboBox(fScaleFrame); fScaleFrame->AddFrame(fScaleLabel, new TGLayoutHints(kLHintsCenterY,0,3,0,0)); fScaleFrame->AddFrame(fScaleBox , new TGLayoutHints(kLHintsCenterY,3,0,0,0)); for (Int_t i=1;i<=3;i++) fScaleBox->AddEntry(Form("x %i",Int_t(pow(2.,i-1))),i); fScaleBox->Resize(50,20); fScaleBox->Connect("Selected(Int_t)","CbmVisMuchStationFrame", this,"DoScaleStation(Int_t)"); fScaleBox->Select(1,kFALSE); TGLayoutHints* hints = new TGLayoutHints(kLHintsExpandX,0,0,0,0); // Create layout frame fLayoutFrame = new TGGroupFrame(fMain,"Layout"); // Create checkbox to show/hide points fPointsVisibleBtn = new TGCheckButton(fLayoutFrame,"Show points",100); fPointsVisibleBtn->SetState(kButtonDown); fPointsVisibleBtn->Connect("Clicked()","CbmVisMuchStationFrame",this,"HandleButtons()"); fLayoutFrame->AddFrame(fPointsVisibleBtn,hints); // Create checkbox to show/hide hits fHitsVisibleBtn = new TGCheckButton(fLayoutFrame,"Show hits",101); fHitsVisibleBtn->SetState(kButtonDown); fHitsVisibleBtn->Connect("Clicked()","CbmVisMuchStationFrame",this,"HandleButtons()"); fLayoutFrame->AddFrame(fHitsVisibleBtn,hints); Int_t fPdgs[10]={2212,211,-211,321,-321,11,-11,13,-13,0}; Int_t fMoPdgs[10]={-1,22,211,-211,321,-321,3122,3312,3334,0}; fPdgFrame = new TGGroupFrame(fMain,"Select track"); for (Int_t i=0;i<10;i++) { TString name = Form("%i",fPdgs[i]); if (fPdgs[i]==0) name = "Other"; fPdgBtn[i] = new TGCheckButton(fPdgFrame,name,i); fPdgBtn[i]->SetState(kButtonDown); fPdgBtn[i]->Connect("Clicked()","CbmVisMuchStationFrame",this,"HandleButtons()"); fPdgFrame->AddFrame(fPdgBtn[i],hints); } fMoPdgFrame = new TGGroupFrame(fMain,"Select mother"); for (Int_t i=0;i<10;i++) { TString name = Form("%i",fMoPdgs[i]); if (fMoPdgs[i]==0) name = "Other"; if (fMoPdgs[i]==-1) name = "Primary"; fMoPdgBtn[i] = new TGCheckButton(fMoPdgFrame,name,20+i); fMoPdgBtn[i]->SetState(kButtonDown); fMoPdgBtn[i]->Connect("Clicked()","CbmVisMuchStationFrame",this,"HandleButtons()"); fMoPdgFrame->AddFrame(fMoPdgBtn[i],hints); } /* fEntryPtId = new TGNumberEntry(fSelectionFrame); fEntryMcId = new TGNumberEntry(fSelectionFrame); fEntryMcPdg = new TGNumberEntry(fSelectionFrame); fEntryMoId = new TGNumberEntry(fSelectionFrame); fEntryMoPdg = new TGNumberEntry(fSelectionFrame); fSelectButton = new TGTextButton(fSelectionFrame,"Select"); fEntryPtId->SetText("PointId"); */ /* fSelectionFrame->AddFrame(fEntryPtId,hints); fSelectionFrame->AddFrame(fEntryMcId,hints); fSelectionFrame->AddFrame(fEntryMcPdg,hints); fSelectionFrame->AddFrame(fEntryMoId,hints); fSelectionFrame->AddFrame(fEntryMoPdg,hints); fSelectionFrame->AddFrame(fSelectButton,hints); */ TGLayoutHints* hints1 = new TGLayoutHints(kLHintsCenterY|kLHintsExpandX,3,3,3,3); fMain->AddFrame(fStationCombo, hints1); fMain->AddFrame(fScaleFrame , hints1); fMain->AddFrame(fLayoutFrame , hints1); fMain->AddFrame(fPdgFrame , hints1); fMain->AddFrame(fMoPdgFrame , hints1); fGCanvas = new TGCanvas(this,501,501); TGCompositeFrame* container = new TGCompositeFrame(fGCanvas->GetViewPort(),10, 10, kHorizontalFrame,TGFrame::GetWhitePixel()); fGCanvas->SetContainer(container); fECanvas = new TRootEmbeddedCanvas(0,container,fECanvasW,fECanvasH); fGCanvas->AddFrame(fECanvas,new TGLayoutHints(kLHintsCenterX|kLHintsCenterY,0,0,0,0)); fCanvas = fECanvas->GetCanvas(); fCanvas->Range(-fRangeX,-fRangeY,fRangeX,fRangeY); fCanvas->SetBorderMode(0); fCanvas->SetGrid(); fCanvas->SetBit(kNoContextMenu); fCanvas->Connect("ProcessedEvent(Int_t,Int_t,Int_t,TObject*)", "CbmVisMuchStationFrame", this,"HandleEmbeddedCanvas(Int_t,Int_t,Int_t,TObject*)"); fScaleX = 2*fRangeX/fCanvas->GetWw(); fScaleY = 2*fRangeY/fCanvas->GetWh(); this->AddFrame(fMain ,new TGLayoutHints(kLHintsExpandY|kLHintsLeft,0,0,0,0)); this->AddFrame(fGCanvas,new TGLayoutHints(kLHintsExpandX|kLHintsExpandY,0,0,0,0)); this->Resize(); this->MapSubwindows(); 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); UpdateStation(fStationNr); } // ------------------------------------------------------------------------- // ------------------------------------------------------------------------- CbmVisMuchStationFrame::~CbmVisMuchStationFrame(){ /*FOLD00*/ if (fSectors) {fSectors->Delete(); delete fSectors;} if (fStationCombo) delete fStationCombo; if (fScaleLabel) delete fScaleLabel; if (fScaleBox) delete fScaleBox; if (fScaleFrame) delete fScaleFrame; if (fECanvas) delete fECanvas; if (fGCanvas) delete fGCanvas; if (fMain) delete fMain; // if (fPdgFrame) // if (fMoPrgFrame) // if (fPdgBtn) // if (fMoPdgBtn) } // ------------------------------------------------------------------------- // ------------------------------------------------------------------------- void CbmVisMuchStationFrame::CloseWindow(){ printf("Delete frame\n"); delete this; } // ------------------------------------------------------------------------- // ------------------------------------------------------------------------- void CbmVisMuchStationFrame::DoDrawStation(Int_t stationNr){ /*FOLD00*/ if (stationNr!=0) fStationNr = stationNr; fCanvas->cd(); fCanvas->SetEditable(kTRUE); fCanvas->Clear(); fSectors->Clear(); printf("DoDrawStation:%i\n",fStationNr); CbmMuchStation* station = fDigiScheme->GetStationByNr(fStationNr); // SetInfo(station); Double_t rmin = station->GetRmin(); Double_t rmax = station->GetRmax(); fNsectors=station->GetNSectors(); for (Int_t sectorNr=1; sectorNr<=fNsectors; sectorNr++){ CbmMuchSector* sector = fDigiScheme->GetSector(fStationNr,sectorNr); CbmVisMuchSector* gsector = new CbmVisMuchSector(station,sector,fSectors,fDisplay->GetDigis()); fSectors->Add(gsector); gsector->Draw("f"); gsector->Draw(); // gsector->DrawFull(); } TArc* cMin = new TArc(0,0,rmin,0,360); cMin->Draw(); TArc* cMax = new TArc(0,0,rmax,0,360); cMax->Draw(); fCanvas->Update(); fCanvas->SetEditable(kFALSE); SetInfo(station); } // ------------------------------------------------------------------------- // ------------------------------------------------------------------------- void CbmVisMuchStationFrame::DrawHits(){ /*FOLD00*/ fCanvas->SetEditable(kTRUE); fCanvas->cd(); TClonesArray* hits = fDisplay->GetVisHits(fStationNr); for (Int_t i=0;iGetEntriesFast();i++){ CbmVisHit* hit = (CbmVisHit*) hits->At(i); hit->Draw(); } fCanvas->Update(); fCanvas->SetEditable(kFALSE); } // ------------------------------------------------------------------------- // ------------------------------------------------------------------------- void CbmVisMuchStationFrame::DrawPoints(){ /*FOLD00*/ fCanvas->SetEditable(kTRUE); fCanvas->cd(); TClonesArray* points = fDisplay->GetVisPoints(fStationNr); for (Int_t i=0;iGetEntriesFast();i++){ CbmVisPoint* point = (CbmVisPoint*) points->At(i); point->DrawSpread(); } fCanvas->Update(); fCanvas->SetEditable(kFALSE); } // ------------------------------------------------------------------------- // ------------------------------------------------------------------------- void CbmVisMuchStationFrame::DoScaleStation(Int_t scale){ /*FOLD00*/ 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_old = fECanvas->GetWidth(); Int_t s = Int_t( norm*pow(2.,(Double_t)scale-1.)); fECanvas->SetWidth (s); fECanvas->SetHeight(s); fECanvasH=s; fECanvasW=s; fScaleX = 2*fRangeX/fCanvas->GetWw(); fScaleY = 2*fRangeY/fCanvas->GetWh(); 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)); //if (hrange2SetPosition(0); //if (vrange2SetPosition(0); //if (s_old < hpsize && hrange2>hpsize) //hbar->SetPosition((hrange2-hpsize)/2); //if (s_old < vpsize && vrange2>vpsize) //hbar->SetPosition((hrange2-hpsize)/2); //vbar->SetPosition((vrange2-vpsize)/2); //fGCanvas->MapSubwindows(); } // ------------------------------------------------------------------------- // ------------------------------------------------------------------------- void CbmVisMuchStationFrame::SetInfo(CbmMuchStation* station){ /*FOLD00*/ TString name =Form("Station %i: Z=%.fcm, D=%.0fmm, Rmin=%.1fcm, Rmax=%.1fcm", fStationNr,station->GetZ(),10*station->GetD(), station->GetRmin(),station->GetRmax()); fDisplay->SetWindowName(name); TGStatusBar* sbar = fDisplay->GetStatusBar(); sbar->SetText(Form("NoSectors=%3i",station->GetNSectors()),0); } // ------------------------------------------------------------------------- // ------------------------------------------------------------------------- void CbmVisMuchStationFrame::HandleEmbeddedCanvas(Int_t event, Int_t px, Int_t py, /*FOLD00*/ TObject *sel) { Double_t x=fCanvas->AbsPixeltoX(px); Double_t y=fCanvas->AbsPixeltoY(py); TString selName = sel->IsA()->GetName(); if (event == kButton1Down) { for(Int_t i=0;iGetEntriesFast();i++){ CbmVisMuchSector* gsector = (CbmVisMuchSector*) fSectors->At(i); CbmMuchSector* sector = gsector->GetSector(); if (!sector->Inside(x,y)) continue; printf("sector: %i\n",i+1); CbmVisMuchSectorFrame* sectorFrame = new CbmVisMuchSectorFrame(gsector,fDisplay); fDisplay->GetOpenSectors()->AddAtFree(sectorFrame); break; } } if (event == kMouseMotion){ fDisplay->GetStatusBar()->SetText(Form("(%.1f,%.1f)",x,y),2); if (!strcmp(selName,"CbmVisMuchSector")) { CbmVisMuchSector* gsector = (CbmVisMuchSector*) sel; fDisplay->GetStatusBar()->SetText(gsector->GetInfo(),1); } if (!strcmp(selName,"CbmVisPoint")) { CbmVisPoint* vpoint = (CbmVisPoint*) sel; fDisplay->GetStatusBar()->SetText(vpoint->GetInfo(),1); } if (!strcmp(selName,"CbmVisHit")) { CbmVisHit* vhit = (CbmVisHit*) sel; fDisplay->GetStatusBar()->SetText(vhit->GetInfo(),1); } } } // ------------------------------------------------------------------------- void CbmVisMuchStationFrame::UpdateStation(Int_t stationNr){ if (stationNr==0) stationNr = fStationNr; DoDrawStation(stationNr); DrawHits(); DrawPoints(); } // ------------------------------------------------------------------------- void CbmVisMuchStationFrame::HandleButtons(){ TGCheckButton *btn = (TGCheckButton*) gTQSender; Int_t id = btn->WidgetId(); Int_t isOn = btn->IsOn(); printf("DoButton: id = %d\n",id); // Set points visible if (id==100) { for (Int_t st=1;st<=fDisplay->GetNStations();st++){ TClonesArray* points = fDisplay->GetVisPoints(st); for (Int_t i=0;iGetEntriesFast();i++){ CbmVisPoint* point = (CbmVisPoint*) points->At(i); Int_t pdg=point->GetTrackPdg(); if (ShowTrack(pdg)) point->SetVisible(isOn); } } } if (id==101) { for (Int_t st=1;st<=fDisplay->GetNStations();st++){ TClonesArray* hits = fDisplay->GetVisHits(st); for (Int_t i=0;iGetEntriesFast();i++){ CbmVisHit* hit = (CbmVisHit*) hits->At(i); hit->SetVisible(isOn); } } } Int_t fPdgs[10]={2212,211,-211,321,-321,11,-11,13,-13,0}; // Int_t fMoPdgs[10]={-1,22,211,-211,321,-321,3122,3312,3334,0}; for (Int_t st=1;st<=fDisplay->GetNStations();st++){ TClonesArray* points = fDisplay->GetVisPoints(st); for (Int_t i=0;iGetEntriesFast();i++){ CbmVisPoint* point = (CbmVisPoint*) points->At(i); Int_t pdg=point->GetTrackPdg(); // Int_t moPdg=point->GetMotherPdg(); if (id==9) { Bool_t isInTheList=0; for (Int_t iPdg=0;iPdg<9;iPdg++){ if (pdg==fPdgs[iPdg]) {isInTheList=1; break;} } if (!isInTheList) point->SetVisible(isOn); } else if (id>=0 && id <9){ if (fPdgs[id]!=pdg) continue; point->SetVisible(isOn); // cout << pdg << endl; } } } fCanvas->Modified(); fCanvas->Update(); TObjArray* openSectors = fDisplay->GetOpenSectors(); for (Int_t i=0;iGetEntriesFast();i++){ CbmVisMuchSectorFrame* secFrame = (CbmVisMuchSectorFrame*) openSectors->At(i); if (!secFrame) continue; secFrame->GetCanvas()->Modified(); secFrame->GetCanvas()->Update(); } } // ------------------------------------------------------------------------- // ------------------------------------------------------------------------- bool CbmVisMuchStationFrame::ShowTrack(Int_t pdg){ Int_t fPdgs[10]={2212,211,-211,321,-321,11,-11,13,-13,0}; // check if pdg is in the list of available pdg codes Int_t btnId=-1; for (Int_t iPdg=0;iPdg<9;iPdg++){ if (pdg==fPdgs[iPdg]) {btnId=iPdg; break;} } // if not in the list than check "other" check box if (btnId<0) return fPdgBtn[9]->IsOn(); return fPdgBtn[btnId]->IsOn(); } // ------------------------------------------------------------------------- ClassImp(CbmVisMuchStationFrame) /*FOLD00*/