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