65 :
G4VEmModel(nam),fParticleChange(0),isInitialised(false),
66 scatterFunctionData(0),
67 crossSectionHandler(0),fAtomDeexcitation(0)
78 G4cout <<
"Livermore Modified Compton model is constructed " <<
G4endl;
89 delete crossSectionHandler;
90 delete scatterFunctionData;
98 if (verboseLevel > 2) {
99 G4cout <<
"Calling G4LivermoreComptonModifiedModel::Initialise()" <<
G4endl;
102 if (crossSectionHandler)
104 crossSectionHandler->
Clear();
105 delete crossSectionHandler;
107 delete scatterFunctionData;
111 G4String crossSectionFile =
"comp/ce-cs-";
112 crossSectionHandler->
LoadData(crossSectionFile);
115 G4String scatterFile =
"comp/ce-sf-";
117 scatterFunctionData->
LoadData(scatterFile);
121 G4String file =
"/doppler/shell-doppler";
126 if (verboseLevel > 2) {
127 G4cout <<
"Loaded cross section files for Livermore Modified Compton model" <<
G4endl;
130 if(isInitialised) {
return; }
131 isInitialised =
true;
137 if( verboseLevel>0 ) {
138 G4cout <<
"Livermore modified Compton model is initialized " <<
G4endl
154 if (verboseLevel > 3) {
155 G4cout <<
"Calling ComputeCrossSectionPerAtom() of G4LivermoreComptonModifiedModel" <<
G4endl;
188 if (verboseLevel > 3) {
189 G4cout <<
"G4LivermoreComptonModifiedModel::SampleSecondaries() E(MeV)= "
199 G4double e0m = photonEnergy0 / electron_mass_c2 ;
207 G4double epsilon0Local = 1. / (1. + 2. * e0m);
208 G4double epsilon0Sq = epsilon0Local * epsilon0Local;
210 G4double alpha2 = 0.5 * (1. - epsilon0Sq);
212 G4double wlPhoton = h_Planck*c_light/photonEnergy0;
231 epsilonSq = epsilon0Sq + (1. - epsilon0Sq) *
G4UniformRand();
232 epsilon = std::sqrt(epsilonSq);
236 sinT2 = oneCosT * (2. - oneCosT);
237 G4double x = std::sqrt(oneCosT/2.) / (wlPhoton/cm);
239 gReject = (1. -
epsilon * sinT2 / (1. + epsilonSq)) * scatteringFunction;
244 G4double sinTheta = std::sqrt (sinT2);
246 G4double dirx = sinTheta * std::cos(phi);
247 G4double diry = sinTheta * std::sin(phi);
256 G4int maxDopplerIterations = 1000;
265 G4double momentum_au_to_nat = 1.992851740*std::pow(10.,-24.);
266 G4double e_mass_kg = 9.10938188 * std::pow(10.,-31.);
291 }
while(
Alpha >= (pi/2.0));
293 ePAU = pSample / std::cos(
Alpha);
297 G4double ePSI = ePAU * momentum_au_to_nat;
298 G4double u_temp = sqrt( ((ePSI*ePSI)*(vel_c*vel_c)) / ((e_mass_kg*e_mass_kg)*(vel_c*vel_c)+(ePSI*ePSI)))/vel_c;
299 G4double eEIncident = electron_mass_c2 / sqrt( 1 - (u_temp*u_temp));
302 systemE = eEIncident+photonEnergy0;
304 eMax = systemE - bindingE - electron_mass_c2;
305 G4double pDoppler = pSample * fine_structure_const;
306 G4double pDoppler2 = pDoppler * pDoppler;
308 G4double var3 = var2*var2 - pDoppler2;
309 G4double var4 = var2 - pDoppler2 * cosTheta;
310 G4double var = var4*var4 - var3 + pDoppler2 * var3;
314 G4double scale = photonEnergy0 / var3;
316 if (
G4UniformRand() < 0.5) { photonE = (var4 - varSqrt) * scale; }
317 else { photonE = (var4 + varSqrt) * scale; }
323 }
while ( iteration <= maxDopplerIterations &&
324 (photonE < 0. || photonE > eMax ) );
328 G4double eKineticEnergy = systemE - photonE - bindingE - electron_mass_c2;
335 if(eKineticEnergy < 0.0) {
336 G4cout <<
"Error, kinetic energy of electron less than zero" <<
G4endl;
343 G4double E_num = photonEnergy0 - photonE*cosTheta;
344 G4double E_dom = sqrt(photonEnergy0*photonEnergy0 + photonE*photonE -2*photonEnergy0*photonE*cosTheta);
346 G4double sinThetaE = -sqrt((1. - cosThetaE) * (1. + cosThetaE));
348 eDirX = sinThetaE * std::cos(phi);
349 eDirY = sinThetaE * std::sin(phi);
353 eDirection.
rotateUz(photonDirection0);
355 eDirection,eKineticEnergy) ;
356 fvect->push_back(dp);
362 if (iteration >= maxDopplerIterations)
364 photonE = photonEoriginal;
371 photonDirection1.
rotateUz(photonDirection0);
376 if (photonEnergy1 > 0.)
380 if (iteration < maxDopplerIterations)
383 eDirection.
rotateUz(photonDirection0);
385 eDirection,eKineticEnergy) ;
386 fvect->push_back(dp);
398 if(fAtomDeexcitation && iteration < maxDopplerIterations) {
401 size_t nbefore = fvect->size();
405 size_t nafter = fvect->size();
406 if(nafter > nbefore) {
407 for (
size_t i=nbefore; i<nafter; ++i) {
408 bindingE -= ((*fvect)[i])->GetKineticEnergy();
413 if(bindingE < 0.0) { bindingE = 0.0; }
double epsilon(double density, double temperature)
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
G4double G4Log(G4double x)
G4GLOB_DLL std::ostream G4cout
Hep3Vector & rotateUz(const Hep3Vector &)
G4double RandomSelectMomentum(G4int Z, G4int shellIndex) const
const G4ThreeVector & GetMomentumDirection() const
G4ParticleDefinition * GetDefinition() const
G4double GetKineticEnergy() const
static G4Electron * Electron()
virtual void SampleSecondaries(std::vector< G4DynamicParticle * > *, const G4MaterialCutsCouple *, const G4DynamicParticle *, G4double tmin, G4double maxEnergy)
G4LivermoreComptonModifiedModel(const G4ParticleDefinition *p=0, const G4String &nam="LivermoreModifiedCompton")
G4ParticleChangeForGamma * fParticleChange
virtual void Initialise(const G4ParticleDefinition *, const G4DataVector &)
virtual ~G4LivermoreComptonModifiedModel()
virtual G4double ComputeCrossSectionPerAtom(const G4ParticleDefinition *, G4double kinEnergy, G4double Z, G4double A=0, G4double cut=0, G4double emax=DBL_MAX)
static G4LossTableManager * Instance()
G4VAtomDeexcitation * AtomDeexcitation()
const G4Material * GetMaterial() const
const G4String & GetName() const
void SetProposedKineticEnergy(G4double proposedKinEnergy)
void ProposeMomentumDirection(G4double Px, G4double Py, G4double Pz)
G4double BindingEnergy(G4int Z, G4int shellIndex) const
void LoadData(const G4String &fileName)
G4int SelectRandomShell(G4int Z) const
G4bool CheckDeexcitationActiveRegion(G4int coupleIndex)
virtual const G4AtomicShell * GetAtomicShell(G4int Z, G4AtomicShellEnumerator shell)=0
void GenerateParticles(std::vector< G4DynamicParticle * > *secVect, const G4AtomicShell *, G4int Z, G4int coupleIndex)
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
G4ParticleChangeForGamma * GetParticleChangeForGamma()
G4double LowEnergyLimit() const
G4double HighEnergyLimit() const
const G4Element * SelectRandomAtom(const G4MaterialCutsCouple *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
void SetDeexcitationFlag(G4bool val)
void InitialiseElementSelectors(const G4ParticleDefinition *, const G4DataVector &)
void ProposeTrackStatus(G4TrackStatus status)
void ProposeLocalEnergyDeposit(G4double anEnergyPart)