// ------------------------------------------------------------------------- // ----- CbmVisMuch source file ----- // ----- Created 14/03/07 by E. Kryshen ----- // ------------------------------------------------------------------------- #include "CbmVisMuch.h" #include "TApplication.h" #include "TClonesArray.h" #include "TGClient.h" #include "TGButton.h" #include "TGFrame.h" #include "TGStatusBar.h" #include "CbmRootManager.h" #include "CbmRunAna.h" #include "CbmRuntimeDb.h" #include "CbmGeoMuchPar.h" #include "CbmMCTrack.h" #include "CbmMuchDigiPar.h" #include "CbmMuchDigiScheme.h" #include "CbmMuchStation.h" #include "CbmMuchSector.h" #include "CbmMuchPoint.h" #include "CbmMuchDigi.h" #include "CbmMuchDigiMatch.h" #include "CbmMuchCluster.h" #include "CbmMuchHit.h" #include "CbmVisMuchStationFrame.h" #include "CbmVisMuchSectorFrame.h" #include "CbmVisPoint.h" #include "CbmVisHit.h" #include "CbmVisMuchCluster.h" // ----- Default constructor ------------------------------------------ CbmVisMuch::CbmVisMuch():CbmTask("Task",0){ fEvent = 0; fMCTracks = NULL; fPoints = NULL; fDigis = NULL; fDigiMatches = NULL; fHits = NULL; fDigiScheme = new CbmMuchDigiScheme(); fNstations = 0; fOpenSectors = new TObjArray(); fSumEvents = kFALSE; fVisClusters = new TClonesArray("CbmVisMuchCluster",10); } // ------------------------------------------------------------------------- // ----- Destructor ---------------------------------------------------- CbmVisMuch::~CbmVisMuch() { if ( fDigiScheme ) delete fDigiScheme; if ( fOpenSectors ) fOpenSectors->Delete(); delete fOpenSectors; } // ------------------------------------------------------------------------- // ----- Private method SetParContainers ------------------------------- void CbmVisMuch::SetParContainers() { CbmRunAna* fRun = CbmRunAna::Instance(); CbmRuntimeDb* db = fRun->GetRuntimeDb(); fGeoPar = (CbmGeoMuchPar*) db->getContainer("CbmGeoMuchPar"); fDigiPar = (CbmMuchDigiPar*) db->getContainer("CbmMuchDigiPar"); } // ------------------------------------------------------------------------- // ------------------------------------------------------------------------- InitStatus CbmVisMuch::Init() { fRootManager = CbmRootManager::Instance(); fMCTracks = (TClonesArray*) fRootManager->GetObject("MCTrack"); fPoints = (TClonesArray*) fRootManager->GetObject("MuchPoint"); fHits = (TClonesArray*) fRootManager->GetObject("MuchHit"); fDigis = (TClonesArray*) fRootManager->GetObject("MuchDigi"); fDigiMatches = (TClonesArray*) fRootManager->GetObject("MuchDigiMatch"); fClusters = (TClonesArray*) fRootManager->GetObject("MuchCluster"); fDigiScheme->Init(fGeoPar, fDigiPar); fDigiScheme->InitGrid(); fNstations = fDigiScheme->GetNStations(); for (Int_t i=0;i<=fNstations;i++){ // CbmMuchStation* station = fDigiScheme->GetStation(i); // station->InitNeighbourSectors(); // station->InitNeighbourPads(); fVisHits[i] = new TClonesArray("CbmVisHit"); fVisPoints[i] = new TClonesArray("CbmVisPoint"); } CreateDisplay(); return kSUCCESS; } // ------------------------------------------------------------------------- void CbmVisMuch::CloseWindow(){ gApplication->Terminate(0); } // ------------------------------------------------------------------------- void CbmVisMuch::CreateDisplay(){ fDisplay = new TGMainFrame(gClient->GetRoot(),800,800,kVerticalFrame); fDisplay->SetWindowName("MUCH Event Display"); fDisplay->Connect("CloseWindow()","TApplication",gApplication,"Terminate()"); fMain = new TGVerticalFrame(fDisplay); Int_t parts[] = {20,65,15}; fStatusBar = new TGStatusBar(fDisplay,50,10,kHorizontalFrame); fStatusBar->SetParts(parts,3); fStationFrame = new CbmVisMuchStationFrame(fMain,this); //Button Frame fButtonFrame = new TGHorizontalFrame(fMain,500,100); fPrev = new TGTextButton(fButtonFrame,"&Previous"); fNext = new TGTextButton(fButtonFrame,"&Next"); fExit = new TGTextButton(fButtonFrame,"&Exit","gApplication->Terminate(0)"); fNext->Connect("Clicked()","CbmVisMuch",this,"ReadNextEvent()"); fPrev->Connect("Clicked()","CbmVisMuch",this,"ReadPrevEvent()"); TGLayoutHints* lhButton = new TGLayoutHints(kLHintsCenterX,5,5,2,2); fButtonFrame->AddFrame(fPrev,lhButton); fButtonFrame->AddFrame(fNext,lhButton); fButtonFrame->AddFrame(fExit,lhButton); fMain->AddFrame(fStationFrame, new TGLayoutHints(kLHintsExpandX|kLHintsExpandY,2,2,2,2)); fMain->AddFrame(fButtonFrame , new TGLayoutHints(kLHintsBottom|kLHintsCenterX,2,2,2,2)); fDisplay->AddFrame(fMain ,new TGLayoutHints(kLHintsTop|kLHintsLeft|kLHintsExpandX|kLHintsExpandY,2,2,2,2)); fDisplay->AddFrame(fStatusBar,new TGLayoutHints(kLHintsBottom|kLHintsLeft |kLHintsExpandX,0,0,2,0)); fDisplay->MapSubwindows(); fDisplay->Resize(fDisplay->GetDefaultSize()); fDisplay->MapWindow(); ReadEvent(fEvent); } // ------------------------------------------------------------------------- // ------------------------------------------------------------------------- void CbmVisMuch::ReadEvent(Int_t event){ int verbose = 0; fEvent=event; printf("Event:%i\n",fEvent); fRootManager->ReadEvent(fEvent); //Clear point and hit arrays for (Int_t i=1;i<=fNstations;i++){ fVisPoints[i]->Clear(); fVisHits[i]->Clear(); } printf("Create arrays of CbmVisHits... nHits = %i\n",fHits->GetEntriesFast()); //Create arrays of CbmVisHits for (Int_t i=0;iGetEntriesFast();i++){ if (verbose) printf("Hit: %i",i); CbmMuchHit* hit = (CbmMuchHit*) fHits->At(i); Int_t stationNr = hit->GetStationNr(); if (verbose) printf("station: %i", stationNr); TClonesArray &hits = *fVisHits[stationNr]; Int_t index = hits.GetEntriesFast(); new (hits[index]) CbmVisHit(hit); if (verbose) printf("\n"); // SetHitInfo((CbmVisHit*)hits[index]); } printf("Create arrays of CbmVisPoints... nPoints = %i\n",fPoints->GetEntriesFast()); //Create arrays of CbmVisPoints for (Int_t i=0;iGetEntriesFast();i++){ CbmMuchPoint* point = (CbmMuchPoint*) fPoints->At(i); if ( ! point->IsUsable() ) continue; Int_t detId = point->GetDetectorID(); Int_t stationNr = fDigiScheme->GetStationByMcId(detId)->GetStationNr(); TClonesArray &points = *fVisPoints[stationNr]; Int_t index = points.GetEntriesFast(); new (points[index]) CbmVisPoint(point); SetPointInfo((CbmVisPoint*) points[index]); } fVisClusters->Clear(); for (Int_t i=0;iGetEntriesFast();i++){ new ( (*fVisClusters)[i]) CbmVisMuchCluster(i,fDigiScheme,fVisPoints); } // Update current station view fStationFrame->UpdateStation(); // Update open sectors for (Int_t i=0;iGetEntriesFast();i++){ CbmVisMuchSectorFrame* secFrame = (CbmVisMuchSectorFrame*) fOpenSectors->At(i); if (!secFrame) continue; secFrame->UpdateSector(); } } // ------------------------------------------------------------------------- // ------------------------------------------------------------------------- void CbmVisMuch::ReadNextEvent(){ fEvent++; ReadEvent(fEvent); } // ------------------------------------------------------------------------- // ------------------------------------------------------------------------- void CbmVisMuch::ReadPrevEvent(){ fEvent--; ReadEvent(fEvent); } // ------------------------------------------------------------------------- // ------------------------------------------------------------------------- Int_t CbmVisMuch::SetPointInfo(CbmVisPoint* vpoint){ Int_t trackId = vpoint->GetTrackId(); if (trackId<0) return 2; CbmMCTrack* track = (CbmMCTrack*) fMCTracks->At(trackId); vpoint->SetTrack(track); if (!track) return 3; vpoint->SetMotherPdg(GetMotherPdg(track)); return 0; } // ------------------------------------------------------------------------- // ------------------------------------------------------------------------- Int_t CbmVisMuch::SetHitInfo(CbmVisHit* vhit){ CbmMuchHit* hit = (CbmMuchHit*) vhit->GetHit(); Int_t digiId = hit->GetDigi(); CbmMuchDigiMatch* match = (CbmMuchDigiMatch*) fDigiMatches->At(digiId); Int_t pointId = match->GetRefIndex(); vhit->SetPointId(pointId); if (pointId<0) return 1; CbmMCPoint* point = (CbmMCPoint*) fPoints->At(pointId); Int_t trackId = point->GetTrackID(); vhit->SetTrackId(trackId); if (trackId<0) return 2; CbmMCTrack* track = (CbmMCTrack*) fMCTracks->At(trackId); if (!track) return 3; vhit->SetTrack(track); vhit->SetMotherPdg(GetMotherPdg(track)); return 0; } // ------------------------------------------------------------------------- Int_t CbmVisMuch::GetMotherPdg(CbmMCTrack* track){ Int_t motherId = track->GetMotherId(); if (motherId<0) return 0; CbmMCTrack* mother = (CbmMCTrack*) fMCTracks->At(motherId); if (!mother) return 0; return mother->GetPdgCode(); } ClassImp(CbmVisMuch)