コード例 #1
0
ファイル: GeantFastSimConfig.cpp プロジェクト: ocolegro/FCCSW
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;
}
コード例 #2
0
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;
}