Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // 26 /// \file GB07/src/GB07BOptrLeadingParticle.cc 26 /// \file GB07/src/GB07BOptrLeadingParticle.cc 27 /// \brief Implementation of the GB07BOptrLead 27 /// \brief Implementation of the GB07BOptrLeadingParticle class 28 // 28 // 29 #include "GB07BOptrLeadingParticle.hh" 29 #include "GB07BOptrLeadingParticle.hh" >> 30 #include "G4BiasingProcessInterface.hh" 30 31 31 #include "G4BOptnLeadingParticle.hh" 32 #include "G4BOptnLeadingParticle.hh" 32 #include "G4BiasingProcessInterface.hh" << 33 #include "G4Electron.hh" << 34 #include "G4Gamma.hh" << 35 #include "G4ParticleDefinition.hh" 33 #include "G4ParticleDefinition.hh" 36 #include "G4PionZero.hh" << 34 #include "G4Gamma.hh" >> 35 #include "G4Electron.hh" 37 #include "G4Positron.hh" 36 #include "G4Positron.hh" >> 37 #include "G4PionZero.hh" 38 #include "G4ProcessManager.hh" 38 #include "G4ProcessManager.hh" 39 39 >> 40 40 //....oooOO0OOooo........oooOO0OOooo........oo 41 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 41 42 42 GB07BOptrLeadingParticle::GB07BOptrLeadingPart << 43 GB07BOptrLeadingParticle::GB07BOptrLeadingParticle( G4String operatorName ) 43 : G4VBiasingOperator(operatorName), << 44 : G4VBiasingOperator ( operatorName ), 44 fAnnihilation(nullptr), << 45 fAnnihilation ( nullptr ), 45 fConversion(nullptr), << 46 fConversion ( nullptr ), 46 fDecay(nullptr), << 47 fDecay ( nullptr ), 47 fTwoParticleProcess(nullptr) << 48 fTwoParticleProcess ( nullptr ) 48 { 49 { 49 fLeadingParticleBiasingOperation = new G4BOp << 50 fLeadingParticleBiasingOperation = >> 51 new G4BOptnLeadingParticle("LeadingParticleBiasingOperation"); 50 } 52 } 51 53 52 //....oooOO0OOooo........oooOO0OOooo........oo 54 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 53 55 54 GB07BOptrLeadingParticle::~GB07BOptrLeadingPar 56 GB07BOptrLeadingParticle::~GB07BOptrLeadingParticle() 55 { 57 { 56 delete fLeadingParticleBiasingOperation; 58 delete fLeadingParticleBiasingOperation; 57 } 59 } 58 60 59 //....oooOO0OOooo........oooOO0OOooo........oo 61 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 60 62 61 G4VBiasingOperation* GB07BOptrLeadingParticle: << 63 G4VBiasingOperation* 62 const G4Track*, const G4BiasingProcessInterf << 64 GB07BOptrLeadingParticle:: >> 65 ProposeFinalStateBiasingOperation(const G4Track*, >> 66 const G4BiasingProcessInterface* callingProcess) 63 { 67 { 64 // -- When the present method is called, w 68 // -- When the present method is called, we are at the process final state 65 // -- generation level. The process is given 69 // -- generation level. The process is given by the callingProcess argument, 66 // -- which, in our case, wrappes a physics 70 // -- which, in our case, wrappes a physics process, to control it. 67 // -- To bias the final state generation, 71 // -- To bias the final state generation, we return a biasing operation 68 // -- which is fLeadingParticleBiasingOperat 72 // -- which is fLeadingParticleBiasingOperation here. Before returning it, we 69 // -- configure it depending on if the proce 73 // -- configure it depending on if the process is a two-particle final state 70 // -- or if it is a many-particle final stat 74 // -- or if it is a many-particle final state process. For the two-particle 71 // -- final state, one track is the leading 75 // -- final state, one track is the leading and the other is alone in its category, 72 // -- so always surviving by default. We pla 76 // -- so always surviving by default. We play a Russian roulette on it to 73 // -- trim also these two-particles final st 77 // -- trim also these two-particles final states. 74 << 78 75 if (callingProcess == fTwoParticleProcess) { << 79 if ( callingProcess == fTwoParticleProcess ) 76 // -- secondary particle accompagnying the << 80 { 77 // -- killed with 2./3. probability (Russi << 81 // -- secondary particle accompagnying the leading one will be 78 fLeadingParticleBiasingOperation->SetFurth << 82 // -- killed with 2./3. probability (Russian roulette): 79 } << 83 fLeadingParticleBiasingOperation->SetFurtherKillingProbability( 2./3.); 80 else { << 84 } 81 // -- -1.0 means no effect : no further ki << 85 else 82 // -- particles accompanying the leading o << 86 { 83 fLeadingParticleBiasingOperation->SetFurth << 87 // -- -1.0 means no effect : no further killing is applied to secondary 84 } << 88 // -- particles accompanying the leading one. 85 << 89 fLeadingParticleBiasingOperation->SetFurtherKillingProbability( -1.0 ); >> 90 } >> 91 86 return fLeadingParticleBiasingOperation; 92 return fLeadingParticleBiasingOperation; 87 } 93 } 88 94 89 //....oooOO0OOooo........oooOO0OOooo........oo 95 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 90 96 91 void GB07BOptrLeadingParticle::StartRun() << 97 void >> 98 GB07BOptrLeadingParticle:: >> 99 StartRun() 92 { 100 { 93 // -- collect the two-particle final state p 101 // -- collect the two-particle final state processes: 94 fAnnihilation = nullptr; 102 fAnnihilation = nullptr; 95 fConversion = nullptr; << 103 fConversion = nullptr; 96 fDecay = nullptr; << 104 fDecay = nullptr; 97 << 105 98 // ---- collect e+ annihilation process: 106 // ---- collect e+ annihilation process: 99 auto positronProcesses = G4Positron::Definit 107 auto positronProcesses = G4Positron::Definition()->GetProcessManager()->GetProcessList(); 100 for (size_t i = 0; i < positronProcesses->si << 108 for ( size_t i = 0; i < positronProcesses->size(); ++i ) 101 if ((*positronProcesses)[i]->GetProcessNam << 109 { 102 fAnnihilation = (*positronProcesses)[i]; << 110 if ( (*positronProcesses)[i]->GetProcessName() == "biasWrapper(annihil)") 103 break; << 111 { >> 112 fAnnihilation = (*positronProcesses)[i]; >> 113 break; >> 114 } 104 } 115 } 105 } << 116 106 << 107 // ---- collect gamma conversion process: 117 // ---- collect gamma conversion process: 108 auto gammaProcesses = G4Gamma::Definition()- 118 auto gammaProcesses = G4Gamma::Definition()->GetProcessManager()->GetProcessList(); 109 for (size_t i = 0; i < gammaProcesses->size( << 119 for ( size_t i = 0; i < gammaProcesses->size(); ++i ) 110 if ((*gammaProcesses)[i]->GetProcessName() << 120 { 111 fConversion = (*gammaProcesses)[i]; << 121 if ( (*gammaProcesses)[i]->GetProcessName() == "biasWrapper(conv)") 112 break; << 122 { >> 123 fConversion = (*gammaProcesses)[i]; >> 124 break; >> 125 } 113 } 126 } 114 } << 127 115 << 116 // ---- collect pi0 decay process: 128 // ---- collect pi0 decay process: 117 auto pi0Processes = G4PionZero::Definition() 129 auto pi0Processes = G4PionZero::Definition()->GetProcessManager()->GetProcessList(); 118 for (size_t i = 0; i < pi0Processes->size(); << 130 for ( size_t i = 0; i < pi0Processes->size(); ++i ) 119 if ((*pi0Processes)[i]->GetProcessName() = << 131 { 120 fDecay = (*pi0Processes)[i]; << 132 if ( (*pi0Processes)[i]->GetProcessName() == "biasWrapper(Decay)") 121 break; << 133 { >> 134 fDecay = (*pi0Processes)[i]; >> 135 break; >> 136 } 122 } 137 } 123 } << 124 } 138 } 125 139 126 //....oooOO0OOooo........oooOO0OOooo........oo 140 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 127 141 128 void GB07BOptrLeadingParticle::StartTracking(c << 142 void >> 143 GB07BOptrLeadingParticle:: >> 144 StartTracking( const G4Track* track ) 129 { 145 { 130 // -- remember what is the two-particle fina 146 // -- remember what is the two-particle final state process -if any- for this starting 131 // -- track: 147 // -- track: 132 fTwoParticleProcess = nullptr; 148 fTwoParticleProcess = nullptr; 133 if (track->GetDefinition() == G4Gamma ::Defi << 149 if ( track->GetDefinition() == G4Gamma ::Definition() ) fTwoParticleProcess = fConversion; 134 if (track->GetDefinition() == G4Positron::De << 150 if ( track->GetDefinition() == G4Positron::Definition() ) fTwoParticleProcess = fAnnihilation; 135 if (track->GetDefinition() == G4PionZero::De << 151 if ( track->GetDefinition() == G4PionZero::Definition() ) fTwoParticleProcess = fDecay; 136 } 152 } 137 153