Geant4 Cross Reference |
1 // 1 2 // ******************************************* 3 // * License and Disclaimer 4 // * 5 // * The Geant4 software is copyright of th 6 // * the Geant4 Collaboration. It is provided 7 // * conditions of the Geant4 Software License 8 // * LICENSE and available at http://cern.ch/ 9 // * include a list of copyright holders. 10 // * 11 // * Neither the authors of this software syst 12 // * institutes,nor the agencies providing fin 13 // * work make any representation or warran 14 // * regarding this software system or assum 15 // * use. Please see the license in the file 16 // * for the full disclaimer and the limitatio 17 // * 18 // * This code implementation is the result 19 // * technical work of the GEANT4 collaboratio 20 // * By using, copying, modifying or distri 21 // * any work based on the software) you ag 22 // * use in resulting scientific publicati 23 // * acceptance of all terms of the Geant4 Sof 24 // ******************************************* 25 // 26 // class G4GeometryMessenger implementation 27 // 28 // Author: G.Cosmo, CERN 29 // ------------------------------------------- 30 31 #include <iomanip> 32 33 #include "G4GeometryMessenger.hh" 34 35 #include "G4TransportationManager.hh" 36 #include "G4GeometryManager.hh" 37 #include "G4VPhysicalVolume.hh" 38 #include "G4Navigator.hh" 39 #include "G4PropagatorInField.hh" 40 41 #include "G4UIdirectory.hh" 42 #include "G4UIcommand.hh" 43 #include "G4UIcmdWithoutParameter.hh" 44 #include "G4UIcmdWithABool.hh" 45 #include "G4UIcmdWithAnInteger.hh" 46 #include "G4UIcmdWithADoubleAndUnit.hh" 47 48 #include "G4GeomTestVolume.hh" 49 50 // 51 // Constructor 52 // 53 G4GeometryMessenger::G4GeometryMessenger(G4Tra 54 : tmanager(tman) 55 { 56 geodir = new G4UIdirectory( "/geometry/" ); 57 geodir->SetGuidance( "Geometry control comma 58 59 // 60 // Geometry navigator commands 61 // 62 navdir = new G4UIdirectory( "/geometry/navig 63 navdir->SetGuidance( "Geometry navigator con 64 65 resCmd = new G4UIcmdWithoutParameter( "/geom 66 resCmd->SetGuidance( "Reset navigator and na 67 resCmd->SetGuidance( "NOTE: must be called o 68 resCmd->SetGuidance( " initialized once 69 resCmd->AvailableForStates(G4State_Idle); 70 71 verbCmd = new G4UIcmdWithAnInteger( "/geomet 72 verbCmd->SetGuidance( "Set run-time verbosit 73 verbCmd->SetGuidance(" 0 : Silent (default)" 74 verbCmd->SetGuidance(" 1 : Display volume po 75 verbCmd->SetGuidance(" 2 : Display step/safe 76 verbCmd->SetGuidance(" 3 : Display minimal s 77 verbCmd->SetGuidance(" 4 : Maximum verbosity 78 verbCmd->SetGuidance( "NOTE: this command ha 79 verbCmd->SetGuidance( " been installed 80 verbCmd->SetParameterName("level",true); 81 verbCmd->SetDefaultValue(0); 82 verbCmd->SetRange("level >=0 && level <=4"); 83 84 chkCmd = new G4UIcmdWithABool( "/geometry/na 85 chkCmd->SetGuidance( "Set navigator in -chec 86 chkCmd->SetGuidance( "This will cause extra 87 chkCmd->SetGuidance( "navigation. More stric 88 chkCmd->SetGuidance( "are applied. A run-tim 89 chkCmd->SetGuidance( "observed when the -che 90 chkCmd->SetGuidance( "NOTE: this command has 91 chkCmd->SetGuidance( " been installed w 92 chkCmd->SetParameterName("checkFlag",true); 93 chkCmd->SetDefaultValue(false); 94 chkCmd->AvailableForStates(G4State_Idle); 95 96 pchkCmd = new G4UIcmdWithABool( "/geometry/n 97 pchkCmd->SetGuidance( "Set navigator verbosi 98 pchkCmd->SetGuidance( "This allows one to di 99 pchkCmd->SetGuidance( "navigation, when trac 100 pchkCmd->SetGuidance( "one artificial push a 101 pchkCmd->SetGuidance( "navigator. Notificati 102 pchkCmd->SetGuidance( "NOTE: this command ha 103 pchkCmd->SetGuidance( " been installed 104 pchkCmd->SetParameterName("pushFlag",true); 105 pchkCmd->SetDefaultValue(true); 106 pchkCmd->AvailableForStates(G4State_Idle); 107 108 // 109 // Geometry verification test commands 110 // 111 testdir = new G4UIdirectory( "/geometry/test 112 testdir->SetGuidance( "Geometry verification 113 testdir->SetGuidance( "Helps in detecting po 114 115 tolCmd = new G4UIcmdWithADoubleAndUnit( "/ge 116 tolCmd->SetGuidance( "Define tolerance (in m 117 tolCmd->SetGuidance( "should be reported. By 118 tolCmd->SetGuidance( "reported, i.e. toleran 119 tolCmd->SetParameterName( "Tolerance", true, 120 tolCmd->SetDefaultValue( 0 ); 121 tolCmd->SetDefaultUnit( "mm" ); 122 tolCmd->SetUnitCategory( "Length" ); 123 124 verCmd = new G4UIcmdWithABool( "/geometry/te 125 verCmd->SetGuidance( "Specify if running in 126 verCmd->SetGuidance( "By default verbosity i 127 verCmd->SetParameterName("verbosity",true); 128 verCmd->SetDefaultValue(true); 129 verCmd->AvailableForStates(G4State_Idle); 130 131 rslCmd = new G4UIcmdWithAnInteger( "/geometr 132 rslCmd->SetGuidance( "Set the number of poin 133 rslCmd->SetGuidance( "checking overlaps." ); 134 rslCmd->SetParameterName("resolution",true); 135 rslCmd->SetDefaultValue(10000); 136 137 rcsCmd = new G4UIcmdWithAnInteger( "/geometr 138 rcsCmd->SetGuidance( "Set the initial level 139 rcsCmd->SetGuidance( "recursive_test will th 140 rcsCmd->SetParameterName("initial_level",tru 141 rcsCmd->SetDefaultValue(0); 142 143 rcdCmd = new G4UIcmdWithAnInteger( "/geometr 144 rcdCmd->SetGuidance( "Set the depth in the g 145 rcdCmd->SetGuidance( "recursive_test will th 146 rcdCmd->SetGuidance( "By default, recursion 147 rcdCmd->SetParameterName("recursion_depth",t 148 rcdCmd->SetDefaultValue(-1); 149 150 errCmd = new G4UIcmdWithAnInteger( "/geometr 151 errCmd->SetGuidance( "Set the maximum number 152 errCmd->SetGuidance( "for each single volume 153 errCmd->SetGuidance( "Once reached the maxim 154 errCmd->SetGuidance( "affecting that volume 155 errCmd->SetParameterName("maximum_errors",tr 156 errCmd->SetDefaultValue(1); 157 158 parCmd = new G4UIcmdWithABool( "/geometry/te 159 parCmd->SetGuidance( "Check for overlaps in 160 parCmd->SetGuidance( "By default, overlaps a 161 parCmd->SetParameterName("check_parallel",tr 162 parCmd->SetDefaultValue(true); 163 164 recCmd = new G4UIcmdWithoutParameter( "/geom 165 recCmd->SetGuidance( "Start running the recu 166 recCmd->SetGuidance( "Volumes are recursivel 167 recCmd->SetGuidance( "for points generated o 168 recCmd->SetGuidance( "respective mother volu 169 recCmd->SetGuidance( "level, performing for 170 recCmd->SetGuidance( "daughters, etc." ); 171 recCmd->SetGuidance( "NOTE: it may take a ve 172 recCmd->SetGuidance( " depending on the 173 recCmd->AvailableForStates(G4State_Idle); 174 } 175 176 // 177 // Destructor 178 // 179 G4GeometryMessenger::~G4GeometryMessenger() 180 { 181 delete verCmd; delete recCmd; delete rslCmd; 182 delete resCmd; delete rcsCmd; delete rcdCmd; 183 delete errCmd; delete parCmd; delete tolCmd; 184 delete verbCmd; delete pchkCmd; delete chkCm 185 delete geodir; delete navdir; delete testdir 186 for(auto* tvolume: tvolumes) { 187 delete tvolume; 188 } 189 } 190 191 // 192 // Init 193 // 194 void 195 G4GeometryMessenger::Init() 196 { 197 // Create checker... 198 // 199 if (tvolumes.empty()) 200 { 201 // Get all world volumes 202 // 203 const auto noWorlds = tmanager->GetNoWorld 204 const auto fWorld = tmanager->GetWorldsIte 205 for(size_t i=0;i<noWorlds;++i) 206 { 207 // Test the actual detector... 208 // 209 tvolumes.push_back(new G4GeomTestVolum 210 } 211 } 212 } 213 214 // 215 // SetNewValue 216 // 217 void 218 G4GeometryMessenger::SetNewValue( G4UIcommand* 219 { 220 if (command == resCmd) { 221 ResetNavigator(); 222 } 223 else if (command == verbCmd) { 224 SetVerbosity( newValues ); 225 } 226 else if (command == chkCmd) { 227 SetCheckMode( newValues ); 228 } 229 else if (command == pchkCmd) { 230 SetPushFlag( newValues ); 231 } 232 else if (command == tolCmd) { 233 Init(); 234 tol = tolCmd->GetNewDoubleValue( newValues 235 * tolCmd->GetNewUnitValue( newValues ) 236 for(auto* tvolume: tvolumes) 237 { 238 tvolume->SetTolerance(tol); 239 } 240 } 241 else if (command == verCmd) { 242 Init(); 243 for(auto* tvolume: tvolumes) 244 { 245 tvolume->SetVerbosity(verCmd->GetNewBool 246 } 247 } 248 else if (command == rslCmd) { 249 Init(); 250 for(auto* tvolume: tvolumes) 251 { 252 tvolume->SetResolution(rslCmd->GetNewInt 253 } 254 } 255 else if (command == rcsCmd) { 256 recLevel = rcsCmd->GetNewIntValue( newValu 257 } 258 else if (command == rcdCmd) { 259 recDepth = rcdCmd->GetNewIntValue( newValu 260 } 261 else if (command == parCmd) { 262 checkParallelWorlds = parCmd->GetNewBoolVa 263 } 264 else if (command == errCmd) { 265 Init(); 266 for(auto* tvolume: tvolumes) 267 { 268 tvolume->SetErrorsThreshold(errCmd->GetN 269 } 270 } 271 else if (command == recCmd) { 272 Init(); 273 G4cout << "Running geometry overlaps check 274 RecursiveOverlapTest(); 275 G4cout << "Geometry overlaps check complet 276 } 277 } 278 279 // 280 // GetCurrentValue 281 // 282 G4String 283 G4GeometryMessenger::GetCurrentValue( G4UIcomm 284 { 285 G4String cv = ""; 286 if (command == tolCmd) 287 { 288 cv = tolCmd->ConvertToString( tol, "mm" ); 289 } 290 return cv; 291 } 292 293 // 294 // CheckGeometry 295 // 296 void 297 G4GeometryMessenger::CheckGeometry() 298 { 299 // Verify that the geometry is closed 300 // 301 G4GeometryManager* geomManager = G4GeometryM 302 if (!geomManager->IsGeometryClosed()) 303 { 304 geomManager->OpenGeometry(); 305 geomManager->CloseGeometry(true); 306 } 307 } 308 309 // 310 // ResetNavigator 311 // 312 void 313 G4GeometryMessenger::ResetNavigator() 314 { 315 // Close geometry and reset optimisation if 316 // 317 CheckGeometry(); 318 319 // Reset navigator's state 320 // 321 G4ThreeVector pt(0,0,0); 322 G4Navigator* navigator = tmanager->GetNaviga 323 navigator->LocateGlobalPointAndSetup(pt,null 324 } 325 326 // 327 // Set navigator verbosity 328 // 329 void 330 G4GeometryMessenger::SetVerbosity(const G4Stri 331 { 332 G4int level = verbCmd->GetNewIntValue(input) 333 G4Navigator* navigator = tmanager->GetNaviga 334 navigator->SetVerboseLevel(level); 335 } 336 337 // 338 // Set navigator mode 339 // 340 void 341 G4GeometryMessenger::SetCheckMode(const G4Stri 342 { 343 G4bool mode = chkCmd->GetNewBoolValue(input) 344 G4Navigator* navigator = tmanager->GetNaviga 345 navigator->CheckMode(mode); 346 G4PropagatorInField* pField = tmanager->GetP 347 if (pField != nullptr) { pField->CheckMode( 348 } 349 350 // 351 // Set navigator verbosity for push notificati 352 // 353 void 354 G4GeometryMessenger::SetPushFlag(const G4Strin 355 { 356 G4bool mode = pchkCmd->GetNewBoolValue(input 357 G4Navigator* navigator = tmanager->GetNaviga 358 navigator->SetPushVerbosity(mode); 359 } 360 361 // 362 // Recursive Overlap Test 363 // 364 void 365 G4GeometryMessenger::RecursiveOverlapTest() 366 { 367 // Close geometry if necessary 368 // 369 CheckGeometry(); 370 371 // Make test on single line supplied by user 372 // 373 if (checkParallelWorlds) 374 { 375 for(auto* tvolume: tvolumes) 376 { 377 tvolume->TestRecursiveOverlap( recLevel, 378 } 379 } 380 else 381 { 382 tvolumes.front()->TestRecursiveOverlap( re 383 } 384 } 385