//* $Id: */ // ------------------------------------------------------------------------- // ----- CbmStsDigiScheme source file ----- // ----- Created 31/08/06 by V. Friese ----- // ------------------------------------------------------------------------- #include "CbmStsDigiScheme.h" #include "CbmGeoStsPar.h" #include "CbmStsDigiPar.h" #include "CbmStsSensor.h" #include "CbmStsSensorDigiPar.h" #include "CbmStsSector.h" #include "CbmStsSectorDigiPar.h" #include "CbmStsStation.h" #include "CbmStsStationDigiPar.h" #include "FairGeoMedium.h" #include "FairGeoNode.h" #include "FairGeoTransform.h" #include "FairGeoVector.h" #include "TArrayD.h" #include #include using std::flush; using std::map; using std::cout; using std::endl; using std::pair; // ----- Constructor --------------------------------------------------- CbmStsDigiScheme::CbmStsDigiScheme() { fStations = new TObjArray(10); fNSectors = fNSensors = fNChannels = fNStations = 0; } // ------------------------------------------------------------------------- // ----- Destructor ---------------------------------------------------- CbmStsDigiScheme::~CbmStsDigiScheme() { if ( fStations) { fStations->Delete(); delete fStations; } } // ------------------------------------------------------------------------- // ----- Public method Init -------------------------------------------- Bool_t CbmStsDigiScheme::Init(CbmGeoStsPar* geoPar, CbmStsDigiPar* digiPar) { } // ----- Public method Init -------------------------------------------- Bool_t CbmStsDigiScheme::Init(CbmStsDigiPar* digiPar) { if ( ! digiPar ) { cout << "-W- CbmStsDigiScheme::Init: " << "No digitisation parameters available!" << endl; return kFALSE; } // Loop over stations in DigiPar Int_t nStations = digiPar->GetNStations(); fNStations = digiPar->GetNStations(); CbmStsStationDigiPar* statPar = NULL; CbmStsSectorDigiPar* sectorPar = NULL; CbmStsSensorDigiPar* sensorPar = NULL; for (Int_t iStation=0; iStationGetStation(iStation); Int_t statNr = statPar->GetStationNr(); Double_t statRot = statPar->GetRotation(); Int_t nSectors = statPar->GetNSectors(); Double_t statZPos = -666; CbmStsStation* station; TString stationName = Form("stat%02d",iStation+1); TString statVolName = Form("stsstation%02ikeepvol",statNr); Int_t sensorByIndex = 0; for (Int_t iSector=0; iSectorGetSector(iSector); Int_t sectorNr = iSector+1; Int_t sectorDetId = 2 << 24 | statNr << 16 | sectorNr << 4; sectorPar = (CbmStsSectorDigiPar*) statPar->GetSector(iSector); Int_t nSensors = sectorPar->GetNSensors(); CbmStsSector* sector; TString sectorName = Form("stat%02dsect%d",iStation+1,iSector+1); for (Int_t iSensor=0; iSensorGetSensor(iSensor); Int_t sensorType = sensorPar->GetType(); Double_t sensorX = sensorPar->GetX0(); Double_t sensorY = sensorPar->GetY0(); Double_t sensorZ = sensorPar->GetZ0(); Double_t sensorRot = sensorPar->GetRotation(); Double_t sensorXDim = sensorPar->GetLx(); Double_t sensorYDim = sensorPar->GetLy(); Double_t sensorZDim = sensorPar->GetD(); Double_t sensorDX = sensorPar->GetDx(); Double_t sensorDY = sensorPar->GetDy(); Double_t sensorStereoF = sensorPar->GetStereoF(); Double_t sensorStereoB = sensorPar->GetStereoB(); TString sensorName = Form("sensor%d",iStation); cout<<" SENSOR NAME ========== "<Add(station); fStationMap[statNr] = station; } station->AddSector(sector); } sector->AddSensor(sensor); // put sensor into name/sensor map map < TString, CbmStsSensor*>::iterator p; p=fSensorByName.find(sensorName); if(p!=fSensorByName.end()){ cout << " -E- Sensor \"" << sensorName.Data() << "\" is already inserted " << endl; }else{ fSensorByName.insert(pair (sensorName, sensor)); } } // Loop over sensors fNSensors += sector->GetNSensors(); } // Loop over sectors fNSectors += station->GetNSectors(); fNChannels += station->GetNChannels(); } // Loop over stations return kTRUE; } // ------------------------------------------------------------------------- // ----- Public method Clear ------------------------------------------- void CbmStsDigiScheme::Clear() { fStations->Delete(); fStationMap.clear(); fDetIdByName.clear(); fNSectors = fNSensors = fNChannels = fNStations = 0; } // ------------------------------------------------------------------------- // ----- Public method Reset ------------------------------------------- void CbmStsDigiScheme::Reset() { for (Int_t iStation=0; iStationGetEntries(); iStation++) GetStation(iStation)->Reset(); } // ------------------------------------------------------------------------- // ----- Public method GetStation -------------------------------------- CbmStsStation* CbmStsDigiScheme::GetStation(Int_t iStation) { if ( ! fStations ) return NULL; return dynamic_cast(fStations->At(iStation)); } // ------------------------------------------------------------------------- // ----- Public method GetStationByNr ---------------------------------- CbmStsStation* CbmStsDigiScheme::GetStationByNr(Int_t stationNr) { if ( ! fStations ) return NULL; if ( fStationMap.find(stationNr) == fStationMap.end() ) return NULL; return fStationMap[stationNr]; } // ------------------------------------------------------------------------- // ----- Public method GetSector --------------------------------------- CbmStsSector* CbmStsDigiScheme::GetSector(Int_t stationNr, Int_t sectorNr) { return ( GetStationByNr(stationNr)->GetSectorByNr(sectorNr) ); } // ------------------------------------------------------------------------- // ----- Public method GetSensor --------------------------------------- CbmStsSensor* CbmStsDigiScheme::GetSensor(Int_t stationNr, Int_t sectorNr, Int_t sensorNr) { return ( GetStationByNr(stationNr)->GetSectorByNr(sectorNr)->GetSensorByNr(sensorNr) ); } // ------------------------------------------------------------------------- // ----- Public method GetDetectorIdByName ------------------------------ Int_t CbmStsDigiScheme::GetDetectorIdByName(TString sensorName) { map < TString, Int_t>::iterator p; p=fDetIdByName.find(sensorName); if(p!=fDetIdByName.end()){ return p->second; }else{ cout << " -E- StsDigiScheme::GetDetectorIdByName \"" << sensorName.Data() << "\" not found " << endl; return -1; } } // ------------------------------------------------------------------------- // ----- Public method GetSensorIdByName -------------------------------- CbmStsSensor* CbmStsDigiScheme::GetSensorByName(TString sensorName) { map < TString, CbmStsSensor*>::iterator p; p=fSensorByName.find(sensorName); if(p!=fSensorByName.end()){ return p->second; }else{ cout << " -E- StsDigiScheme::GetDetectorIdByName \"" << sensorName.Data() << "\" not found " << endl; return 0; } } // ------------------------------------------------------------------------- // ----- Public method Print ------------------------------------------- void CbmStsDigiScheme::Print(Bool_t kLong) { cout << endl; cout << "=================== STS digitisation scheme =================" << endl; for (Int_t iStat=0; iStatPrint(kLong); } cout << "================================================================" << endl << endl; } // ------------------------------------------------------------------------- ClassImp(CbmStsDigiScheme)