// ------------------------------------------------------------------------- // ----- CbmVisMuchSector source file ----- // ----- Created 14/03/07 by E. Kryshen ----- // ------------------------------------------------------------------------- #include #include "TMath.h" #include "TClonesArray.h" #include "TLine.h" #include "CbmVisMuchSector.h" #include "CbmMuchSector.h" #include "CbmVisPad.h" #include "CbmMuchDigi.h" using std::map; // ------------------------------------------------------------------------- CbmVisMuchSector::CbmVisMuchSector(CbmMuchStation* station, CbmMuchSector* sec, TObjArray* sectors, TClonesArray* digis ): CbmVisSector(sec->GetX0(),sec->GetY0(),sec->GetLx(),sec->GetLy(),sec->GetRotation()) { fSector=sec; fStation=station; fSectors=sectors; fOccupancy=0; fDigis = digis; fPads = new TClonesArray("CbmVisPad",128); CreatePads(); } // ------------------------------------------------------------------------- // ------------------------------------------------------------------------- void CbmVisMuchSector::CreatePads(){ Double_t x[5], y[5]; // pad corner coordinates Int_t charge = 0; fPads->Clear(); for (Int_t iChannel=0;iChannelGetNChannels();iChannel++){ fSector->GetPadVertices(iChannel,x,y); x[4]=x[0]; y[4]=y[0]; new ((*fPads)[iChannel]) CbmVisPad(x,y,iChannel,charge,fSector); } } // ------------------------------------------------------------------------- // ------------------------------------------------------------------------- void CbmVisMuchSector::DrawPads(){ for (Int_t i=0;iGetEntriesFast();i++){ CbmVisPad* pad = (CbmVisPad*) fPads->At(i); pad->DrawPad(); } } // ------------------------------------------------------------------------- // ------------------------------------------------------------------------- void CbmVisMuchSector::MarkFiredPads(){ for (Int_t i=0;iGetEntriesFast();i++){ CbmMuchDigi* digi = (CbmMuchDigi*) fDigis->At(i); Int_t stationNr = digi->GetStationNr(); if (stationNr!=fSector->GetStationNr()) continue; Int_t sectorNr = digi->GetSectorNr(); if (sectorNr!=fSector->GetSectorNr()) continue; Int_t channelNr = digi->GetChannelNr(); ((CbmVisPad*)fPads->At(channelNr))->SetCharge(digi->GetCharge()); ((CbmVisPad*)fPads->At(channelNr))->SetFired(i); } } // ------------------------------------------------------------------------- // ------------------------------------------------------------------------- void CbmVisMuchSector::ResetPads(){ for (Int_t i=0;iGetEntriesFast();i++) ((CbmVisPad*)fPads->At(i))->SetFired(-1); } // ------------------------------------------------------------------------- // ------------------------------------------------------------------------- Double_t CbmVisMuchSector::CalcOccupancy(){ Int_t nAll = fPads->GetEntriesFast(); Int_t nFired = 0; for (Int_t i=0;iAt(i); if (pad->IsFired()) nFired++; } fOccupancy = (Double_t)nFired/(Double_t) nAll; return fOccupancy; } // ------------------------------------------------------------------------- // ------------------------------------------------------------------------- void CbmVisMuchSector::DrawFull(bool active){ ResetPads(); MarkFiredPads(); DrawPads(); if (active) {SetLineWidth(4); SetLineColor(kRed);} TLine* l[4]; for (int i=0;i<4;i++) { l[i] = new TLine(fX[i],fY[i],fX[i+1],fY[i+1]); l[i]->SetLineWidth(3); l[i]->SetLineColor(kGreen); if (active) l[i]->SetLineColor(kRed); l[i]->Draw(); } } // ------------------------------------------------------------------------- void CbmVisMuchSector::DrawNeighbours(){ map neighbours = fSector->GetNeighbours(); map::iterator it; for(it=neighbours.begin(); it!=neighbours.end(); it++){ CbmMuchSector* sector = (*it).second; Int_t sectorNr = sector->GetSectorNr(); printf("neighbour: %i ", sectorNr); CbmVisMuchSector* visSector = (CbmVisMuchSector*) fSectors->At(sectorNr-1); printf("%i\n",visSector); visSector->DrawFull(); } } // ------------------------------------------------------------------------- ClassImp(CbmVisMuchSector)