Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4LivermorePolarizedComptonModel.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// Authors: G.Depaola & F.Longo
29//
30// History:
31// --------
32// 02 May 2009 S Incerti as V. Ivanchenko proposed in G4LivermoreComptonModel.cc
33//
34// Cleanup initialisation and generation of secondaries:
35// - apply internal high-energy limit only in constructor
36// - do not apply low-energy limit (default is 0)
37// - remove GetMeanFreePath method and table
38// - added protection against numerical problem in energy sampling
39// - use G4ElementSelector
40
43#include "G4SystemOfUnits.hh"
44
45//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
46
47using namespace std;
48
49//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
50
52 const G4String& nam)
53 :G4VEmModel(nam),fParticleChange(0),isInitialised(false),
54 meanFreePathTable(0),scatterFunctionData(0),crossSectionHandler(0)
55{
56 lowEnergyLimit = 250 * eV;
57 highEnergyLimit = 100 * GeV;
58 //SetLowEnergyLimit(lowEnergyLimit);
59 SetHighEnergyLimit(highEnergyLimit);
60
61 verboseLevel= 0;
62 // Verbosity scale:
63 // 0 = nothing
64 // 1 = warning for energy non-conservation
65 // 2 = details of energy budget
66 // 3 = calculation of cross sections, file openings, sampling of atoms
67 // 4 = entering in methods
68
69 if( verboseLevel>0 ) {
70 G4cout << "Livermore Polarized Compton is constructed " << G4endl
71 << "Energy range: "
72 << lowEnergyLimit / eV << " eV - "
73 << highEnergyLimit / GeV << " GeV"
74 << G4endl;
75 }
76}
77
78//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
79
81{
82 if (meanFreePathTable) delete meanFreePathTable;
83 if (crossSectionHandler) delete crossSectionHandler;
84 if (scatterFunctionData) delete scatterFunctionData;
85}
86
87//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
88
90 const G4DataVector& cuts)
91{
92 if (verboseLevel > 3)
93 G4cout << "Calling G4LivermorePolarizedComptonModel::Initialise()" << G4endl;
94
95 if (crossSectionHandler)
96 {
97 crossSectionHandler->Clear();
98 delete crossSectionHandler;
99 }
100
101 // Reading of data files - all materials are read
102
103 crossSectionHandler = new G4CrossSectionHandler;
104 crossSectionHandler->Clear();
105 G4String crossSectionFile = "comp/ce-cs-";
106 crossSectionHandler->LoadData(crossSectionFile);
107
108 meanFreePathTable = 0;
109 meanFreePathTable = crossSectionHandler->BuildMeanFreePathForMaterials();
110
111 G4VDataSetAlgorithm* scatterInterpolation = new G4LogLogInterpolation;
112 G4String scatterFile = "comp/ce-sf-";
113 scatterFunctionData = new G4CompositeEMDataSet(scatterInterpolation, 1., 1.);
114 scatterFunctionData->LoadData(scatterFile);
115
116 // For Doppler broadening
117 shellData.SetOccupancyData();
118 G4String file = "/doppler/shell-doppler";
119 shellData.LoadData(file);
120
121 if (verboseLevel > 2)
122 G4cout << "Loaded cross section files for Livermore Polarized Compton model" << G4endl;
123
124 InitialiseElementSelectors(particle,cuts);
125
126 if( verboseLevel>0 ) {
127 G4cout << "Livermore Polarized Compton model is initialized " << G4endl
128 << "Energy range: "
129 << LowEnergyLimit() / eV << " eV - "
130 << HighEnergyLimit() / GeV << " GeV"
131 << G4endl;
132 }
133
134 //
135
136 if(isInitialised) return;
138 isInitialised = true;
139}
140
141//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
142
145 G4double GammaEnergy,
148{
149 if (verboseLevel > 3)
150 G4cout << "Calling ComputeCrossSectionPerAtom() of G4LivermorePolarizedComptonModel" << G4endl;
151
152 if (GammaEnergy < lowEnergyLimit || GammaEnergy > highEnergyLimit) return 0.0;
153
154 G4double cs = crossSectionHandler->FindValue(G4int(Z), GammaEnergy);
155 return cs;
156}
157
158//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
159
160void G4LivermorePolarizedComptonModel::SampleSecondaries(std::vector<G4DynamicParticle*>* fvect,
161 const G4MaterialCutsCouple* couple,
162 const G4DynamicParticle* aDynamicGamma,
163 G4double,
164 G4double)
165{
166 // The scattered gamma energy is sampled according to Klein - Nishina formula.
167 // The random number techniques of Butcher & Messel are used (Nuc Phys 20(1960),15).
168 // GEANT4 internal units
169 //
170 // Note : Effects due to binding of atomic electrons are negliged.
171
172 if (verboseLevel > 3)
173 G4cout << "Calling SampleSecondaries() of G4LivermorePolarizedComptonModel" << G4endl;
174
175 G4double gammaEnergy0 = aDynamicGamma->GetKineticEnergy();
176 G4ThreeVector gammaPolarization0 = aDynamicGamma->GetPolarization();
177
178 // Protection: a polarisation parallel to the
179 // direction causes problems;
180 // in that case find a random polarization
181
182 G4ThreeVector gammaDirection0 = aDynamicGamma->GetMomentumDirection();
183
184 // Make sure that the polarization vector is perpendicular to the
185 // gamma direction. If not
186
187 if(!(gammaPolarization0.isOrthogonal(gammaDirection0, 1e-6))||(gammaPolarization0.mag()==0))
188 { // only for testing now
189 gammaPolarization0 = GetRandomPolarization(gammaDirection0);
190 }
191 else
192 {
193 if ( gammaPolarization0.howOrthogonal(gammaDirection0) != 0)
194 {
195 gammaPolarization0 = GetPerpendicularPolarization(gammaDirection0, gammaPolarization0);
196 }
197 }
198
199 // End of Protection
200
201 // Within energy limit?
202
203 if(gammaEnergy0 <= lowEnergyLimit)
204 {
208 return;
209 }
210
211 G4double E0_m = gammaEnergy0 / electron_mass_c2 ;
212
213 // Select randomly one element in the current material
214 //G4int Z = crossSectionHandler->SelectRandomAtom(couple,gammaEnergy0);
215 const G4ParticleDefinition* particle = aDynamicGamma->GetDefinition();
216 const G4Element* elm = SelectRandomAtom(couple,particle,gammaEnergy0);
217 G4int Z = (G4int)elm->GetZ();
218
219 // Sample the energy and the polarization of the scattered photon
220
221 G4double epsilon, epsilonSq, onecost, sinThetaSqr, greject ;
222
223 G4double epsilon0Local = 1./(1. + 2*E0_m);
224 G4double epsilon0Sq = epsilon0Local*epsilon0Local;
225 G4double alpha1 = - std::log(epsilon0Local);
226 G4double alpha2 = 0.5*(1.- epsilon0Sq);
227
228 G4double wlGamma = h_Planck*c_light/gammaEnergy0;
229 G4double gammaEnergy1;
230 G4ThreeVector gammaDirection1;
231
232 do {
233 if ( alpha1/(alpha1+alpha2) > G4UniformRand() )
234 {
235 epsilon = std::exp(-alpha1*G4UniformRand());
236 epsilonSq = epsilon*epsilon;
237 }
238 else
239 {
240 epsilonSq = epsilon0Sq + (1.- epsilon0Sq)*G4UniformRand();
241 epsilon = std::sqrt(epsilonSq);
242 }
243
244 onecost = (1.- epsilon)/(epsilon*E0_m);
245 sinThetaSqr = onecost*(2.-onecost);
246
247 // Protection
248 if (sinThetaSqr > 1.)
249 {
250 G4cout
251 << " -- Warning -- G4LivermorePolarizedComptonModel::SampleSecondaries "
252 << "sin(theta)**2 = "
253 << sinThetaSqr
254 << "; set to 1"
255 << G4endl;
256 sinThetaSqr = 1.;
257 }
258 if (sinThetaSqr < 0.)
259 {
260 G4cout
261 << " -- Warning -- G4LivermorePolarizedComptonModel::SampleSecondaries "
262 << "sin(theta)**2 = "
263 << sinThetaSqr
264 << "; set to 0"
265 << G4endl;
266 sinThetaSqr = 0.;
267 }
268 // End protection
269
270 G4double x = std::sqrt(onecost/2.) / (wlGamma/cm);;
271 G4double scatteringFunction = scatterFunctionData->FindValue(x,Z-1);
272 greject = (1. - epsilon*sinThetaSqr/(1.+ epsilonSq))*scatteringFunction;
273
274 } while(greject < G4UniformRand()*Z);
275
276
277 // ****************************************************
278 // Phi determination
279 // ****************************************************
280
281 G4double phi = SetPhi(epsilon,sinThetaSqr);
282
283 //
284 // scattered gamma angles. ( Z - axis along the parent gamma)
285 //
286
287 G4double cosTheta = 1. - onecost;
288
289 // Protection
290
291 if (cosTheta > 1.)
292 {
293 G4cout
294 << " -- Warning -- G4LivermorePolarizedComptonModel::SampleSecondaries "
295 << "cosTheta = "
296 << cosTheta
297 << "; set to 1"
298 << G4endl;
299 cosTheta = 1.;
300 }
301 if (cosTheta < -1.)
302 {
303 G4cout
304 << " -- Warning -- G4LivermorePolarizedComptonModel::SampleSecondaries "
305 << "cosTheta = "
306 << cosTheta
307 << "; set to -1"
308 << G4endl;
309 cosTheta = -1.;
310 }
311 // End protection
312
313
314 G4double sinTheta = std::sqrt (sinThetaSqr);
315
316 // Protection
317 if (sinTheta > 1.)
318 {
319 G4cout
320 << " -- Warning -- G4LivermorePolarizedComptonModel::SampleSecondaries "
321 << "sinTheta = "
322 << sinTheta
323 << "; set to 1"
324 << G4endl;
325 sinTheta = 1.;
326 }
327 if (sinTheta < -1.)
328 {
329 G4cout
330 << " -- Warning -- G4LivermorePolarizedComptonModel::SampleSecondaries "
331 << "sinTheta = "
332 << sinTheta
333 << "; set to -1"
334 << G4endl;
335 sinTheta = -1.;
336 }
337 // End protection
338
339
340 G4double dirx = sinTheta*std::cos(phi);
341 G4double diry = sinTheta*std::sin(phi);
342 G4double dirz = cosTheta ;
343
344
345 // oneCosT , eom
346
347 // Doppler broadening - Method based on:
348 // Y. Namito, S. Ban and H. Hirayama,
349 // "Implementation of the Doppler Broadening of a Compton-Scattered Photon Into the EGS4 Code"
350 // NIM A 349, pp. 489-494, 1994
351
352 // Maximum number of sampling iterations
353
354 G4int maxDopplerIterations = 1000;
355 G4double bindingE = 0.;
356 G4double photonEoriginal = epsilon * gammaEnergy0;
357 G4double photonE = -1.;
358 G4int iteration = 0;
359 G4double eMax = gammaEnergy0;
360
361 do
362 {
363 iteration++;
364 // Select shell based on shell occupancy
365 G4int shell = shellData.SelectRandomShell(Z);
366 bindingE = shellData.BindingEnergy(Z,shell);
367
368 eMax = gammaEnergy0 - bindingE;
369
370 // Randomly sample bound electron momentum (memento: the data set is in Atomic Units)
371 G4double pSample = profileData.RandomSelectMomentum(Z,shell);
372 // Rescale from atomic units
373 G4double pDoppler = pSample * fine_structure_const;
374 G4double pDoppler2 = pDoppler * pDoppler;
375 G4double var2 = 1. + onecost * E0_m;
376 G4double var3 = var2*var2 - pDoppler2;
377 G4double var4 = var2 - pDoppler2 * cosTheta;
378 G4double var = var4*var4 - var3 + pDoppler2 * var3;
379 if (var > 0.)
380 {
381 G4double varSqrt = std::sqrt(var);
382 G4double scale = gammaEnergy0 / var3;
383 // Random select either root
384 if (G4UniformRand() < 0.5) photonE = (var4 - varSqrt) * scale;
385 else photonE = (var4 + varSqrt) * scale;
386 }
387 else
388 {
389 photonE = -1.;
390 }
391 } while ( iteration <= maxDopplerIterations &&
392 (photonE < 0. || photonE > eMax || photonE < eMax*G4UniformRand()) );
393
394 // End of recalculation of photon energy with Doppler broadening
395 // Revert to original if maximum number of iterations threshold has been reached
396 if (iteration >= maxDopplerIterations)
397 {
398 photonE = photonEoriginal;
399 bindingE = 0.;
400 }
401
402 gammaEnergy1 = photonE;
403
404 //
405 // update G4VParticleChange for the scattered photon
406 //
407
408 // gammaEnergy1 = epsilon*gammaEnergy0;
409
410
411 // New polarization
412
413 G4ThreeVector gammaPolarization1 = SetNewPolarization(epsilon,
414 sinThetaSqr,
415 phi,
416 cosTheta);
417
418 // Set new direction
419 G4ThreeVector tmpDirection1( dirx,diry,dirz );
420 gammaDirection1 = tmpDirection1;
421
422 // Change reference frame.
423
424 SystemOfRefChange(gammaDirection0,gammaDirection1,
425 gammaPolarization0,gammaPolarization1);
426
427 if (gammaEnergy1 > 0.)
428 {
430 fParticleChange->ProposeMomentumDirection( gammaDirection1 );
431 fParticleChange->ProposePolarization( gammaPolarization1 );
432 }
433 else
434 {
435 gammaEnergy1 = 0.;
438 }
439
440 //
441 // kinematic of the scattered electron
442 //
443
444 G4double ElecKineEnergy = gammaEnergy0 - gammaEnergy1 -bindingE;
445
446 // SI -protection against negative final energy: no e- is created
447 // like in G4LivermoreComptonModel.cc
448 if(ElecKineEnergy < 0.0) {
449 fParticleChange->ProposeLocalEnergyDeposit(gammaEnergy0 - gammaEnergy1);
450 return;
451 }
452
453 // SI - Removed range test
454
455 G4double ElecMomentum = std::sqrt(ElecKineEnergy*(ElecKineEnergy+2.*electron_mass_c2));
456
457 G4ThreeVector ElecDirection((gammaEnergy0 * gammaDirection0 -
458 gammaEnergy1 * gammaDirection1) * (1./ElecMomentum));
459
461
462 G4DynamicParticle* dp = new G4DynamicParticle (G4Electron::Electron(),ElecDirection.unit(),ElecKineEnergy) ;
463 fvect->push_back(dp);
464
465}
466
467//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
468
469G4double G4LivermorePolarizedComptonModel::SetPhi(G4double energyRate,
470 G4double sinSqrTh)
471{
472 G4double rand1;
473 G4double rand2;
474 G4double phiProbability;
475 G4double phi;
476 G4double a, b;
477
478 do
479 {
480 rand1 = G4UniformRand();
481 rand2 = G4UniformRand();
482 phiProbability=0.;
483 phi = twopi*rand1;
484
485 a = 2*sinSqrTh;
486 b = energyRate + 1/energyRate;
487
488 phiProbability = 1 - (a/b)*(std::cos(phi)*std::cos(phi));
489
490
491
492 }
493 while ( rand2 > phiProbability );
494 return phi;
495}
496
497
498//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
499
500G4ThreeVector G4LivermorePolarizedComptonModel::SetPerpendicularVector(G4ThreeVector& a)
501{
502 G4double dx = a.x();
503 G4double dy = a.y();
504 G4double dz = a.z();
505 G4double x = dx < 0.0 ? -dx : dx;
506 G4double y = dy < 0.0 ? -dy : dy;
507 G4double z = dz < 0.0 ? -dz : dz;
508 if (x < y) {
509 return x < z ? G4ThreeVector(-dy,dx,0) : G4ThreeVector(0,-dz,dy);
510 }else{
511 return y < z ? G4ThreeVector(dz,0,-dx) : G4ThreeVector(-dy,dx,0);
512 }
513}
514
515//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
516
517G4ThreeVector G4LivermorePolarizedComptonModel::GetRandomPolarization(G4ThreeVector& direction0)
518{
519 G4ThreeVector d0 = direction0.unit();
520 G4ThreeVector a1 = SetPerpendicularVector(d0); //different orthogonal
521 G4ThreeVector a0 = a1.unit(); // unit vector
522
523 G4double rand1 = G4UniformRand();
524
525 G4double angle = twopi*rand1; // random polar angle
526 G4ThreeVector b0 = d0.cross(a0); // cross product
527
529
530 c.setX(std::cos(angle)*(a0.x())+std::sin(angle)*b0.x());
531 c.setY(std::cos(angle)*(a0.y())+std::sin(angle)*b0.y());
532 c.setZ(std::cos(angle)*(a0.z())+std::sin(angle)*b0.z());
533
534 G4ThreeVector c0 = c.unit();
535
536 return c0;
537
538}
539
540//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
541
542G4ThreeVector G4LivermorePolarizedComptonModel::GetPerpendicularPolarization
543(const G4ThreeVector& gammaDirection, const G4ThreeVector& gammaPolarization) const
544{
545
546 //
547 // The polarization of a photon is always perpendicular to its momentum direction.
548 // Therefore this function removes those vector component of gammaPolarization, which
549 // points in direction of gammaDirection
550 //
551 // Mathematically we search the projection of the vector a on the plane E, where n is the
552 // plains normal vector.
553 // The basic equation can be found in each geometry book (e.g. Bronstein):
554 // p = a - (a o n)/(n o n)*n
555
556 return gammaPolarization - gammaPolarization.dot(gammaDirection)/gammaDirection.dot(gammaDirection) * gammaDirection;
557}
558
559//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
560
561G4ThreeVector G4LivermorePolarizedComptonModel::SetNewPolarization(G4double epsilon,
562 G4double sinSqrTh,
563 G4double phi,
564 G4double costheta)
565{
566 G4double rand1;
567 G4double rand2;
568 G4double cosPhi = std::cos(phi);
569 G4double sinPhi = std::sin(phi);
570 G4double sinTheta = std::sqrt(sinSqrTh);
571 G4double cosSqrPhi = cosPhi*cosPhi;
572 // G4double cossqrth = 1.-sinSqrTh;
573 // G4double sinsqrphi = sinPhi*sinPhi;
574 G4double normalisation = std::sqrt(1. - cosSqrPhi*sinSqrTh);
575
576
577 // Determination of Theta
578
579 // ---- MGP ---- Commented out the following 3 lines to avoid compilation
580 // warnings (unused variables)
581 // G4double thetaProbability;
582 G4double theta;
583 // G4double a, b;
584 // G4double cosTheta;
585
586 /*
587
588 depaola method
589
590 do
591 {
592 rand1 = G4UniformRand();
593 rand2 = G4UniformRand();
594 thetaProbability=0.;
595 theta = twopi*rand1;
596 a = 4*normalisation*normalisation;
597 b = (epsilon + 1/epsilon) - 2;
598 thetaProbability = (b + a*std::cos(theta)*std::cos(theta))/(a+b);
599 cosTheta = std::cos(theta);
600 }
601 while ( rand2 > thetaProbability );
602
603 G4double cosBeta = cosTheta;
604
605 */
606
607
608 // Dan Xu method (IEEE TNS, 52, 1160 (2005))
609
610 rand1 = G4UniformRand();
611 rand2 = G4UniformRand();
612
613 if (rand1<(epsilon+1.0/epsilon-2)/(2.0*(epsilon+1.0/epsilon)-4.0*sinSqrTh*cosSqrPhi))
614 {
615 if (rand2<0.5)
616 theta = pi/2.0;
617 else
618 theta = 3.0*pi/2.0;
619 }
620 else
621 {
622 if (rand2<0.5)
623 theta = 0;
624 else
625 theta = pi;
626 }
627 G4double cosBeta = std::cos(theta);
628 G4double sinBeta = std::sqrt(1-cosBeta*cosBeta);
629
630 G4ThreeVector gammaPolarization1;
631
632 G4double xParallel = normalisation*cosBeta;
633 G4double yParallel = -(sinSqrTh*cosPhi*sinPhi)*cosBeta/normalisation;
634 G4double zParallel = -(costheta*sinTheta*cosPhi)*cosBeta/normalisation;
635 G4double xPerpendicular = 0.;
636 G4double yPerpendicular = (costheta)*sinBeta/normalisation;
637 G4double zPerpendicular = -(sinTheta*sinPhi)*sinBeta/normalisation;
638
639 G4double xTotal = (xParallel + xPerpendicular);
640 G4double yTotal = (yParallel + yPerpendicular);
641 G4double zTotal = (zParallel + zPerpendicular);
642
643 gammaPolarization1.setX(xTotal);
644 gammaPolarization1.setY(yTotal);
645 gammaPolarization1.setZ(zTotal);
646
647 return gammaPolarization1;
648
649}
650
651//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
652
653void G4LivermorePolarizedComptonModel::SystemOfRefChange(G4ThreeVector& direction0,
654 G4ThreeVector& direction1,
655 G4ThreeVector& polarization0,
656 G4ThreeVector& polarization1)
657{
658 // direction0 is the original photon direction ---> z
659 // polarization0 is the original photon polarization ---> x
660 // need to specify y axis in the real reference frame ---> y
661 G4ThreeVector Axis_Z0 = direction0.unit();
662 G4ThreeVector Axis_X0 = polarization0.unit();
663 G4ThreeVector Axis_Y0 = (Axis_Z0.cross(Axis_X0)).unit(); // to be confirmed;
664
665 G4double direction_x = direction1.getX();
666 G4double direction_y = direction1.getY();
667 G4double direction_z = direction1.getZ();
668
669 direction1 = (direction_x*Axis_X0 + direction_y*Axis_Y0 + direction_z*Axis_Z0).unit();
670 G4double polarization_x = polarization1.getX();
671 G4double polarization_y = polarization1.getY();
672 G4double polarization_z = polarization1.getZ();
673
674 polarization1 = (polarization_x*Axis_X0 + polarization_y*Axis_Y0 + polarization_z*Axis_Z0).unit();
675
676}
677
678
CLHEP::Hep3Vector G4ThreeVector
@ fStopAndKill
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
Hep3Vector unit() const
double getZ() const
double x() const
void setY(double)
double y() const
Hep3Vector cross(const Hep3Vector &) const
double dot(const Hep3Vector &) const
void setZ(double)
bool isOrthogonal(const Hep3Vector &v, double epsilon=tolerance) const
Definition: SpaceVector.cc:237
double mag() const
double getX() const
double howOrthogonal(const Hep3Vector &v) const
Definition: SpaceVector.cc:219
void setX(double)
double getY() const
G4double RandomSelectMomentum(G4int Z, G4int shellIndex) const
const G4ThreeVector & GetMomentumDirection() const
G4ParticleDefinition * GetDefinition() const
G4double GetKineticEnergy() const
const G4ThreeVector & GetPolarization() const
static G4Electron * Electron()
Definition: G4Electron.cc:94
G4double GetZ() const
Definition: G4Element.hh:131
virtual void Initialise(const G4ParticleDefinition *, const G4DataVector &)
G4LivermorePolarizedComptonModel(const G4ParticleDefinition *p=0, const G4String &nam="LivermorePolarizedCompton")
virtual G4double ComputeCrossSectionPerAtom(const G4ParticleDefinition *, G4double kinEnergy, G4double Z, G4double A=0, G4double cut=0, G4double emax=DBL_MAX)
virtual void SampleSecondaries(std::vector< G4DynamicParticle * > *, const G4MaterialCutsCouple *, const G4DynamicParticle *, G4double tmin, G4double maxEnergy)
void SetProposedKineticEnergy(G4double proposedKinEnergy)
void ProposePolarization(const G4ThreeVector &dir)
void ProposeMomentumDirection(G4double Px, G4double Py, G4double Pz)
void SetOccupancyData()
Definition: G4ShellData.hh:70
G4double BindingEnergy(G4int Z, G4int shellIndex) const
Definition: G4ShellData.cc:166
void LoadData(const G4String &fileName)
Definition: G4ShellData.cc:234
G4int SelectRandomShell(G4int Z) const
Definition: G4ShellData.cc:363
G4VEMDataSet * BuildMeanFreePathForMaterials(const G4DataVector *energyCuts=0)
G4double FindValue(G4int Z, G4double e) const
void LoadData(const G4String &dataFile)
virtual G4double FindValue(G4double x, G4int componentId=0) const =0
virtual G4bool LoadData(const G4String &fileName)=0
void SetHighEnergyLimit(G4double)
Definition: G4VEmModel.hh:585
G4ParticleChangeForGamma * GetParticleChangeForGamma()
Definition: G4VEmModel.cc:109
G4double LowEnergyLimit() const
Definition: G4VEmModel.hh:529
G4double HighEnergyLimit() const
Definition: G4VEmModel.hh:522
const G4Element * SelectRandomAtom(const G4MaterialCutsCouple *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
Definition: G4VEmModel.hh:459
void InitialiseElementSelectors(const G4ParticleDefinition *, const G4DataVector &)
Definition: G4VEmModel.cc:123
void ProposeTrackStatus(G4TrackStatus status)
void ProposeLocalEnergyDeposit(G4double anEnergyPart)
const G4double pi