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 26 27 // G4 Low energy model: n-p scattering << 27 // G4 Low energy model: n-p scattering 28 // F.W. Jones, L.G. Greeniaus, H.P. Wellisch << 28 // F.W. Jones, L.G. Greeniaus, H.P. Wellisch 29 29 30 // 11-OCT-2007 F.W. Jones: removed erroneous c << 31 // exchange of particles. << 32 // FWJ 27-AUG-2010: extended to 5 GeV by Tony << 33 30 34 #include "G4LEnp.hh" 31 #include "G4LEnp.hh" 35 #include "G4PhysicalConstants.hh" << 36 #include "G4SystemOfUnits.hh" << 37 #include "Randomize.hh" 32 #include "Randomize.hh" 38 #include "G4ios.hh" 33 #include "G4ios.hh" 39 34 40 // Initialization of static data arrays: 35 // Initialization of static data arrays: 41 #include "G4LEnpData.hh" 36 #include "G4LEnpData.hh" 42 #include "Randomize.hh" 37 #include "Randomize.hh" 43 38 44 #include "G4PhysicsModelCatalog.hh" << 45 39 46 << 40 G4LEnp::G4LEnp():G4HadronicInteraction("G4LEnp") 47 G4LEnp::G4LEnp(): << 48 G4HadronElastic("G4LEnp") // G4HadronicInter << 49 { 41 { 50 secID = G4PhysicsModelCatalog::GetModelID( " << 51 // theParticleChange.SetNumberOfSecondari 42 // theParticleChange.SetNumberOfSecondaries(1); 52 43 53 // SetMinEnergy(10.*MeV); 44 // SetMinEnergy(10.*MeV); 54 // SetMaxEnergy(1200.*MeV); 45 // SetMaxEnergy(1200.*MeV); 55 SetMinEnergy(0.); 46 SetMinEnergy(0.); 56 SetMaxEnergy(5.*GeV); << 47 SetMaxEnergy(1200.*GeV); 57 } 48 } 58 49 59 G4LEnp::~G4LEnp() 50 G4LEnp::~G4LEnp() 60 { 51 { 61 theParticleChange.Clear(); 52 theParticleChange.Clear(); 62 } 53 } 63 54 64 G4HadFinalState* 55 G4HadFinalState* 65 G4LEnp::ApplyYourself(const G4HadProjectile& a 56 G4LEnp::ApplyYourself(const G4HadProjectile& aTrack, G4Nucleus& targetNucleus) 66 { 57 { 67 theParticleChange.Clear(); 58 theParticleChange.Clear(); 68 const G4HadProjectile* aParticle = &aTrack 59 const G4HadProjectile* aParticle = &aTrack; 69 60 70 G4double P = aParticle->GetTotalMomentum() 61 G4double P = aParticle->GetTotalMomentum(); 71 G4double Px = aParticle->Get4Momentum().x( 62 G4double Px = aParticle->Get4Momentum().x(); 72 G4double Py = aParticle->Get4Momentum().y( 63 G4double Py = aParticle->Get4Momentum().y(); 73 G4double Pz = aParticle->Get4Momentum().z( 64 G4double Pz = aParticle->Get4Momentum().z(); 74 G4double ek = aParticle->GetKineticEnergy( 65 G4double ek = aParticle->GetKineticEnergy(); 75 G4ThreeVector theInitial = aParticle->Get4 66 G4ThreeVector theInitial = aParticle->Get4Momentum().vect(); 76 67 77 if (verboseLevel > 1) { 68 if (verboseLevel > 1) { 78 G4double E = aParticle->GetTotalEnergy() 69 G4double E = aParticle->GetTotalEnergy(); 79 G4double E0 = aParticle->GetDefinition() 70 G4double E0 = aParticle->GetDefinition()->GetPDGMass(); 80 G4double Q = aParticle->GetDefinition()- 71 G4double Q = aParticle->GetDefinition()->GetPDGCharge(); 81 G4int A = targetNucleus.GetA_asInt(); << 72 G4double N = targetNucleus.GetN(); 82 G4int Z = targetNucleus.GetZ_asInt(); << 73 G4double Z = targetNucleus.GetZ(); 83 G4cout << "G4LEnp:ApplyYourself: inciden 74 G4cout << "G4LEnp:ApplyYourself: incident particle: " 84 << aParticle->GetDefinition()->Ge 75 << aParticle->GetDefinition()->GetParticleName() << G4endl; 85 G4cout << "P = " << P/GeV << " GeV/c" 76 G4cout << "P = " << P/GeV << " GeV/c" 86 << ", Px = " << Px/GeV << " GeV/c 77 << ", Px = " << Px/GeV << " GeV/c" 87 << ", Py = " << Py/GeV << " GeV/c 78 << ", Py = " << Py/GeV << " GeV/c" 88 << ", Pz = " << Pz/GeV << " GeV/c 79 << ", Pz = " << Pz/GeV << " GeV/c" << G4endl; 89 G4cout << "E = " << E/GeV << " GeV" 80 G4cout << "E = " << E/GeV << " GeV" 90 << ", kinetic energy = " << ek/Ge 81 << ", kinetic energy = " << ek/GeV << " GeV" 91 << ", mass = " << E0/GeV << " GeV 82 << ", mass = " << E0/GeV << " GeV" 92 << ", charge = " << Q << G4endl; 83 << ", charge = " << Q << G4endl; 93 G4cout << "G4LEnp:ApplyYourself: materia 84 G4cout << "G4LEnp:ApplyYourself: material:" << G4endl; 94 G4cout << "A = " << A << 85 G4cout << "A = " << N 95 << ", Z = " << Z 86 << ", Z = " << Z 96 << ", atomic mass " 87 << ", atomic mass " 97 << G4Proton::Proton()->GetPDGMas 88 << G4Proton::Proton()->GetPDGMass()/GeV << "GeV" 98 << G4endl; 89 << G4endl; 99 // 90 // 100 // GHEISHA ADD operation to get total en 91 // GHEISHA ADD operation to get total energy, mass, charge 101 // 92 // 102 E += proton_mass_c2; << 93 E += G4Proton::Proton()->GetPDGMass(); 103 G4double E02 = E*E - P*P; 94 G4double E02 = E*E - P*P; 104 E0 = std::sqrt(std::abs(E02)); 95 E0 = std::sqrt(std::abs(E02)); 105 if (E02 < 0)E0 *= -1; 96 if (E02 < 0)E0 *= -1; 106 Q += Z; 97 Q += Z; 107 G4cout << "G4LEnp:ApplyYourself: total:" 98 G4cout << "G4LEnp:ApplyYourself: total:" << G4endl; 108 G4cout << "E = " << E/GeV << " GeV" 99 G4cout << "E = " << E/GeV << " GeV" 109 << ", mass = " << E0/GeV << " GeV 100 << ", mass = " << E0/GeV << " GeV" 110 << ", charge = " << Q << G4endl; 101 << ", charge = " << Q << G4endl; 111 } 102 } 112 103 113 // Find energy bin 104 // Find energy bin 114 105 115 G4int je1 = 0; 106 G4int je1 = 0; 116 G4int je2 = NENERGY - 1; 107 G4int je2 = NENERGY - 1; 117 ek = ek/GeV; 108 ek = ek/GeV; 118 do { 109 do { 119 G4int midBin = (je1 + je2)/2; 110 G4int midBin = (je1 + je2)/2; 120 if (ek < elab[midBin]) 111 if (ek < elab[midBin]) 121 je2 = midBin; 112 je2 = midBin; 122 else 113 else 123 je1 = midBin; 114 je1 = midBin; 124 } while (je2 - je1 > 1); /* Loop checking << 115 } while (je2 - je1 > 1); >> 116 // G4int j; >> 117 //std::abs(ek-elab[je1]) < std::abs(ek-elab[je2]) ? j = je1 : j = je2; 125 G4double delab = elab[je2] - elab[je1]; 118 G4double delab = elab[je2] - elab[je1]; 126 119 127 // Sample the angle 120 // Sample the angle 128 121 129 G4double sample = G4UniformRand(); << 122 G4float sample = G4UniformRand(); 130 G4int ke1 = 0; 123 G4int ke1 = 0; 131 G4int ke2 = NANGLE - 1; 124 G4int ke2 = NANGLE - 1; 132 G4double dsig = sig[je2][0] - sig[je1][0]; 125 G4double dsig = sig[je2][0] - sig[je1][0]; 133 G4double rc = dsig/delab; 126 G4double rc = dsig/delab; 134 G4double b = sig[je1][0] - rc*elab[je1]; 127 G4double b = sig[je1][0] - rc*elab[je1]; 135 G4double sigint1 = rc*ek + b; 128 G4double sigint1 = rc*ek + b; 136 G4double sigint2 = 0.; 129 G4double sigint2 = 0.; 137 130 138 if (verboseLevel > 1) { << 131 if (verboseLevel > 1) G4cout << "sample=" << sample << G4endl 139 G4cout << "sample=" << sample << G4endl << 132 << ke1 << " " << ke2 << " " 140 << ke1 << " " << ke2 << " " << 133 << sigint1 << " " << sigint2 << G4endl; 141 << sigint1 << " " << sigint2 << G4endl; << 134 142 } << 143 do { 135 do { 144 G4int midBin = (ke1 + ke2)/2; 136 G4int midBin = (ke1 + ke2)/2; 145 dsig = sig[je2][midBin] - sig[je1][midBi 137 dsig = sig[je2][midBin] - sig[je1][midBin]; 146 rc = dsig/delab; 138 rc = dsig/delab; 147 b = sig[je1][midBin] - rc*elab[je1]; 139 b = sig[je1][midBin] - rc*elab[je1]; 148 G4double sigint = rc*ek + b; 140 G4double sigint = rc*ek + b; 149 if (sample < sigint) { 141 if (sample < sigint) { 150 ke2 = midBin; 142 ke2 = midBin; 151 sigint2 = sigint; 143 sigint2 = sigint; 152 } 144 } 153 else { 145 else { 154 ke1 = midBin; 146 ke1 = midBin; 155 sigint1 = sigint; 147 sigint1 = sigint; 156 } 148 } 157 if (verboseLevel > 1) { << 149 if (verboseLevel > 1)G4cout << ke1 << " " << ke2 << " " 158 G4cout << ke1 << " " << ke2 << " " << 150 << sigint1 << " " << sigint2 << G4endl; 159 << sigint1 << " " << sigint2 << G4end << 151 } while (ke2 - ke1 > 1); 160 } << 152 161 } while (ke2 - ke1 > 1); /* Loop checking << 153 // sigint1 and sigint2 should be recoverable from above loop >> 154 >> 155 // G4double dsig = sig[je2][ke1] - sig[je1][ke1]; >> 156 // G4double rc = dsig/delab; >> 157 // G4double b = sig[je1][ke1] - rc*elab[je1]; >> 158 // G4double sigint1 = rc*ek + b; >> 159 >> 160 // G4double dsig = sig[je2][ke2] - sig[je1][ke2]; >> 161 // G4double rc = dsig/delab; >> 162 // G4double b = sig[je1][ke2] - rc*elab[je1]; >> 163 // G4double sigint2 = rc*ek + b; 162 164 163 dsig = sigint2 - sigint1; 165 dsig = sigint2 - sigint1; 164 rc = 1./dsig; 166 rc = 1./dsig; 165 b = ke1 - rc*sigint1; 167 b = ke1 - rc*sigint1; 166 G4double kint = rc*sample + b; 168 G4double kint = rc*sample + b; 167 G4double theta = (0.5 + kint)*pi/180.; 169 G4double theta = (0.5 + kint)*pi/180.; 168 170 >> 171 // G4int k; >> 172 //std::abs(sample-sig[j][ke1]) < std::abs(sample-sig[j][ke2]) ? k = ke1 : k = ke2; >> 173 // G4double theta = (0.5 + k)*pi/180.; >> 174 169 if (verboseLevel > 1) { 175 if (verboseLevel > 1) { 170 G4cout << " energy bin " << je1 << " e 176 G4cout << " energy bin " << je1 << " energy=" << elab[je1] << G4endl; 171 G4cout << " angle bin " << kint << " a 177 G4cout << " angle bin " << kint << " angle=" << theta/degree << G4endl; 172 } 178 } 173 179 >> 180 174 // Get the target particle 181 // Get the target particle 175 182 176 G4DynamicParticle* targetParticle = target 183 G4DynamicParticle* targetParticle = targetNucleus.ReturnTargetParticle(); 177 184 178 G4double E1 = aParticle->GetTotalEnergy(); 185 G4double E1 = aParticle->GetTotalEnergy(); 179 G4double M1 = aParticle->GetDefinition()-> 186 G4double M1 = aParticle->GetDefinition()->GetPDGMass(); 180 G4double E2 = targetParticle->GetTotalEner 187 G4double E2 = targetParticle->GetTotalEnergy(); 181 G4double M2 = targetParticle->GetDefinitio 188 G4double M2 = targetParticle->GetDefinition()->GetPDGMass(); 182 G4double totalEnergy = E1 + E2; 189 G4double totalEnergy = E1 + E2; 183 G4double pseudoMass = std::sqrt(totalEnerg 190 G4double pseudoMass = std::sqrt(totalEnergy*totalEnergy - P*P); >> 191 // pseudoMass also = std::sqrt(M1*M1 + M2*M2 + 2*M2*E1) 184 192 185 // Transform into centre of mass system 193 // Transform into centre of mass system 186 194 187 G4double px = (M2/pseudoMass)*Px; 195 G4double px = (M2/pseudoMass)*Px; 188 G4double py = (M2/pseudoMass)*Py; 196 G4double py = (M2/pseudoMass)*Py; 189 G4double pz = (M2/pseudoMass)*Pz; 197 G4double pz = (M2/pseudoMass)*Pz; 190 G4double p = std::sqrt(px*px + py*py + pz* 198 G4double p = std::sqrt(px*px + py*py + pz*pz); 191 199 192 if (verboseLevel > 1) { 200 if (verboseLevel > 1) { 193 G4cout << " E1, M1 (GeV) " << E1/GeV << 201 G4cout << " E1, M1 (GeV) " << E1/GeV << " " << M1/GeV << G4endl; 194 G4cout << " E2, M2 (GeV) " << E2/GeV << 202 G4cout << " E2, M2 (GeV) " << E2/GeV << " " << M2/GeV << G4endl; 195 G4cout << " particle 1 momentum in CM 203 G4cout << " particle 1 momentum in CM " << px/GeV << " " << py/GeV << " " 196 << pz/GeV << " " << p/GeV << G4endl 204 << pz/GeV << " " << p/GeV << G4endl; 197 } 205 } 198 206 199 // First scatter w.r.t. Z axis 207 // First scatter w.r.t. Z axis 200 G4double phi = G4UniformRand()*twopi; 208 G4double phi = G4UniformRand()*twopi; 201 G4double pxnew = p*std::sin(theta)*std::co 209 G4double pxnew = p*std::sin(theta)*std::cos(phi); 202 G4double pynew = p*std::sin(theta)*std::si 210 G4double pynew = p*std::sin(theta)*std::sin(phi); 203 G4double pznew = p*std::cos(theta); 211 G4double pznew = p*std::cos(theta); 204 212 205 // Rotate according to the direction of th 213 // Rotate according to the direction of the incident particle 206 if (px*px + py*py > 0) { 214 if (px*px + py*py > 0) { 207 G4double cost, sint, ph, cosp, sinp; 215 G4double cost, sint, ph, cosp, sinp; 208 cost = pz/p; 216 cost = pz/p; 209 sint = (std::sqrt(std::fabs((1-cost)*(1+ << 217 sint = (std::sqrt(std::abs((1-cost)*(1+cost))) + std::sqrt(px*px+py*py)/p)/2; 210 py < 0 ? ph = 3*halfpi : ph = halfpi; 218 py < 0 ? ph = 3*halfpi : ph = halfpi; 211 if (std::abs(px) > 0.000001*GeV) ph = st 219 if (std::abs(px) > 0.000001*GeV) ph = std::atan2(py,px); 212 cosp = std::cos(ph); 220 cosp = std::cos(ph); 213 sinp = std::sin(ph); 221 sinp = std::sin(ph); 214 px = (cost*cosp*pxnew - sinp*pynew + sin 222 px = (cost*cosp*pxnew - sinp*pynew + sint*cosp*pznew); 215 py = (cost*sinp*pxnew + cosp*pynew + sin 223 py = (cost*sinp*pxnew + cosp*pynew + sint*sinp*pznew); 216 pz = (-sint*pxnew + cos 224 pz = (-sint*pxnew + cost*pznew); >> 225 // G4ThreeVector it(a,b,c); >> 226 // p0->SetMomentum(it); >> 227 // G4ThreeVector aTargetMom = theInitial - it; >> 228 // targetParticle->SetMomentum(aTargetMom); 217 } 229 } 218 else { 230 else { 219 px = pxnew; 231 px = pxnew; 220 py = pynew; 232 py = pynew; 221 pz = pznew; 233 pz = pznew; 222 } 234 } 223 235 224 if (verboseLevel > 1) { 236 if (verboseLevel > 1) { 225 G4cout << " AFTER SCATTER..." << G4endl 237 G4cout << " AFTER SCATTER..." << G4endl; 226 G4cout << " particle 1 momentum in CM " 238 G4cout << " particle 1 momentum in CM " << px/GeV << " " << py/GeV << " " 227 << pz/GeV << " " << p/GeV << G4endl 239 << pz/GeV << " " << p/GeV << G4endl; 228 } 240 } 229 241 230 // Transform to lab system 242 // Transform to lab system 231 243 232 G4double E1pM2 = E1 + M2; 244 G4double E1pM2 = E1 + M2; 233 G4double betaCM = P/E1pM2; 245 G4double betaCM = P/E1pM2; 234 G4double betaCMx = Px/E1pM2; 246 G4double betaCMx = Px/E1pM2; 235 G4double betaCMy = Py/E1pM2; 247 G4double betaCMy = Py/E1pM2; 236 G4double betaCMz = Pz/E1pM2; 248 G4double betaCMz = Pz/E1pM2; 237 G4double gammaCM = E1pM2/std::sqrt(E1pM2*E 249 G4double gammaCM = E1pM2/std::sqrt(E1pM2*E1pM2 - P*P); 238 250 239 if (verboseLevel > 1) { 251 if (verboseLevel > 1) { 240 G4cout << " betaCM " << betaCMx << " " 252 G4cout << " betaCM " << betaCMx << " " << betaCMy << " " 241 << betaCMz << " " << betaCM << G4 253 << betaCMz << " " << betaCM << G4endl; 242 G4cout << " gammaCM " << gammaCM << G4e 254 G4cout << " gammaCM " << gammaCM << G4endl; 243 } 255 } 244 256 245 // Now following GLOREN... 257 // Now following GLOREN... 246 258 247 G4double BETA[5], PA[5], PB[5]; 259 G4double BETA[5], PA[5], PB[5]; 248 BETA[1] = -betaCMx; 260 BETA[1] = -betaCMx; 249 BETA[2] = -betaCMy; 261 BETA[2] = -betaCMy; 250 BETA[3] = -betaCMz; 262 BETA[3] = -betaCMz; 251 BETA[4] = gammaCM; 263 BETA[4] = gammaCM; 252 264 253 //The incident particle... 265 //The incident particle... 254 266 255 PA[1] = px; 267 PA[1] = px; 256 PA[2] = py; 268 PA[2] = py; 257 PA[3] = pz; 269 PA[3] = pz; 258 PA[4] = std::sqrt(M1*M1 + p*p); 270 PA[4] = std::sqrt(M1*M1 + p*p); 259 271 260 G4double BETPA = BETA[1]*PA[1] + BETA[2]* 272 G4double BETPA = BETA[1]*PA[1] + BETA[2]*PA[2] + BETA[3]*PA[3]; 261 G4double BPGAM = (BETPA * BETA[4]/(BETA[4 273 G4double BPGAM = (BETPA * BETA[4]/(BETA[4] + 1.) - PA[4]) * BETA[4]; 262 274 263 PB[1] = PA[1] + BPGAM * BETA[1]; 275 PB[1] = PA[1] + BPGAM * BETA[1]; 264 PB[2] = PA[2] + BPGAM * BETA[2]; 276 PB[2] = PA[2] + BPGAM * BETA[2]; 265 PB[3] = PA[3] + BPGAM * BETA[3]; 277 PB[3] = PA[3] + BPGAM * BETA[3]; 266 PB[4] = (PA[4] - BETPA) * BETA[4]; 278 PB[4] = (PA[4] - BETPA) * BETA[4]; 267 279 268 G4DynamicParticle* newP = new G4DynamicPar 280 G4DynamicParticle* newP = new G4DynamicParticle; 269 newP->SetDefinition(aParticle->GetDefiniti << 281 newP->SetDefinition(const_cast<G4ParticleDefinition *>(aParticle->GetDefinition())); 270 newP->SetMomentum(G4ThreeVector(PB[1], PB[ 282 newP->SetMomentum(G4ThreeVector(PB[1], PB[2], PB[3])); 271 283 272 //The target particle... 284 //The target particle... 273 285 274 PA[1] = -px; 286 PA[1] = -px; 275 PA[2] = -py; 287 PA[2] = -py; 276 PA[3] = -pz; 288 PA[3] = -pz; 277 PA[4] = std::sqrt(M2*M2 + p*p); 289 PA[4] = std::sqrt(M2*M2 + p*p); 278 290 279 BETPA = BETA[1]*PA[1] + BETA[2]*PA[2] + B 291 BETPA = BETA[1]*PA[1] + BETA[2]*PA[2] + BETA[3]*PA[3]; 280 BPGAM = (BETPA * BETA[4]/(BETA[4] + 1.) - 292 BPGAM = (BETPA * BETA[4]/(BETA[4] + 1.) - PA[4]) * BETA[4]; 281 293 282 PB[1] = PA[1] + BPGAM * BETA[1]; 294 PB[1] = PA[1] + BPGAM * BETA[1]; 283 PB[2] = PA[2] + BPGAM * BETA[2]; 295 PB[2] = PA[2] + BPGAM * BETA[2]; 284 PB[3] = PA[3] + BPGAM * BETA[3]; 296 PB[3] = PA[3] + BPGAM * BETA[3]; 285 PB[4] = (PA[4] - BETPA) * BETA[4]; 297 PB[4] = (PA[4] - BETPA) * BETA[4]; 286 298 287 targetParticle->SetMomentum(G4ThreeVector( 299 targetParticle->SetMomentum(G4ThreeVector(PB[1], PB[2], PB[3])); 288 300 289 if (verboseLevel > 1) { 301 if (verboseLevel > 1) { 290 G4cout << " particle 1 momentum in LAB 302 G4cout << " particle 1 momentum in LAB " 291 << newP->GetMomentum()*(1./GeV) 303 << newP->GetMomentum()*(1./GeV) 292 << " " << newP->GetTotalMomentum()/ 304 << " " << newP->GetTotalMomentum()/GeV << G4endl; 293 G4cout << " particle 2 momentum in LAB 305 G4cout << " particle 2 momentum in LAB " 294 << targetParticle->GetMomentum()*(1 306 << targetParticle->GetMomentum()*(1./GeV) 295 << " " << targetParticle->GetTotalM 307 << " " << targetParticle->GetTotalMomentum()/GeV << G4endl; 296 G4cout << " TOTAL momentum in LAB " 308 G4cout << " TOTAL momentum in LAB " 297 << (newP->GetMomentum()+targetParti 309 << (newP->GetMomentum()+targetParticle->GetMomentum())*(1./GeV) 298 << " " 310 << " " 299 << (newP->GetMomentum()+targetParti 311 << (newP->GetMomentum()+targetParticle->GetMomentum()).mag()/GeV 300 << G4endl; 312 << G4endl; 301 } 313 } 302 314 303 theParticleChange.SetMomentumChange(newP-> << 315 // charge symmetry.... 304 theParticleChange.SetEnergyChange(newP->Ge << 316 if(G4UniformRand()<.5) 305 delete newP; << 317 { 306 theParticleChange.AddSecondary(targetParti << 318 theParticleChange.SetMomentumChange(newP->GetMomentumDirection()); 307 << 319 theParticleChange.SetEnergyChange(newP->GetKineticEnergy()); >> 320 delete newP; >> 321 G4DynamicParticle* p1 = new G4DynamicParticle; >> 322 p1->SetDefinition(targetParticle->GetDefinition()); >> 323 p1->SetMomentum(targetParticle->GetMomentum()); >> 324 theParticleChange.AddSecondary(p1); >> 325 } >> 326 else >> 327 { >> 328 theParticleChange.SetStatusChange(stopAndKill); >> 329 G4DynamicParticle * pA = new G4DynamicParticle; >> 330 pA->SetDefinition(targetParticle->GetDefinition()); >> 331 pA->SetMomentum(newP->GetMomentum()); >> 332 G4DynamicParticle * pB = new G4DynamicParticle; >> 333 pB->SetDefinition(newP->GetDefinition()); >> 334 pB->SetMomentum(targetParticle->GetMomentum()); >> 335 delete newP; >> 336 theParticleChange.AddSecondary(pA); >> 337 theParticleChange.AddSecondary(pB); >> 338 } 308 return &theParticleChange; 339 return &theParticleChange; 309 } << 310 << 311 ////////////////////////////////////////////// << 312 // << 313 // sample momentum transfer using Lab. momentu << 314 << 315 G4double G4LEnp::SampleInvariantT(const G4Part << 316 G4double plab, G4int , G4int ) << 317 { << 318 G4double nMass = p->GetPDGMass(); // 939.565 << 319 G4double ek = std::sqrt(plab*plab+nMass*nMas << 320 << 321 // Find energy bin << 322 << 323 G4int je1 = 0; << 324 G4int je2 = NENERGY - 1; << 325 ek = ek/GeV; << 326 << 327 do << 328 { << 329 G4int midBin = (je1 + je2)/2; << 330 if (ek < elab[midBin]) << 331 je2 = midBin; << 332 else << 333 je1 = midBin; << 334 } while (je2 - je1 > 1); /* Loop checking, << 335 << 336 G4double delab = elab[je2] - elab[je1]; << 337 << 338 // Sample the angle << 339 << 340 G4double sample = G4UniformRand(); << 341 G4int ke1 = 0; << 342 G4int ke2 = NANGLE - 1; << 343 G4double dsig = sig[je2][0] - sig[je1][0]; << 344 G4double rc = dsig/delab; << 345 G4double b = sig[je1][0] - rc*elab[je1]; << 346 G4double sigint1 = rc*ek + b; << 347 G4double sigint2 = 0.; << 348 << 349 do << 350 { << 351 G4int midBin = (ke1 + ke2)/2; << 352 dsig = sig[je2][midBin] - sig[je1][midBi << 353 rc = dsig/delab; << 354 b = sig[je1][midBin] - rc*elab[je1]; << 355 G4double sigint = rc*ek + b; << 356 << 357 if (sample < sigint) << 358 { << 359 ke2 = midBin; << 360 sigint2 = sigint; << 361 } << 362 else << 363 { << 364 ke1 = midBin; << 365 sigint1 = sigint; << 366 } << 367 } while (ke2 - ke1 > 1); /* Loop checking, << 368 << 369 dsig = sigint2 - sigint1; << 370 rc = 1./dsig; << 371 b = ke1 - rc*sigint1; << 372 << 373 G4double kint = rc*sample + b; << 374 G4double theta = (0.5 + kint)*pi/180.; << 375 G4double t = 0.5*plab*plab*(1-std::cos(theta << 376 << 377 return t; << 378 } 340 } 379 341 380 // end of file 342 // end of file 381 343