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 // $Id: G4VMscModel.cc,v 1.13 2009/07/20 17:32:47 vnivanch Exp $ >> 27 // GEANT4 tag $Name: geant4-09-03-patch-02 $ 26 // 28 // 27 // ------------------------------------------- 29 // ------------------------------------------------------------------- 28 // 30 // 29 // GEANT4 Class file 31 // GEANT4 Class file 30 // 32 // 31 // 33 // 32 // File name: G4VMscModel 34 // File name: G4VMscModel 33 // 35 // 34 // Author: Vladimir Ivanchenko 36 // Author: Vladimir Ivanchenko 35 // 37 // 36 // Creation date: 07.03.2008 38 // Creation date: 07.03.2008 37 // 39 // 38 // Modifications: 40 // Modifications: 39 // 41 // 40 // 42 // 41 // Class Description: 43 // Class Description: 42 // 44 // 43 // General interface to msc models 45 // General interface to msc models 44 46 45 // ------------------------------------------- 47 // ------------------------------------------------------------------- 46 // 48 // 47 49 48 #include "G4VMscModel.hh" 50 #include "G4VMscModel.hh" 49 #include "G4SystemOfUnits.hh" << 50 #include "G4ParticleChangeForMSC.hh" 51 #include "G4ParticleChangeForMSC.hh" 51 #include "G4TransportationManager.hh" 52 #include "G4TransportationManager.hh" 52 #include "G4LossTableManager.hh" << 53 #include "G4LossTableBuilder.hh" << 54 #include "G4EmParameters.hh" << 55 53 56 //....oooOO0OOooo........oooOO0OOooo........oo 54 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 57 //....oooOO0OOooo........oooOO0OOooo........oo 55 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 58 56 59 G4VMscModel::G4VMscModel(const G4String& nam): 57 G4VMscModel::G4VMscModel(const G4String& nam): 60 G4VEmModel(nam), 58 G4VEmModel(nam), 61 lambdalimit(1.*CLHEP::mm), << 59 safetyHelper(0), 62 geomMin(1.e-6*CLHEP::mm), << 60 facrange(0.04), 63 geomMax(1.e50*CLHEP::mm), << 61 facgeom(2.5), 64 fDisplacement(0.,0.,0.), << 62 facsafety(0.3), 65 steppingAlgorithm(fUseSafety) << 63 skin(3.0), 66 { << 64 dtrl(0.05), 67 dedx = 2.0*CLHEP::MeV*CLHEP::cm2/CLHEP::g; << 65 lambdalimit(mm), 68 } << 66 geommax(1.e50*mm), >> 67 steppingAlgorithm(fUseSafety), >> 68 samplez(false), >> 69 latDisplasment(true) >> 70 {} 69 71 70 //....oooOO0OOooo........oooOO0OOooo........oo 72 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 71 73 72 G4VMscModel::~G4VMscModel() = default; << 74 G4VMscModel::~G4VMscModel() >> 75 {} 73 76 74 //....oooOO0OOooo........oooOO0OOooo........oo 77 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 75 78 76 G4ParticleChangeForMSC* << 79 G4ParticleChangeForMSC* G4VMscModel::GetParticleChangeForMSC() 77 G4VMscModel::GetParticleChangeForMSC(const G4P << 78 { 80 { 79 // recomputed for each new run << 81 G4ParticleChangeForMSC* p = 0; 80 if(nullptr == safetyHelper) { << 82 if (pParticleChange) { 81 safetyHelper = G4TransportationManager::Ge << 83 p = static_cast<G4ParticleChangeForMSC*>(pParticleChange); 82 ->GetSafetyHelper(); << 83 safetyHelper->InitialiseHelper(); << 84 } << 85 G4ParticleChangeForMSC* change = nullptr; << 86 if (nullptr != pParticleChange) { << 87 change = static_cast<G4ParticleChangeForMS << 88 } else { 84 } else { 89 change = new G4ParticleChangeForMSC(); << 85 p = new G4ParticleChangeForMSC(); 90 } 86 } 91 return change; << 87 return p; 92 } 88 } 93 89 94 //....oooOO0OOooo........oooOO0OOooo........oo 90 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 95 91 96 void G4VMscModel::InitialiseParameters(const G << 92 void G4VMscModel::InitialiseSafetyHelper() 97 { 93 { 98 if(IsLocked()) { return; } << 94 if(!safetyHelper) { 99 G4EmParameters* param = G4EmParameters::Inst << 95 safetyHelper = G4TransportationManager::GetTransportationManager() 100 if(std::abs(part->GetPDGEncoding()) == 11) { << 96 ->GetSafetyHelper(); 101 steppingAlgorithm = param->MscStepLimitTyp << 97 safetyHelper->InitialiseHelper(); 102 facrange = param->MscRangeFactor(); << 103 latDisplasment = param->LateralDisplacemen << 104 } else { << 105 steppingAlgorithm = param->MscMuHadStepLim << 106 facrange = param->MscMuHadRangeFactor(); << 107 latDisplasment = param->MuHadLateralDispla << 108 } 98 } 109 skin = param->MscSkin(); << 110 facgeom = param->MscGeomFactor(); << 111 facsafety = param->MscSafetyFactor(); << 112 lambdalimit = param->MscLambdaLimit(); << 113 } 99 } 114 100 115 //....oooOO0OOooo........oooOO0OOooo........oo 101 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 116 102 117 void G4VMscModel::DumpParameters(std::ostream& << 103 void G4VMscModel::ComputeDisplacement(G4ParticleChangeForMSC* fParticleChange, 118 { << 104 const G4ThreeVector& dir, 119 G4String alg = "UseSafety"; << 105 G4double displacement, 120 if (steppingAlgorithm == fUseDistanceToBound << 106 G4double postsafety) 121 else if (steppingAlgorithm == fMinimal) alg << 107 { 122 else if (steppingAlgorithm == fUseSafetyPlus << 108 const G4ThreeVector* pos = fParticleChange->GetProposedPosition(); 123 << 109 G4double r = displacement; 124 out << std::setw(18) << "StepLim=" << alg << << 110 if(r > postsafety) { 125 << " Gfact=" << facgeom << " Sfact=" << << 111 G4double newsafety = safetyHelper->ComputeSafety(*pos); 126 << " Skin=" << skin << " Llim=" << lambd << 112 if(r > newsafety) r = newsafety; >> 113 } >> 114 if(r > 0.) { >> 115 >> 116 // compute new endpoint of the Step >> 117 G4ThreeVector newPosition = *pos + r*dir; >> 118 >> 119 // definitely not on boundary >> 120 if(displacement == r) { >> 121 safetyHelper->ReLocateWithinVolume(newPosition); >> 122 >> 123 } else { >> 124 // check safety after displacement >> 125 G4double postsafety = safetyHelper->ComputeSafety(newPosition); >> 126 >> 127 // displacement to boundary >> 128 if(postsafety <= 0.0) { >> 129 safetyHelper->Locate(newPosition, >> 130 *fParticleChange->GetProposedMomentumDirection()); >> 131 >> 132 // not on the boundary >> 133 } else { >> 134 safetyHelper->ReLocateWithinVolume(newPosition); >> 135 } >> 136 } >> 137 fParticleChange->ProposePosition(newPosition); >> 138 } 127 } 139 } 128 140 129 //....oooOO0OOooo........oooOO0OOooo........oo 141 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 130 142 131 void G4VMscModel::SampleSecondaries(std::vecto << 143 void G4VMscModel::SampleScattering(const G4DynamicParticle*, G4double) 132 const G4Ma << 133 const G4Dy << 134 G4double, << 135 {} 144 {} 136 145 137 //....oooOO0OOooo........oooOO0OOooo........oo 146 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 138 147 139 G4double G4VMscModel::GetDEDX(const G4Particle << 148 G4double G4VMscModel::ComputeTruePathLengthLimit(const G4Track&, 140 const G4Material << 149 G4PhysicsTable*, 141 { << 150 G4double) 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 { 151 { 157 G4double x; << 152 return DBL_MAX; 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 } 153 } 166 154 167 //....oooOO0OOooo........oooOO0OOooo........oo 155 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 168 156 169 G4double G4VMscModel::GetRange(const G4Particl << 157 G4double G4VMscModel::ComputeGeomPathLength(G4double truePathLength) 170 const G4Materia << 171 { 158 { 172 // << ionisation << " " << part->GetPartic << 159 return truePathLength; 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 } 160 } 183 161 184 //....oooOO0OOooo........oooOO0OOooo........oo 162 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 185 163 186 G4double G4VMscModel::GetRange(const G4Particl << 164 G4double G4VMscModel::ComputeTrueStepLength(G4double geomPathLength) 187 const G4Materia << 188 { 165 { 189 //G4cout << "G4VMscModel::GetRange E(MeV)= " << 166 return geomPathLength; 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 } 167 } 201 168 202 //....oooOO0OOooo........oooOO0OOooo........oo 169 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 203 170 204 G4double G4VMscModel::GetEnergy(const G4Partic << 171 void G4VMscModel::SampleSecondaries(std::vector<G4DynamicParticle*>*, 205 G4double range << 172 const G4MaterialCutsCouple*, 206 { << 173 const G4DynamicParticle*, 207 G4double e; << 174 G4double, G4double) 208 //G4cout << "G4VMscModel::GetEnergy R(mm)= " << 175 {} 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 176 221 //....oooOO0OOooo........oooOO0OOooo........oo 177 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 222 178