Import Geant4 11.2.1 source tree

This commit is contained in:
Gabriele Cosmo
2024-02-16 14:58:45 +01:00
parent 860a2b92bf
commit dda54bbdcf
331 changed files with 48457 additions and 50699 deletions
@@ -6,6 +6,13 @@ It must **not** be used as a substitute for writing good git commit messages!
-------------------------------------------------------------------------------
## 2024-01-23 V.Ivanchenko (emstand-V11-01-25)
- G4IonICRU73Data - fixed bug #2586 for the case if target material has
an element with Z>92, improve debug printouts. In the Lindhard-Sorensen
model to compute dEdx the first try is to take it from ICRU73 or ICRU90
data, if this class return 0.0, then dEdx is computed from G4GenericIon
and effective charge.
## 2023-11-03 Ben Morgan (emstand-V11-01-24)
- Use "G4" prefixed version of EXPAT/ZLIB CMake variables
@@ -65,6 +65,7 @@ public:
// Z - atomic number of the projectile
// e - energy per nucleon, loge = log(e)
// if data for a given combination Z/material exist the DEDX > 0.
G4double GetDEDX(const G4Material*, const G4int Z,
const G4double e, const G4double loge) const;
@@ -97,7 +98,6 @@ private:
G4PhysicsLogVector* fElmData[81][93] = {{nullptr}};
G4PhysicsFreeVector* fVector = nullptr;
G4int fNmat = 0;
G4int fNbins = 0;
G4int fNbinsPerDecade = 10;
G4int fVerbose = 0;
@@ -130,16 +130,19 @@ G4IonICRU73Data::~G4IonICRU73Data()
G4double G4IonICRU73Data::GetDEDX(const G4Material* mat, const G4int Z,
const G4double e, const G4double loge) const
{
// if data does not exist the result is zero
if (Z > ZPROJMAX) { return 0.0; }
G4PhysicsLogVector* v = nullptr;
G4int Z2 = std::min(Z, ZPROJMAX);
if(1 == mat->GetNumberOfElements()) {
G4int Z1 = std::min((*(mat->GetElementVector()))[0]->GetZasInt(), ZTARGMAX);
v = fElmData[Z2][Z1];
} else {
if (1 == mat->GetNumberOfElements()) {
G4int Z1 = (*(mat->GetElementVector()))[0]->GetZasInt();
if(Z1 > ZTARGMAX) { return 0.0; }
v = fElmData[Z][Z1];
}
else {
G4int idx = fMatIndex[mat->GetIndex()];
if(idx < fNmat) {
v = (*(fMatData[Z2]))[idx];
}
if (idx < 0) { return 0.0; }
v = (*(fMatData[Z]))[idx];
}
if(nullptr == v) { return 0.0; }
G4double res = (e > fEmin) ? v->LogVectorValue(e, loge)
@@ -158,9 +161,13 @@ void G4IonICRU73Data::Initialise()
fDataDirectory = ost.str();
}
std::size_t nmat = G4Material::GetNumberOfMaterials();
const std::size_t nmat = G4Material::GetNumberOfMaterials();
// do nothing if for a new run list of materials is not changed
if(nmat == fMatIndex.size()) { return; }
// look over all materials and recompute all materials
// do not recompute element data if exist
if(1 < fVerbose) {
G4cout << "### G4IonICRU73Data::Initialise() for " << nmat
<< " materials" << G4endl;
@@ -173,55 +180,64 @@ void G4IonICRU73Data::Initialise()
auto mtable = G4Material::GetMaterialTable();
for(G4int i=0; i<(G4int)nmat; ++i) {
fNmat = i;
const G4Material* mat = (*mtable)[i];
const G4String matname = mat->GetName();
G4int idx = (G4int)mat->GetIndex();
if(1 < fVerbose) {
G4cout << i << ". material:" << mat->GetName()
G4cout << i << ". material: " << matname
<< " idx=" << idx << " matIdx=" << fMatIndex[idx]
<< " fNmat=" << fNmat << G4endl;
<< G4endl;
}
if(fMatIndex[idx] == -1) {
fMatIndex[idx] = i;
G4String matname = mat->GetName();
G4bool isOK = false;
if(1 == mat->GetNumberOfElements()) {
ReadElementData(mat, useICRU90);
isOK = true;
if(1 < fVerbose) {
G4cout << "Material from single element fNmat=" << fNmat << G4endl;
}
}
if(!isOK && useICRU90) {
// for material in ICRU90
if(useICRU90) {
for(G4int j=0; j<3; ++j) {
if(matname == namesICRU90[j]) {
ReadMaterialData(mat, densityCoef[j], true);
isOK = true;
if(1 < fVerbose) {
G4cout << "ICRU90 material" << G4endl;
G4cout << "ICRU90 material " << matname << G4endl;
}
break;
}
}
}
// for material in ICRU73
if(!isOK) {
for(G4int j=0; j<31; ++j) {
if(matname == namesICRU73[j]) {
ReadMaterialData(mat, 1.0, false);
isOK = true;
if(1 < fVerbose) {
G4cout << "ICRU73 material" << G4endl;
G4cout << "ICRU73 material " << matname << G4endl;
}
break;
}
}
}
// dEdx is combined from element stopping power
// Target element Z <= ZTARGMAX
if(!isOK) {
ReadElementData(mat, useICRU90);
if(1 < fVerbose) {
G4cout << "Read element data" << G4endl;
}
const std::size_t nelm = mat->GetNumberOfElements();
auto elmv = mat->GetElementVector();
G4bool isOut = false;
for (std::size_t j=0; j<nelm; ++j) {
if ((*elmv)[j]->GetZasInt() > ZTARGMAX) {
isOut = true;
break;
}
}
if (!isOut) {
ReadElementData(mat, useICRU90);
isOK = true;
if(1 < fVerbose) {
G4cout << "Data via elements for " << matname << G4endl;
}
}
}
if(isOK) { fMatIndex[idx] = i; }
}
if(1 < fVerbose) {
G4cout << " matData: " << fMatData[i] << G4endl;
@@ -235,7 +251,8 @@ void G4IonICRU73Data::ReadMaterialData(const G4Material* mat,
const G4double coeff,
const G4bool useICRU90)
{
G4String name = mat->GetName();
const G4String name = mat->GetName();
const G4int idx = (G4int)mat->GetIndex();
for(G4int Z=3; Z<=ZPROJMAX; ++Z) {
std::ostringstream ost;
ost << fDataDirectory << "icru";
@@ -262,7 +279,7 @@ void G4IonICRU73Data::ReadMaterialData(const G4Material* mat,
}
}
}
if(nullptr == (*(fMatData[Z1]))[fNmat]) {
if(nullptr == (*(fMatData[Z1]))[idx]) {
ost << "/z" << Z1 << "_" << name << ".dat";
G4PhysicsLogVector* v = RetrieveVector(ost, false);
if(nullptr != v) {
@@ -274,14 +291,14 @@ void G4IonICRU73Data::ReadMaterialData(const G4Material* mat,
<< " and projectile Z=" << Z1 << G4endl;
G4cout << *v << G4endl;
}
(*(fMatData[Z1]))[fNmat] = v;
(*(fMatData[Z1]))[idx] = v;
}
}
if(Z != Z1) {
auto v2 = (*(fMatData[Z1]))[fNmat];
auto v2 = (*(fMatData[Z1]))[idx];
if(nullptr != v2) {
auto v1 = new G4PhysicsLogVector(*v2);
(*(fMatData[Z]))[fNmat] = v1;
(*(fMatData[Z]))[idx] = v1;
v1->ScaleVector(1.0, scale);
}
}
@@ -295,7 +312,11 @@ void G4IonICRU73Data::ReadElementData(const G4Material* mat, G4bool useICRU90)
const G4ElementVector* elmv = mat->GetElementVector();
const G4double* dens = mat->GetFractionVector();
const G4int nelm = (G4int)mat->GetNumberOfElements();
for(G4int Z=3; Z<ZPROJMAX; ++Z) {
for(G4int Z=3; Z<=ZPROJMAX; ++Z) {
if (1 < fVerbose) {
G4cout << "ReadElementData for " << mat->GetName() << " Z=" << Z
<< " Nelm=" << nelm << G4endl;
}
G4PhysicsLogVector* v = nullptr;
if(1 == nelm) {
v = FindOrBuildElementData(Z, (*elmv)[0]->GetZasInt(), useICRU90);
@@ -311,7 +332,7 @@ void G4IonICRU73Data::ReadElementData(const G4Material* mat, G4bool useICRU90)
v->PutValue(i, dedx);
}
if(fSpline) { v->FillSecondDerivatives(); }
(*(fMatData[Z]))[fNmat] = v;
(*(fMatData[Z]))[(G4int)mat->GetIndex()] = v;
}
// scale data for correct units
if(nullptr != v) {