StatusCode GeantFastSimConfig::getOtherSettings() { // Create the envelopes for the geometry, attach fast sim models for Tracker, EMCal, HCal G4LogicalVolume* world = (*G4TransportationManager::GetTransportationManager()->GetWorldsIterator())->GetLogicalVolume(); for(int iter_region = 0; iter_region<world->GetNoDaughters(); ++iter_region) { // TO DO: proper integration with DD4hep to resolve where to attach a fast sim model if(world->GetDaughter(iter_region)->GetName().find("Tracker") != std::string::npos) { /// deleted by the G4RegionStore m_g4regions.emplace_back(new G4Region(world->GetDaughter(iter_region)->GetLogicalVolume()->GetName()+"_fastsim")); m_g4regions.back()->AddRootLogicalVolume(world->GetDaughter(iter_region)->GetLogicalVolume()); m_models.emplace_back(new FastSimModelTracker(m_g4regions.back()->GetName(),m_g4regions.back(),m_smearToolName)); info()<<"Attaching a Fast Simulation Model to the region "<<m_g4regions.back()->GetName()<<endmsg; } } return StatusCode::SUCCESS; }
StatusCode SimG4UserLimitRegion::create() { G4LogicalVolume* world = (*G4TransportationManager::GetTransportationManager()->GetWorldsIterator())->GetLogicalVolume(); // Support two usecases: // (a) if user specifies world, set limits for everything if (std::find(m_volumeNames.begin(), m_volumeNames.end(), "world") != m_volumeNames.end()) { m_userLimits.emplace_back(new G4UserLimits(m_maxStep / Gaudi::Units::mm * CLHEP::mm, m_maxTrack / Gaudi::Units::mm * CLHEP::mm, m_maxTime / Gaudi::Units::s * CLHEP::s, m_minKineticEnergy / Gaudi::Units::MeV * CLHEP::MeV, m_minRange / Gaudi::Units::mm * CLHEP::mm)); world->SetUserLimits(m_userLimits.back().get()); info() << "Creating user limits for world" << endmsg; // (b) if individiual volumenames are specified, try to find them and set limits for them. } else { for (const auto& volumeName : m_volumeNames) { for (int iter_region = 0; iter_region < world->GetNoDaughters(); ++iter_region) { if (world->GetDaughter(iter_region)->GetName().find(volumeName) != std::string::npos) { /// all G4Region objects are deleted by the G4RegionStore m_g4regions.emplace_back( new G4Region(world->GetDaughter(iter_region)->GetLogicalVolume()->GetName() + "_userLimits")); m_g4regions.back()->AddRootLogicalVolume(world->GetDaughter(iter_region)->GetLogicalVolume()); m_userLimits.emplace_back(new G4UserLimits(m_maxStep / Gaudi::Units::mm * CLHEP::mm, m_maxTrack / Gaudi::Units::mm * CLHEP::mm, m_maxTime / Gaudi::Units::s * CLHEP::s, m_minKineticEnergy / Gaudi::Units::MeV * CLHEP::MeV, m_minRange / Gaudi::Units::mm * CLHEP::mm)); m_g4regions.back()->SetUserLimits(m_userLimits.back().get()); info() << "Creating user limits in the region " << m_g4regions.back()->GetName() << endmsg; } } } if (m_g4regions.size() != m_volumeNames.size()) { error() << "Regions were not created for all the volumes" << endmsg; return StatusCode::FAILURE; } } return StatusCode::SUCCESS; }