291 if (fVerboseLevel > 3)
292 G4cout <<
"Calling SampleSecondaries() of G4PenelopeComptonModel" <<
G4endl;
306 const G4int nmax = 64;
315 size_t numberOfOscillators = theTable->size();
316 size_t targetOscillator = 0;
319 G4double ek = photonEnergy0/electron_mass_c2;
328 static G4double taumax = std::nexttoward(1.0,0.0);
329 if (fVerboseLevel > 3)
330 G4cout <<
"G4PenelopeComptonModel: maximum value of tau: 1 - " << 1.-taumax <<
G4endl;
333 G4double a2 = a1+2.0*ek*(1.0+ek)/(ek2*ek2);
340 if (photonEnergy0 > 5*MeV)
349 TST = (1.0+tau*(ek1+tau*(ek2+tau*eks)))/(eks*tau*(1.0+tau*tau));
351 if (tau > taumax) tau = taumax;
353 cosTheta = 1.0 - (1.0-tau)/(ek*tau);
357 targetOscillator = numberOfOscillators-1;
359 G4bool levelFound =
false;
360 for (
size_t j=0;j<numberOfOscillators && !levelFound; j++)
362 S += (*theTable)[j]->GetOscillatorStrength();
365 targetOscillator = j;
370 ionEnergy = (*theTable)[targetOscillator]->GetIonisationEnergy();
371 }
while((
epsilon*photonEnergy0-photonEnergy0+ionEnergy) >0);
380 for (
size_t i=0;i<numberOfOscillators;i++)
382 ionEnergy = (*theTable)[i]->GetIonisationEnergy();
383 if (photonEnergy0 > ionEnergy)
385 G4double aux2 = photonEnergy0*(photonEnergy0-ionEnergy)*2.0;
386 hartreeFunc = (*theTable)[i]->GetHartreeFactor();
387 oscStren = (*theTable)[i]->GetOscillatorStrength();
388 pzomc = hartreeFunc*(aux2-electron_mass_c2*ionEnergy)/
389 (electron_mass_c2*std::sqrt(2.0*aux2+ionEnergy*ionEnergy));
391 rni = 1.0-0.5*
G4Exp(0.5-(std::sqrt(0.5)+std::sqrt(2.0)*pzomc)*
392 (std::sqrt(0.5)+std::sqrt(2.0)*pzomc));
394 rni = 0.5*
G4Exp(0.5-(std::sqrt(0.5)-std::sqrt(2.0)*pzomc)*
395 (std::sqrt(0.5)-std::sqrt(2.0)*pzomc));
407 if (tau > taumax) tau = taumax;
408 cdt1 = (1.0-tau)/(ek*tau);
411 for (
size_t i=0;i<numberOfOscillators;i++)
413 ionEnergy = (*theTable)[i]->GetIonisationEnergy();
414 if (photonEnergy0 > ionEnergy)
416 aux = photonEnergy0*(photonEnergy0-ionEnergy)*cdt1;
417 hartreeFunc = (*theTable)[i]->GetHartreeFactor();
418 oscStren = (*theTable)[i]->GetOscillatorStrength();
419 pzomc = hartreeFunc*(aux-electron_mass_c2*ionEnergy)/
420 (electron_mass_c2*std::sqrt(2.0*aux+ionEnergy*ionEnergy));
422 rn[i] = 1.0-0.5*
G4Exp(0.5-(std::sqrt(0.5)+std::sqrt(2.0)*pzomc)*
423 (std::sqrt(0.5)+std::sqrt(2.0)*pzomc));
425 rn[i] = 0.5*
G4Exp(0.5-(std::sqrt(0.5)-std::sqrt(2.0)*pzomc)*
426 (std::sqrt(0.5)-std::sqrt(2.0)*pzomc));
434 TST =
S*(1.0+tau*(ek1+tau*(ek2+tau*eks)))/(eks*tau*(1.0+tau*tau));
437 cosTheta = 1.0 - cdt1;
446 targetOscillator = numberOfOscillators-1;
447 G4bool levelFound =
false;
448 for (
size_t i=0;i<numberOfOscillators && !levelFound;i++)
452 targetOscillator = i;
457 hartreeFunc = (*theTable)[targetOscillator]->GetHartreeFactor();
458 oscStren = (*theTable)[targetOscillator]->GetOscillatorStrength();
460 pzomc = (std::sqrt(0.5)-std::sqrt(0.5-
G4Log(2.0*
A)))/
461 (std::sqrt(2.0)*hartreeFunc);
463 pzomc = (std::sqrt(0.5-
G4Log(2.0-2.0*
A))-std::sqrt(0.5))/
464 (std::sqrt(2.0)*hartreeFunc);
465 }
while (pzomc < -1);
468 G4double XQC = 1.0+tau*(tau-2.0*cosTheta);
469 G4double AF = std::sqrt(XQC)*(1.0+tau*(tau-cosTheta)/XQC);
474 fpz = 1.0+AF*std::max(std::min(pzomc,0.2),-0.2);
482 epsilon = (tau/b1)*(b2+std::sqrt(std::abs(b2*b2-b1*(1.0-T))));
484 epsilon = (tau/b1)*(b2-std::sqrt(std::abs(b2*b2-b1*(1.0-T))));
488 G4double sinTheta = std::sqrt(1-cosTheta*cosTheta);
490 G4double dirx = sinTheta * std::cos(phi);
491 G4double diry = sinTheta * std::sin(phi);
496 photonDirection1.
rotateUz(photonDirection0);
501 if (photonEnergy1 > 0.)
511 ionEnergy = (*theTable)[targetOscillator]->GetIonisationEnergy();
514 photonEnergy0*photonEnergy0+photonEnergy1*(photonEnergy1-2.0*photonEnergy0*cosTheta);
518 cosThetaE = (photonEnergy0-photonEnergy1*cosTheta)/std::sqrt(Q2);
521 G4double sinThetaE = std::sqrt(1-cosThetaE*cosThetaE);
525 G4int shFlag = (*theTable)[targetOscillator]->GetShellFlag();
526 G4int Z = (
G4int) (*theTable)[targetOscillator]->GetParentZ();
533 if (Z > 0 && shFlag<30)
535 shell = fTransitionManager->Shell(Z,shFlag-1);
536 bindingEnergy = shell->BindingEnergy();
539 G4double ionEnergyInPenelopeDatabase = ionEnergy;
541 ionEnergy = std::max(bindingEnergy,ionEnergyInPenelopeDatabase);
545 G4double eKineticEnergy = diffEnergy - ionEnergy;
546 G4double localEnergyDeposit = ionEnergy;
550 if (eKineticEnergy < 0)
556 localEnergyDeposit = diffEnergy;
557 eKineticEnergy = 0.0;
563 if (fAtomDeexcitation && shell)
566 if (fAtomDeexcitation->CheckDeexcitationActiveRegion(index))
568 size_t nBefore = fvect->size();
569 fAtomDeexcitation->GenerateParticles(fvect,shell,Z,index);
570 size_t nAfter = fvect->size();
572 if (nAfter > nBefore)
574 for (
size_t j=nBefore;j<nAfter;j++)
576 G4double itsEnergy = ((*fvect)[j])->GetKineticEnergy();
577 if (itsEnergy < localEnergyDeposit)
579 localEnergyDeposit -= itsEnergy;
581 energyInFluorescence += itsEnergy;
582 else if (((*fvect)[j])->GetParticleDefinition() ==
584 energyInAuger += itsEnergy;
589 (*fvect)[j] =
nullptr;
600 G4double xEl = sinThetaE * std::cos(phi+pi);
601 G4double yEl = sinThetaE * std::sin(phi+pi);
604 eDirection.
rotateUz(photonDirection0);
606 eDirection,eKineticEnergy) ;
607 fvect->push_back(electron);
609 if (localEnergyDeposit < 0)
611 G4Exception(
"G4PenelopeComptonModel::SampleSecondaries()",
612 "em2099",
JustWarning,
"WARNING: Negative local energy deposit");
613 localEnergyDeposit=0.;
619 electronEnergy = eKineticEnergy;
620 if (fVerboseLevel > 1)
622 G4cout <<
"-----------------------------------------------------------" <<
G4endl;
623 G4cout <<
"Energy balance from G4PenelopeCompton" <<
G4endl;
624 G4cout <<
"Incoming photon energy: " << photonEnergy0/keV <<
" keV" <<
G4endl;
625 G4cout <<
"-----------------------------------------------------------" <<
G4endl;
626 G4cout <<
"Scattered photon: " << photonEnergy1/keV <<
" keV" <<
G4endl;
627 G4cout <<
"Scattered electron " << electronEnergy/keV <<
" keV" <<
G4endl;
628 if (energyInFluorescence)
629 G4cout <<
"Fluorescence x-rays: " << energyInFluorescence/keV <<
" keV" <<
G4endl;
631 G4cout <<
"Auger electrons: " << energyInAuger/keV <<
" keV" <<
G4endl;
632 G4cout <<
"Local energy deposit " << localEnergyDeposit/keV <<
" keV" <<
G4endl;
633 G4cout <<
"Total final state: " << (photonEnergy1+electronEnergy+energyInFluorescence+
634 localEnergyDeposit+energyInAuger)/keV <<
636 G4cout <<
"-----------------------------------------------------------" <<
G4endl;
638 if (fVerboseLevel > 0)
640 G4double energyDiff = std::fabs(photonEnergy1+
641 electronEnergy+energyInFluorescence+
642 localEnergyDeposit+energyInAuger-photonEnergy0);
643 if (energyDiff > 0.05*keV)
644 G4cout <<
"Warning from G4PenelopeCompton: problem with energy conservation: " <<
645 (photonEnergy1+electronEnergy+energyInFluorescence+energyInAuger+localEnergyDeposit)/keV <<
646 " keV (final) vs. " <<
647 photonEnergy0/keV <<
" keV (initial)" <<
G4endl;