44 using namespace CLHEP;
52 :
G4VEmModel(
"DiscrScat"), fParticleChange(nullptr),fAnalogModel(
"pwe"),
53 fNumAngles(iNumAngles), fLowEnergyLimit(2*
keV)
85 G4cout <<
"G4DiscreteScatteringModel::Initialise start"<<
G4endl;
87 const G4int maxZ = 100;
89 char *path = getenv(
"G4GBFPDATA");
92 G4Exception(
"G4DiscreteScatteringModel::Initialise",
"em0006",
97 std::ostringstream eFullFileName;
98 eFullFileName << path;
105 for(
G4int i=0; i<numOfCouples; ++i)
112 for (
G4int j=0; j<nelm; ++j)
116 else if(Z > maxZ) { Z = maxZ; }
120 G4cout <<
"G4DiscreteScatteringModel::Initialise completed"<<
G4endl;
137 +
"_tcs_"+ss1.str()+
"_"+ss2.str()+
".dat";
140 std::ifstream in(tcsPath, std::ifstream::binary|std::ifstream::in);
145 message+=
"\" not found";
146 G4Exception(
"G4DiscreteScatteringModel::LoadData",
"em0003",
168 +ss1.str()+
"_"+ss2.str()+
".dat";
171 std::ifstream in2(cdfPath, std::ifstream::binary|std::ifstream::in);
176 message+=
"\" not found";
177 G4Exception(
"G4DiscreteScatteringModel::LoadData",
"em0003",
198 std::vector<G4PhysicsVector*> tempDataCDF;
200 for (
int j=0; j<numEnergies; j++)
222 std::ofstream file(
"tempDataFile.dat",
223 std::fstream::out | std::fstream::trunc);
230 file<<
"-1. 1. "<<fNumAngles<<
" "<<fNumAngles<<
G4endl;
237 while(in2>>temp1>>temp2)
240 file<<setprecision(16)<<temp1<<
" "<<temp2<<
G4endl;
247 if (cntr==fNumAngles)
250 std::ifstream inTemp(
"tempDataFile.dat",
251 std::ifstream::binary|std::ifstream::in);
252 tempDataCDF[j]->Retrieve(inTemp,
true);
255 inTemp.close(), inTemp.clear(), file.close(), file.clear();
256 file.open(
"tempDataFile.dat",std::fstream::out | std::fstream::trunc);
257 file<<
"-1. 1. "<<fNumAngles<<
" "<<fNumAngles<<
G4endl;
269 std::vector<G4DynamicParticle*>*,
281 E,cutEnergy,E)->GetZ());
329 G4cout <<
"G4DiscreteScatteringModel::SampleSecondaries():"
330 <<
" CDF was not inverted properly "<<k<<
G4endl;
349 newDirection.rotateUz(dir);
360 if (E==0.) {
return 1e30;}
380 G4double cost = sqrt(1.0 - sint*sint);
386 dir.set(dirx,diry,dirz);
static G4ElementData * fCdf
G4PhysicsVector * GetComponentDataByIndex(G4int Z, size_t idx)
void ReadData(G4int, const G4String &argFileName)
void AddComponent(G4int Z, G4int id, G4PhysicsVector *v)
std::vector< G4Element * > G4ElementVector
G4double GetKineticEnergy() const
CLHEP::Hep3Vector G4ThreeVector
G4ThreeVector GetNewDirection(G4double z1)
G4PhysicsVector * GetElementData(G4int Z)
G4ParticleDefinition * GetDefinition() const
G4DiscreteScatteringModel(G4int iNumAngles=1)
size_t GetVectorLength() const
const G4ElementVector * GetElementVector() const
void ProposeMomentumDirection(G4double Px, G4double Py, G4double Pz)
void SetHighEnergyLimit(G4double)
virtual G4double ComputeCrossSectionPerAtom(const G4ParticleDefinition *, G4double E, G4double Z, G4double A=0., G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
virtual void Initialise(const G4ParticleDefinition *, const G4DataVector &)
void InitialiseForElement(G4int Z, G4PhysicsVector *v)
G4GLOB_DLL std::ostream G4cout
size_t GetTableSize() const
const G4ThreeVector & GetMomentumDirection() const
virtual void SampleSecondaries(std::vector< G4DynamicParticle * > *, const G4MaterialCutsCouple *, const G4DynamicParticle *, G4double tmin=0.0, G4double maxEnergy=DBL_MAX)
static const double twopi
size_t FindBin(G4double energy, size_t idx) const
G4double Energy(size_t index) const
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
virtual ~G4DiscreteScatteringModel()
G4double G4Log(G4double x)
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
static G4ProductionCutsTable * GetProductionCutsTable()
const G4MaterialCutsCouple * GetMaterialCutsCouple(G4int i) const
G4double GetValueForElement(G4int Z, G4double kinEnergy)
G4ParticleChangeForGamma * fParticleChange
virtual G4bool Retrieve(std::ifstream &fIn, G4bool ascii=false)
static G4ElementData * fTcs
size_t GetNumberOfElements() const
void SetLowEnergyLimit(G4double)
void InitialiseForComponent(G4int Z, G4int nComponents=0)
const G4Element * SelectRandomAtom(const G4MaterialCutsCouple *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
G4ParticleChangeForGamma * GetParticleChangeForGamma()
const G4Material * GetMaterial() const