Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4DiffuseElastic.cc
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26// $Id$
27//
28//
29// Physics model class G4DiffuseElastic
30//
31//
32// G4 Model: optical diffuse elastic scattering with 4-momentum balance
33//
34// 24-May-07 V. Grichine
35//
36
37#include "G4DiffuseElastic.hh"
38#include "G4ParticleTable.hh"
40#include "G4IonTable.hh"
41#include "G4NucleiProperties.hh"
42
43#include "Randomize.hh"
44#include "G4Integrator.hh"
45#include "globals.hh"
47#include "G4SystemOfUnits.hh"
48
49#include "G4Proton.hh"
50#include "G4Neutron.hh"
51#include "G4Deuteron.hh"
52#include "G4Alpha.hh"
53#include "G4PionPlus.hh"
54#include "G4PionMinus.hh"
55
56#include "G4Element.hh"
57#include "G4ElementTable.hh"
58#include "G4PhysicsTable.hh"
59#include "G4PhysicsLogVector.hh"
61
62/////////////////////////////////////////////////////////////////////////
63//
64// Test Constructor. Just to check xsc
65
66
68 : G4HadronElastic("DiffuseElastic"), fParticle(0)
69{
70 SetMinEnergy( 0.01*GeV );
71 SetMaxEnergy( 1.*TeV );
72 verboseLevel = 0;
73 lowEnergyRecoilLimit = 100.*keV;
74 lowEnergyLimitQ = 0.0*GeV;
75 lowEnergyLimitHE = 0.0*GeV;
76 lowestEnergyLimit= 0.0*keV;
77 plabLowLimit = 20.0*MeV;
78
79 theProton = G4Proton::Proton();
80 theNeutron = G4Neutron::Neutron();
81 theDeuteron = G4Deuteron::Deuteron();
82 theAlpha = G4Alpha::Alpha();
83 thePionPlus = G4PionPlus::PionPlus();
84 thePionMinus= G4PionMinus::PionMinus();
85
86 fEnergyBin = 200;
87 fAngleBin = 200;
88
89 fEnergyVector = new G4PhysicsLogVector( theMinEnergy, theMaxEnergy, fEnergyBin );
90 fAngleTable = 0;
91
92 fParticle = 0;
93 fWaveVector = 0.;
94 fAtomicWeight = 0.;
95 fAtomicNumber = 0.;
96 fNuclearRadius = 0.;
97 fBeta = 0.;
98 fZommerfeld = 0.;
99 fAm = 0.;
100 fAddCoulomb = false;
101}
102
103//////////////////////////////////////////////////////////////////////////////
104//
105// Destructor
106
108{
109 if(fEnergyVector) delete fEnergyVector;
110
111 if( fAngleTable )
112 {
113 fAngleTable->clearAndDestroy();
114 delete fAngleTable ;
115 }
116}
117
118//////////////////////////////////////////////////////////////////////////////
119//
120// Initialisation for given particle using element table of application
121
123{
124
125 // fEnergyVector = new G4PhysicsLogVector( theMinEnergy, theMaxEnergy, fEnergyBin );
126
127 const G4ElementTable* theElementTable = G4Element::GetElementTable();
128
129 size_t jEl, numOfEl = G4Element::GetNumberOfElements();
130
131 for(jEl = 0 ; jEl < numOfEl; ++jEl) // application element loop
132 {
133 fAtomicNumber = (*theElementTable)[jEl]->GetZ(); // atomic number
134 fAtomicWeight = (*theElementTable)[jEl]->GetN(); // number of nucleons
135 fNuclearRadius = CalculateNuclearRad(fAtomicWeight);
136
137 if(verboseLevel > 0)
138 {
139 G4cout<<"G4DiffuseElastic::Initialise() the element: "
140 <<(*theElementTable)[jEl]->GetName()<<G4endl;
141 }
142 fElementNumberVector.push_back(fAtomicNumber);
143 fElementNameVector.push_back((*theElementTable)[jEl]->GetName());
144
146 fAngleBank.push_back(fAngleTable);
147 }
148 return;
149}
150
151////////////////////////////////////////////////////////////////////////////
152//
153// return differential elastic cross section d(sigma)/d(omega)
154
157 G4double theta,
158 G4double momentum,
159 G4double A )
160{
161 fParticle = particle;
162 fWaveVector = momentum/hbarc;
163 fAtomicWeight = A;
164 fAddCoulomb = false;
165 fNuclearRadius = CalculateNuclearRad(A);
166
167 G4double sigma = fNuclearRadius*fNuclearRadius*GetDiffElasticProb(theta);
168
169 return sigma;
170}
171
172////////////////////////////////////////////////////////////////////////////
173//
174// return invariant differential elastic cross section d(sigma)/d(tMand)
175
178 G4double tMand,
179 G4double plab,
180 G4double A, G4double Z )
181{
182 G4double m1 = particle->GetPDGMass();
183 G4LorentzVector lv1(0.,0.,plab,std::sqrt(plab*plab+m1*m1));
184
185 G4int iZ = static_cast<G4int>(Z+0.5);
186 G4int iA = static_cast<G4int>(A+0.5);
187 G4ParticleDefinition * theDef = 0;
188
189 if (iZ == 1 && iA == 1) theDef = theProton;
190 else if (iZ == 1 && iA == 2) theDef = theDeuteron;
191 else if (iZ == 1 && iA == 3) theDef = G4Triton::Triton();
192 else if (iZ == 2 && iA == 3) theDef = G4He3::He3();
193 else if (iZ == 2 && iA == 4) theDef = theAlpha;
194 else theDef = G4ParticleTable::GetParticleTable()->FindIon(iZ,iA,0,iZ);
195
196 G4double tmass = theDef->GetPDGMass();
197
198 G4LorentzVector lv(0.0,0.0,0.0,tmass);
199 lv += lv1;
200
201 G4ThreeVector bst = lv.boostVector();
202 lv1.boost(-bst);
203
204 G4ThreeVector p1 = lv1.vect();
205 G4double ptot = p1.mag();
206 G4double ptot2 = ptot*ptot;
207 G4double cost = 1 - 0.5*std::fabs(tMand)/ptot2;
208
209 if( cost >= 1.0 ) cost = 1.0;
210 else if( cost <= -1.0) cost = -1.0;
211
212 G4double thetaCMS = std::acos(cost);
213
214 G4double sigma = GetDiffuseElasticXsc( particle, thetaCMS, ptot, A);
215
216 sigma *= pi/ptot2;
217
218 return sigma;
219}
220
221////////////////////////////////////////////////////////////////////////////
222//
223// return differential elastic cross section d(sigma)/d(omega) with Coulomb
224// correction
225
228 G4double theta,
229 G4double momentum,
230 G4double A, G4double Z )
231{
232 fParticle = particle;
233 fWaveVector = momentum/hbarc;
234 fAtomicWeight = A;
235 fAtomicNumber = Z;
236 fNuclearRadius = CalculateNuclearRad(A);
237 fAddCoulomb = false;
238
239 G4double z = particle->GetPDGCharge();
240
241 G4double kRt = fWaveVector*fNuclearRadius*theta;
242 G4double kRtC = 1.9;
243
244 if( z && (kRt > kRtC) )
245 {
246 fAddCoulomb = true;
247 fBeta = CalculateParticleBeta( particle, momentum);
248 fZommerfeld = CalculateZommerfeld( fBeta, z, fAtomicNumber);
249 fAm = CalculateAm( momentum, fZommerfeld, fAtomicNumber);
250 }
251 G4double sigma = fNuclearRadius*fNuclearRadius*GetDiffElasticSumProb(theta);
252
253 return sigma;
254}
255
256////////////////////////////////////////////////////////////////////////////
257//
258// return invariant differential elastic cross section d(sigma)/d(tMand) with Coulomb
259// correction
260
263 G4double tMand,
264 G4double plab,
265 G4double A, G4double Z )
266{
267 G4double m1 = particle->GetPDGMass();
268
269 G4LorentzVector lv1(0.,0.,plab,std::sqrt(plab*plab+m1*m1));
270
271 G4int iZ = static_cast<G4int>(Z+0.5);
272 G4int iA = static_cast<G4int>(A+0.5);
273
274 G4ParticleDefinition* theDef = 0;
275
276 if (iZ == 1 && iA == 1) theDef = theProton;
277 else if (iZ == 1 && iA == 2) theDef = theDeuteron;
278 else if (iZ == 1 && iA == 3) theDef = G4Triton::Triton();
279 else if (iZ == 2 && iA == 3) theDef = G4He3::He3();
280 else if (iZ == 2 && iA == 4) theDef = theAlpha;
281 else theDef = G4ParticleTable::GetParticleTable()->FindIon(iZ,iA,0,iZ);
282
283 G4double tmass = theDef->GetPDGMass();
284
285 G4LorentzVector lv(0.0,0.0,0.0,tmass);
286 lv += lv1;
287
288 G4ThreeVector bst = lv.boostVector();
289 lv1.boost(-bst);
290
291 G4ThreeVector p1 = lv1.vect();
292 G4double ptot = p1.mag();
293 G4double ptot2 = ptot*ptot;
294 G4double cost = 1 - 0.5*std::fabs(tMand)/ptot2;
295
296 if( cost >= 1.0 ) cost = 1.0;
297 else if( cost <= -1.0) cost = -1.0;
298
299 G4double thetaCMS = std::acos(cost);
300
301 G4double sigma = GetDiffuseElasticSumXsc( particle, thetaCMS, ptot, A, Z );
302
303 sigma *= pi/ptot2;
304
305 return sigma;
306}
307
308////////////////////////////////////////////////////////////////////////////
309//
310// return invariant differential elastic cross section d(sigma)/d(tMand) with Coulomb
311// correction
312
315 G4double tMand,
316 G4double plab,
317 G4double A, G4double Z )
318{
319 G4double m1 = particle->GetPDGMass();
320 G4LorentzVector lv1(0.,0.,plab,std::sqrt(plab*plab+m1*m1));
321
322 G4int iZ = static_cast<G4int>(Z+0.5);
323 G4int iA = static_cast<G4int>(A+0.5);
324 G4ParticleDefinition * theDef = 0;
325
326 if (iZ == 1 && iA == 1) theDef = theProton;
327 else if (iZ == 1 && iA == 2) theDef = theDeuteron;
328 else if (iZ == 1 && iA == 3) theDef = G4Triton::Triton();
329 else if (iZ == 2 && iA == 3) theDef = G4He3::He3();
330 else if (iZ == 2 && iA == 4) theDef = theAlpha;
331 else theDef = G4ParticleTable::GetParticleTable()->FindIon(iZ,iA,0,iZ);
332
333 G4double tmass = theDef->GetPDGMass();
334
335 G4LorentzVector lv(0.0,0.0,0.0,tmass);
336 lv += lv1;
337
338 G4ThreeVector bst = lv.boostVector();
339 lv1.boost(-bst);
340
341 G4ThreeVector p1 = lv1.vect();
342 G4double ptot = p1.mag();
343 G4double ptot2 = ptot*ptot;
344 G4double cost = 1 - 0.5*std::fabs(tMand)/ptot2;
345
346 if( cost >= 1.0 ) cost = 1.0;
347 else if( cost <= -1.0) cost = -1.0;
348
349 G4double thetaCMS = std::acos(cost);
350
351 G4double sigma = GetCoulombElasticXsc( particle, thetaCMS, ptot, Z );
352
353 sigma *= pi/ptot2;
354
355 return sigma;
356}
357
358////////////////////////////////////////////////////////////////////////////
359//
360// return differential elastic probability d(probability)/d(omega)
361
363G4DiffuseElastic::GetDiffElasticProb( // G4ParticleDefinition* particle,
364 G4double theta
365 // G4double momentum,
366 // G4double A
367 )
368{
369 G4double sigma, bzero, bzero2, bonebyarg, bonebyarg2, damp, damp2;
370 G4double delta, diffuse, gamma;
371 G4double e1, e2, bone, bone2;
372
373 // G4double wavek = momentum/hbarc; // wave vector
374 // G4double r0 = 1.08*fermi;
375 // G4double rad = r0*std::pow(A, 1./3.);
376
377 G4double kr = fWaveVector*fNuclearRadius; // wavek*rad;
378 G4double kr2 = kr*kr;
379 G4double krt = kr*theta;
380
381 bzero = BesselJzero(krt);
382 bzero2 = bzero*bzero;
383 bone = BesselJone(krt);
384 bone2 = bone*bone;
385 bonebyarg = BesselOneByArg(krt);
386 bonebyarg2 = bonebyarg*bonebyarg;
387
388 if (fParticle == theProton)
389 {
390 diffuse = 0.63*fermi;
391 gamma = 0.3*fermi;
392 delta = 0.1*fermi*fermi;
393 e1 = 0.3*fermi;
394 e2 = 0.35*fermi;
395 }
396 else // as proton, if were not defined
397 {
398 diffuse = 0.63*fermi;
399 gamma = 0.3*fermi;
400 delta = 0.1*fermi*fermi;
401 e1 = 0.3*fermi;
402 e2 = 0.35*fermi;
403 }
404 G4double lambda = 15.; // 15 ok
405
406 // G4double kgamma = fWaveVector*gamma; // wavek*delta;
407
408 G4double kgamma = lambda*(1.-std::exp(-fWaveVector*gamma/lambda)); // wavek*delta;
409 G4double kgamma2 = kgamma*kgamma;
410
411 // G4double dk2t = delta*fWaveVector*fWaveVector*theta; // delta*wavek*wavek*theta;
412 // G4double dk2t2 = dk2t*dk2t;
413 // G4double pikdt = pi*fWaveVector*diffuse*theta;// pi*wavek*diffuse*theta;
414
415 G4double pikdt = lambda*(1.-std::exp(-pi*fWaveVector*diffuse*theta/lambda)); // wavek*delta;
416
417 damp = DampFactor(pikdt);
418 damp2 = damp*damp;
419
420 G4double mode2k2 = (e1*e1+e2*e2)*fWaveVector*fWaveVector;
421 G4double e2dk3t = -2.*e2*delta*fWaveVector*fWaveVector*fWaveVector*theta;
422
423
424 sigma = kgamma2;
425 // sigma += dk2t2;
426 sigma *= bzero2;
427 sigma += mode2k2*bone2 + e2dk3t*bzero*bone;
428 sigma += kr2*bonebyarg2;
429 sigma *= damp2; // *rad*rad;
430
431 return sigma;
432}
433
434////////////////////////////////////////////////////////////////////////////
435//
436// return differential elastic probability d(probability)/d(omega) with
437// Coulomb correction
438
440G4DiffuseElastic::GetDiffElasticSumProb( // G4ParticleDefinition* particle,
441 G4double theta
442 // G4double momentum,
443 // G4double A
444 )
445{
446 G4double sigma, bzero, bzero2, bonebyarg, bonebyarg2, damp, damp2;
447 G4double delta, diffuse, gamma;
448 G4double e1, e2, bone, bone2;
449
450 // G4double wavek = momentum/hbarc; // wave vector
451 // G4double r0 = 1.08*fermi;
452 // G4double rad = r0*std::pow(A, 1./3.);
453
454 G4double kr = fWaveVector*fNuclearRadius; // wavek*rad;
455 G4double kr2 = kr*kr;
456 G4double krt = kr*theta;
457
458 bzero = BesselJzero(krt);
459 bzero2 = bzero*bzero;
460 bone = BesselJone(krt);
461 bone2 = bone*bone;
462 bonebyarg = BesselOneByArg(krt);
463 bonebyarg2 = bonebyarg*bonebyarg;
464
465 if (fParticle == theProton)
466 {
467 diffuse = 0.63*fermi;
468 // diffuse = 0.6*fermi;
469 gamma = 0.3*fermi;
470 delta = 0.1*fermi*fermi;
471 e1 = 0.3*fermi;
472 e2 = 0.35*fermi;
473 }
474 else // as proton, if were not defined
475 {
476 diffuse = 0.63*fermi;
477 gamma = 0.3*fermi;
478 delta = 0.1*fermi*fermi;
479 e1 = 0.3*fermi;
480 e2 = 0.35*fermi;
481 }
482 G4double lambda = 15.; // 15 ok
483 // G4double kgamma = fWaveVector*gamma; // wavek*delta;
484 G4double kgamma = lambda*(1.-std::exp(-fWaveVector*gamma/lambda)); // wavek*delta;
485
486 // G4cout<<"kgamma = "<<kgamma<<G4endl;
487
488 if(fAddCoulomb) // add Coulomb correction
489 {
490 G4double sinHalfTheta = std::sin(0.5*theta);
491 G4double sinHalfTheta2 = sinHalfTheta*sinHalfTheta;
492
493 kgamma += 0.5*fZommerfeld/kr/(sinHalfTheta2+fAm); // correction at J0()
494 // kgamma += 0.65*fZommerfeld/kr/(sinHalfTheta2+fAm); // correction at J0()
495 }
496
497 G4double kgamma2 = kgamma*kgamma;
498
499 // G4double dk2t = delta*fWaveVector*fWaveVector*theta; // delta*wavek*wavek*theta;
500 // G4cout<<"dk2t = "<<dk2t<<G4endl;
501 // G4double dk2t2 = dk2t*dk2t;
502 // G4double pikdt = pi*fWaveVector*diffuse*theta;// pi*wavek*diffuse*theta;
503
504 G4double pikdt = lambda*(1.-std::exp(-pi*fWaveVector*diffuse*theta/lambda)); // wavek*delta;
505
506 // G4cout<<"pikdt = "<<pikdt<<G4endl;
507
508 damp = DampFactor(pikdt);
509 damp2 = damp*damp;
510
511 G4double mode2k2 = (e1*e1+e2*e2)*fWaveVector*fWaveVector;
512 G4double e2dk3t = -2.*e2*delta*fWaveVector*fWaveVector*fWaveVector*theta;
513
514 sigma = kgamma2;
515 // sigma += dk2t2;
516 sigma *= bzero2;
517 sigma += mode2k2*bone2;
518 sigma += e2dk3t*bzero*bone;
519
520 // sigma += kr2*(1 + 8.*fZommerfeld*fZommerfeld/kr2)*bonebyarg2; // correction at J1()/()
521 sigma += kr2*bonebyarg2; // correction at J1()/()
522
523 sigma *= damp2; // *rad*rad;
524
525 return sigma;
526}
527
528
529////////////////////////////////////////////////////////////////////////////
530//
531// return differential elastic probability d(probability)/d(t) with
532// Coulomb correction
533
536{
537 G4double theta;
538
539 theta = std::sqrt(alpha);
540
541 // theta = std::acos( 1 - alpha/2. );
542
543 G4double sigma, bzero, bzero2, bonebyarg, bonebyarg2, damp, damp2;
544 G4double delta, diffuse, gamma;
545 G4double e1, e2, bone, bone2;
546
547 // G4double wavek = momentum/hbarc; // wave vector
548 // G4double r0 = 1.08*fermi;
549 // G4double rad = r0*std::pow(A, 1./3.);
550
551 G4double kr = fWaveVector*fNuclearRadius; // wavek*rad;
552 G4double kr2 = kr*kr;
553 G4double krt = kr*theta;
554
555 bzero = BesselJzero(krt);
556 bzero2 = bzero*bzero;
557 bone = BesselJone(krt);
558 bone2 = bone*bone;
559 bonebyarg = BesselOneByArg(krt);
560 bonebyarg2 = bonebyarg*bonebyarg;
561
562 if (fParticle == theProton)
563 {
564 diffuse = 0.63*fermi;
565 // diffuse = 0.6*fermi;
566 gamma = 0.3*fermi;
567 delta = 0.1*fermi*fermi;
568 e1 = 0.3*fermi;
569 e2 = 0.35*fermi;
570 }
571 else // as proton, if were not defined
572 {
573 diffuse = 0.63*fermi;
574 gamma = 0.3*fermi;
575 delta = 0.1*fermi*fermi;
576 e1 = 0.3*fermi;
577 e2 = 0.35*fermi;
578 }
579 G4double lambda = 15.; // 15 ok
580 // G4double kgamma = fWaveVector*gamma; // wavek*delta;
581 G4double kgamma = lambda*(1.-std::exp(-fWaveVector*gamma/lambda)); // wavek*delta;
582
583 // G4cout<<"kgamma = "<<kgamma<<G4endl;
584
585 if(fAddCoulomb) // add Coulomb correction
586 {
587 G4double sinHalfTheta = theta*0.5; // std::sin(0.5*theta);
588 G4double sinHalfTheta2 = sinHalfTheta*sinHalfTheta;
589
590 kgamma += 0.5*fZommerfeld/kr/(sinHalfTheta2+fAm); // correction at J0()
591 // kgamma += 0.65*fZommerfeld/kr/(sinHalfTheta2+fAm); // correction at J0()
592 }
593
594 G4double kgamma2 = kgamma*kgamma;
595
596 // G4double dk2t = delta*fWaveVector*fWaveVector*theta; // delta*wavek*wavek*theta;
597 // G4cout<<"dk2t = "<<dk2t<<G4endl;
598 // G4double dk2t2 = dk2t*dk2t;
599 // G4double pikdt = pi*fWaveVector*diffuse*theta;// pi*wavek*diffuse*theta;
600
601 G4double pikdt = lambda*(1.-std::exp(-pi*fWaveVector*diffuse*theta/lambda)); // wavek*delta;
602
603 // G4cout<<"pikdt = "<<pikdt<<G4endl;
604
605 damp = DampFactor(pikdt);
606 damp2 = damp*damp;
607
608 G4double mode2k2 = (e1*e1+e2*e2)*fWaveVector*fWaveVector;
609 G4double e2dk3t = -2.*e2*delta*fWaveVector*fWaveVector*fWaveVector*theta;
610
611 sigma = kgamma2;
612 // sigma += dk2t2;
613 sigma *= bzero2;
614 sigma += mode2k2*bone2;
615 sigma += e2dk3t*bzero*bone;
616
617 // sigma += kr2*(1 + 8.*fZommerfeld*fZommerfeld/kr2)*bonebyarg2; // correction at J1()/()
618 sigma += kr2*bonebyarg2; // correction at J1()/()
619
620 sigma *= damp2; // *rad*rad;
621
622 return sigma;
623}
624
625
626////////////////////////////////////////////////////////////////////////////
627//
628// return differential elastic probability 2*pi*sin(theta)*d(probability)/d(omega)
629
632{
633 G4double result;
634
635 result = GetDiffElasticSumProbA(alpha);
636
637 // result *= 2*pi*std::sin(theta);
638
639 return result;
640}
641
642////////////////////////////////////////////////////////////////////////////
643//
644// return integral elastic cross section d(sigma)/d(omega) integrated 0 - theta
645
648 G4double theta,
649 G4double momentum,
650 G4double A )
651{
652 G4double result;
653 fParticle = particle;
654 fWaveVector = momentum/hbarc;
655 fAtomicWeight = A;
656
657 fNuclearRadius = CalculateNuclearRad(A);
658
659
661
662 // result = integral.Legendre10(this,&G4DiffuseElastic::GetIntegrandFunction, 0., theta );
663 result = integral.Legendre96(this,&G4DiffuseElastic::GetIntegrandFunction, 0., theta );
664
665 return result;
666}
667
668////////////////////////////////////////////////////////////////////////////
669//
670// Return inv momentum transfer -t > 0
671
673{
674 G4double theta = SampleThetaCMS( aParticle, p, A); // sample theta in cms
675 G4double t = 2*p*p*( 1 - std::cos(theta) ); // -t !!!
676 return t;
677}
678
679////////////////////////////////////////////////////////////////////////////
680//
681// Return scattering angle sampled in cms
682
683
686 G4double momentum, G4double A)
687{
688 G4int i, iMax = 100;
689 G4double norm, result, theta1, theta2, thetaMax, sum = 0.;
690
691 fParticle = particle;
692 fWaveVector = momentum/hbarc;
693 fAtomicWeight = A;
694
695 fNuclearRadius = CalculateNuclearRad(A);
696
697 thetaMax = 10.174/fWaveVector/fNuclearRadius;
698
699 if (thetaMax > pi) thetaMax = pi;
700
702
703 // result = integral.Legendre10(this,&G4DiffuseElastic::GetIntegrandFunction, 0., theta );
704 norm = integral.Legendre96(this,&G4DiffuseElastic::GetIntegrandFunction, 0., thetaMax );
705
706 norm *= G4UniformRand();
707
708 for(i = 1; i <= iMax; i++)
709 {
710 theta1 = (i-1)*thetaMax/iMax;
711 theta2 = i*thetaMax/iMax;
712 sum += integral.Legendre10(this,&G4DiffuseElastic::GetIntegrandFunction, theta1, theta2);
713
714 if ( sum >= norm )
715 {
716 result = 0.5*(theta1 + theta2);
717 break;
718 }
719 }
720 if (i > iMax ) result = 0.5*(theta1 + theta2);
721
722 G4double sigma = pi*thetaMax/iMax;
723
724 result += G4RandGauss::shoot(0.,sigma);
725
726 if(result < 0.) result = 0.;
727 if(result > thetaMax) result = thetaMax;
728
729 return result;
730}
731
732/////////////////////////////////////////////////////////////////////////////
733///////////////////// Table preparation and reading ////////////////////////
734////////////////////////////////////////////////////////////////////////////
735//
736// Return inv momentum transfer -t > 0 from initialisation table
737
739 G4int Z, G4int A)
740{
741 fParticle = aParticle;
742 G4double m1 = fParticle->GetPDGMass();
743 G4double totElab = std::sqrt(m1*m1+p*p);
745 G4LorentzVector lv1(p,0.0,0.0,totElab);
746 G4LorentzVector lv(0.0,0.0,0.0,mass2);
747 lv += lv1;
748
749 G4ThreeVector bst = lv.boostVector();
750 lv1.boost(-bst);
751
752 G4ThreeVector p1 = lv1.vect();
753 G4double momentumCMS = p1.mag();
754
755 G4double t = SampleTableT( aParticle, momentumCMS, G4double(Z), G4double(A) ); // sample theta2 in cms
756 return t;
757}
758
759////////////////////////////////////////////////////////////////////////////
760//
761// Return inv momentum transfer -t > 0 from initialisation table
762
764 G4double Z, G4double A)
765{
766 G4double alpha = SampleTableThetaCMS( aParticle, p, Z, A); // sample theta2 in cms
767 // G4double t = 2*p*p*( 1 - std::cos(std::sqrt(alpha)) ); // -t !!!
768 G4double t = p*p*alpha; // -t !!!
769 return t;
770}
771
772////////////////////////////////////////////////////////////////////////////
773//
774// Return scattering angle2 sampled in cms according to precalculated table.
775
776
779 G4double momentum, G4double Z, G4double A)
780{
781 size_t iElement;
782 G4int iMomentum, iAngle;
783 G4double randAngle, position, theta1, theta2, E1, E2, W1, W2, W;
784 G4double m1 = particle->GetPDGMass();
785
786 for(iElement = 0; iElement < fElementNumberVector.size(); iElement++)
787 {
788 if( std::fabs(Z - fElementNumberVector[iElement]) < 0.5) break;
789 }
790 if ( iElement == fElementNumberVector.size() )
791 {
792 InitialiseOnFly(Z,A); // table preparation, if needed
793
794 // iElement--;
795
796 // G4cout << "G4DiffuseElastic: Element with atomic number " << Z
797 // << " is not found, return zero angle" << G4endl;
798 // return 0.; // no table for this element
799 }
800 // G4cout<<"iElement = "<<iElement<<G4endl;
801
802 fAngleTable = fAngleBank[iElement];
803
804 G4double kinE = std::sqrt(momentum*momentum + m1*m1) - m1;
805
806 for( iMomentum = 0; iMomentum < fEnergyBin; iMomentum++)
807 {
808 if( kinE < fEnergyVector->GetLowEdgeEnergy(iMomentum) ) break;
809 }
810 if ( iMomentum >= fEnergyBin ) iMomentum = fEnergyBin-1; // kinE is more then theMaxEnergy
811 if ( iMomentum < 0 ) iMomentum = 0; // against negative index, kinE < theMinEnergy
812
813 // G4cout<<"iMomentum = "<<iMomentum<<G4endl;
814
815 if (iMomentum == fEnergyBin -1 || iMomentum == 0 ) // the table edges
816 {
817 position = (*(*fAngleTable)(iMomentum))(fAngleBin-2)*G4UniformRand();
818
819 // G4cout<<"position = "<<position<<G4endl;
820
821 for(iAngle = 0; iAngle < fAngleBin-1; iAngle++)
822 {
823 if( position < (*(*fAngleTable)(iMomentum))(iAngle) ) break;
824 }
825 if (iAngle >= fAngleBin-1) iAngle = fAngleBin-2;
826
827 // G4cout<<"iAngle = "<<iAngle<<G4endl;
828
829 randAngle = GetScatteringAngle(iMomentum, iAngle, position);
830
831 // G4cout<<"randAngle = "<<randAngle<<G4endl;
832 }
833 else // kinE inside between energy table edges
834 {
835 // position = (*(*fAngleTable)(iMomentum))(fAngleBin-2)*G4UniformRand();
836 position = (*(*fAngleTable)(iMomentum))(0)*G4UniformRand();
837
838 // G4cout<<"position = "<<position<<G4endl;
839
840 for(iAngle = 0; iAngle < fAngleBin-1; iAngle++)
841 {
842 // if( position < (*(*fAngleTable)(iMomentum))(iAngle) ) break;
843 if( position > (*(*fAngleTable)(iMomentum))(iAngle) ) break;
844 }
845 if (iAngle >= fAngleBin-1) iAngle = fAngleBin-2;
846
847 // G4cout<<"iAngle = "<<iAngle<<G4endl;
848
849 theta2 = GetScatteringAngle(iMomentum, iAngle, position);
850
851 // G4cout<<"theta2 = "<<theta2<<G4endl;
852 E2 = fEnergyVector->GetLowEdgeEnergy(iMomentum);
853
854 // G4cout<<"E2 = "<<E2<<G4endl;
855
856 iMomentum--;
857
858 // position = (*(*fAngleTable)(iMomentum))(fAngleBin-2)*G4UniformRand();
859
860 // G4cout<<"position = "<<position<<G4endl;
861
862 for(iAngle = 0; iAngle < fAngleBin-1; iAngle++)
863 {
864 // if( position < (*(*fAngleTable)(iMomentum))(iAngle) ) break;
865 if( position > (*(*fAngleTable)(iMomentum))(iAngle) ) break;
866 }
867 if (iAngle >= fAngleBin-1) iAngle = fAngleBin-2;
868
869 theta1 = GetScatteringAngle(iMomentum, iAngle, position);
870
871 // G4cout<<"theta1 = "<<theta1<<G4endl;
872
873 E1 = fEnergyVector->GetLowEdgeEnergy(iMomentum);
874
875 // G4cout<<"E1 = "<<E1<<G4endl;
876
877 W = 1.0/(E2 - E1);
878 W1 = (E2 - kinE)*W;
879 W2 = (kinE - E1)*W;
880
881 randAngle = W1*theta1 + W2*theta2;
882
883 // randAngle = theta2;
884 // G4cout<<"randAngle = "<<randAngle<<G4endl;
885 }
886 // G4double angle = randAngle;
887 // if (randAngle > 0.) randAngle /= 2*pi*std::sin(angle);
888
889 return randAngle;
890}
891
892//////////////////////////////////////////////////////////////////////////////
893//
894// Initialisation for given particle on fly using new element number
895
897{
898 fAtomicNumber = Z; // atomic number
899 fAtomicWeight = A; // number of nucleons
900
901 fNuclearRadius = CalculateNuclearRad(fAtomicWeight);
902
903 if( verboseLevel > 0 )
904 {
905 G4cout<<"G4DiffuseElastic::Initialise() the element with Z = "
906 <<Z<<"; and A = "<<A<<G4endl;
907 }
908 fElementNumberVector.push_back(fAtomicNumber);
909
911
912 fAngleBank.push_back(fAngleTable);
913
914 return;
915}
916
917///////////////////////////////////////////////////////////////////////////////
918//
919// Build for given particle and element table of momentum, angle probability.
920// For the moment in lab system.
921
923{
924 G4int i, j;
925 G4double partMom, kinE, a = 0., z = fParticle->GetPDGCharge(), m1 = fParticle->GetPDGMass();
926 G4double alpha1, alpha2, alphaMax, alphaCoulomb, delta = 0., sum = 0.;
927
929
930 fAngleTable = new G4PhysicsTable(fEnergyBin);
931
932 for( i = 0; i < fEnergyBin; i++)
933 {
934 kinE = fEnergyVector->GetLowEdgeEnergy(i);
935 partMom = std::sqrt( kinE*(kinE + 2*m1) );
936
937 fWaveVector = partMom/hbarc;
938
939 G4double kR = fWaveVector*fNuclearRadius;
940 G4double kR2 = kR*kR;
941 G4double kRmax = 18.6; // 10.6; 10.6, 18, 10.174; ~ 3 maxima of J1 or 15., 25.
942 G4double kRcoul = 1.9; // 1.2; 1.4, 2.5; // on the first slope of J1
943 // G4double kRlim = 1.2;
944 // G4double kRlim2 = kRlim*kRlim/kR2;
945
946 alphaMax = kRmax*kRmax/kR2;
947
948 if (alphaMax > 4.) alphaMax = 4.; // vmg05-02-09: was pi2
949
950 alphaCoulomb = kRcoul*kRcoul/kR2;
951
952 if( z )
953 {
954 a = partMom/m1; // beta*gamma for m1
955 fBeta = a/std::sqrt(1+a*a);
956 fZommerfeld = CalculateZommerfeld( fBeta, z, fAtomicNumber);
957 fAm = CalculateAm( partMom, fZommerfeld, fAtomicNumber);
958 }
959 G4PhysicsFreeVector* angleVector = new G4PhysicsFreeVector(fAngleBin-1);
960
961 // G4PhysicsLogVector* angleBins = new G4PhysicsLogVector( 0.001*alphaMax, alphaMax, fAngleBin );
962
963 G4double delth = alphaMax/fAngleBin;
964
965 sum = 0.;
966
967 // fAddCoulomb = false;
968 fAddCoulomb = true;
969
970 // for(j = 1; j < fAngleBin; j++)
971 for(j = fAngleBin-1; j >= 1; j--)
972 {
973 // alpha1 = angleBins->GetLowEdgeEnergy(j-1);
974 // alpha2 = angleBins->GetLowEdgeEnergy(j);
975
976 // alpha1 = alphaMax*(j-1)/fAngleBin;
977 // alpha2 = alphaMax*( j )/fAngleBin;
978
979 alpha1 = delth*(j-1);
980 // if(alpha1 < kRlim2) alpha1 = kRlim2;
981 alpha2 = alpha1 + delth;
982
983 // if( ( alpha2 > alphaCoulomb ) && z ) fAddCoulomb = true;
984 if( ( alpha1 < alphaCoulomb ) && z ) fAddCoulomb = false;
985
986 delta = integral.Legendre10(this, &G4DiffuseElastic::GetIntegrandFunction, alpha1, alpha2);
987 // delta = integral.Legendre96(this, &G4DiffuseElastic::GetIntegrandFunction, alpha1, alpha2);
988
989 sum += delta;
990
991 angleVector->PutValue( j-1 , alpha1, sum ); // alpha2
992 // G4cout<<"j-1 = "<<j-1<<"; alpha2 = "<<alpha2<<"; sum = "<<sum<<G4endl;
993 }
994 fAngleTable->insertAt(i,angleVector);
995
996 // delete[] angleVector;
997 // delete[] angleBins;
998 }
999 return;
1000}
1001
1002/////////////////////////////////////////////////////////////////////////////////
1003//
1004//
1005
1006G4double
1008{
1009 G4double x1, x2, y1, y2, randAngle;
1010
1011 if( iAngle == 0 )
1012 {
1013 randAngle = (*fAngleTable)(iMomentum)->GetLowEdgeEnergy(iAngle);
1014 // iAngle++;
1015 }
1016 else
1017 {
1018 if ( iAngle >= G4int((*fAngleTable)(iMomentum)->GetVectorLength()) )
1019 {
1020 iAngle = (*fAngleTable)(iMomentum)->GetVectorLength() - 1;
1021 }
1022 y1 = (*(*fAngleTable)(iMomentum))(iAngle-1);
1023 y2 = (*(*fAngleTable)(iMomentum))(iAngle);
1024
1025 x1 = (*fAngleTable)(iMomentum)->GetLowEdgeEnergy(iAngle-1);
1026 x2 = (*fAngleTable)(iMomentum)->GetLowEdgeEnergy(iAngle);
1027
1028 if ( x1 == x2 ) randAngle = x2;
1029 else
1030 {
1031 if ( y1 == y2 ) randAngle = x1 + ( x2 - x1 )*G4UniformRand();
1032 else
1033 {
1034 randAngle = x1 + ( position - y1 )*( x2 - x1 )/( y2 - y1 );
1035 }
1036 }
1037 }
1038 return randAngle;
1039}
1040
1041
1042
1043////////////////////////////////////////////////////////////////////////////
1044//
1045// Return scattering angle sampled in lab system (target at rest)
1046
1047
1048
1049G4double
1051 G4double tmass, G4double A)
1052{
1053 const G4ParticleDefinition* theParticle = aParticle->GetDefinition();
1054 G4double m1 = theParticle->GetPDGMass();
1055 G4double plab = aParticle->GetTotalMomentum();
1056 G4LorentzVector lv1 = aParticle->Get4Momentum();
1057 G4LorentzVector lv(0.0,0.0,0.0,tmass);
1058 lv += lv1;
1059
1060 G4ThreeVector bst = lv.boostVector();
1061 lv1.boost(-bst);
1062
1063 G4ThreeVector p1 = lv1.vect();
1064 G4double ptot = p1.mag();
1065 G4double tmax = 4.0*ptot*ptot;
1066 G4double t = 0.0;
1067
1068
1069 //
1070 // Sample t
1071 //
1072
1073 t = SampleT( theParticle, ptot, A);
1074
1075 // NaN finder
1076 if(!(t < 0.0 || t >= 0.0))
1077 {
1078 if (verboseLevel > 0)
1079 {
1080 G4cout << "G4DiffuseElastic:WARNING: A = " << A
1081 << " mom(GeV)= " << plab/GeV
1082 << " S-wave will be sampled"
1083 << G4endl;
1084 }
1085 t = G4UniformRand()*tmax;
1086 }
1087 if(verboseLevel>1)
1088 {
1089 G4cout <<" t= " << t << " tmax= " << tmax
1090 << " ptot= " << ptot << G4endl;
1091 }
1092 // Sampling of angles in CM system
1093
1094 G4double phi = G4UniformRand()*twopi;
1095 G4double cost = 1. - 2.0*t/tmax;
1096 G4double sint;
1097
1098 if( cost >= 1.0 )
1099 {
1100 cost = 1.0;
1101 sint = 0.0;
1102 }
1103 else if( cost <= -1.0)
1104 {
1105 cost = -1.0;
1106 sint = 0.0;
1107 }
1108 else
1109 {
1110 sint = std::sqrt((1.0-cost)*(1.0+cost));
1111 }
1112 if (verboseLevel>1)
1113 {
1114 G4cout << "cos(t)=" << cost << " std::sin(t)=" << sint << G4endl;
1115 }
1116 G4ThreeVector v1(sint*std::cos(phi),sint*std::sin(phi),cost);
1117 v1 *= ptot;
1118 G4LorentzVector nlv1(v1.x(),v1.y(),v1.z(),std::sqrt(ptot*ptot + m1*m1));
1119
1120 nlv1.boost(bst);
1121
1122 G4ThreeVector np1 = nlv1.vect();
1123
1124 // G4double theta = std::acos( np1.z()/np1.mag() ); // degree;
1125
1126 G4double theta = np1.theta();
1127
1128 return theta;
1129}
1130
1131////////////////////////////////////////////////////////////////////////////
1132//
1133// Return scattering angle in lab system (target at rest) knowing theta in CMS
1134
1135
1136
1137G4double
1139 G4double tmass, G4double thetaCMS)
1140{
1141 const G4ParticleDefinition* theParticle = aParticle->GetDefinition();
1142 G4double m1 = theParticle->GetPDGMass();
1143 // G4double plab = aParticle->GetTotalMomentum();
1144 G4LorentzVector lv1 = aParticle->Get4Momentum();
1145 G4LorentzVector lv(0.0,0.0,0.0,tmass);
1146
1147 lv += lv1;
1148
1149 G4ThreeVector bst = lv.boostVector();
1150
1151 lv1.boost(-bst);
1152
1153 G4ThreeVector p1 = lv1.vect();
1154 G4double ptot = p1.mag();
1155
1156 G4double phi = G4UniformRand()*twopi;
1157 G4double cost = std::cos(thetaCMS);
1158 G4double sint;
1159
1160 if( cost >= 1.0 )
1161 {
1162 cost = 1.0;
1163 sint = 0.0;
1164 }
1165 else if( cost <= -1.0)
1166 {
1167 cost = -1.0;
1168 sint = 0.0;
1169 }
1170 else
1171 {
1172 sint = std::sqrt((1.0-cost)*(1.0+cost));
1173 }
1174 if (verboseLevel>1)
1175 {
1176 G4cout << "cos(tcms)=" << cost << " std::sin(tcms)=" << sint << G4endl;
1177 }
1178 G4ThreeVector v1(sint*std::cos(phi),sint*std::sin(phi),cost);
1179 v1 *= ptot;
1180 G4LorentzVector nlv1(v1.x(),v1.y(),v1.z(),std::sqrt(ptot*ptot + m1*m1));
1181
1182 nlv1.boost(bst);
1183
1184 G4ThreeVector np1 = nlv1.vect();
1185
1186
1187 G4double thetaLab = np1.theta();
1188
1189 return thetaLab;
1190}
1191////////////////////////////////////////////////////////////////////////////
1192//
1193// Return scattering angle in CMS system (target at rest) knowing theta in Lab
1194
1195
1196
1197G4double
1199 G4double tmass, G4double thetaLab)
1200{
1201 const G4ParticleDefinition* theParticle = aParticle->GetDefinition();
1202 G4double m1 = theParticle->GetPDGMass();
1203 G4double plab = aParticle->GetTotalMomentum();
1204 G4LorentzVector lv1 = aParticle->Get4Momentum();
1205 G4LorentzVector lv(0.0,0.0,0.0,tmass);
1206
1207 lv += lv1;
1208
1209 G4ThreeVector bst = lv.boostVector();
1210
1211 // lv1.boost(-bst);
1212
1213 // G4ThreeVector p1 = lv1.vect();
1214 // G4double ptot = p1.mag();
1215
1216 G4double phi = G4UniformRand()*twopi;
1217 G4double cost = std::cos(thetaLab);
1218 G4double sint;
1219
1220 if( cost >= 1.0 )
1221 {
1222 cost = 1.0;
1223 sint = 0.0;
1224 }
1225 else if( cost <= -1.0)
1226 {
1227 cost = -1.0;
1228 sint = 0.0;
1229 }
1230 else
1231 {
1232 sint = std::sqrt((1.0-cost)*(1.0+cost));
1233 }
1234 if (verboseLevel>1)
1235 {
1236 G4cout << "cos(tlab)=" << cost << " std::sin(tlab)=" << sint << G4endl;
1237 }
1238 G4ThreeVector v1(sint*std::cos(phi),sint*std::sin(phi),cost);
1239 v1 *= plab;
1240 G4LorentzVector nlv1(v1.x(),v1.y(),v1.z(),std::sqrt(plab*plab + m1*m1));
1241
1242 nlv1.boost(-bst);
1243
1244 G4ThreeVector np1 = nlv1.vect();
1245
1246
1247 G4double thetaCMS = np1.theta();
1248
1249 return thetaCMS;
1250}
1251
1252///////////////////////////////////////////////////////////////////////////////
1253//
1254// Test for given particle and element table of momentum, angle probability.
1255// For the moment in lab system.
1256
1258 G4double Z, G4double A)
1259{
1260 fAtomicNumber = Z; // atomic number
1261 fAtomicWeight = A; // number of nucleons
1262 fNuclearRadius = CalculateNuclearRad(fAtomicWeight);
1263
1264
1265
1266 G4cout<<"G4DiffuseElastic::TestAngleTable() init the element with Z = "
1267 <<Z<<"; and A = "<<A<<G4endl;
1268
1269 fElementNumberVector.push_back(fAtomicNumber);
1270
1271
1272
1273
1274 G4int i=0, j;
1275 G4double a = 0., z = theParticle->GetPDGCharge(), m1 = fParticle->GetPDGMass();
1276 G4double alpha1=0., alpha2=0., alphaMax=0., alphaCoulomb=0.;
1277 G4double deltaL10 = 0., deltaL96 = 0., deltaAG = 0.;
1278 G4double sumL10 = 0.,sumL96 = 0.,sumAG = 0.;
1279 G4double epsilon = 0.001;
1280
1282
1283 fAngleTable = new G4PhysicsTable(fEnergyBin);
1284
1285 fWaveVector = partMom/hbarc;
1286
1287 G4double kR = fWaveVector*fNuclearRadius;
1288 G4double kR2 = kR*kR;
1289 G4double kRmax = 10.6; // 10.6, 18, 10.174; ~ 3 maxima of J1 or 15., 25.
1290 G4double kRcoul = 1.2; // 1.4, 2.5; // on the first slope of J1
1291
1292 alphaMax = kRmax*kRmax/kR2;
1293
1294 if (alphaMax > 4.) alphaMax = 4.; // vmg05-02-09: was pi2
1295
1296 alphaCoulomb = kRcoul*kRcoul/kR2;
1297
1298 if( z )
1299 {
1300 a = partMom/m1; // beta*gamma for m1
1301 fBeta = a/std::sqrt(1+a*a);
1302 fZommerfeld = CalculateZommerfeld( fBeta, z, fAtomicNumber);
1303 fAm = CalculateAm( partMom, fZommerfeld, fAtomicNumber);
1304 }
1305 G4PhysicsFreeVector* angleVector = new G4PhysicsFreeVector(fAngleBin-1);
1306
1307 // G4PhysicsLogVector* angleBins = new G4PhysicsLogVector( 0.001*alphaMax, alphaMax, fAngleBin );
1308
1309
1310 fAddCoulomb = false;
1311
1312 for(j = 1; j < fAngleBin; j++)
1313 {
1314 // alpha1 = angleBins->GetLowEdgeEnergy(j-1);
1315 // alpha2 = angleBins->GetLowEdgeEnergy(j);
1316
1317 alpha1 = alphaMax*(j-1)/fAngleBin;
1318 alpha2 = alphaMax*( j )/fAngleBin;
1319
1320 if( ( alpha2 > alphaCoulomb ) && z ) fAddCoulomb = true;
1321
1322 deltaL10 = integral.Legendre10(this, &G4DiffuseElastic::GetIntegrandFunction, alpha1, alpha2);
1323 deltaL96 = integral.Legendre96(this, &G4DiffuseElastic::GetIntegrandFunction, alpha1, alpha2);
1324 deltaAG = integral.AdaptiveGauss(this, &G4DiffuseElastic::GetIntegrandFunction,
1325 alpha1, alpha2,epsilon);
1326
1327 // G4cout<<alpha1<<"\t"<<std::sqrt(alpha1)/degree<<"\t"
1328 // <<deltaL10<<"\t"<<deltaL96<<"\t"<<deltaAG<<G4endl;
1329
1330 sumL10 += deltaL10;
1331 sumL96 += deltaL96;
1332 sumAG += deltaAG;
1333
1334 G4cout<<alpha1<<"\t"<<std::sqrt(alpha1)/degree<<"\t"
1335 <<sumL10<<"\t"<<sumL96<<"\t"<<sumAG<<G4endl;
1336
1337 angleVector->PutValue( j-1 , alpha1, sumL10 ); // alpha2
1338 }
1339 fAngleTable->insertAt(i,angleVector);
1340 fAngleBank.push_back(fAngleTable);
1341
1342 /*
1343 // Integral over all angle range - Bad accuracy !!!
1344
1345 sumL10 = integral.Legendre10(this, &G4DiffuseElastic::GetIntegrandFunction, 0., alpha2);
1346 sumL96 = integral.Legendre96(this, &G4DiffuseElastic::GetIntegrandFunction, 0., alpha2);
1347 sumAG = integral.AdaptiveGauss(this, &G4DiffuseElastic::GetIntegrandFunction,
1348 0., alpha2,epsilon);
1349 G4cout<<G4endl;
1350 G4cout<<alpha2<<"\t"<<std::sqrt(alpha2)/degree<<"\t"
1351 <<sumL10<<"\t"<<sumL96<<"\t"<<sumAG<<G4endl;
1352 */
1353 return;
1354}
1355
1356//
1357//
1358/////////////////////////////////////////////////////////////////////////////////
std::vector< G4Element * > G4ElementTable
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cout
#define G4UniformRand()
Definition: Randomize.hh:53
double z() const
double theta() const
double x() const
double y() const
double mag() const
Hep3Vector boostVector() const
HepLorentzVector & boost(double, double, double)
Hep3Vector vect() const
static G4Alpha * Alpha()
Definition: G4Alpha.cc:89
static G4Deuteron * Deuteron()
Definition: G4Deuteron.cc:94
G4double SampleThetaLab(const G4HadProjectile *aParticle, G4double tmass, G4double A)
G4double GetDiffElasticSumProbA(G4double alpha)
G4double BesselOneByArg(G4double z)
G4double GetCoulombElasticXsc(const G4ParticleDefinition *particle, G4double theta, G4double momentum, G4double Z)
G4double CalculateAm(G4double momentum, G4double n, G4double Z)
G4double ThetaCMStoThetaLab(const G4DynamicParticle *aParticle, G4double tmass, G4double thetaCMS)
G4double GetInvElasticXsc(const G4ParticleDefinition *particle, G4double theta, G4double momentum, G4double A, G4double Z)
G4double GetInvCoulombElasticXsc(const G4ParticleDefinition *particle, G4double tMand, G4double momentum, G4double A, G4double Z)
void TestAngleTable(const G4ParticleDefinition *theParticle, G4double partMom, G4double Z, G4double A)
G4double ThetaLabToThetaCMS(const G4DynamicParticle *aParticle, G4double tmass, G4double thetaLab)
G4double BesselJzero(G4double z)
G4double SampleThetaCMS(const G4ParticleDefinition *aParticle, G4double p, G4double A)
G4double GetIntegrandFunction(G4double theta)
G4double DampFactor(G4double z)
G4double SampleTableThetaCMS(const G4ParticleDefinition *aParticle, G4double p, G4double Z, G4double A)
virtual G4double SampleInvariantT(const G4ParticleDefinition *p, G4double plab, G4int Z, G4int A)
G4double CalculateParticleBeta(const G4ParticleDefinition *particle, G4double momentum)
G4double GetDiffuseElasticSumXsc(const G4ParticleDefinition *particle, G4double theta, G4double momentum, G4double A, G4double Z)
G4double SampleT(const G4ParticleDefinition *aParticle, G4double p, G4double A)
G4double GetDiffElasticSumProb(G4double theta)
G4double GetDiffElasticProb(G4double theta)
G4double IntegralElasticProb(const G4ParticleDefinition *particle, G4double theta, G4double momentum, G4double A)
G4double CalculateZommerfeld(G4double beta, G4double Z1, G4double Z2)
G4double CalculateNuclearRad(G4double A)
virtual ~G4DiffuseElastic()
void InitialiseOnFly(G4double Z, G4double A)
G4double SampleTableT(const G4ParticleDefinition *aParticle, G4double p, G4double Z, G4double A)
G4double BesselJone(G4double z)
G4double GetDiffuseElasticXsc(const G4ParticleDefinition *particle, G4double theta, G4double momentum, G4double A)
G4double GetScatteringAngle(G4int iMomentum, G4int iAngle, G4double position)
G4double GetInvElasticSumXsc(const G4ParticleDefinition *particle, G4double tMand, G4double momentum, G4double A, G4double Z)
G4ParticleDefinition * GetDefinition() const
G4LorentzVector Get4Momentum() const
G4double GetTotalMomentum() const
static size_t GetNumberOfElements()
Definition: G4Element.cc:406
static const G4ElementTable * GetElementTable()
Definition: G4Element.cc:399
G4double GetTotalMomentum() const
const G4ParticleDefinition * GetDefinition() const
const G4LorentzVector & Get4Momentum() const
void SetMinEnergy(G4double anEnergy)
void SetMaxEnergy(const G4double anEnergy)
static G4He3 * He3()
Definition: G4He3.cc:94
static G4Neutron * Neutron()
Definition: G4Neutron.cc:104
static G4double GetNuclearMass(const G4double A, const G4double Z)
G4double GetPDGCharge() const
G4ParticleDefinition * FindIon(G4int atomicNumber, G4int atomicMass, G4double excitationEnergy)
static G4ParticleTable * GetParticleTable()
void PutValue(size_t binNumber, G4double binValue, G4double dataValue)
void clearAndDestroy()
virtual G4double GetLowEdgeEnergy(size_t binNumber) const
static G4PionMinus * PionMinus()
Definition: G4PionMinus.cc:98
static G4PionPlus * PionPlus()
Definition: G4PionPlus.cc:98
static G4Proton * Proton()
Definition: G4Proton.cc:93
static G4Triton * Triton()
Definition: G4Triton.cc:95