57 nShellLimit(100),fDeexcitationActive(false),isInitialised(false),
74 for(
G4int i=0; i<maxZ; ++i) {
76 fCrossSectionLE[i] = 0;
82 G4cout <<
"Livermore PhotoElectric is constructed "
83 <<
" nShellLimit= " << nShellLimit <<
G4endl;
94 for(
G4int i=0; i<maxZ; ++i) {
95 delete fCrossSection[i];
96 delete fCrossSectionLE[i];
106 if (verboseLevel > 2) {
107 G4cout <<
"Calling G4LivermorePhotoElectricModel::Initialise()" <<
G4endl;
110 char* path = getenv(
"G4LEDATA");
116 for(
G4int i=0; i<numOfCouples; ++i)
123 for (
G4int j=0; j<nelm; ++j)
127 else if(Z > maxZ) { Z = maxZ; }
128 if(!fCrossSection[Z]) { ReadData(Z, path); }
132 if (verboseLevel > 2) {
133 G4cout <<
"Loaded cross section files for LivermorePhotoElectric model"
137 isInitialised =
true;
142 fDeexcitationActive =
false;
143 if(fAtomDeexcitation) {
144 fDeexcitationActive = fAtomDeexcitation->
IsFluoActive();
147 if (verboseLevel > 0) {
148 G4cout <<
"LivermorePhotoElectric model is initialized " <<
G4endl
161 if (verboseLevel > 3) {
162 G4cout <<
"G4LivermorePhotoElectricModel::Calling ComputeCrossSectionPerAtom()"
163 <<
" Z= " << ZZ <<
" R(keV)= " << energy/
keV <<
G4endl;
169 if(Z < 1 || Z >= maxZ) {
return cs; }
172 if(!fCrossSection[Z]) {
173 char* path = getenv(
"G4LEDATA");
175 if(!fCrossSection[Z]) {
return cs; }
178 G4int idx = fNShells[
Z]*6 - 4;
179 if (gammaEnergy <= (fParam[Z])[idx-1]) {
return cs; }
186 if(gammaEnergy >= (fParam[Z])[0]) {
188 cs = x1*((fParam[
Z])[idx] + x1*(fParam[Z])[idx+1]
189 + x2*(fParam[
Z])[idx+2] + x3*(fParam[Z])[idx+3]
190 + x4*(fParam[
Z])[idx+4]);
192 }
else if(gammaEnergy >= (fParam[Z])[1]) {
193 cs = x3*(fCrossSection[
Z])->
Value(gammaEnergy);
197 cs = x3*(fCrossSectionLE[
Z])->
Value(gammaEnergy);
199 if (verboseLevel > 1) {
200 G4cout <<
"LivermorePhotoElectricModel: E(keV)= " << gammaEnergy/
keV
201 <<
" Z= " << Z <<
" cross(barn)= " << cs/
barn <<
G4endl;
210 std::vector<G4DynamicParticle*>* fvect,
217 if (verboseLevel > 3) {
218 G4cout <<
"G4LivermorePhotoElectricModel::SampleSecondaries() Egamma(keV)= "
239 if(Z >= maxZ) { Z = maxZ-1; }
242 if(!fCrossSection[Z]) {
243 char* path = getenv(
"G4LEDATA");
245 if(!fCrossSection[Z]) {
253 size_t nn = fNShellsUsed[
Z];
256 if(gammaEnergy >= (fParam[Z])[0]) {
261 G4int idx = nn*6 - 4;
265 + x2*(fParam[
Z])[idx+2]
266 + x3*(fParam[Z])[idx+3]
267 + x4*(fParam[
Z])[idx+4]);
268 for(shellIdx=0; shellIdx<
nn; ++shellIdx) {
269 idx = shellIdx*6 + 2;
270 if(gammaEnergy > (fParam[Z])[idx-1]) {
271 G4double cs = (fParam[
Z])[idx] + x1*(fParam[Z])[idx+1]
272 + x2*(fParam[
Z])[idx+2] + x3*(fParam[Z])[idx+3]
273 + x4*(fParam[
Z])[idx+4];
274 if(cs >= cs0) {
break; }
277 if(shellIdx >= nn) { shellIdx = nn-1; }
285 if(gammaEnergy >= (fParam[Z])[1]) {
286 cs *= (fCrossSection[
Z])->
Value(gammaEnergy);
288 cs *= (fCrossSectionLE[
Z])->
Value(gammaEnergy);
291 for(
size_t j=0; j<
nn; ++j) {
293 if(gammaEnergy > (fParam[Z])[6*shellIdx+1]) {
296 if(cs <= 0.0 || j+1 == nn) {
break; }
310 if(fDeexcitationActive && shellIdx + 1 < nn) {
317 if(gammaEnergy < bindingEnergy) {
337 fvect->push_back(electron);
343 size_t nbefore = fvect->size();
346 size_t nafter = fvect->size();
347 if(nafter > nbefore) {
348 for (
size_t j=nbefore; j<nafter; ++j) {
349 edep -= ((*fvect)[j])->GetKineticEnergy();
363 G4LivermorePhotoElectricModel::ReadData(
G4int Z,
const char* path)
365 if (verboseLevel > 1)
367 G4cout <<
"Calling ReadData() of G4LivermoreGammaConversionModel"
371 if(fCrossSection[Z]) {
return; }
373 const char* datadir = path;
377 datadir = getenv(
"G4LEDATA");
380 G4Exception(
"G4LivermorePhotoElectricModel::ReadData()",
382 "Environment variable G4LEDATA not defined");
391 std::ostringstream ost;
392 ost << datadir <<
"/livermore/phot/pe-cs-" << Z <<
".dat";
393 std::ifstream
fin(ost.str().c_str());
394 if( !
fin.is_open()) {
396 ed <<
"G4LivermorePhotoElectricModel data file <" << ost.str().c_str()
397 <<
"> is not opened!" <<
G4endl;
398 G4Exception(
"G4LivermorePhotoElectricModel::ReadData()",
400 ed,
"G4LEDATA version should be G4EMLOW6.32 or later.");
403 if(verboseLevel > 3) {
G4cout <<
"File " << ost.str().c_str()
404 <<
" is opened by G4LivermorePhotoElectricModel" <<
G4endl;}
414 std::ostringstream ost1;
415 ost1 << datadir <<
"/livermore/phot/pe-" << Z <<
".dat";
416 std::ifstream fin1(ost1.str().c_str());
417 if( !fin1.is_open()) {
419 ed <<
"G4LivermorePhotoElectricModel data file <" << ost1.str().c_str()
420 <<
"> is not opened!" <<
G4endl;
421 G4Exception(
"G4LivermorePhotoElectricModel::ReadData()",
423 ed,
"G4LEDATA version should be G4EMLOW6.32 or later.");
426 if(verboseLevel > 3) {
427 G4cout <<
"File " << ost1.str().c_str()
428 <<
" is opened by G4LivermorePhotoElectricModel" <<
G4endl;
430 fin1 >> n1 >> n2 >>
x;
432 (fParam[
Z]).reserve(6*n1+1);
433 (fParam[
Z]).push_back(x*
MeV);
434 for(
G4int i=0; i<n1; ++i) {
435 for(
G4int j=0; j<6; ++j) {
437 if(0 == j) { x *=
MeV; }
439 (fParam[
Z]).push_back(x);
445 if(nShellLimit < n2) { n2 = nShellLimit; }
447 fNShellsUsed[
Z] = n2;
450 std::ostringstream ost2;
451 ost2 << datadir <<
"/livermore/phot/pe-ss-cs-" << Z <<
".dat";
452 std::ifstream fin2(ost2.str().c_str());
453 if( !fin2.is_open()) {
455 ed <<
"G4LivermorePhotoElectricModel data file <" << ost2.str().c_str()
456 <<
"> is not opened!" <<
G4endl;
457 G4Exception(
"G4LivermorePhotoElectricModel::ReadData()",
459 ed,
"G4LEDATA version should be G4EMLOW6.32 or later.");
462 if(verboseLevel > 3) {
463 G4cout <<
"File " << ost2.str().c_str()
464 <<
" is opened by G4LivermorePhotoElectricModel" <<
G4endl;
469 for(
G4int i=0; i<n2; ++i) {
470 fin2 >> x >> y >> n3 >> n4;
472 for(
G4int j=0; j<n3; ++j) {
483 if(1 < fNShells[Z]) {
486 std::ostringstream ost3;
487 ost3 << datadir <<
"/livermore/phot/pe-le-cs-" << Z <<
".dat";
488 std::ifstream fin3(ost3.str().c_str());
489 if( !fin3.is_open()) {
491 ed <<
"G4LivermorePhotoElectricModel data file <" << ost3.str().c_str()
492 <<
"> is not opened!" <<
G4endl;
493 G4Exception(
"G4LivermorePhotoElectricModel::ReadData()",
495 ed,
"G4LEDATA version should be G4EMLOW6.32 or later.");
498 if(verboseLevel > 3) {
499 G4cout <<
"File " << ost3.str().c_str()
500 <<
" is opened by G4LivermorePhotoElectricModel" <<
G4endl;
502 fCrossSectionLE[
Z]->
Retrieve(fin3,
true);