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: G4VMscModel 33 // 34 // Author: Vladimir Ivanchenko 35 // 36 // Creation date: 07.03.2008 37 // 38 // Modifications: 39 // 40 // 41 // Class Description: 42 // 43 // General interface to msc models 44 45 // ------------------------------------------- 46 // 47 48 #include "G4VMscModel.hh" 49 #include "G4SystemOfUnits.hh" 50 #include "G4ParticleChangeForMSC.hh" 51 #include "G4TransportationManager.hh" 52 #include "G4LossTableManager.hh" 53 #include "G4LossTableBuilder.hh" 54 #include "G4EmParameters.hh" 55 56 //....oooOO0OOooo........oooOO0OOooo........oo 57 //....oooOO0OOooo........oooOO0OOooo........oo 58 59 G4VMscModel::G4VMscModel(const G4String& nam): 60 G4VEmModel(nam), 61 lambdalimit(1.*CLHEP::mm), 62 geomMin(1.e-6*CLHEP::mm), 63 geomMax(1.e50*CLHEP::mm), 64 fDisplacement(0.,0.,0.), 65 steppingAlgorithm(fUseSafety) 66 { 67 dedx = 2.0*CLHEP::MeV*CLHEP::cm2/CLHEP::g; 68 } 69 70 //....oooOO0OOooo........oooOO0OOooo........oo 71 72 G4VMscModel::~G4VMscModel() = default; 73 74 //....oooOO0OOooo........oooOO0OOooo........oo 75 76 G4ParticleChangeForMSC* 77 G4VMscModel::GetParticleChangeForMSC(const G4P 78 { 79 // recomputed for each new run 80 if(nullptr == safetyHelper) { 81 safetyHelper = G4TransportationManager::Ge 82 ->GetSafetyHelper(); 83 safetyHelper->InitialiseHelper(); 84 } 85 G4ParticleChangeForMSC* change = nullptr; 86 if (nullptr != pParticleChange) { 87 change = static_cast<G4ParticleChangeForMS 88 } else { 89 change = new G4ParticleChangeForMSC(); 90 } 91 return change; 92 } 93 94 //....oooOO0OOooo........oooOO0OOooo........oo 95 96 void G4VMscModel::InitialiseParameters(const G 97 { 98 if(IsLocked()) { return; } 99 G4EmParameters* param = G4EmParameters::Inst 100 if(std::abs(part->GetPDGEncoding()) == 11) { 101 steppingAlgorithm = param->MscStepLimitTyp 102 facrange = param->MscRangeFactor(); 103 latDisplasment = param->LateralDisplacemen 104 } else { 105 steppingAlgorithm = param->MscMuHadStepLim 106 facrange = param->MscMuHadRangeFactor(); 107 latDisplasment = param->MuHadLateralDispla 108 } 109 skin = param->MscSkin(); 110 facgeom = param->MscGeomFactor(); 111 facsafety = param->MscSafetyFactor(); 112 lambdalimit = param->MscLambdaLimit(); 113 } 114 115 //....oooOO0OOooo........oooOO0OOooo........oo 116 117 void G4VMscModel::DumpParameters(std::ostream& 118 { 119 G4String alg = "UseSafety"; 120 if (steppingAlgorithm == fUseDistanceToBound 121 else if (steppingAlgorithm == fMinimal) alg 122 else if (steppingAlgorithm == fUseSafetyPlus 123 124 out << std::setw(18) << "StepLim=" << alg << 125 << " Gfact=" << facgeom << " Sfact=" << 126 << " Skin=" << skin << " Llim=" << lambd 127 } 128 129 //....oooOO0OOooo........oooOO0OOooo........oo 130 131 void G4VMscModel::SampleSecondaries(std::vecto 132 const G4Ma 133 const G4Dy 134 G4double, 135 {} 136 137 //....oooOO0OOooo........oooOO0OOooo........oo 138 139 G4double G4VMscModel::GetDEDX(const G4Particle 140 const G4Material 141 { 142 G4double x; 143 if (nullptr != ionisation) { 144 x = ionisation->GetDEDX(kinEnergy, couple) 145 } else { 146 const G4double q = part->GetPDGCharge()*in 147 x = dedx*q*q; 148 } 149 return x; 150 } 151 152 //....oooOO0OOooo........oooOO0OOooo........oo 153 154 G4double G4VMscModel::GetDEDX(const G4Particle 155 const G4Material 156 { 157 G4double x; 158 if (nullptr != ionisation) { 159 x = ionisation->GetDEDX(kinEnergy, couple, 160 } else { 161 const G4double q = part->GetPDGCharge()*in 162 x = dedx*q*q; 163 } 164 return x; 165 } 166 167 //....oooOO0OOooo........oooOO0OOooo........oo 168 169 G4double G4VMscModel::GetRange(const G4Particl 170 const G4Materia 171 { 172 // << ionisation << " " << part->GetPartic 173 localtkin = kinEnergy; 174 if (nullptr != ionisation) { 175 localrange = ionisation->GetRange(kinEnerg 176 } else { 177 const G4double q = part->GetPDGCharge()*in 178 localrange = kinEnergy/(dedx*q*q*couple->G 179 } 180 //G4cout << "R(mm)= " << localrange << " " 181 return localrange; 182 } 183 184 //....oooOO0OOooo........oooOO0OOooo........oo 185 186 G4double G4VMscModel::GetRange(const G4Particl 187 const G4Materia 188 { 189 //G4cout << "G4VMscModel::GetRange E(MeV)= " 190 // << ionisation << " " << part->GetPartic 191 localtkin = kinEnergy; 192 if (nullptr != ionisation) { 193 localrange = ionisation->GetRange(kinEnerg 194 } else { 195 const G4double q = part->GetPDGCharge()*in 196 localrange = kinEnergy/(dedx*q*q*couple->G 197 } 198 //G4cout << "R(mm)= " << localrange << " " 199 return localrange; 200 } 201 202 //....oooOO0OOooo........oooOO0OOooo........oo 203 204 G4double G4VMscModel::GetEnergy(const G4Partic 205 G4double range 206 { 207 G4double e; 208 //G4cout << "G4VMscModel::GetEnergy R(mm)= " 209 // << " Rlocal(mm)= " << localrange << 210 if(nullptr != ionisation) { e = ionisation-> 211 else { 212 e = localtkin; 213 if(localrange > range) { 214 G4double q = part->GetPDGCharge()*invepl 215 e -= (localrange - range)*dedx*q*q*coupl 216 } 217 } 218 return e; 219 } 220 221 //....oooOO0OOooo........oooOO0OOooo........oo 222