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 /// \file GB07/src/GB07BOptrLeadingParticle.cc 27 /// \brief Implementation of the GB07BOptrLeadingParticle class 28 // 29 #include "GB07BOptrLeadingParticle.hh" 30 31 #include "G4BOptnLeadingParticle.hh" 32 #include "G4BiasingProcessInterface.hh" 33 #include "G4Electron.hh" 34 #include "G4Gamma.hh" 35 #include "G4ParticleDefinition.hh" 36 #include "G4PionZero.hh" 37 #include "G4Positron.hh" 38 #include "G4ProcessManager.hh" 39 40 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 41 42 GB07BOptrLeadingParticle::GB07BOptrLeadingParticle(G4String operatorName) 43 : G4VBiasingOperator(operatorName), 44 fAnnihilation(nullptr), 45 fConversion(nullptr), 46 fDecay(nullptr), 47 fTwoParticleProcess(nullptr) 48 { 49 fLeadingParticleBiasingOperation = new G4BOptnLeadingParticle("LeadingParticleBiasingOperation"); 50 } 51 52 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 53 54 GB07BOptrLeadingParticle::~GB07BOptrLeadingParticle() 55 { 56 delete fLeadingParticleBiasingOperation; 57 } 58 59 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 60 61 G4VBiasingOperation* GB07BOptrLeadingParticle::ProposeFinalStateBiasingOperation( 62 const G4Track*, const G4BiasingProcessInterface* callingProcess) 63 { 64 // -- When the present method is called, we are at the process final state 65 // -- generation level. The process is given by the callingProcess argument, 66 // -- which, in our case, wrappes a physics process, to control it. 67 // -- To bias the final state generation, we return a biasing operation 68 // -- which is fLeadingParticleBiasingOperation here. Before returning it, we 69 // -- configure it depending on if the process is a two-particle final state 70 // -- or if it is a many-particle final state process. For the two-particle 71 // -- final state, one track is the leading and the other is alone in its category, 72 // -- so always surviving by default. We play a Russian roulette on it to 73 // -- trim also these two-particles final states. 74 75 if (callingProcess == fTwoParticleProcess) { 76 // -- secondary particle accompagnying the leading one will be 77 // -- killed with 2./3. probability (Russian roulette): 78 fLeadingParticleBiasingOperation->SetFurtherKillingProbability(2. / 3.); 79 } 80 else { 81 // -- -1.0 means no effect : no further killing is applied to secondary 82 // -- particles accompanying the leading one. 83 fLeadingParticleBiasingOperation->SetFurtherKillingProbability(-1.0); 84 } 85 86 return fLeadingParticleBiasingOperation; 87 } 88 89 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 90 91 void GB07BOptrLeadingParticle::StartRun() 92 { 93 // -- collect the two-particle final state processes: 94 fAnnihilation = nullptr; 95 fConversion = nullptr; 96 fDecay = nullptr; 97 98 // ---- collect e+ annihilation process: 99 auto positronProcesses = G4Positron::Definition()->GetProcessManager()->GetProcessList(); 100 for (size_t i = 0; i < positronProcesses->size(); ++i) { 101 if ((*positronProcesses)[i]->GetProcessName() == "biasWrapper(annihil)") { 102 fAnnihilation = (*positronProcesses)[i]; 103 break; 104 } 105 } 106 107 // ---- collect gamma conversion process: 108 auto gammaProcesses = G4Gamma::Definition()->GetProcessManager()->GetProcessList(); 109 for (size_t i = 0; i < gammaProcesses->size(); ++i) { 110 if ((*gammaProcesses)[i]->GetProcessName() == "biasWrapper(conv)") { 111 fConversion = (*gammaProcesses)[i]; 112 break; 113 } 114 } 115 116 // ---- collect pi0 decay process: 117 auto pi0Processes = G4PionZero::Definition()->GetProcessManager()->GetProcessList(); 118 for (size_t i = 0; i < pi0Processes->size(); ++i) { 119 if ((*pi0Processes)[i]->GetProcessName() == "biasWrapper(Decay)") { 120 fDecay = (*pi0Processes)[i]; 121 break; 122 } 123 } 124 } 125 126 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 127 128 void GB07BOptrLeadingParticle::StartTracking(const G4Track* track) 129 { 130 // -- remember what is the two-particle final state process -if any- for this starting 131 // -- track: 132 fTwoParticleProcess = nullptr; 133 if (track->GetDefinition() == G4Gamma ::Definition()) fTwoParticleProcess = fConversion; 134 if (track->GetDefinition() == G4Positron::Definition()) fTwoParticleProcess = fAnnihilation; 135 if (track->GetDefinition() == G4PionZero::Definition()) fTwoParticleProcess = fDecay; 136 } 137