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 header file 30 // 31 // 32 // File name: G4eeToHadronsModel 33 // 34 // Author: Vladimir Ivanchenko 35 // 36 // Creation date: 12.08.2003 37 // 38 // Modifications: 39 // 08-04-05 Major optimisation of internal int 40 // 18-05-05 Use optimized interfaces (V.Ivantc 41 // 42 // 43 // ------------------------------------------- 44 // 45 46 47 //....oooOO0OOooo........oooOO0OOooo........oo 48 //....oooOO0OOooo........oooOO0OOooo........oo 49 50 #include "G4eeToHadronsModel.hh" 51 #include "Randomize.hh" 52 #include "G4PhysicalConstants.hh" 53 #include "G4SystemOfUnits.hh" 54 #include "G4Electron.hh" 55 #include "G4Gamma.hh" 56 #include "G4Positron.hh" 57 #include "G4PionPlus.hh" 58 #include "Randomize.hh" 59 #include "G4Vee2hadrons.hh" 60 #include "G4PhysicsVector.hh" 61 #include "G4PhysicsLogVector.hh" 62 #include "G4Log.hh" 63 #include "G4Exp.hh" 64 65 //....oooOO0OOooo........oooOO0OOooo........oo 66 67 using namespace std; 68 69 G4eeToHadronsModel::G4eeToHadronsModel(G4Vee2h 70 const G 71 : G4VEmModel(nam), 72 model(mod), 73 verbose(ver) 74 { 75 theGamma = G4Gamma::Gamma(); 76 highKinEnergy = HighEnergyLimit(); 77 lowKinEnergy = LowEnergyLimit(); 78 emin = lowKinEnergy; 79 emax = highKinEnergy; 80 peakKinEnergy = highKinEnergy; 81 epeak = emax; 82 //verbose = 1; 83 } 84 85 //....oooOO0OOooo........oooOO0OOooo........oo 86 87 G4eeToHadronsModel::~G4eeToHadronsModel() 88 { 89 delete model; 90 } 91 92 //....oooOO0OOooo........oooOO0OOooo........oo 93 94 void G4eeToHadronsModel::Initialise(const G4Pa 95 const G4Da 96 { 97 if(isInitialised) { return; } 98 isInitialised = true; 99 100 // CM system 101 emin = model->LowEnergy(); 102 emax = model->HighEnergy(); 103 104 // peak energy 105 epeak = std::min(model->PeakEnergy(), emax); 106 107 if(verbose>0) { 108 G4cout << "G4eeToHadronsModel::Initialise: 109 G4cout << "CM System: emin(MeV)= " << emin 110 << " epeak(MeV)= " << epeak/MeV 111 << " emax(MeV)= " << emax/MeV 112 << G4endl; 113 } 114 115 crossBornPerElectron = model->PhysicsVector( 116 crossPerElectron = model->PhysicsVector( 117 nbins = (G4int)crossPerElectron->GetVectorLe 118 for(G4int i=0; i<nbins; ++i) { 119 G4double e = crossPerElectron->Energy(i); 120 G4double cs = model->ComputeCrossSection(e 121 crossBornPerElectron->PutValue(i, cs); 122 } 123 ComputeCMCrossSectionPerElectron(); 124 125 if(verbose>1) { 126 G4cout << "G4eeToHadronsModel: Cross secti 127 << " nbins= " << nbins 128 << " emin(MeV)= " << emin/MeV 129 << " emax(MeV)= " << emax/MeV 130 << G4endl; 131 for(G4int i=0; i<nbins; ++i) { 132 G4double e = crossPerElectron->Energy(i 133 G4double s1 = crossPerElectron->Value(e) 134 G4double s2 = crossBornPerElectron->Valu 135 G4cout << "E(MeV)= " << e/MeV 136 << " cross(nb)= " << s1/nanobarn 137 << " crossBorn(nb)= " << s2/nano 138 << G4endl; 139 } 140 } 141 } 142 143 //....oooOO0OOooo........oooOO0OOooo........oo 144 145 G4double G4eeToHadronsModel::CrossSectionPerVo 146 const G4Material* mat, 147 const G4ParticleDefinition* p, 148 G4double kineticEnergy, 149 G4double, G4double) 150 { 151 return mat->GetElectronDensity()* 152 ComputeCrossSectionPerElectron(p, kineticE 153 } 154 155 //....oooOO0OOooo........oooOO0OOooo........oo 156 157 G4double G4eeToHadronsModel::ComputeCrossSecti 158 const G4 159 G4double kineticEnergy, 160 G4double Z, G4double, 161 G4double, G4double) 162 { 163 return Z*ComputeCrossSectionPerElectron(p, k 164 } 165 166 //....oooOO0OOooo........oooOO0OOooo........oo 167 168 G4double G4eeToHadronsModel::ComputeCrossSecti 169 cons 170 171 172 { 173 return crossPerElectron->Value(energy); 174 } 175 176 //....oooOO0OOooo........oooOO0OOooo........oo 177 178 void G4eeToHadronsModel::SampleSecondaries(std 179 const G4MaterialCutsCouple*, 180 const G4DynamicParticle* dParticl 181 G4double, 182 G4double) 183 { 184 G4double t = dParticle->GetKineticEnergy() + 185 G4LorentzVector inlv = dParticle->Get4Moment 186 G4LorentzVector(0.0,0.0,0.0,electron_mass_ 187 G4double e = inlv.m(); 188 G4ThreeVector inBoost = inlv.boostVector(); 189 //G4cout << "G4eeToHadronsModel::SampleSecon 190 // << " " << inlv << " " << inBoost <<G4 191 if(e > emin) { 192 G4DynamicParticle* gamma = GenerateCMPhoto 193 G4LorentzVector gLv = gamma->Get4Momentum( 194 G4LorentzVector lv(0.0,0.0,0.0,e); 195 lv -= gLv; 196 G4double mass = lv.m(); 197 //G4cout << "mass= " << mass << " " << lv 198 G4ThreeVector boost = lv.boostVector(); 199 //G4cout << "mass= " << mass << " " << boo 200 const G4ThreeVector dir = gamma->GetMoment 201 model->SampleSecondaries(newp, mass, dir); 202 std::size_t np = newp->size(); 203 for(std::size_t j=0; j<np; ++j) { 204 G4DynamicParticle* dp = (*newp)[j]; 205 G4LorentzVector v = dp->Get4Momentum(); 206 v.boost(boost); 207 //G4cout << j << ". " << v << G4endl; 208 v.boost(inBoost); 209 //G4cout << " " << v << G4endl; 210 dp->Set4Momentum(v); 211 t -= v.e(); 212 } 213 //G4cout << "Gamma " << gLv << G4endl; 214 gLv.boost(inBoost); 215 //G4cout << " " << gLv << G4endl; 216 gamma->Set4Momentum(gLv); 217 t -= gLv.e(); 218 newp->push_back(gamma); 219 if(std::abs(t) > CLHEP::MeV) { 220 G4cout << "G4eeToHadronsModel::SampleSec 221 << t/MeV << " primary 4-momentum: " << 222 } 223 } 224 } 225 226 //....oooOO0OOooo........oooOO0OOooo........oo 227 228 void G4eeToHadronsModel::ComputeCMCrossSection 229 { 230 for(G4int i=0; i<nbins; i++) { 231 G4double e = crossPerElectron->Energy(i); 232 G4double cs = 0.0; 233 if(i > 0) { 234 G4double LL = 2.0*G4Log(e/electron_mas 235 G4double bt = 2.0*fine_structure_const* 236 G4double btm1= bt - 1.0; 237 G4double del = 1. + fine_structure_const 238 G4double s1 = crossBornPerElectron->Val 239 G4double e1 = crossPerElectron->Energy( 240 G4double x1 = 1. - e1/e; 241 cs += s1*(del*G4Exp(G4Log(x1)*bt) - bt*( 242 if(i > 1) { 243 G4double e2 = e1; 244 G4double x2 = x1; 245 G4double s2 = crossBornPerElectron->Value(e 246 G4double w2 = bt*(del*G4Exp(G4Log(x2)*btm1) 247 G4double w1; 248 249 for(G4int j=i-2; j>=0; --j) { 250 e1 = crossPerElectron->Energy(j); 251 x1 = 1. - e1/e; 252 s1 = crossBornPerElectron->Value(e1); 253 w1 = bt*(del*G4Exp(G4Log(x1)*btm1) - 1.0 254 cs += 0.5*(x1 - x2)*(w2*s2 + w1*s1); 255 e2 = e1; 256 x2 = x1; 257 s2 = s1; 258 w2 = w1; 259 } 260 } 261 } 262 crossPerElectron->PutValue(i, cs); 263 } 264 } 265 266 //....oooOO0OOooo........oooOO0OOooo........oo 267 268 G4DynamicParticle* G4eeToHadronsModel::Generat 269 { 270 G4double x; 271 G4DynamicParticle* gamma = nullptr; 272 G4double LL = 2.0*G4Log(e/electron_mass_c2 273 G4double bt = 2.0*fine_structure_const*(LL 274 G4double btm1= bt - 1.0; 275 G4double del = 1. + fine_structure_const*(1. 276 277 G4double s0 = crossBornPerElectron->Value(e) 278 G4double de = (emax - emin)/(G4double)nbins; 279 G4double xmax = 0.5*(1.0 - (emin*emin)/(e*e) 280 G4double xmin = std::min(de/e, xmax); 281 G4double ds = s0*(del*G4Exp(G4Log(xmin)*bt) 282 G4double e1 = e*(1. - xmin); 283 284 //G4cout << "e1= " << e1 << G4endl; 285 if(e1 < emax && s0*G4UniformRand()<ds) { 286 x = xmin*G4Exp(G4Log(G4UniformRand())/bt); 287 } else { 288 289 x = xmin; 290 G4double s1 = crossBornPerElectron->Value( 291 G4double w1 = bt*(del*G4Exp(G4Log(x)*btm1) 292 G4double grej = s1*w1; 293 G4double f; 294 /* 295 G4cout << "e(GeV)= " << e/GeV << " epeak( 296 << " s1= " << s1 << " w1= " << w1 297 << " grej= " << grej << G4endl; 298 */ 299 // Above emax cross section is const 300 if(e1 > emax) { 301 x = 0.5*(1. - (emax*emax)/(e*e)); 302 G4double s2 = crossBornPerElectron->Valu 303 G4double w2 = bt*(del*G4Exp(G4Log(x)*btm 304 grej = s2*w2; 305 //G4cout << "emax= " << emax << " s2= " 306 // << " grej= " << grej << G4endl; 307 } 308 309 if(e1 > epeak) { 310 x = 0.5*(1.0 - (epeak*epeak)/(e*e)); 311 G4double s2 = crossBornPerElectron->Valu 312 G4double w2 = bt*(del*G4Exp(G4Log(x)*btm 313 grej = std::max(grej,s2*w2); 314 //G4cout << "epeak= " << epeak << " s2= 315 // << " grej= " << grej << G4endl; 316 } 317 G4int ii = 0; 318 const G4int iimax = 1000; 319 do { 320 x = xmin + G4UniformRand()*(xmax - xmin) 321 322 G4double s2 = crossBornPerElectron->Valu 323 G4double w2 = bt*(del*G4Exp(G4Log(x)*btm 324 /* 325 G4cout << "x= " << x << " xmin= " << xmi 326 << " s2= " << s2 << " w2= " << w2 < 327 */ 328 f = s2*w2; 329 if(f > grej) { 330 G4cout << "G4DynamicParticle* G4eeToHadronsM 331 << f << " > " << grej << " majorant i 332 << G4endl; 333 } 334 if(++ii >= iimax) { break; } 335 // Loop checking, 07-Aug-2015, Vladimir 336 } while (f < grej*G4UniformRand()); 337 } 338 339 G4ThreeVector dir(0.0,0.0,1.0); 340 if(G4UniformRand() > 0.5) { dir.set(0.0,0.0, 341 //G4cout << "Egamma(MeV)= " << x*e << " " < 342 gamma = new G4DynamicParticle(theGamma,dir,x 343 return gamma; 344 } 345 346 //....oooOO0OOooo........oooOO0OOooo........oo 347