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 // ------------------------------------------- 28 // 29 // GEANT4 Class file 30 // 31 // 32 // File name: G4DynamicParticleMSC 33 // 34 // Author: Vladimir Ivanchenko 35 // 36 // Creation date: 17.08.2024 37 // 38 // ------------------------------------------- 39 // 40 //....oooOO0OOooo........oooOO0OOooo........oo 41 //....oooOO0OOooo........oooOO0OOooo........oo 42 43 #include "G4DynamicParticleMSC.hh" 44 #include "G4PhysicalConstants.hh" 45 #include "G4SystemOfUnits.hh" 46 #include "G4EmProcessSubType.hh" 47 #include "G4LossTableManager.hh" 48 #include "G4Step.hh" 49 #include "G4Track.hh" 50 #include "G4Log.hh" 51 #include "G4Exp.hh" 52 53 namespace 54 { 55 constexpr G4double c_highland = 13.6*CLHEP:: 56 } 57 58 //....oooOO0OOooo........oooOO0OOooo........oo 59 60 G4DynamicParticleMSC::G4DynamicParticleMSC() 61 : G4VContinuousDiscreteProcess("dynPartMSC") 62 { 63 SetVerboseLevel(1); 64 SetProcessSubType(fDynamicMultipleScattering 65 lManager = G4LossTableManager::Instance(); 66 lManager->Register(this); 67 } 68 69 //....oooOO0OOooo........oooOO0OOooo........oo 70 71 G4DynamicParticleMSC::~G4DynamicParticleMSC() 72 { 73 lManager->DeRegister(this); 74 } 75 76 //....oooOO0OOooo........oooOO0OOooo........oo 77 78 void G4DynamicParticleMSC::PreStepInitialisati 79 { 80 fMaterial = track.GetMaterial(); 81 fZeff = fMaterial->GetIonisation()->GetZeffe 82 auto dpart = track.GetDynamicParticle(); 83 fEkinPreStep = dpart->GetKineticEnergy(); 84 fBeta = dpart->GetBeta(); 85 fCharge = dpart->GetCharge()/CLHEP::eplus; 86 fMass = std::max(dpart->GetMass(), CLHEP::el 87 } 88 89 //....oooOO0OOooo........oooOO0OOooo........oo 90 91 G4double G4DynamicParticleMSC::AlongStepGetPhy 92 const G4Trac 93 G4GPILSelect 94 { 95 *selection = CandidateForSelection; 96 PreStepInitialisation(track); 97 98 // no step limit for the time being 99 return DBL_MAX; 100 } 101 102 //....oooOO0OOooo........oooOO0OOooo........oo 103 104 G4double G4DynamicParticleMSC::PostStepGetPhys 105 const G4Trac 106 G4ForceCondi 107 { 108 *condition = NotForced; 109 return DBL_MAX; 110 } 111 112 //....oooOO0OOooo........oooOO0OOooo........oo 113 114 G4VParticleChange* G4DynamicParticleMSC::Along 115 const G4Step& step) 116 { 117 fParticleChange.InitialiseMSC(track, step); 118 119 // no energy loss 120 if (fCharge == 0.0) { return &fParticleChang 121 122 G4double geomLength = step.GetStepLength(); 123 G4double y = geomLength/fMaterial->GetRadlen 124 G4double theta0 = c_highland*std::abs(fCharg 125 (1.0 + 0.038*G4Log(y*fCharge*fCharge/(fBet 126 127 if (theta0 < 0.001) { return &fParticleChang 128 G4double cost = 1.0; 129 G4double r = G4UniformRand(); 130 if (theta0 < 1.0) { 131 G4double theta2 = theta0*theta0; 132 cost -= theta2*G4Log(1.0 + r*(G4Exp(2.0/th 133 } else { 134 cost -= 2.0*r; 135 } 136 G4double phi = CLHEP::twopi*G4UniformRand(); 137 G4double sint = std::sqrt((1.0 - cost)*(1.0 138 fNewDir.set(sint*std::cos(phi), sint*std::si 139 fNewDir.rotateUz(step.GetPostStepPoint()->Ge 140 141 fParticleChange.ProposeMomentumDirection(fNe 142 fParticleChange.ProposeTrueStepLength(geomLe 143 return &fParticleChange; 144 } 145 146 //....oooOO0OOooo........oooOO0OOooo........oo 147 148 G4double G4DynamicParticleMSC::GetMeanFreePath 149 G4ForceCondition* condition) 150 { 151 *condition = Forced; 152 return DBL_MAX; 153 } 154 155 //....oooOO0OOooo........oooOO0OOooo........oo 156 157 G4double G4DynamicParticleMSC::GetContinuousSt 158 G4double previousStepSize, 159 160 G4double& currentSafety) 161 { 162 G4GPILSelection selection = NotCandidateForS 163 G4double x = AlongStepGetPhysicalInteraction 164 currentMinimalStep, 165 currentSafety, &selecti 166 return x; 167 } 168 169 //....oooOO0OOooo........oooOO0OOooo........oo 170 171 void G4DynamicParticleMSC::ProcessDescription( 172 { 173 out << "G4DynamicParticleMSC: no delta rays" 174 } 175 176 //....oooOO0OOooo........oooOO0OOooo........oo 177