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 // G4BiasingHelper 27 // -------------------------------------------------------------------- 28 #include "G4BiasingHelper.hh" 29 30 #include "G4ProcessManager.hh" 31 #include "G4BiasingProcessInterface.hh" 32 #include "G4ParallelGeometriesLimiterProcess.hh" 33 34 G4bool G4BiasingHelper::ActivatePhysicsBiasing(G4ProcessManager* pmanager, 35 const G4String& physicsProcessToBias, 36 const G4String& wrappedName) 37 { 38 G4VProcess* physicsProcess(0); 39 40 G4ProcessVector* vprocess = pmanager->GetProcessList(); 41 for (auto ip = 0 ; ip < (G4int)vprocess->size() ; ++ip) 42 { 43 if ( (*vprocess)[ip]->GetProcessName() == physicsProcessToBias ) 44 { 45 physicsProcess = (*vprocess)[ip]; 46 break; 47 } 48 } 49 50 // -- process not found, return "false" to tell about failure 51 if ( physicsProcess == nullptr ) return false; 52 53 // -- process is not a physics one, return "false" to tell about failure 54 G4int processType = physicsProcess->GetProcessType(); 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* >( physicsProcess ) ) 63 return false; 64 65 // -- remember process indeces: 66 G4int atRestIndex = pmanager->GetProcessOrdering(physicsProcess, idxAtRest); 67 G4int alongStepIndex = pmanager->GetProcessOrdering(physicsProcess, idxAlongStep); 68 G4int postStepIndex = pmanager->GetProcessOrdering(physicsProcess, idxPostStep); 69 70 // -- now remove the physic process, that will be replaced by a wrapped version: 71 G4VProcess* removed = pmanager->RemoveProcess(physicsProcess); 72 if ( removed != physicsProcess ) 73 { 74 G4ExceptionDescription ed; 75 ed << "Internal inconsistency in processes handling. Please report !" << G4endl; 76 G4Exception("G4BiasingHelper::ActivatePhysicsBiasing(...)", 77 "BIAS.GEN.01", FatalException, ed); 78 } 79 80 G4BiasingProcessInterface* biasingWrapper = 81 new G4BiasingProcessInterface( physicsProcess, 82 atRestIndex != ordInActive, 83 alongStepIndex != ordInActive, 84 postStepIndex != ordInActive, 85 wrappedName ); 86 87 if ( alongStepIndex == -1 ) alongStepIndex = ordDefault; 88 89 pmanager->AddProcess( biasingWrapper, atRestIndex, alongStepIndex, postStepIndex); 90 91 return true; 92 } 93 94 void G4BiasingHelper::ActivateNonPhysicsBiasing(G4ProcessManager* pmanager, 95 const G4String& nonPhysicsProcessName ) 96 { 97 G4BiasingProcessInterface* biasingNonPhys(nullptr); 98 if ( nonPhysicsProcessName == "" ) 99 biasingNonPhys = new G4BiasingProcessInterface(); 100 else 101 biasingNonPhys = new G4BiasingProcessInterface(nonPhysicsProcessName ); 102 103 pmanager->AddProcess( biasingNonPhys, ordInActive, ordInActive, ordDefault); 104 } 105 106 G4ParallelGeometriesLimiterProcess* 107 G4BiasingHelper::AddLimiterProcess(G4ProcessManager* pmanager, 108 const G4String& processName) 109 { 110 G4ParallelGeometriesLimiterProcess* toReturn = nullptr; 111 112 G4ProcessVector* processList = pmanager->GetProcessList(); 113 G4bool noInstance = true; 114 for (auto i = 0 ; i < (G4int)processList->size() ; ++i) 115 { 116 G4VProcess* process = (*processList)[i]; 117 if ( dynamic_cast< G4ParallelGeometriesLimiterProcess* >( process ) ) 118 { 119 noInstance = false; 120 121 G4ExceptionDescription ed; 122 ed << "Trying to re-add a G4ParallelGeometriesLimiterProcess process \n" 123 << "to the process manager for '" 124 << pmanager->GetParticleType()->GetParticleName() 125 << " (PDG : " << pmanager->GetParticleType()->GetPDGEncoding() << " )" 126 << " while one is already present." << G4endl; 127 G4Exception("G4BiasingHelper::AddBiasingProcessLimiter()", 128 "BIAS.GEN.28", JustWarning, ed, "Call ignored."); 129 break; 130 } 131 } 132 133 if ( noInstance ) 134 { 135 G4ParallelGeometriesLimiterProcess* biasingLimiter = new G4ParallelGeometriesLimiterProcess(processName); 136 pmanager->AddProcess ( biasingLimiter ); 137 pmanager->SetProcessOrderingToSecond( biasingLimiter, idxAlongStep ); 138 pmanager->SetProcessOrderingToLast ( biasingLimiter, idxPostStep ); 139 140 toReturn = biasingLimiter; 141 } 142 143 return toReturn; 144 } 145