124 G4cout <<
"### G4GoudsmitSaundersonMscModel loading ELSEPA data" <<
G4endl;
173 eloss = kineticEnergy -
185 kineticEnergy -= 0.5*eloss;
195 for(
G4int i=0;i<nelm;i++)
198 lambda0 += (theAtomNumDensityVector[i]*
s0);
210 for(
G4int i=0;i<1000;++i)
212 logx0 =
G4Log(1.+1./x0);
213 x1 = x0-(x0*((1.+x0)*logx0-1.0)-g1*0.5)/( (1.+2.*x0)*logx0-2.0);
216 if(x1 < 0.0) { x1 = 0.5*x0; }
217 else if(x1 > 2*x0) { x1 = 2*x0; }
218 else if(x1 < 0.5*x0) { x1 = 0.5*x0; }
219 delta = std::fabs( x1 - x0 );
221 if(delta < 1.0e-3*x1) {
break;}
236 G4double cosTheta1,sinTheta1,cosTheta2,sinTheta2;
237 G4double cosPhi1=1.0,sinPhi1=0.0,cosPhi2=1.0,sinPhi2=0.0;
238 G4double us=0.0,vs=0.0,ws=1.0,wss=0.,x_coord=0.0,y_coord=0.0,z_coord=1.0;
245 else if((epsilon1<((1.+lambdan)*expn))||(lambdan<1.))
248 xi= 2.*scrA*xi/(1.-xi +
scrA);
252 wss=std::sqrt(xi*(2.-xi));
273 us = sinTheta2*(cosTheta1*cosPhi1*cosPhi2 - sinPhi1*sinPhi2)
274 + cosTheta2*sinTheta1*cosPhi1;
275 vs = sinTheta2*(cosTheta1*sinPhi1*cosPhi2 + cosPhi1*sinPhi2)
276 + cosTheta2*sinTheta1*sinPhi1;
277 ws = cosTheta1*cosTheta2 - sinTheta1*sinTheta2*cosPhi2;
280 if(1. - ws < 0.5*scrA)
285 }
while((fabs(ws)>1.)&&(i<20));
286 if(i>=19)ws=cos(sqrt(scrA));
287 wss=std::sqrt((1. - ws)*(1. + ws));
288 us=wss*std::cos(phi1);
289 vs=wss*std::sin(phi1);
295 newDirection.rotateUz(oldDirection);
299 if(Qn1<0.02) { z_coord = 1.0 - Qn1*(0.5 - Qn1/6.); }
300 else { z_coord = (1.-
G4Exp(-Qn1))/Qn1; }
330 if(scrA < 10.) { Qn1 *= scrA*((1.+
scrA)*
G4Log(1.+1./scrA)-1.); }
331 else { Qn1*= (1.0 - 0.5/scrA - 0.5/(scrA*
scrA)) ; }
338 }
while(tet*r1*r1>sin(tet));
348 sint=sqrt(xi*(2.-xi));
369 if(iZ > 103) iZ = 103;
372 for(
G4int i=0;i<105;i++)
374 if((logE>=
ener[i])&&(logE<
ener[i+1])){enerInd=i;
break;}
383 y1=
TCSE[iZ-1][enerInd];
384 y2=
TCSE[iZ-1][enerInd+1];
385 acoeff=(y2-y1)/(x2*x2-x1*x1);
386 bcoeff=y2-acoeff*x2*x2;
387 Sig0=acoeff*logE*logE+bcoeff;
389 y1=
FTCSE[iZ-1][enerInd];
390 y2=
FTCSE[iZ-1][enerInd+1];
391 acoeff=(y2-y1)/(x2*x2-x1*x1);
392 bcoeff=y2-acoeff*x2*x2;
393 Sig1=acoeff*logE*logE+bcoeff;
402 Sig0=(y2-y1)*(logE-x1)/(x2-x1)+y1;
406 Sig1=(y2-y1)*(logE-x1)/(x2-x1)+y1;
412 if(kinEnergy<=1.0e+9)
416 y1=
TCSP[iZ-1][enerInd];
417 y2=
TCSP[iZ-1][enerInd+1];
418 acoeff=(y2-y1)/(x2*x2-x1*x1);
419 bcoeff=y2-acoeff*x2*x2;
420 Sig0=acoeff*logE*logE+bcoeff;
422 y1=
FTCSP[iZ-1][enerInd];
423 y2=
FTCSP[iZ-1][enerInd+1];
424 acoeff=(y2-y1)/(x2*x2-x1*x1);
425 bcoeff=y2-acoeff*x2*x2;
426 Sig1=acoeff*logE*logE+bcoeff;
435 Sig0=(y2-y1)*(logE-x1)/(x2-x1)+y1;
439 Sig1=(y2-y1)*(logE-x1)/(x2-x1)+y1;
526 rat = 1.e-3/(rat*(10.+rat)) ;
623 rat = 1.e-3/(rat*(10.+rat)) ;
716 if(zt >= 0.333333333) {
718 G4double cz = 0.5*(3.*zt-1.)/(1.-zt) ;
724 grej = exp(cz*
G4Log(u/u0))*(1.-u)/(1.-u0) ;
778 G4String filename =
"XSECTIONS.dat";
780 char* path = getenv(
"G4LEDATA");
783 G4Exception(
"G4GoudsmitSaundersonMscModel::LoadELSEPAXSections()",
"em0006",
785 "Environment variable G4LEDATA not defined");
790 G4String dirFile = pathString +
"/msc_GS/" + filename;
791 std::ifstream infile(dirFile, std::ios::in);
792 if( !infile.is_open()) {
794 ed <<
"Data file <" + dirFile +
"> is not opened!";
795 G4Exception(
"G4GoudsmitSaundersonMscModel::LoadELSEPAXSections()",
802 for(
G4int i=0 ; i<106 ;i++){
806 ed <<
"Error reading <" + dirFile +
"> loop #1 i= " << i;
807 G4Exception(
"G4GoudsmitSaundersonMscModel::LoadELSEPAXSections()",
811 if(aRead > 0.0) { aRead =
G4Log(aRead); }
812 else { aRead = 0.0; }
816 for(
G4int j=0;j<103;j++){
817 for(
G4int i=0;i<106;i++){
821 ed <<
"Error reading <" + dirFile +
"> loop #2 j= " << j
823 G4Exception(
"G4GoudsmitSaundersonMscModel::LoadELSEPAXSections()",
827 if(aRead > 0.0) { aRead =
G4Log(aRead); }
828 else { aRead = 0.0; }
833 for(
G4int j=0;j<103;j++){
834 for(
G4int i=0;i<106;i++){
838 ed <<
"Error reading <" + dirFile +
"> loop #3 j= " << j
840 G4Exception(
"G4GoudsmitSaundersonMscModel::LoadELSEPAXSections()",
844 if(aRead > 0.0) { aRead =
G4Log(aRead); }
845 else { aRead = 0.0; }
850 for(
G4int j=0;j<103;j++){
851 for(
G4int i=0;i<106;i++){
855 ed <<
"Error reading <" + dirFile +
"> loop #4 j= " << j
857 G4Exception(
"G4GoudsmitSaundersonMscModel::LoadELSEPAXSections()",
861 if(aRead > 0.0) { aRead =
G4Log(aRead); }
862 else { aRead = 0.0; }
867 for(
G4int j=0;j<103;j++){
868 for(
G4int i=0;i<106;i++){
872 ed <<
"Error reading <" + dirFile +
"> loop #5 j= " << j
874 G4Exception(
"G4GoudsmitSaundersonMscModel::LoadELSEPAXSections()",
878 if(aRead > 0.0) { aRead =
G4Log(aRead); }
879 else { aRead = 0.0; }
G4GoudsmitSaundersonMscModel(const G4String &nam="GoudsmitSaunderson")
void CalculateIntegrals(const G4ParticleDefinition *, G4double, G4double, G4double &, G4double &)
virtual G4double ComputeTrueStepLength(G4double geomStepLength)
G4GoudsmitSaundersonTable * GSTable
virtual void StartTracking(G4Track *)
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
G4double ComputeSafety(const G4ThreeVector &position, G4double limit=DBL_MAX)
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 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()