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 // G4BiasingHelper 27 // ------------------------------------------- 28 #include "G4BiasingHelper.hh" 29 30 #include "G4ProcessManager.hh" 31 #include "G4BiasingProcessInterface.hh" 32 #include "G4ParallelGeometriesLimiterProcess.h 33 34 G4bool G4BiasingHelper::ActivatePhysicsBiasing 35 const G4String& physicsProces 36 const G4String& wrappedName) 37 { 38 G4VProcess* physicsProcess(0); 39 40 G4ProcessVector* vprocess = pmanager->GetPro 41 for (auto ip = 0 ; ip < (G4int)vprocess->siz 42 { 43 if ( (*vprocess)[ip]->GetProcessName() == 44 { 45 physicsProcess = (*vprocess)[ip]; 46 break; 47 } 48 } 49 50 // -- process not found, return "false" to t 51 if ( physicsProcess == nullptr ) return fals 52 53 // -- process is not a physics one, return " 54 G4int processType = physicsProcess->GetProce 55 if ( ( processType != 2 ) && // EM 56 ( processType != 3 ) && // Optical 57 ( processType != 4 ) && // Hadronic 58 ( processType != 6 ) ) // Decay 59 return false; 60 61 // -- prevent wrapper of wrapper... 62 if ( dynamic_cast< G4BiasingProcessInterface 63 return false; 64 65 // -- remember process indeces: 66 G4int atRestIndex = pmanager->GetProcessOrde 67 G4int alongStepIndex = pmanager->GetProcessO 68 G4int postStepIndex = pmanager->GetProcessOr 69 70 // -- now remove the physic process, that wi 71 G4VProcess* removed = pmanager->RemoveProces 72 if ( removed != physicsProcess ) 73 { 74 G4ExceptionDescription ed; 75 ed << "Internal inconsistency in processes 76 G4Exception("G4BiasingHelper::ActivatePhys 77 "BIAS.GEN.01", FatalException, 78 } 79 80 G4BiasingProcessInterface* biasingWrapper = 81 new G4BiasingProcessInterface( physicsProc 82 atRestIndex 83 alongStepIn 84 postStepInd 85 wrappedName 86 87 if ( alongStepIndex == -1 ) alongStepIndex = 88 89 pmanager->AddProcess( biasingWrapper, atRest 90 91 return true; 92 } 93 94 void G4BiasingHelper::ActivateNonPhysicsBiasin 95 const G4S 96 { 97 G4BiasingProcessInterface* biasingNonPhys(nu 98 if ( nonPhysicsProcessName == "" ) 99 biasingNonPhys = new G4BiasingProcessInter 100 else 101 biasingNonPhys = new G4BiasingProcessInter 102 103 pmanager->AddProcess( biasingNonPhys, ordInA 104 } 105 106 G4ParallelGeometriesLimiterProcess* 107 G4BiasingHelper::AddLimiterProcess(G4ProcessMa 108 const G4Str 109 { 110 G4ParallelGeometriesLimiterProcess* toReturn 111 112 G4ProcessVector* processList = pmanager->Get 113 G4bool noInstance = true; 114 for (auto i = 0 ; i < (G4int)processList->si 115 { 116 G4VProcess* process = (*processList)[i]; 117 if ( dynamic_cast< G4ParallelGeometriesLim 118 { 119 noInstance = false; 120 121 G4ExceptionDescription ed; 122 ed << "Trying to re-add a G4ParallelGeom 123 << "to the process manager for '" 124 << pmanager->GetParticleType()->GetPa 125 << " (PDG : " << pmanager->GetParticl 126 << " while one is already present." < 127 G4Exception("G4BiasingHelper::AddBiasing 128 "BIAS.GEN.28", JustWarning, 129 break; 130 } 131 } 132 133 if ( noInstance ) 134 { 135 G4ParallelGeometriesLimiterProcess* biasin 136 pmanager->AddProcess ( bias 137 pmanager->SetProcessOrderingToSecond( bias 138 pmanager->SetProcessOrderingToLast ( bias 139 140 toReturn = biasingLimiter; 141 } 142 143 return toReturn; 144 } 145