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 // 27 /// \file GB03BOptnSplitOrKillOnBoundary.cc 28 /// \brief Implementation of the GB03BOptnSpli 29 30 #include "GB03BOptnSplitOrKillOnBoundary.hh" 31 32 #include "Randomize.hh" 33 34 //....oooOO0OOooo........oooOO0OOooo........oo 35 36 GB03BOptnSplitOrKillOnBoundary::GB03BOptnSplit 37 : G4VBiasingOperation(name), fParticleChange 38 {} 39 40 //....oooOO0OOooo........oooOO0OOooo........oo 41 42 GB03BOptnSplitOrKillOnBoundary::~GB03BOptnSpli 43 44 //....oooOO0OOooo........oooOO0OOooo........oo 45 46 G4double GB03BOptnSplitOrKillOnBoundary::Dista 47 48 { 49 // -- return "infinite" distance for interac 50 // -- being called anyway at the end of the 51 // -- flag. 52 *condition = Forced; 53 return DBL_MAX; 54 } 55 56 //....oooOO0OOooo........oooOO0OOooo........oo 57 58 G4VParticleChange* GB03BOptnSplitOrKillOnBound 59 60 { 61 // Check if step is limited by the geometry: 62 // to the absorber layer, this volume bounda 63 // (check of current step # of track is inel 64 // that a cloned track can wrongly be seen i 65 // precision issue. In this case it makes a 66 if ((step->GetPostStepPoint()->GetStepStatus 67 && (track->GetCurrentStepNumber() != 1)) 68 { 69 // -- Before deciding for killing or split 70 // -- the technique or not: 71 G4double trial = G4UniformRand(); // -- N 72 // -- e 73 if (trial <= fApplyProbability) { 74 // -- Get z component of track, to see i 75 G4double pz = track->GetMomentum().z(); 76 77 if (pz > 0.0) { 78 // ----------------------------------- 79 // Here, we are moving "forward". We d 80 // ----------------------------------- 81 82 // Get track weight: 83 G4double initialWeight = track->GetWei 84 // Define the tracks weight: 85 G4double weightOfTrack = initialWeight 86 87 // The "particle change" is the object 88 // the tracking the update of the prim 89 // secondary tracks. 90 fParticleChange.Initialize(*track); 91 92 // ask currect track weight to be chan 93 fParticleChange.ProposeParentWeight(we 94 95 // Now make clones of this track (this 96 // we will then have the primary and N 97 // splitting by a factor N: 98 fParticleChange.SetNumberOfSecondaries 99 for (G4int iSplit = 1; iSplit < fSplit 100 G4Track* clone = new G4Track(*track) 101 clone->SetWeight(weightOfTrack); 102 fParticleChange.AddSecondary(clone); 103 } 104 fParticleChange.SetSecondaryWeightByPr 105 // -- take it as is ;) [though not nec 106 107 // this new final state is returned to 108 return &fParticleChange; 109 } 110 111 else { 112 // ----------------------------------- 113 // Here, we are moving backward. We do 114 // roulette, killing 1/fSplittingFacto 115 // ----------------------------------- 116 117 // Get track weight: 118 G4double initialWeight = track->GetWei 119 120 // The "particle change" is the object 121 // the tracking the update of the prim 122 // secondary tracks. 123 fParticleChange.Initialize(*track); 124 125 // Shoot a random number (in ]0,1[ seg 126 G4double random = G4UniformRand(); 127 128 // Decide to kill, keeping 1/fSplittin 129 G4double survivingProbability = 1.0 / 130 if (random > survivingProbability) { 131 // We ask for the the track to be ki 132 fParticleChange.ProposeTrackStatus(f 133 } 134 else { 135 // In this case, the track survives. 136 // to conserve weight among killed a 137 fParticleChange.ProposeParentWeight( 138 } 139 140 // this new final state is returned to 141 return &fParticleChange; 142 } 143 } // -- end of : if ( trial > probaForApp 144 } // -- end of : if ( ( step->GetPostStepPo 145 // 146 147 // Here, the step was not limited by the geo 148 // process). We do nothing: ie we make no ch 149 fParticleChangeForNothing.Initialize(*track) 150 return &fParticleChangeForNothing; 151 } 152 153 //....oooOO0OOooo........oooOO0OOooo........oo 154