44 std::vector<G4VPhysicalVolume*> pv_to_remove;
45 for (
unsigned int i=0;i<v->GetNoDaughters();++i){
46 G4VPhysicalVolume * n_v = v->GetDaughter(i);
47 if ( n_v->GetName() ==
"LArMgr::LAr::EMEC::Pos::InnerWheel" ||
48 n_v->GetName() ==
"LArMgr::LAr::EMEC::Neg::InnerWheel" ||
49 n_v->GetName() ==
"LArMgr::LAr::EMEC::Pos::OuterWheel" ||
50 n_v->GetName() ==
"LArMgr::LAr::EMEC::Neg::OuterWheel" ){
52 pv_to_remove.push_back(n_v);
58 for (
unsigned int j=0;j<pv_to_remove.size();++j){
59 v->RemoveDaughter( pv_to_remove[j] );
65 G4VPhysicalVolume* W =
66 G4TransportationManager::GetTransportationManager()->
67 GetNavigatorForTracking()->GetWorldVolume();
74 G4LogicalVolumeStore *lvs = G4LogicalVolumeStore::GetInstance();
75 for (
unsigned int i=0;i<lvs->size();++i){
76 for (
unsigned int j=0;j<(*lvs)[i]->GetNoDaughters();++j){
77 if ( (*lvs)[i]->GetDaughter(j)->GetName().c_str()==
m_config.targetVolume ){
81 G4NistManager* nist = G4NistManager::Instance();
82 G4Material* world_mat = nist->FindOrBuildMaterial(
"G4_AIR");
83 G4VSolid* vBox = W->GetLogicalVolume()->GetSolid();
84 G4LogicalVolume* logicWorld =
new G4LogicalVolume(vBox,world_mat,
"World");
85 W =
new G4PVPlacement(0,G4ThreeVector(),logicWorld,
"World",0,
false,0,
false);
86 new G4PVPlacement(0,G4ThreeVector(),(*lvs)[i]->GetDaughter(j)->GetLogicalVolume(),
m_config.targetVolume,logicWorld,
false,0,
false);
94 ATH_MSG_FATAL(
"Did not find the volume named " <<
m_config.targetVolume <<
". Please set parameter TargetVolume to one of:\n\n");
96 for (
unsigned int i = 0; i < lvs->size(); ++i) {
97 for (
unsigned int j = 0; j < (*lvs)[i]->GetNoDaughters(); ++j) {
101 ATH_MSG_FATAL(
"\n\n ================= E N D O F L I S T ========================\n\n");
115 parser.SetRegionExport(
m_config.dumpPhysicsRegions);
116 parser.Write(
m_config.path, W,
true);
123 ATH_MSG_INFO(
"Overlap check: there were problems with the geometry.");
140 bool somethingOverlapped =
false;
142 if (hasOverlaps &&
m_config.verbose)
ATH_MSG_ERROR(
"Volume " << topPV->GetName() <<
" has overlaps.");
143 somethingOverlapped |= hasOverlaps;
147 std::multimap<G4LogicalVolume *, G4VPhysicalVolume *> lv2pvMap;
148 G4LogicalVolume *lv = topPV->GetLogicalVolume();
149 unsigned int nDaughters = lv->GetNoDaughters();
150 for (
unsigned int i = 0; i < nDaughters; ++i) {
151 G4VPhysicalVolume *daughterPV = lv->GetDaughter(i);
152 G4LogicalVolume *daughterLV = daughterPV->GetLogicalVolume();
153 lv2pvMap.insert(std::pair<G4LogicalVolume *, G4VPhysicalVolume *>(daughterLV, daughterPV));
156 for (std::multimap<G4LogicalVolume *, G4VPhysicalVolume *>::iterator mapEl = lv2pvMap.begin(); mapEl != lv2pvMap.end(); ) {
160 G4VPhysicalVolume *daughterPV = mapEl->second;
162 somethingOverlapped |= hasOverlaps;
163 if (hasOverlaps &&
m_config.verbose)
ATH_MSG_ERROR(
"Volume " << daughterPV->GetName() <<
" has overlaps.");
167 std::pair <std::multimap<G4LogicalVolume *, G4VPhysicalVolume *>::iterator,
168 std::multimap<G4LogicalVolume *, G4VPhysicalVolume *>::iterator> range = lv2pvMap.equal_range(mapEl->first);
175 int n = std::distance(range.first, range.second);
176 int checkEveryNth = int(n /
m_config.targetMaxCopiesToCheck + 0.5);
177 if (checkEveryNth <= 0) checkEveryNth = 1;
178 for (
int i = 1; i < n; ++i) {
179 if (i % checkEveryNth == 0) {
181 somethingOverlapped |= hasOverlaps;
182 if (hasOverlaps &&
m_config.verbose)
ATH_MSG_ERROR(
"Volume " << mapEl->second->GetLogicalVolume()->GetName() <<
" has overlaps.");
187 return somethingOverlapped;
191 std::stringstream sstr{};
192 const G4ThreeVector trans = pv->GetFrameTranslation();
193 const G4RotationMatrix* rot = pv->GetFrameRotation();
195 sstr<<
"Volume: "<<pv->GetName()<<
", location: "<<
Amg::toString(trans, 2)<<
", ";
202 G4LogicalVolume* log = pv->GetLogicalVolume();
203 for (
size_t d= 0; d <log->GetNoDaughters(); ++d){
204 sstr<<childDelim<<(d+1)<<
": "<<
printVolume(log->GetDaughter(d),