66 Initialise(0,
"",
"",
"",1.*keV,0.1*GeV,200,MeV,barn,6,92);
82 : interpolation(algorithm), eMin(minE), eMax(maxE), nBins(bins),
83 unit1(unitE), unit2(unitData), zMin(minZ), zMax(maxZ)
87 crossModel.push_back(modelK);
88 crossModel.push_back(modelL);
89 crossModel.push_back(modelM);
100 delete interpolation;
102 std::map<G4int,G4IDataSet*,std::less<G4int> >::iterator pos;
104 for (pos = dataMap.begin(); pos != dataMap.end(); ++pos)
114 if (crossSections != 0)
116 std::size_t n = crossSections->size();
117 for (std::size_t i=0; i<n; ++i)
119 delete (*crossSections)[i];
121 delete crossSections;
137 delete interpolation;
138 interpolation = algorithm;
142 interpolation = CreateInterpolation();
147 nBins = numberOfBins;
153 crossModel.push_back(modelK);
154 crossModel.push_back(modelL);
155 crossModel.push_back(modelM);
161 std::map<G4int,G4IDataSet*,std::less<G4int> >::const_iterator pos;
163 for (pos = dataMap.begin(); pos != dataMap.end(); pos++)
170 G4int z = (*pos).first;
172 G4cout <<
"---- Data set for Z = "
176 G4cout <<
"--------------------------------------------------" <<
G4endl;
182 std::size_t nZ = activeZ.size();
183 for (std::size_t i=0; i<nZ; ++i)
199 dataMap[Z] = dataSet;
213 std::map<G4int,G4IDataSet*,std::less<G4int> >::iterator pos;
215 if(! dataMap.empty())
217 for (pos = dataMap.begin(); pos != dataMap.end(); ++pos)
226 G4int i = (*pos).first;
240 std::map<G4int,G4IDataSet*,std::less<G4int> >::const_iterator pos;
241 pos = dataMap.find(Z);
242 if (pos!= dataMap.end())
253 G4cout <<
"WARNING: G4PixeCrossSectionHandler::FindValue(Z,e) did not find Z = "
260 G4int shellIndex)
const
264 std::map<G4int,G4IDataSet*,std::less<G4int> >::const_iterator pos;
265 pos = dataMap.find(Z);
266 if (pos!= dataMap.end())
276 if(shellIndex < nComponents)
281 G4cout <<
"WARNING: G4PixeCrossSectionHandler::FindValue(Z,e,shell) did not find"
282 <<
" shellIndex= " << shellIndex
292 G4cout <<
"WARNING: G4PixeCrossSectionHandler::FindValue did not find Z = "
308 for (std::size_t i=0 ; i<nElements ; ++i)
310 G4int Z = (
G4int) (*elementVector)[i]->GetZ();
312 G4double nAtomsVol = nAtomsPerVolume[i];
313 value += nAtomsVol * elementValue;
406void G4PixeCrossSectionHandler::BuildForMaterials()
412 G4double dBin = std::log10(eMax/eMin) / nBins;
414 for (
G4int i=0; i<nBins+1; i++)
416 energyVector.push_back(std::pow(10., std::log10(eMin)+i*dBin));
419 if (crossSections != 0)
421 std::vector<G4IDataSet*>::iterator mat;
422 if (! crossSections->empty())
424 for (mat = crossSections->begin(); mat!= crossSections->end(); ++mat)
430 crossSections->clear();
431 delete crossSections;
436 crossSections = BuildCrossSectionsForMaterials(energyVector);
438 if (crossSections == 0)
439 G4Exception(
"G4PixeCrossSectionHandler::BuildForMaterials",
442 ", crossSections = 0");
466 std::size_t materialIndex = material->
GetIndex();
468 G4IDataSet* materialSet = (*crossSections)[materialIndex];
469 G4double materialCrossSection0 = 0.0;
472 for (
G4int i=0; i < nElements; ++i )
475 materialCrossSection0 += cr;
476 cross.push_back(materialCrossSection0);
481 for (
G4int k=0 ; k < nElements ; ++k )
483 if (random <= cross[k])
return (
G4int) (*elementVector)[k]->GetZ();
553 auto pos = dataMap.find(Z);
558 if (pos != dataMap.end()) dataSet = (*pos).second;
560 if (dataSet !=
nullptr) {
562 for (
G4int i=0; i<nShells; ++i)
565 if (shellDataSet != 0)
569 if (random <= partialSum)
return i;
577void G4PixeCrossSectionHandler::ActiveElements()
580 if (materialTable == 0)
581 G4Exception(
"G4PixeCrossSectionHandler::ActiveElements",
584 "no MaterialTable found");
588 for (std::size_t mat=0; mat<nMaterials; ++mat)
590 const G4Material* material= (*materialTable)[mat];
594 for (std::size_t iEl=0; iEl<nElements; ++iEl)
596 G4double Z = (*elementVector)[iEl]->GetZ();
597 if (!(activeZ.
contains(Z)) && Z >= zMin && Z <= zMax)
599 activeZ.push_back(Z);
611G4int G4PixeCrossSectionHandler::NumberOfComponents(
G4int Z)
const
615 std::map<G4int,G4IDataSet*,std::less<G4int> >::const_iterator
pos;
616 pos = dataMap.find(Z);
617 if (pos!= dataMap.end())
624 G4cout <<
"WARNING: G4PixeCrossSectionHandler::NumberOfComponents did not "
632std::vector<G4IDataSet*>*
633G4PixeCrossSectionHandler::BuildCrossSectionsForMaterials(
const G4DataVector& energyVector)
638 std::vector<G4IDataSet*>* matCrossSections =
new std::vector<G4IDataSet*>;
643 std::size_t nOfBins = energyVector.size();
644 const auto interpolationAlgo = std::unique_ptr<G4IInterpolator>(CreateInterpolation());
647 if (materialTable == 0)
648 G4Exception(
"G4PixeCrossSectionHandler::BuildCrossSectionsForMaterials",
651 "no MaterialTable found");
655 for (std::size_t mat=0; mat<nMaterials; ++mat)
657 const G4Material* material = (*materialTable)[mat];
666 for (
G4int i=0; i<nElements; ++i) {
668 G4int Z = (
G4int) (*elementVector)[i]->GetZ();
669 G4double density = nAtomsPerVolume[i];
675 for (std::size_t bin=0; bin<nOfBins; ++bin)
678 energies->push_back(e);
680 if (Z >= zMin && Z <= zMax) cross = density*
FindValue(Z,e);
681 data->push_back(cross);
689 matCrossSections->push_back(setForMat);
691 return matCrossSections;
709 G4double energy = kineticEnergy + particleMass;
712 G4double gamma = energy / particleMass;
713 G4double beta2 = 1. - 1. / (gamma * gamma);
714 G4double var = electron_mass_c2 / particleMass;
715 G4double tMax = 2. * electron_mass_c2 * (gamma*gamma - 1.) / (1. + 2.*gamma*var + var*var);
719 if ( tMax > deltaCut )
721 var = deltaCut / tMax;
722 cross = (1. - var * (1. - beta2 * std::log(var))) / deltaCut;
729 cross += 0.5 * (tMax - deltaCut) / (energy*energy);
732 else if (spin > 0.9 )
734 cross += -std::log(var) / (3.*deltaCut) + (tMax-deltaCut) *
735 ((5.+1./var)*0.25 /(energy*energy) - beta2 / (tMax*deltaCut))/3.;
737 cross *= twopi_mc2_rcl2 * Z / beta2 ;
std::vector< const G4Element * > G4ElementVector
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
std::vector< G4Material * > G4MaterialTable
G4GLOB_DLL std::ostream G4cout
G4bool contains(const G4double &) const
virtual const G4IDataSet * GetComponent(G4int componentId) const =0
virtual G4bool LoadData(const G4String &fileName)=0
virtual size_t NumberOfComponents(void) const =0
virtual G4double FindValue(G4double x, G4int componentId=0) const =0
virtual void AddComponent(G4IDataSet *dataSet)=0
virtual void PrintData(void) const =0
virtual G4IInterpolator * Clone() const =0
const G4ElementVector * GetElementVector() const
const G4double * GetAtomicNumDensityVector() const
static std::size_t GetNumberOfMaterials()
const G4double * GetVecNbOfAtomsPerVolume() const
std::size_t GetIndex() const
static G4MaterialTable * GetMaterialTable()
std::size_t GetNumberOfElements() const
G4double GetPDGMass() const
G4double GetPDGSpin() const
virtual ~G4PixeCrossSectionHandler()
void Initialise(G4IInterpolator *interpolation, const G4String &modelK="ecpssr", const G4String &modelL="ecpssr", const G4String &modelM="ecpssr", G4double minE=1 *CLHEP::keV, G4double maxE=0.1 *CLHEP::GeV, G4int nBins=200, G4double unitE=CLHEP::MeV, G4double unitData=CLHEP::barn, G4int minZ=6, G4int maxZ=92)
G4double MicroscopicCrossSection(const G4ParticleDefinition *particleDef, G4double kineticEnergy, G4double Z, G4double deltaCut) const
G4double FindValue(G4int Z, G4double e) const
G4int SelectRandomShell(G4int Z, G4double e) const
void LoadShellData(const G4String &dataFile)
G4double ValueForMaterial(const G4Material *material, G4double e) const
G4PixeCrossSectionHandler()
G4int SelectRandomAtom(const G4Material *material, G4double e) const