121 G4cout <<
"### G4GoudsmitSaundersonMscModel loading ELSEPA data" <<
G4endl;
169 eloss = kineticEnergy -
181 kineticEnergy -= 0.5*eloss;
191 for(
G4int i=0;i<nelm;i++)
194 lambda0 += (theAtomNumDensityVector[i]*
s0);
206 for(
G4int i=0;i<1000;++i)
208 logx0 =
G4Log(1.+1./x0);
209 x1 = x0-(x0*((1.+x0)*logx0-1.0)-g1*0.5)/( (1.+2.*x0)*logx0-2.0);
212 if(x1 < 0.0) { x1 = 0.5*x0; }
213 else if(x1 > 2*x0) { x1 = 2*x0; }
214 else if(x1 < 0.5*x0) { x1 = 0.5*x0; }
215 delta = std::fabs( x1 - x0 );
217 if(delta < 1.0e-3*x1) {
break;}
232 G4double cosTheta1,sinTheta1,cosTheta2,sinTheta2;
233 G4double cosPhi1=1.0,sinPhi1=0.0,cosPhi2=1.0,sinPhi2=0.0;
234 G4double us=0.0,vs=0.0,ws=1.0,wss=0.,x_coord=0.0,y_coord=0.0,z_coord=1.0;
241 else if((epsilon1<((1.+lambdan)*expn))||(lambdan<1.))
244 xi= 2.*scrA*xi/(1.-xi +
scrA);
248 wss=std::sqrt(xi*(2.-xi));
269 us = sinTheta2*(cosTheta1*cosPhi1*cosPhi2 - sinPhi1*sinPhi2) + cosTheta2*sinTheta1*cosPhi1;
270 vs = sinTheta2*(cosTheta1*sinPhi1*cosPhi2 + cosPhi1*sinPhi2) + cosTheta2*sinTheta1*sinPhi1;
271 ws = cosTheta1*cosTheta2 - sinTheta1*sinTheta2*cosPhi2;
278 }
while((fabs(ws)>1.)&&(i<20));
279 if(i>=19)ws=cos(sqrtA);
280 wss=std::sqrt((1.-ws*ws));
281 us=wss*std::cos(phi1);
282 vs=wss*std::sin(phi1);
288 newDirection.rotateUz(oldDirection);
292 if(Qn1<0.02) { z_coord = 1.0 - Qn1*(0.5 - Qn1/6.); }
293 else { z_coord = (1.-
G4Exp(-Qn1))/Qn1; }
323 if(scrA < 10.) { Qn1 *= scrA*((1.+
scrA)*
G4Log(1.+1./scrA)-1.); }
324 else { Qn1*= (1.0 - 0.5/scrA - 0.5/(scrA*
scrA)) ; }
331 }
while(tet*r1*r1>sin(tet));
341 sint=sqrt(xi*(2.-xi));
362 if(iZ > 103) iZ = 103;
365 for(
G4int i=0;i<105;i++)
367 if((logE>=
ener[i])&&(logE<
ener[i+1])){enerInd=i;
break;}
376 y1=
TCSE[iZ-1][enerInd];
377 y2=
TCSE[iZ-1][enerInd+1];
378 acoeff=(y2-y1)/(x2*x2-x1*x1);
379 bcoeff=y2-acoeff*x2*x2;
380 Sig0=acoeff*logE*logE+bcoeff;
382 y1=
FTCSE[iZ-1][enerInd];
383 y2=
FTCSE[iZ-1][enerInd+1];
384 acoeff=(y2-y1)/(x2*x2-x1*x1);
385 bcoeff=y2-acoeff*x2*x2;
386 Sig1=acoeff*logE*logE+bcoeff;
395 Sig0=(y2-y1)*(logE-x1)/(x2-x1)+y1;
399 Sig1=(y2-y1)*(logE-x1)/(x2-x1)+y1;
405 if(kinEnergy<=1.0e+9)
409 y1=
TCSP[iZ-1][enerInd];
410 y2=
TCSP[iZ-1][enerInd+1];
411 acoeff=(y2-y1)/(x2*x2-x1*x1);
412 bcoeff=y2-acoeff*x2*x2;
413 Sig0=acoeff*logE*logE+bcoeff;
415 y1=
FTCSP[iZ-1][enerInd];
416 y2=
FTCSP[iZ-1][enerInd+1];
417 acoeff=(y2-y1)/(x2*x2-x1*x1);
418 bcoeff=y2-acoeff*x2*x2;
419 Sig1=acoeff*logE*logE+bcoeff;
428 Sig0=(y2-y1)*(logE-x1)/(x2-x1)+y1;
432 Sig1=(y2-y1)*(logE-x1)/(x2-x1)+y1;
518 rat = 1.e-3/(rat*(10.+rat)) ;
615 rat = 1.e-3/(rat*(10.+rat)) ;
708 if(zt >= 0.333333333) {
710 G4double cz = 0.5*(3.*zt-1.)/(1.-zt) ;
716 grej = exp(cz*
G4Log(u/u0))*(1.-u)/(1.-u0) ;
770 G4String filename =
"XSECTIONS.dat";
772 char* path = getenv(
"G4LEDATA");
775 G4Exception(
"G4GoudsmitSaundersonMscModel::LoadELSEPAXSections()",
"em0006",
777 "Environment variable G4LEDATA not defined");
782 G4String dirFile = pathString +
"/msc_GS/" + filename;
783 std::ifstream infile(dirFile, std::ios::in);
784 if( !infile.is_open()) {
786 ed <<
"Data file <" + dirFile +
"> is not opened!";
787 G4Exception(
"G4GoudsmitSaundersonMscModel::LoadELSEPAXSections()",
794 for(
G4int i=0 ; i<106 ;i++){
798 ed <<
"Error reading <" + dirFile +
"> loop #1 i= " << i;
799 G4Exception(
"G4GoudsmitSaundersonMscModel::LoadELSEPAXSections()",
803 if(aRead > 0.0) { aRead =
G4Log(aRead); }
804 else { aRead = 0.0; }
808 for(
G4int j=0;j<103;j++){
809 for(
G4int i=0;i<106;i++){
813 ed <<
"Error reading <" + dirFile +
"> loop #2 j= " << j
815 G4Exception(
"G4GoudsmitSaundersonMscModel::LoadELSEPAXSections()",
819 if(aRead > 0.0) { aRead =
G4Log(aRead); }
820 else { aRead = 0.0; }
825 for(
G4int j=0;j<103;j++){
826 for(
G4int i=0;i<106;i++){
830 ed <<
"Error reading <" + dirFile +
"> loop #3 j= " << j
832 G4Exception(
"G4GoudsmitSaundersonMscModel::LoadELSEPAXSections()",
836 if(aRead > 0.0) { aRead =
G4Log(aRead); }
837 else { aRead = 0.0; }
842 for(
G4int j=0;j<103;j++){
843 for(
G4int i=0;i<106;i++){
847 ed <<
"Error reading <" + dirFile +
"> loop #4 j= " << j
849 G4Exception(
"G4GoudsmitSaundersonMscModel::LoadELSEPAXSections()",
853 if(aRead > 0.0) { aRead =
G4Log(aRead); }
854 else { aRead = 0.0; }
859 for(
G4int j=0;j<103;j++){
860 for(
G4int i=0;i<106;i++){
864 ed <<
"Error reading <" + dirFile +
"> loop #5 j= " << j
866 G4Exception(
"G4GoudsmitSaundersonMscModel::LoadELSEPAXSections()",
870 if(aRead > 0.0) { aRead =
G4Log(aRead); }
871 else { aRead = 0.0; }
G4GoudsmitSaundersonMscModel(const G4String &nam="GoudsmitSaunderson")
void CalculateIntegrals(const G4ParticleDefinition *, G4double, G4double, G4double &, G4double &)
virtual G4double ComputeTrueStepLength(G4double geomStepLength)
G4GoudsmitSaundersonTable * GSTable
static G4double TCSP[103][106]
static G4LossTableManager * Instance()
std::vector< G4Element * > G4ElementVector
std::ostringstream G4ExceptionDescription
G4double GetKineticEnergy() const
CLHEP::Hep3Vector G4ThreeVector
const G4DynamicParticle * GetDynamicParticle() const
G4int currentMaterialIndex
G4StepStatus GetStepStatus() const
G4double ConvertTrueToGeom(G4double &tLength, G4double &gLength)
const G4MaterialCutsCouple * GetMaterialCutsCouple() const
const G4ParticleDefinition * particle
G4double SampleTheta(G4double, G4double, G4double)
G4ParticleDefinition * GetDefinition() const
G4LossTableManager * theManager
const G4Step * GetStep() const
const G4ElementVector * GetElementVector() const
G4double currentKinEnergy
G4StepPoint * GetPreStepPoint() const
G4double GetEnergy(const G4ParticleDefinition *part, G4double range, const G4MaterialCutsCouple *couple)
void StartTracking(G4Track *)
static G4double FTCSE[103][106]
static const G4double scrA[76 *11]
virtual G4double ComputeTruePathLengthLimit(const G4Track &track, G4double ¤tMinimalStep)
const G4double * GetVecNbOfAtomsPerVolume() const
G4GLOB_DLL std::ostream G4cout
G4ParticleChangeForMSC * fParticleChange
static G4double TCSE[103][106]
const G4ThreeVector & GetPosition() const
G4double GetRange(const G4ParticleDefinition *part, G4double kineticEnergy, const G4MaterialCutsCouple *couple)
G4ParticleChangeForMSC * GetParticleChangeForMSC(const G4ParticleDefinition *p=0)
virtual void Initialise(const G4ParticleDefinition *, const G4DataVector &)
G4double ComputeGeomLimit(const G4Track &, G4double &presafety, G4double limit)
G4ThreeVector fDisplacement
G4double GetTransportMeanFreePath(const G4ParticleDefinition *part, G4double kinEnergy)
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
G4double ComputeSafety(const G4ThreeVector &position, G4double limit)
G4double G4Log(G4double x)
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
void ProposeMomentumDirection(const G4ThreeVector &Pfinal)
static G4double FTCSP[103][106]
static G4Positron * Positron()
void SetParticle(const G4ParticleDefinition *p)
G4double GetDEDX(const G4ParticleDefinition *part, G4double kineticEnergy, const G4MaterialCutsCouple *couple)
void SetCurrentCouple(const G4MaterialCutsCouple *)
virtual ~G4GoudsmitSaundersonMscModel()
virtual G4double ComputeCrossSectionPerAtom(const G4ParticleDefinition *particle, G4double KineticEnergy, G4double AtomicNumber, G4double, G4double, G4double)
G4double GetSafety() const
G4MscStepLimitType steppingAlgorithm
static G4Electron * Electron()
void SampleCosineTheta(G4double, G4double, G4double &, G4double &)
size_t GetNumberOfElements() const
virtual G4ThreeVector & SampleScattering(const G4ThreeVector &, G4double safety)
const G4MaterialCutsCouple * currentCouple
const G4Material * GetMaterial() const
static G4double ener[106]
virtual G4double ComputeGeomPathLength(G4double truePathLength)
void LoadELSEPAXSections()