Geant4 Cross Reference |
1 // 2 // ******************************************************************** 3 // * License and Disclaimer * 4 // * * 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. * 10 // * * 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitation of liability. * 17 // * * 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************************************** 25 // 26 // 27 //--------------------------------------------------------------------------- 28 // 29 // ClassName: G4FastSimulationPhysics 30 // 31 // Author: M. Verderi (Nov.03.2016) 32 // 33 //---------------------------------------------------------------------------- 34 // 35 // 36 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 37 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 38 39 #include "G4FastSimulationPhysics.hh" 40 41 #include "G4ParticleDefinition.hh" 42 #include "G4ProcessManager.hh" 43 44 #include "G4FastSimulationHelper.hh" 45 #include "G4FastSimulationManagerProcess.hh" 46 47 // factory 48 #include "G4PhysicsConstructorFactory.hh" 49 // 50 G4_DECLARE_PHYSCONSTR_FACTORY(G4FastSimulationPhysics); 51 52 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 53 54 G4FastSimulationPhysics::G4FastSimulationPhysics(const G4String& name) 55 : G4VPhysicsConstructor(name), 56 fVerbose(false) 57 {;} 58 59 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 60 61 G4FastSimulationPhysics::~G4FastSimulationPhysics() 62 {;} 63 64 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 65 66 void G4FastSimulationPhysics::ActivateFastSimulation(const G4String particleName, const G4String parallelGeometryName) 67 { 68 fParticlesUnderFastSimulation.push_back(particleName); 69 fGeometries .push_back(parallelGeometryName); 70 } 71 72 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 73 74 void G4FastSimulationPhysics::ConstructParticle() 75 {;} 76 77 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 78 79 void G4FastSimulationPhysics::ConstructProcess() 80 { 81 82 auto myParticleIterator = GetParticleIterator(); 83 myParticleIterator->reset(); 84 85 while ( (*myParticleIterator)() ) 86 { 87 G4ParticleDefinition* particle = myParticleIterator->value(); 88 G4String particleName = particle->GetParticleName(); 89 G4ProcessManager* pmanager = particle->GetProcessManager(); 90 91 // -- include fast simulation manager process interface: 92 auto itr = std::find( fParticlesUnderFastSimulation.begin(), 93 fParticlesUnderFastSimulation.end(), 94 particleName ); 95 96 if ( itr != fParticlesUnderFastSimulation.end() ) 97 { 98 std::size_t ipos = itr - fParticlesUnderFastSimulation.begin(); 99 const G4String& geometry = fGeometries[ipos]; 100 if ( geometry == "" ) G4FastSimulationHelper::ActivateFastSimulation(pmanager); 101 else G4FastSimulationHelper::ActivateFastSimulation(pmanager, geometry); 102 } 103 } 104 105 // -- tells what is done: 106 if ( fVerbose ) 107 { 108 // -- print: 109 myParticleIterator->reset(); 110 111 while ( (*myParticleIterator)() ) 112 { 113 G4ParticleDefinition* particle = myParticleIterator->value(); 114 G4String particleName = particle->GetParticleName(); 115 G4ProcessManager* pmanager = particle->GetProcessManager(); 116 117 G4bool isUnderFastSimulation(false); 118 G4String processAndGeometryNames; 119 120 G4ProcessVector* vprocess = pmanager->GetProcessList(); 121 for (G4int ip = 0 ; ip < (G4int)vprocess->size() ; ++ip) 122 { 123 G4VProcess* process = (*vprocess)[ip]; 124 G4FastSimulationManagerProcess* pb = dynamic_cast< G4FastSimulationManagerProcess* >(process); 125 if ( pb != nullptr ) 126 { 127 isUnderFastSimulation = true; 128 processAndGeometryNames += pb->GetProcessName(); 129 processAndGeometryNames += "[geom:"; 130 processAndGeometryNames += pb->GetWorldVolume()->GetName(); 131 processAndGeometryNames += "] "; 132 } 133 } 134 if ( isUnderFastSimulation ) G4cout << std::setw(14) << particleName << " : " << processAndGeometryNames << G4endl; 135 } 136 } 137 } 138