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: $ 26 // 27 // 27 // Author: D.H. Wright 28 // Author: D.H. Wright 28 // Date: 2 February 2011 29 // Date: 2 February 2011 29 // 30 // 30 // Description: model of muon nuclear interact 31 // Description: model of muon nuclear interaction in which a gamma from 31 // the virtual photon spectrum in 32 // the virtual photon spectrum interacts in the nucleus as 32 // a real gamma at low energies a 33 // a real gamma at low energies and as a pi0 at high energies. 33 // Kokoulin's muon cross section 34 // Kokoulin's muon cross section and equivalent gamma spectrum 34 // are used. 35 // are used. 35 // 36 // 36 37 37 #include "G4MuonVDNuclearModel.hh" 38 #include "G4MuonVDNuclearModel.hh" 38 39 39 #include "Randomize.hh" 40 #include "Randomize.hh" 40 #include "G4Log.hh" << 41 #include "G4PhysicalConstants.hh" 41 #include "G4PhysicalConstants.hh" 42 #include "G4SystemOfUnits.hh" 42 #include "G4SystemOfUnits.hh" 43 #include "G4CascadeInterface.hh" 43 #include "G4CascadeInterface.hh" 44 #include "G4TheoFSGenerator.hh" 44 #include "G4TheoFSGenerator.hh" 45 #include "G4GeneratorPrecompoundInterface.hh" 45 #include "G4GeneratorPrecompoundInterface.hh" >> 46 #include "G4ExcitationHandler.hh" 46 #include "G4PreCompoundModel.hh" 47 #include "G4PreCompoundModel.hh" 47 #include "G4LundStringFragmentation.hh" 48 #include "G4LundStringFragmentation.hh" 48 #include "G4ExcitedStringDecay.hh" 49 #include "G4ExcitedStringDecay.hh" 49 #include "G4FTFModel.hh" 50 #include "G4FTFModel.hh" 50 #include "G4HadronicInteractionRegistry.hh" << 51 #include "G4KokoulinMuonNuclearXS.hh" << 52 #include "G4CrossSectionDataSetRegistry.hh" << 53 #include "G4ElementData.hh" << 54 #include "G4Physics2DVector.hh" << 55 #include "G4Pow.hh" << 56 #include "G4PhysicsModelCatalog.hh" << 57 << 58 const G4int G4MuonVDNuclearModel::zdat[] = {1, << 59 const G4double G4MuonVDNuclearModel::adat[] = << 60 const G4double G4MuonVDNuclearModel::tdat[] = << 61 1.e3,2.e3,3.e3,4.e3,5.e3,6.e3,7.e3,8.e3,9.e3 << 62 1.e4,2.e4,3.e4,4.e4,5.e4,6.e4,7.e4,8.e4,9.e4 << 63 1.e5,2.e5,3.e5,4.e5,5.e5,6.e5,7.e5,8.e5,9.e5 << 64 1.e6,2.e6,3.e6,4.e6,5.e6,6.e6,7.e6,8.e6,9.e6 << 65 1.e7,2.e7,3.e7,4.e7,5.e7,6.e7,7.e7,8.e7,9.e7 << 66 1.e8,2.e8,3.e8,4.e8,5.e8,6.e8,7.e8,8.e8,9.e8 << 67 1.e9,2.e9,3.e9,4.e9,5.e9,6.e9,7.e9,8.e9,9.e9 << 68 1.e10,2.e10,3.e10,4.e10,5.e10,6.e10,7.e10,8. << 69 << 70 G4ElementData* G4MuonVDNuclearModel::fElementD << 71 51 72 G4MuonVDNuclearModel::G4MuonVDNuclearModel() 52 G4MuonVDNuclearModel::G4MuonVDNuclearModel() 73 : G4HadronicInteraction("G4MuonVDNuclearMode << 53 : G4HadronicInteraction("G4MuonVDNuclearModel") 74 { 54 { 75 muNucXS = (G4KokoulinMuonNuclearXS*)G4CrossS << 76 GetCrossSectionDataSet(G4KokoulinMuonNucle << 77 << 78 SetMinEnergy(0.0); 55 SetMinEnergy(0.0); 79 SetMaxEnergy(1*CLHEP::PeV); << 56 SetMaxEnergy(1*PeV); 80 CutFixed = 0.2*CLHEP::GeV; << 57 CutFixed = 0.2*GeV; 81 << 58 NBIN = 1000; 82 if (nullptr == fElementData) { << 59 83 fElementData = new G4ElementData(93); << 60 for (G4int k = 0; k < 5; k++) { 84 MakeSamplingTable(); << 61 for (G4int j = 0; j < 8; j++) { >> 62 for (G4int i = 0; i < 1001; i++) { >> 63 proba[k][j][i] = 0.0; >> 64 ya[i] = 0.0; >> 65 } >> 66 } 85 } 67 } 86 << 68 87 // reuse existing pre-compound model << 69 MakeSamplingTable(); 88 G4GeneratorPrecompoundInterface* precoInterf << 89 = new G4GeneratorPrecompoundInterface(); << 90 G4HadronicInteraction* p = << 91 G4HadronicInteractionRegistry::Instance()- << 92 G4VPreCompoundModel* pre = static_cast<G4VPr << 93 if(nullptr == pre) { pre = new G4PreCompound << 94 precoInterface->SetDeExcitation(pre); << 95 70 96 // Build FTFP model 71 // Build FTFP model 97 ftfp = new G4TheoFSGenerator(); 72 ftfp = new G4TheoFSGenerator(); >> 73 precoInterface = new G4GeneratorPrecompoundInterface(); >> 74 theHandler = new G4ExcitationHandler(); >> 75 preEquilib = new G4PreCompoundModel(theHandler); >> 76 precoInterface->SetDeExcitation(preEquilib); 98 ftfp->SetTransport(precoInterface); 77 ftfp->SetTransport(precoInterface); 99 theFragmentation = new G4LundStringFragmenta 78 theFragmentation = new G4LundStringFragmentation(); 100 theStringDecay = new G4ExcitedStringDecay(th 79 theStringDecay = new G4ExcitedStringDecay(theFragmentation); 101 G4FTFModel* theStringModel = new G4FTFModel; << 80 theStringModel = new G4FTFModel; 102 theStringModel->SetFragmentationModel(theStr 81 theStringModel->SetFragmentationModel(theStringDecay); 103 ftfp->SetHighEnergyGenerator(theStringModel) 82 ftfp->SetHighEnergyGenerator(theStringModel); 104 83 105 // Build Bertini cascade 84 // Build Bertini cascade 106 bert = new G4CascadeInterface(); 85 bert = new G4CascadeInterface(); 107 << 108 // Creator model ID << 109 secID = G4PhysicsModelCatalog::GetModelID( " << 110 } 86 } 111 87 >> 88 112 G4MuonVDNuclearModel::~G4MuonVDNuclearModel() 89 G4MuonVDNuclearModel::~G4MuonVDNuclearModel() 113 { 90 { >> 91 delete ftfp; >> 92 delete preEquilib; 114 delete theFragmentation; 93 delete theFragmentation; 115 delete theStringDecay; 94 delete theStringDecay; >> 95 delete theStringModel; >> 96 delete bert; 116 } 97 } >> 98 117 99 118 G4HadFinalState* 100 G4HadFinalState* 119 G4MuonVDNuclearModel::ApplyYourself(const G4Ha 101 G4MuonVDNuclearModel::ApplyYourself(const G4HadProjectile& aTrack, 120 G4Nucleus& 102 G4Nucleus& targetNucleus) 121 { 103 { 122 theParticleChange.Clear(); 104 theParticleChange.Clear(); 123 105 124 // For very low energy, return initial track 106 // For very low energy, return initial track 125 G4double epmax = aTrack.GetTotalEnergy() - 0 107 G4double epmax = aTrack.GetTotalEnergy() - 0.5*proton_mass_c2; 126 if (epmax <= CutFixed) { 108 if (epmax <= CutFixed) { 127 theParticleChange.SetStatusChange(isAlive) 109 theParticleChange.SetStatusChange(isAlive); 128 theParticleChange.SetEnergyChange(aTrack.G 110 theParticleChange.SetEnergyChange(aTrack.GetKineticEnergy()); 129 theParticleChange.SetMomentumChange(aTrack 111 theParticleChange.SetMomentumChange(aTrack.Get4Momentum().vect().unit()); 130 return &theParticleChange; 112 return &theParticleChange; 131 } 113 } 132 114 133 // Produce recoil muon and transferred photo 115 // Produce recoil muon and transferred photon 134 G4DynamicParticle* transferredPhoton = Calcu 116 G4DynamicParticle* transferredPhoton = CalculateEMVertex(aTrack, targetNucleus); 135 117 136 // Interact the gamma with the nucleus 118 // Interact the gamma with the nucleus 137 CalculateHadronicVertex(transferredPhoton, t 119 CalculateHadronicVertex(transferredPhoton, targetNucleus); 138 return &theParticleChange; 120 return &theParticleChange; 139 } 121 } 140 122 >> 123 141 G4DynamicParticle* 124 G4DynamicParticle* 142 G4MuonVDNuclearModel::CalculateEMVertex(const 125 G4MuonVDNuclearModel::CalculateEMVertex(const G4HadProjectile& aTrack, 143 G4Nucl 126 G4Nucleus& targetNucleus) 144 { 127 { 145 // Select sampling table 128 // Select sampling table 146 G4double KineticEnergy = aTrack.GetKineticEn 129 G4double KineticEnergy = aTrack.GetKineticEnergy(); 147 G4double TotalEnergy = aTrack.GetTotalEnergy 130 G4double TotalEnergy = aTrack.GetTotalEnergy(); 148 G4double Mass = G4MuonMinus::MuonMinus()->Ge 131 G4double Mass = G4MuonMinus::MuonMinus()->GetPDGMass(); 149 G4Pow* g4calc = G4Pow::GetInstance(); << 132 G4double lnZ = std::log(G4double(targetNucleus.GetZ_asInt() ) ); 150 G4double lnZ = g4calc->logZ(targetNucleus.Ge << 151 133 152 G4double epmin = CutFixed; 134 G4double epmin = CutFixed; 153 G4double epmax = TotalEnergy - 0.5*proton_ma 135 G4double epmax = TotalEnergy - 0.5*proton_mass_c2; 154 G4double m0 = CutFixed; << 136 G4double m0 = 0.2*GeV; 155 137 156 G4double delmin = 1.e10; 138 G4double delmin = 1.e10; 157 G4double del; 139 G4double del; 158 G4int izz = 0; 140 G4int izz = 0; 159 G4int itt = 0; 141 G4int itt = 0; >> 142 G4int NBINminus1 = NBIN - 1; 160 143 161 for (G4int iz = 0; iz < nzdat; ++iz) { << 144 G4int nzdat = 5; 162 del = std::abs(lnZ - g4calc->logZ(zdat[iz] << 145 G4double zdat[] = {1.,4.,13.,29.,92.}; >> 146 for (G4int iz = 0; iz < nzdat; iz++) { >> 147 del = std::abs(lnZ-std::log(zdat[iz])); 163 if (del < delmin) { 148 if (del < delmin) { 164 delmin = del; 149 delmin = del; 165 izz = iz; 150 izz = iz; 166 } 151 } 167 } 152 } 168 153 >> 154 G4int ntdat = 8; >> 155 G4double tdat[] = {1.e3,1.e4,1.e5,1.e6,1.e7,1.e8,1.e9,1.e10}; 169 delmin = 1.e10; 156 delmin = 1.e10; 170 for (G4int it = 0; it < ntdat; ++it) { << 157 for (G4int it = 0; it < ntdat; it++) { 171 del = std::abs(G4Log(KineticEnergy)-G4Log( << 158 del = std::abs(std::log(KineticEnergy)-std::log(tdat[it]) ); 172 if (del < delmin) { 159 if (del < delmin) { 173 delmin = del; 160 delmin = del; 174 itt = it; 161 itt = it; 175 } 162 } 176 } 163 } 177 164 178 // Sample the energy transfer according to t 165 // Sample the energy transfer according to the probability table 179 G4double r = G4UniformRand(); 166 G4double r = G4UniformRand(); 180 167 181 G4int iy; << 168 G4int iy = -1; 182 << 169 do { 183 G4int Z = zdat[izz]; << 170 iy += 1 ; 184 << 171 } while (((proba[izz][itt][iy]) < r)&&(iy < NBINminus1)) ; 185 for(iy = 0; iy<NBIN; ++iy) { << 186 << 187 G4double pvv = fElementData->GetElement2DD << 188 if(pvv >= r) { break; } << 189 } << 190 172 191 // Sampling is done uniformly in y in the bi 173 // Sampling is done uniformly in y in the bin 192 G4double pvx = fElementData->GetElement2DDat << 193 G4double pvx1 = fElementData->GetElement2DDa << 194 G4double y = pvx + G4UniformRand() * (pvx1 - << 195 174 196 G4double x = G4Exp(y); << 175 G4double y; 197 G4double ep = epmin*G4Exp(x*G4Log(epmax/epmi << 176 if (iy < NBIN) >> 177 y = ya[iy] + G4UniformRand() * (ya[iy+1] - ya[iy]); >> 178 else >> 179 y = ya[iy]; >> 180 >> 181 G4double x = std::exp(y); >> 182 G4double ep = epmin*std::exp(x*std::log(epmax/epmin) ); 198 183 199 // Sample scattering angle of mu, but first 184 // Sample scattering angle of mu, but first t should be sampled. 200 G4double yy = ep/TotalEnergy; 185 G4double yy = ep/TotalEnergy; 201 G4double tmin = Mass*Mass*yy*yy/(1.-yy); 186 G4double tmin = Mass*Mass*yy*yy/(1.-yy); 202 G4double tmax = 2.*proton_mass_c2*ep; 187 G4double tmax = 2.*proton_mass_c2*ep; 203 G4double t1; 188 G4double t1; 204 G4double t2; 189 G4double t2; 205 if (m0 < ep) { 190 if (m0 < ep) { 206 t1 = m0*m0; 191 t1 = m0*m0; 207 t2 = ep*ep; 192 t2 = ep*ep; 208 } else { 193 } else { 209 t1 = ep*ep; 194 t1 = ep*ep; 210 t2 = m0*m0; 195 t2 = m0*m0; 211 } 196 } 212 197 213 G4double w1 = tmax*t1; 198 G4double w1 = tmax*t1; 214 G4double w2 = tmax+t1; 199 G4double w2 = tmax+t1; 215 G4double w3 = tmax*(tmin+t1)/(tmin*w2); 200 G4double w3 = tmax*(tmin+t1)/(tmin*w2); 216 G4double y1 = 1.-yy; 201 G4double y1 = 1.-yy; 217 G4double y2 = 0.5*yy*yy; 202 G4double y2 = 0.5*yy*yy; 218 G4double y3 = y1+y2; 203 G4double y3 = y1+y2; 219 204 220 G4double t = 0.0; << 205 G4double t; 221 G4double rej = 0.0; << 206 G4double rej; 222 207 223 // Now sample t 208 // Now sample t 224 G4int ntry = 0; << 209 G4int ntry = 0; 225 do 210 do 226 { 211 { 227 ntry += 1; 212 ntry += 1; 228 if (ntry > 10000) { << 213 t = w1/(w2*std::exp(G4UniformRand()*std::log(w3))-tmax); 229 G4ExceptionDescription eda; << 230 eda << " While count exceeded " << G4end << 231 G4Exception("G4MuonVDNuclearModel::Calcu << 232 break; << 233 } << 234 << 235 t = w1/(w2*G4Exp(G4UniformRand()*G4Log(w3) << 236 rej = (1.-t/tmax)*(y1*(1.-tmin/t)+y2)/(y3* 214 rej = (1.-t/tmax)*(y1*(1.-tmin/t)+y2)/(y3*(1.-t/t2)); 237 } while (G4UniformRand() > rej) ; /* Loop << 215 } while (G4UniformRand() > rej) ; 238 216 239 // compute angle from t 217 // compute angle from t 240 G4double sinth2 = 218 G4double sinth2 = 241 0.5*(t-tmin)/(2.*(TotalEnergy*(To 219 0.5*(t-tmin)/(2.*(TotalEnergy*(TotalEnergy-ep)-Mass*Mass)-tmin); 242 G4double theta = std::acos(1. - 2.*sinth2); 220 G4double theta = std::acos(1. - 2.*sinth2); 243 221 244 G4double phi = twopi*G4UniformRand(); 222 G4double phi = twopi*G4UniformRand(); 245 G4double sinth = std::sin(theta); 223 G4double sinth = std::sin(theta); 246 G4double dirx = sinth*std::cos(phi); 224 G4double dirx = sinth*std::cos(phi); 247 G4double diry = sinth*std::sin(phi); 225 G4double diry = sinth*std::sin(phi); 248 G4double dirz = std::cos(theta); 226 G4double dirz = std::cos(theta); 249 G4ThreeVector finalDirection(dirx,diry,dirz) 227 G4ThreeVector finalDirection(dirx,diry,dirz); 250 G4ThreeVector ParticleDirection(aTrack.Get4M 228 G4ThreeVector ParticleDirection(aTrack.Get4Momentum().vect().unit() ); 251 finalDirection.rotateUz(ParticleDirection); 229 finalDirection.rotateUz(ParticleDirection); 252 230 253 G4double NewKinEnergy = KineticEnergy - ep; 231 G4double NewKinEnergy = KineticEnergy - ep; 254 G4double finalMomentum = std::sqrt(NewKinEne 232 G4double finalMomentum = std::sqrt(NewKinEnergy*(NewKinEnergy+2.*Mass) ); 255 G4double Ef = NewKinEnergy + Mass; 233 G4double Ef = NewKinEnergy + Mass; 256 G4double initMomentum = std::sqrt(KineticEne 234 G4double initMomentum = std::sqrt(KineticEnergy*(TotalEnergy+Mass) ); 257 235 258 // Set energy and direction of scattered pri 236 // Set energy and direction of scattered primary in theParticleChange 259 theParticleChange.SetStatusChange(isAlive); 237 theParticleChange.SetStatusChange(isAlive); 260 theParticleChange.SetEnergyChange(NewKinEner 238 theParticleChange.SetEnergyChange(NewKinEnergy); 261 theParticleChange.SetMomentumChange(finalDir 239 theParticleChange.SetMomentumChange(finalDirection); 262 240 263 // Now create the emitted gamma 241 // Now create the emitted gamma 264 G4LorentzVector primaryMomentum(initMomentum 242 G4LorentzVector primaryMomentum(initMomentum*ParticleDirection, TotalEnergy); 265 G4LorentzVector fsMomentum(finalMomentum*fin 243 G4LorentzVector fsMomentum(finalMomentum*finalDirection, Ef); 266 G4LorentzVector momentumTransfer = primaryMo 244 G4LorentzVector momentumTransfer = primaryMomentum - fsMomentum; 267 245 268 G4DynamicParticle* gamma = 246 G4DynamicParticle* gamma = 269 new G4DynamicParticle(G4Gamma::Gamm 247 new G4DynamicParticle(G4Gamma::Gamma(), momentumTransfer); 270 248 271 return gamma; 249 return gamma; 272 } 250 } 273 251 >> 252 274 void 253 void 275 G4MuonVDNuclearModel::CalculateHadronicVertex( 254 G4MuonVDNuclearModel::CalculateHadronicVertex(G4DynamicParticle* incident, 276 255 G4Nucleus& target) 277 { 256 { 278 G4HadFinalState* hfs = 0; 257 G4HadFinalState* hfs = 0; 279 G4double gammaE = incident->GetTotalEnergy() 258 G4double gammaE = incident->GetTotalEnergy(); 280 259 281 if (gammaE < 10*GeV) { 260 if (gammaE < 10*GeV) { 282 G4HadProjectile projectile(*incident); 261 G4HadProjectile projectile(*incident); 283 hfs = bert->ApplyYourself(projectile, targ 262 hfs = bert->ApplyYourself(projectile, target); 284 } else { 263 } else { 285 // convert incident gamma to a pi0 264 // convert incident gamma to a pi0 286 G4double piMass = G4PionZero::PionZero()-> 265 G4double piMass = G4PionZero::PionZero()->GetPDGMass(); 287 G4double piKE = incident->GetTotalEnergy() 266 G4double piKE = incident->GetTotalEnergy() - piMass; 288 G4double piMom = std::sqrt(piKE*(piKE + 2* 267 G4double piMom = std::sqrt(piKE*(piKE + 2*piMass) ); 289 G4ThreeVector piMomentum(incident->GetMome 268 G4ThreeVector piMomentum(incident->GetMomentumDirection() ); 290 piMomentum *= piMom; 269 piMomentum *= piMom; 291 G4DynamicParticle theHadron(G4PionZero::Pi 270 G4DynamicParticle theHadron(G4PionZero::PionZero(), piMomentum); 292 G4HadProjectile projectile(theHadron); 271 G4HadProjectile projectile(theHadron); 293 hfs = ftfp->ApplyYourself(projectile, targ 272 hfs = ftfp->ApplyYourself(projectile, target); 294 } 273 } 295 274 296 delete incident; 275 delete incident; 297 276 298 // Assign the creator model ID to the second << 299 for ( size_t i = 0; i < hfs->GetNumberOfSeco << 300 hfs->GetSecondary( i )->SetCreatorModelID( << 301 } << 302 << 303 // Copy secondaries from sub-model to model 277 // Copy secondaries from sub-model to model 304 theParticleChange.AddSecondaries(hfs); 278 theParticleChange.AddSecondaries(hfs); 305 } 279 } 306 280 307 281 308 void G4MuonVDNuclearModel::MakeSamplingTable() 282 void G4MuonVDNuclearModel::MakeSamplingTable() 309 { 283 { >> 284 G4double adat[] = {1.01,9.01,26.98,63.55,238.03}; >> 285 G4double zdat[] = {1.,4.,13.,29.,92.}; >> 286 G4int nzdat = 5; >> 287 >> 288 G4double tdat[] = {1.e3,1.e4,1.e5,1.e6,1.e7,1.e8,1.e9,1.e10}; >> 289 G4int ntdat = 8; >> 290 310 G4int nbin; 291 G4int nbin; 311 G4double KineticEnergy; 292 G4double KineticEnergy; 312 G4double TotalEnergy; 293 G4double TotalEnergy; 313 G4double Maxep; 294 G4double Maxep; 314 G4double CrossSection; 295 G4double CrossSection; 315 296 316 G4double c; 297 G4double c; 317 G4double y; 298 G4double y; 318 G4double ymin,ymax; 299 G4double ymin,ymax; 319 G4double dy,yy; 300 G4double dy,yy; 320 G4double dx,x; 301 G4double dx,x; 321 G4double ep; 302 G4double ep; 322 303 323 G4double AtomicNumber; 304 G4double AtomicNumber; 324 G4double AtomicWeight; 305 G4double AtomicWeight; 325 << 326 G4double mumass = G4MuonMinus::MuonMinus()-> << 327 306 328 for (G4int iz = 0; iz < nzdat; ++iz) { << 307 for (G4int iz = 0; iz < nzdat; iz++) { 329 AtomicNumber = zdat[iz]; 308 AtomicNumber = zdat[iz]; 330 AtomicWeight = adat[iz]*(g/mole); << 309 AtomicWeight = adat[iz]*(g/mole); 331 << 332 G4Physics2DVector* pv = new G4Physics2DVec << 333 G4double pvv; << 334 310 335 for (G4int it = 0; it < ntdat; ++it) { << 311 for (G4int it = 0; it < ntdat; it++) { 336 KineticEnergy = tdat[it]; 312 KineticEnergy = tdat[it]; 337 TotalEnergy = KineticEnergy + mumass; << 313 TotalEnergy = KineticEnergy + G4MuonMinus::MuonMinus()->GetPDGMass(); 338 Maxep = TotalEnergy - 0.5*proton_mass_c2 314 Maxep = TotalEnergy - 0.5*proton_mass_c2; 339 315 340 CrossSection = 0.0; 316 CrossSection = 0.0; 341 317 342 // Calculate the differential cross sect 318 // Calculate the differential cross section 343 // numerical integration in log ........ 319 // numerical integration in log ......... 344 c = G4Log(Maxep/CutFixed); << 320 c = std::log(Maxep/CutFixed); 345 ymin = -5.0; 321 ymin = -5.0; 346 ymax = 0.0; 322 ymax = 0.0; 347 dy = (ymax-ymin)/NBIN; 323 dy = (ymax-ymin)/NBIN; 348 324 349 nbin=-1; 325 nbin=-1; 350 326 351 y = ymin - 0.5*dy; 327 y = ymin - 0.5*dy; 352 yy = ymin - dy; 328 yy = ymin - dy; 353 for (G4int i = 0; i < NBIN; ++i) { << 329 for (G4int i = 0; i < NBIN; i++) { 354 y += dy; 330 y += dy; 355 x = G4Exp(y); << 331 x = std::exp(y); 356 yy += dy; 332 yy += dy; 357 dx = G4Exp(yy+dy)-G4Exp(yy); << 333 dx = std::exp(yy+dy)-std::exp(yy); 358 334 359 ep = CutFixed*G4Exp(c*x); << 335 ep = CutFixed*std::exp(c*x); 360 336 361 CrossSection += 337 CrossSection += 362 ep*dx*muNucXS->ComputeDDMicroscopic << 338 ep*dx*muNucXS.ComputeDDMicroscopicCrossSection(KineticEnergy, 363 AtomicNumber, << 339 AtomicNumber, 364 AtomicWeight, ep); << 340 AtomicWeight, ep); 365 if (nbin < NBIN) { 341 if (nbin < NBIN) { 366 ++nbin; << 342 nbin += 1; 367 pv->PutValue(nbin, it, CrossSection) << 343 ya[nbin] = y; 368 pv->PutX(nbin, y); << 344 proba[iz][it][nbin] = CrossSection; 369 } 345 } 370 } 346 } 371 pv->PutX(NBIN, 0.); << 347 ya[NBIN] = 0.; 372 348 373 if (CrossSection > 0.0) { 349 if (CrossSection > 0.0) { 374 for (G4int ib = 0; ib <= nbin; ++ib) { << 350 for (G4int ib = 0; ib <= nbin; ib++) proba[iz][it][ib] /= CrossSection; 375 pvv = pv->GetValue(ib, it); << 376 pvv = pvv/CrossSection; << 377 pv->PutValue(ib, it, pvv); << 378 } << 379 } 351 } 380 } // loop on it 352 } // loop on it 381 << 382 fElementData->InitialiseForElement(zdat[iz << 383 } // loop on iz 353 } // loop on iz 384 354 385 // G4cout << " Kokoulin XS = " 355 // G4cout << " Kokoulin XS = " 386 // << muNucXS->ComputeDDMicroscopicCro << 356 // << muNucXS.ComputeDDMicroscopicCrossSection(1*GeV, 20.0, 40.0*g/mole, 0.3*GeV)/millibarn 387 // 40.0*g/mole, 0.3*GeV)/millibarn << 388 // << G4endl; 357 // << G4endl; 389 } << 390 << 391 void G4MuonVDNuclearModel::ModelDescription(st << 392 { << 393 outFile << "G4MuonVDNuclearModel handles the << 394 << "of mu- and mu+ from nuclei using << 395 << "approximation in which the incom << 396 << "virtual photon at the electromag << 397 << "virtual photon is converted to a << 398 << "energies, the photon interacts d << 399 << "using the Bertini cascade. At h << 400 << "is converted to a pi0 which inte << 401 << "model. The muon-nuclear cross s << 402 << "are used to generate the virtual << 403 } 358 } 404 359 405 360