68 1.98550718E-02, 1.01666761E-01, 2.37233795E-01, 4.08282679E-01,
69 5.91717321E-01, 7.62766205E-01, 8.98333239E-01, 9.80144928E-01
72 5.06142681E-02, 1.11190517E-01, 1.56853323E-01, 1.81341892E-01,
73 1.81341892E-01, 1.56853323E-01, 1.11190517E-01, 5.06142681E-02
81: fIsRestrictedSamplingRequired(isrestricted), fIsElectron(iselectron) {
90 for (std::size_t i=0; i<
fDCS.size(); ++i) {
93 for (std::size_t i=0; i<
fDCSLow.size(); ++i) {
125 std::ifstream infile(
fname.c_str());
126 if (!infile.is_open()) {
128 " Problem while trying to read " +
fname +
" file.\n"+
129 " G4LEDATA version should be G4EMLOW7.12 or later.\n";
130 G4Exception(
"G4eDPWAElasticDCS::ReadCompressedFile",
"em0006",
154 const double theA = 0.01;
177 if (
fDCS[iz])
return;
189 for (std::size_t ie=0; ie<hNumEnergries; ++ie) {
192 std::ostringstream ossh;
194 std::istringstream finh(std::ios::in);
199 for (std::size_t ie=0; ie<hNumEnergries; ++ie) {
216 std::ostringstream ossl;
218 std::istringstream finl(std::ios::in);
247 std::ostringstream oss;
249 std::istringstream fin(std::ios::in);
278 if (mumin>=mumax)
return;
283 const std::vector<G4double>& theMuVector = (isLowerGrid) ?
gTheMus1 :
gTheMus2;
287 const std::size_t iMuStart = (mumin == 0.0) ? 0 : std::distance( theMuVector.begin(), std::upper_bound(theMuVector.begin(), theMuVector.end(), mumin) )-1 ;
289 const std::size_t iMuEnd = (mumax == 1.0) ? theMuVector.size()-2 : std::distance( theMuVector.begin(), std::upper_bound(theMuVector.begin(), theMuVector.end(), mumax) )-1 ;
294 for (std::size_t imu=iMuStart; imu<=iMuEnd; ++imu) {
298 const G4double low = (imu==iMuStart) ? mumin : theMuVector[imu];
299 const G4double del = (imu==iMuEnd) ? mumax-low : theMuVector[imu+1]-low;
301 for (std::size_t igl=0; igl<8; ++igl) {
302 const double mu = low + del*
gXGL[igl];
303 const double dcs =
G4Exp(the2DDCS->
Value(mu, lekin, ix, iy));
304 elcsPar +=
gWGL[igl]*dcs;
305 tr1csPar +=
gWGL[igl]*dcs*mu;
306 tr2csPar +=
gWGL[igl]*dcs*mu*(1.0-mu);
309 tr1cs += del*tr1csPar;
310 tr2cs += del*tr2csPar;
342 std::vector<G4double>
fW;
344 std::vector<G4double>
fA;
345 std::vector<G4double>
fB;
346 std::vector<G4int>
fI;
356 std::vector<OneSamplingTable>* sTables =
new std::vector<OneSamplingTable>(
gNumEnergies);
358 std::ostringstream oss;
361 std::istringstream fin(std::ios::in);
363 std::size_t ndata = 0;
373 for (std::size_t
id=0;
id<ndata; ++id) {
374 fin >> aTable.
fW[id];
376 for (std::size_t
id=0;
id<ndata; ++id) {
377 fin >> aTable.
fI[id];
380 for (std::size_t
id=0;
id<ndata; ++id) {
381 fin >> aTable.
fCum[id];
383 for (std::size_t
id=0;
id<ndata; ++id) {
384 fin >> aTable.
fA[id];
386 for (std::size_t
id=0;
id<ndata; ++id) {
387 fin >> aTable.
fB[id];
409 const std::size_t k = (std::size_t)rem;
410 const std::size_t iekin = (r1 < rem-k) ? k+1 : k;
412 const double mu =
SampleMu(iz, iekin, r2, r3);
434 const std::size_t k = (size_t)rem;
435 const std::size_t iekin = (r1 < rem-k) ? k : k+1;
437 const G4double mu =
SampleMu(iz, iekin, r2, 0.5*(1.0-costMax), 0.5*(1.0-costMin));
448 std::size_t indxl = (std::size_t)rest;
450 if (rtn.
fW[indxl] < dum0) indxl = rtn.
fI[indxl];
455 const G4double dum1 = (1.0 + rtn.
fA[indxl] + rtn.
fB[indxl]) * delta * aval;
456 const G4double dum2 = delta * delta + rtn.
fA[indxl] * delta * aval + rtn.
fB[indxl] * aval * aval;
458 const G4double u = theUVect[indxl] + dum1 / dum2 * (theUVect[indxl + 1] - theUVect[indxl]);
467 const std::vector<G4double>& uvect) {
468 const std::size_t iLow = std::distance( uvect.begin(), std::upper_bound(uvect.begin(), uvect.end(), u) )-1;
469 const G4double tau = (u-uvect[iLow])/(uvect[iLow+1]-uvect[iLow]);
470 const G4double dum0 = (1.0+stable.
fA[iLow]*(1.0-tau)+stable.
fB[iLow]);
471 const G4double dum1 = 2.0*stable.
fB[iLow]*tau;
472 const G4double dum2 = 1.0 - std::sqrt(
std::max(0.0, 1.0-2.0*dum1*tau/(dum0*dum0)));
483 const G4double xiMin = (muMin > 0.0) ?
FindCumValue((theA+1.0)*muMin/(theA+muMin), rtn, theUVect) : 0.0;
484 const G4double xiMax = (muMax < 1.0) ?
FindCumValue((theA+1.0)*muMax/(theA+muMax), rtn, theUVect) : 1.0;
486 const G4double xi = xiMin+r1*(xiMax-xiMin);
487 const std::size_t iLow = std::distance( rtn.
fCum.begin(), std::upper_bound(rtn.
fCum.begin(), rtn.
fCum.end(), xi) )-1;
491 const G4double dum1 = (1.0 + rtn.
fA[iLow] + rtn.
fB[iLow]) * delta * aval;
492 const G4double dum2 = delta * delta + rtn.
fA[iLow] * delta * aval + rtn.
fB[iLow] * aval * aval;
493 const G4double u = theUVect[iLow] + dum1 / dum2 * (theUVect[iLow + 1] - theUVect[iLow]);
494 return theA*u/(theA+1.0-u);
503 const char* path = std::getenv(
"G4LEDATA");
505 std::ostringstream ost;
506 ost << path <<
"/dpwa/";
509 G4Exception(
"G4eDPWAElasticDCS::FindDirectoryPath()",
"em0006",
511 "Environment variable G4LEDATA not defined");
525 std::ifstream in(compfilename, std::ios::binary | std::ios::ate);
528 G4int fileSize = in.tellg();
530 in.seekg(0,std::ios::beg);
532 Bytef *compdata =
new Bytef[fileSize];
534 in.read((
char*)compdata, fileSize);
537 uLongf complen = (uLongf)(fileSize*4);
538 Bytef *uncompdata =
new Bytef[complen];
539 while (
Z_OK!=
uncompress(uncompdata, &complen, compdata, fileSize)) {
543 uncompdata =
new Bytef[complen];
548 dataString =
new G4String((
char*)uncompdata, (
long)complen);
550 delete [] uncompdata;
553 " Problem while trying to read " +
fname +
" data file.\n"+
554 " G4LEDATA version should be G4EMLOW7.12 or later.\n";
555 G4Exception(
"G4eDPWAElasticDCS::ReadCompressedFile",
"em0006",
561 iss.str(*dataString);
610 for (std::size_t imc=0; imc<numMatCuts; ++imc) {
639 for (
G4int ie=0; ie<numEbins; ++ie) {
647 const G4double A = moliereXc2/(4.0*tau*(tau+2.)*moliereBc);
649 const G4double dum0 = (tau+2.)/(tau+1.);
651 G4double gm =
G4Log(0.5*tau/tauCut) + (1.+dum0*dum0)*
G4Log(2.*(tau-tauCut+2.)/(tau+4.))
652 - 0.25*(tau+2.)*( tau+2.+2.*(2.*tau+1.)/(dum1*dum1))*
653 G4Log((tau+4.)*(tau-tauCut)/tau/(tau-tauCut+2.))
654 + 0.5*(tau-2*tauCut)*(tau+2.)*(1./(tau-tauCut)-1./(dum1*dum1));
661 scpCorr = 1.-gm*
z0/(
z0*(
z0+1.));
674 const G4double finstrc2 = 5.325135453E-5;
687 for(
G4int ielem = 0; ielem < numelems; ielem++) {
688 const G4double zet = (*theElemVect)[ielem]->GetZ();
689 const G4double iwa = (*theElemVect)[ielem]->GetN();
690 const G4double ipz = theNbAtomsPerVolVect[ielem]/theTotNbAtomsPerVol;
691 const G4double dum = ipz*zet*(zet+1.0);
693 ze += dum*(-2.0/3.0)*
G4Log(zet);
694 zx += dum*
G4Log(1.0+3.34*finstrc2*zet*zet);
699 theBc = const1*density*zs/sa*
G4Exp(ze/zs)/
G4Exp(zx/zs);
700 theXc2 = const2*density*zs/sa;
std::vector< const G4Element * > G4ElementVector
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
G4double G4Log(G4double x)
G4double GetZeffective() const
const G4Material * GetMaterial() const
G4double GetDensity() const
const G4ElementVector * GetElementVector() const
G4double GetTotNbOfAtomsPerVolume() const
G4IonisParamMat * GetIonisation() const
size_t GetNumberOfElements() const
const G4double * GetVecNbOfAtomsPerVolume() const
void PutY(std::size_t idy, G4double value)
G4double Value(G4double x, G4double y, std::size_t &lastidx, std::size_t &lastidy) const
void SetBicubicInterpolation(G4bool)
void PutValue(std::size_t idx, std::size_t idy, G4double value)
void PutX(std::size_t idx, G4double value)
const G4MaterialCutsCouple * GetMaterialCutsCouple(G4int i) const
std::size_t GetTableSize() const
const std::vector< G4double > * GetEnergyCutsVector(std::size_t pcIdx) const
static G4ProductionCutsTable * GetProductionCutsTable()
void LoadDCSForZ(G4int iz)
static std::vector< G4double > gTheU1
static std::size_t gNumThetas2
void ReadCompressedFile(G4String fname, std::istringstream &iss)
std::vector< G4Physics2DVector * > fDCS
static G4double gInvDelLogEkin
static constexpr std::size_t gMaxZ
static std::size_t gIndxEnergyLim
static G4double gLogMinEkin
static const G4double gWGL[8]
std::vector< SCPCorrection * > fSCPCPerMatCuts
std::vector< std::vector< OneSamplingTable > * > fSamplingTables
static std::vector< G4double > gTheMus2
void ComputeCSPerAtom(G4int iz, G4double ekin, G4double &elcs, G4double &tr1cs, G4double &tr2cs, G4double mumin=0.0, G4double mumax=1.0)
void ComputeMParams(const G4Material *mat, G4double &theBc, G4double &theXc2)
void InitialiseForZ(std::size_t iz)
void InitSCPCorrection(G4double lowEnergyLimit, G4double highEnergyLimit)
G4double ComputeScatteringPowerCorrection(const G4MaterialCutsCouple *matcut, G4double ekin)
static std::size_t gNumEnergies
static std::vector< G4double > gTheEnergies
static std::vector< G4double > gTheU2
static G4bool gIsGridLoaded
void BuildSmplingTableForZ(G4int iz)
G4double SampleMu(std::size_t izet, std::size_t ie, G4double r1, G4double r2)
G4double SampleCosineTheta(std::size_t iz, G4double lekin, G4double r1, G4double r2, G4double r3)
static std::vector< G4double > gTheMus1
const G4String & FindDirectoryPath()
G4double FindCumValue(G4double u, const OneSamplingTable &stable, const std::vector< G4double > &uvect)
G4double SampleCosineThetaRestricted(std::size_t iz, G4double lekin, G4double r1, G4double r2, G4double costMax, G4double costMin)
static std::size_t gNumThetas1
static G4String gDataDirectory
G4eDPWAElasticDCS(G4bool iselectron=true, G4bool isrestricted=false)
const G4int fNumSPCEbinPerDec
G4bool fIsRestrictedSamplingRequired
static const G4double gXGL[8]
std::vector< G4Physics2DVector * > fDCSLow
static constexpr double electron_mass_c2
static constexpr double cm3
static constexpr double degree
static constexpr double keV
static constexpr double twopi
static constexpr double MeV
static constexpr double sr
static constexpr double g
static constexpr double cm2
static constexpr double cm
T max(const T t1, const T t2)
brief Return the largest of the two arguments
T min(const T t1, const T t2)
brief Return the smallest of the two arguments
std::vector< G4double > fW
std::vector< G4double > fB
std::vector< G4double > fA
void SetSize(std::size_t nx, G4bool useAlias)
std::vector< G4double > fCum
std::vector< G4double > fB
std::vector< G4double > fA
void SetSize(std::size_t nx, G4bool useAlias)
std::vector< G4double > fW
std::vector< G4double > fCum
int ZEXPORT uncompress(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen)