149 using namespace CLHEP;
152 const G4double G4RadioactiveDecay::levelTolerance = 10.0*
eV;
156 #ifdef G4MULTITHREADED
164 forceDecayDirection(0.,0.,0.), forceDecayHalfAngle(0.*
deg), verboseLevel(0)
168 G4cout <<
"G4RadioactiveDecay constructor: processName = " << processName
179 theUserRadioactiveDataFiles.clear();
182 #ifdef G4MULTITHREADED
183 G4AutoLock lk(&G4RadioactiveDecay::radioactiveDecayMutex);
201 theRadioactivityTables.push_back(rTable);
211 isAllVolumesMode =
true;
218 delete theRadioactiveDecaymessenger;
219 for (DecayTableMap::iterator i = dkmap->begin(); i != dkmap->end(); i++) {
230 if (((
const G4Ions*)(&aParticle))->GetExcitationEnergy() > 0.) {
return true;}
239 G4int A = ((
const G4Ions*) (&aParticle))->GetAtomicMass();
240 G4int Z = ((
const G4Ions*) (&aParticle))->GetAtomicNumber();
242 if (A > theNucleusLimits.
GetAMax() || A < theNucleusLimits.
GetAMin())
244 else if (Z > theNucleusLimits.
GetZMax() || Z < theNucleusLimits.
GetZMin())
252 DecayTableMap::iterator table_ptr = dkmap->find(key);
255 if (table_ptr == dkmap->end() ) {
257 if(theDecayTable) (*dkmap)[key] = theDecayTable;
259 theDecayTable = table_ptr->second;
262 return theDecayTable;
271 for (
size_t i = 0; i < theLogicalVolumes->size(); i++) {
272 volume=(*theLogicalVolumes)[i];
273 if (volume->
GetName() == aVolume) {
274 ValidVolumes.push_back(aVolume);
275 std::sort(ValidVolumes.begin(), ValidVolumes.end());
281 }
else if(i == theLogicalVolumes->size()) {
282 G4cerr <<
"SelectAVolume: "<< aVolume
283 <<
" is not a valid logical volume name" <<
G4endl;
294 for (
size_t i = 0; i < theLogicalVolumes->size(); i++){
295 volume=(*theLogicalVolumes)[i];
296 if (volume->
GetName() == aVolume) {
297 std::vector<G4String>::iterator location;
298 location = std::find(ValidVolumes.begin(),ValidVolumes.end(),aVolume);
299 if (location != ValidVolumes.end()) {
300 ValidVolumes.erase(location);
301 std::sort(ValidVolumes.begin(), ValidVolumes.end());
302 isAllVolumesMode =
false;
304 G4cerr <<
" DeselectVolume:" << aVolume <<
" is not in the list "
309 G4cout <<
" DeselectVolume: " << aVolume <<
" is removed from list "
312 }
else if (i == theLogicalVolumes->size()) {
313 G4cerr <<
" DeselectVolume:" << aVolume
314 <<
"is not a valid logical volume name" <<
G4endl;
325 ValidVolumes.clear();
330 for (
size_t i = 0; i < theLogicalVolumes->size(); i++){
331 volume = (*theLogicalVolumes)[i];
332 ValidVolumes.push_back(volume->
GetName());
338 std::sort(ValidVolumes.begin(), ValidVolumes.end());
340 isAllVolumesMode=
true;
346 ValidVolumes.clear();
347 isAllVolumesMode=
false;
360 for (
size_t i = 0; i < theDecayRateTableVector.size(); i++) {
361 if (theDecayRateTableVector[i].GetIonName() == aParticleName)
return true;
374 for (
size_t i = 0; i < theDecayRateTableVector.size(); i++) {
375 if (theDecayRateTableVector[i].GetIonName() == aParticleName) {
376 theDecayRateVector = theDecayRateTableVector[i].GetItsRates();
381 G4cout <<
"The DecayRate Table for " << aParticleName <<
" is selected."
396 long double convolvedTime = 0.L;
398 if ( t > SBin[NSourceBin]) {
405 ed <<
" While count exceeded " <<
G4endl;
406 while (t > SBin[nbin]) {
409 G4Exception(
"G4RadioactiveDecay::ConvolveSourceTimeProfile()",
419 long double ltau = tau;
422 for (
G4int i = 0; i < nbin; i++) {
423 convolvedTime += (
long double)SProfile[i] *
424 (std::exp(-(lt-(
long double)SBin[i+1])/ltau)-std::exp(-(lt-(
long double)SBin[i])/ltau));
427 convolvedTime += (
long double)SProfile[nbin] * (1.
L-std::exp(-(lt-(
long double)SBin[nbin])/ltau));
431 if (convolvedTime < 0.) {
432 G4cout <<
" Convolved time =: " << convolvedTime <<
" reset to zero! " <<
G4endl;
439 G4cout <<
" Convolved time: " << convolvedTime <<
G4endl;
570 ed <<
" While count exceeded " <<
G4endl;
571 while ( DProfile[i] < rand) {
581 decaytime = DBin[i] + rand*(DBin[i+1]-DBin[i]);
584 G4cout <<
" Decay time: " <<decaytime/
s <<
"[s]" <<G4endl;
596 ed <<
" While count exceeded " <<
G4endl;
597 while ( aDecayTime > DBin[i] ) {
629 G4cout <<
"G4RadioactiveDecay::GetMeanLifeTime() " <<
G4endl;
631 <<
" GeV, Mass: " << theParticle->
GetMass()/
GeV
632 <<
" GeV, Life time: " << theLife/
ns <<
" ns " <<
G4endl;
636 else if (theLife < 0.0) {meanlife =
DBL_MAX;}
637 else {meanlife = theLife;}
640 if (((
const G4Ions*)(theParticleDef))->GetExcitationEnergy() > 0. &&
641 meanlife ==
DBL_MAX) {meanlife = 0.;}
645 G4cout <<
" mean life time: " << meanlife/
s <<
" s " <<
G4endl;
667 G4cout <<
"G4RadioactiveDecay::GetMeanFreePath() " <<
G4endl;
669 <<
" GeV, Mass: " << aMass/
GeV <<
" GeV, tau: " << tau <<
" ns "
680 }
else if (tau < 0.0) {
683 ed <<
"Ion has negative lifetime " << tau
684 <<
" but is not stable. Setting mean free path to DBL_MAX" <<
G4endl;
685 G4Exception(
"G4RadioactiveDecay::GetMeanFreePath()",
"HAD_RDM_011",
692 pathlength =
c_light*tau*betaGamma;
698 G4cout <<
"G4Decay::GetMeanFreePath: "
700 <<
" stops, kinetic energy = "
710 G4cout <<
"mean free path: "<< pathlength/
m <<
" m" <<
G4endl;
724 if (!isInitialised) {
725 isInitialised =
true;
730 ed <<
" Atomic deexcitation is not defined.";
731 G4Exception(
"G4RadioactiveDecay::BuildPhysicsTable",
"HAD_RDM_001",
760 G4int A = ((
const G4Ions*)(&theParentNucleus))->GetAtomicMass();
761 G4int Z = ((
const G4Ions*)(&theParentNucleus))->GetAtomicNumber();
763 G4double levelEnergy = ((
const G4Ions*)(&theParentNucleus))->GetExcitationEnergy();
765 ((
const G4Ions*)(&theParentNucleus))->GetFloatLevelBase();
767 #ifdef G4MULTITHREADED
768 G4AutoLock lk(&G4RadioactiveDecay::radioactiveDecayMutex);
771 DecayTableMap::iterator master_table_ptr = master_dkmap->find(key);
773 if (master_table_ptr != master_dkmap->end() ) {
774 return master_table_ptr->second;
779 G4String file = theUserRadioactiveDataFiles[1000*A+
Z];
782 if (!getenv(
"G4RADIOACTIVEDATA") ) {
783 G4cout <<
"Please setenv G4RADIOACTIVEDATA to point to the radioactive decay data files."
785 throw G4HadronicException(__FILE__, __LINE__,
" Please setenv G4RADIOACTIVEDATA to point to the radioactive decay data files.");
787 G4String dirName = getenv(
"G4RADIOACTIVEDATA");
789 std::ostringstream os;
790 os << dirName <<
"/z" << Z <<
".a" << A <<
'\0';
797 std::ifstream DecaySchemeFile;
798 DecaySchemeFile.open(file);
800 if (DecaySchemeFile.good()) {
803 const G4int nMode = 9;
804 G4double modeTotalBR[nMode] = {0.0};
806 for (
G4int i = 0; i < nMode; i++) {
810 char inputChars[120]={
' '};
832 ed <<
" While count exceeded " <<
G4endl;
834 while (!complete && !DecaySchemeFile.getline(inputChars, 120).eof()) {
841 inputLine = inputChars;
842 inputLine = inputLine.
strip(1);
843 if (inputChars[0] !=
'#' && inputLine.length() != 0) {
844 std::istringstream tmpStream(inputLine);
846 if (inputChars[0] ==
'P') {
849 tmpStream >> recordType >> parentExcitation >> floatingFlag >> dummy;
857 found = (std::abs(parentExcitation*
keV - levelEnergy) < levelTolerance);
858 if (floatingLevel !=
noFloat) {
861 if (!floatMatch) found =
false;
870 if (inputLine.length() < 72) {
871 tmpStream >> theDecayMode >> dummy >> decayModeTotal;
872 switch (theDecayMode) {
878 anITChannel->
SetARM(applyARM);
879 theDecayTable->
Insert(anITChannel);
884 modeTotalBR[1] = decayModeTotal;
break;
886 modeTotalBR[2] = decayModeTotal;
break;
888 modeTotalBR[3] = decayModeTotal;
break;
890 modeTotalBR[4] = decayModeTotal;
break;
892 modeTotalBR[5] = decayModeTotal;
break;
894 modeTotalBR[6] = decayModeTotal;
break;
896 modeTotalBR[7] = decayModeTotal;
break;
898 modeTotalBR[8] = decayModeTotal;
break;
916 G4Exception(
"G4RadioactiveDecay::LoadDecayTable()",
"HAD_RDM_000",
921 if (inputLine.length() < 84) {
922 tmpStream >> theDecayMode >> a >> daughterFloatFlag >> b >>
c;
925 tmpStream >> theDecayMode >> a >> daughterFloatFlag >> b >> c >> betaType;
934 switch (theDecayMode) {
939 daughterFloatLevel, betaType);
942 theDecayTable->
Insert(aBetaMinusChannel);
951 daughterFloatLevel, betaType);
954 theDecayTable->
Insert(aBetaPlusChannel);
966 aKECChannel->
SetARM(applyARM);
967 theDecayTable->
Insert(aKECChannel);
979 aLECChannel->
SetARM(applyARM);
980 theDecayTable->
Insert(aLECChannel);
992 aMECChannel->
SetARM(applyARM);
993 theDecayTable->
Insert(aMECChannel);
1002 daughterFloatLevel);
1005 theDecayTable->
Insert(anAlphaChannel);
1014 daughterFloatLevel);
1017 theDecayTable->
Insert(aProtonChannel);
1026 daughterFloatLevel);
1029 theDecayTable->
Insert(aNeutronChannel);
1065 G4Exception(
"G4RadioactiveDecay::LoadDecayTable()",
"HAD_RDM_000",
1083 theNuclearDecayChannel =
static_cast<G4NuclearDecay*
>(theChannel);
1086 if (theDecayMode !=
IT) {
1087 theBR = theChannel->
GetBR();
1088 theChannel->
SetBR(theBR*modeTotalBR[theDecayMode]/modeSumBR[theDecayMode]);
1093 DecaySchemeFile.close();
1095 if (!found && levelEnergy > 0) {
1100 anITChannel->
SetARM(applyARM);
1101 theDecayTable->
Insert(anITChannel);
1108 #ifdef G4MULTITHREADED
1111 return theDecayTable;
1117 if (Z < 1 || A < 2)
G4cout <<
"Z and A not valid!" <<
G4endl;
1119 std::ifstream DecaySchemeFile(filename);
1120 if (DecaySchemeFile) {
1121 G4int ID_ion = A*1000 +
Z;
1122 theUserRadioactiveDataFiles[ID_ion] = filename;
1124 G4cout <<
"The file " << filename <<
" does not exist!" <<
G4endl;
1131 G4int theG, std::vector<G4double> theCoefficients,
1132 std::vector<G4double> theTaos)
1136 theDecayRate.
SetZ(theZ);
1137 theDecayRate.
SetA(theA);
1138 theDecayRate.
SetE(theE);
1141 theDecayRate.
SetTaos(theTaos);
1155 theDecayRateVector.clear();
1157 G4int nGeneration = 0;
1159 std::vector<G4double> taos;
1162 std::vector<G4double> Acoeffs;
1165 Acoeffs.push_back(-1.);
1167 G4int A = ((
const G4Ions*)(&theParentNucleus))->GetAtomicMass();
1168 G4int Z = ((
const G4Ions*)(&theParentNucleus))->GetAtomicNumber();
1169 G4double E = ((
const G4Ions*)(&theParentNucleus))->GetExcitationEnergy();
1171 if (tao < 0.) tao = 1e-100;
1172 taos.push_back(tao);
1180 theDecayRateVector.push_back(theDecayRate);
1203 std::vector<G4double> TP;
1204 std::vector<G4double> RP;
1208 G4int nearestLevelIndex = 0;
1216 const G4int nMode = 9;
1224 ed <<
" While count exceeded " <<
G4endl;
1233 for (j = nS; j < nT; j++) {
1235 ZP = theDecayRateVector[j].GetZ();
1236 AP = theDecayRateVector[j].GetA();
1237 EP = theDecayRateVector[j].GetE();
1238 RP = theDecayRateVector[j].GetDecayRateC();
1239 TP = theDecayRateVector[j].GetTaos();
1241 G4cout <<
"G4RadioactiveDecay::AddDecayRateTable : daughters of ("
1242 << ZP <<
", " << AP <<
", " << EP
1243 <<
") are being calculated, generation = " << nGeneration
1250 aParentNucleus = theIonTable->
GetIon(ZP,AP,EP);
1263 for (
G4int k = 0; k < nMode; k++) brs[k] = 0.0;
1266 for (i = 0; i < parentDecayTable->
entries(); i++) {
1268 theNuclearDecayChannel =
static_cast<G4NuclearDecay*
>(theChannel);
1273 AD = ((
const G4Ions*)(theDaughterNucleus))->GetAtomicMass();
1274 ZD = ((
const G4Ions*)(theDaughterNucleus))->GetAtomicNumber();
1280 if (std::abs(daughterExcitation - nearestEnergy) < levelTolerance) {
1284 if (levelManager->
LifeTime(nearestLevelIndex)*
ns >= halflifethreshold){
1286 summedDecayTable->
Insert(theChannel);
1288 brs[theDecayMode] += theChannel->
GetBR();
1291 brs[theDecayMode] += theChannel->
GetBR();
1294 brs[theDecayMode] += theChannel->
GetBR();
1298 brs[2] = brs[2]+brs[3]+brs[4]+brs[5];
1299 brs[3] = brs[4] =brs[5] = 0.0;
1300 for (i= 0; i<nMode; i++){
1305 theITChannel =
new G4ITDecay(aParentNucleus, brs[0], 0.0, 0.0);
1307 summedDecayTable->
Insert(theITChannel);
1315 summedDecayTable->
Insert(theBetaMinusChannel);
1323 summedDecayTable->
Insert(theBetaPlusChannel);
1330 summedDecayTable->
Insert(theAlphaChannel);
1337 summedDecayTable->
Insert(theProtonChannel);
1343 summedDecayTable->
Insert(theNeutronChannel);
1353 for (i = 0; i < summedDecayTable->
entries(); i++){
1355 theNuclearDecayChannel =
static_cast<G4NuclearDecay*
>(theChannel);
1356 theBR = theChannel->
GetBR();
1361 if (theNuclearDecayChannel->
GetDecayMode() ==
IT && nGeneration == 1) {
1363 A = ((
const G4Ions*)(theDaughterNucleus))->GetAtomicMass();
1364 Z = ((
const G4Ions*)(theDaughterNucleus))->GetAtomicNumber();
1365 theDaughterNucleus=theIonTable->
GetIon(Z,A,0.);
1368 aParentNucleus != theDaughterNucleus) {
1372 if (parentDecayTable->
entries() ) {
1373 A = ((
const G4Ions*)(theDaughterNucleus))->GetAtomicMass();
1374 Z = ((
const G4Ions*)(theDaughterNucleus))->GetAtomicNumber();
1375 E = ((
const G4Ions*)(theDaughterNucleus))->GetExcitationEnergy();
1378 if (TaoPlus <= 0.) TaoPlus = 1e-100;
1388 taos.push_back(TaoPlus);
1394 long double ta1,ta2;
1395 ta2 = (
long double)TaoPlus;
1396 for (k = 0; k < RP.size(); k++){
1397 ta1 = (
long double)TP[k];
1401 theRate = ta1/(ta1-ta2);
1403 theRate = theRate * theBR * RP[k];
1404 Acoeffs.push_back(theRate);
1411 long double aRate, aRate1;
1413 for (k = 0; k < RP.size(); k++){
1414 ta1 = (
long double)TP[k];
1418 aRate = ta2/(ta1-ta2);
1420 aRate = aRate * (
long double)(theBR * RP[k]);
1424 Acoeffs.push_back(theRate);
1426 theDecayRateVector.push_back(theDecayRate);
1436 if (nS == nT) stable =
true;
1448 theDecayRateTable.
SetItsRates(theDecayRateVector);
1451 theDecayRateTableVector.push_back(theDecayRateTable);
1463 std::ifstream infile ( filename, std::ios::in );
1466 ed <<
" Could not open file " << filename <<
G4endl;
1467 G4Exception(
"G4RadioactiveDecay::SetSourceTimeProfile()",
"HAD_RDM_001",
1476 ed <<
" While count exceeded " <<
G4endl;
1478 while (infile >> bin >> flux ) {
1486 if (NSourceBin > 99) {
1487 G4Exception(
"G4RadioactiveDecay::SetSourceTimeProfile()",
"HAD_RDM_002",
1491 SBin[NSourceBin] = bin *
s;
1492 SProfile[NSourceBin] = flux;
1500 G4cout <<
" Source Timeprofile Nbin = " << NSourceBin <<
G4endl;
1514 std::ifstream infile(filename, std::ios::in);
1515 if (!infile)
G4Exception(
"G4RadioactiveDecay::SetDecayBias()",
"HAD_RDM_003",
1522 theRadioactivityTables.clear();
1528 ed <<
" While count exceeded " <<
G4endl;
1530 while (infile >> bin >> flux ) {
1538 if (NDecayBin > 99) {
1539 G4Exception(
"G4RadioactiveDecay::SetDecayBias()",
"HAD_RDM_004",
1542 DBin[NDecayBin] = bin *
s;
1543 DProfile[NDecayBin] = flux;
1545 decayWindows[NDecayBin] = dWindows;
1548 theRadioactivityTables.push_back(rTable);
1552 for ( i = 1; i<= NDecayBin; i++) DProfile[i] += DProfile[i-1];
1553 for ( i = 0; i<= NDecayBin; i++) DProfile[i] /= DProfile[NDecayBin];
1561 G4cout <<
" Decay Bias Profile Nbin = " << NDecayBin <<
G4endl;
1576 fParticleChangeForRadDecay.
Initialize(theTrack);
1582 if (!isAllVolumesMode) {
1583 if (!std::binary_search(ValidVolumes.begin(), ValidVolumes.end(),
1587 G4cout <<
"G4RadioactiveDecay::DecayIt : "
1589 <<
" is not selected for the RDM"<<
G4endl;
1590 G4cout <<
" There are " << ValidVolumes.size() <<
" volumes" <<
G4endl;
1592 for (
size_t i = 0; i< ValidVolumes.size(); i++)
1593 G4cout << ValidVolumes[i] << G4endl;
1602 return &fParticleChangeForRadDecay;
1612 G4cerr <<
"G4RadioactiveDecay::DecayIt : "
1614 <<
" is not a valid nucleus for the RDM"<<
G4endl;
1623 return &fParticleChangeForRadDecay;
1627 if (theDecayTable == 0 || theDecayTable->
entries() == 0) {
1632 G4cerr <<
"G4RadioactiveDecay::DecayIt : decay table not defined for ";
1642 return &fParticleChangeForRadDecay;
1664 if ( products->
entries() == 1) {
1669 return &fParticleChangeForRadDecay;
1693 if (temptime < 0.) temptime = 0.;
1694 finalGlobalTime += temptime;
1695 finalLocalTime += temptime;
1698 products->
Boost(ParentEnergy, ParentDirection);
1705 G4cout <<
"G4RadioactiveDecay::DecayIt : Decay vertex :";
1706 G4cout <<
" Time: " <<finalGlobalTime/
ns <<
"[ns]";
1711 G4cout <<
"G4Decay::DecayIt : decay products in Lab. Frame" <<
G4endl;
1716 for (index=0; index < numberOfSecondaries; index++) {
1718 finalGlobalTime, currentPosition);
1730 G4cout <<
"DecayIt: Variance Reduction version " <<
G4endl;
1747 std::vector<G4double> PT;
1748 std::vector<G4double> PR;
1750 long double decayRate;
1754 G4int numberOfSecondaries;
1755 G4int totalNumberOfSecondaries = 0;
1759 std::vector<G4DynamicParticle*> secondaryparticles;
1760 std::vector<G4double> pw;
1761 std::vector<G4double> ptime;
1766 for (
G4int n = 0;
n < NSplit;
n++) {
1775 weight1 = 1./DProfile[nbin-1]
1776 *(DBin[nbin]-DBin[nbin-1])/NSplit;
1777 }
else if (nbin > 1) {
1778 weight1 = 1./(DProfile[nbin]-DProfile[nbin-2])
1779 *(DBin[nbin]-DBin[nbin-1])/NSplit;
1787 for (i = 0; i < theDecayRateVector.size(); i++) {
1788 PZ = theDecayRateVector[i].GetZ();
1789 PA = theDecayRateVector[i].GetA();
1790 PE = theDecayRateVector[i].GetE();
1791 PT = theDecayRateVector[i].GetTaos();
1792 PR = theDecayRateVector[i].GetDecayRateC();
1802 for (j = 0; j < PT.size(); j++) {
1806 decayRate -= PR[j] * (
long double)taotime;
1819 theRadioactivityTables[decayWindows[nbin-1]]->AddIsotope(PZ,PA,PE,weight1*decayRate,theTrack.
GetWeight());
1828 parentNucleus = theIonTable->
GetIon(PZ,PA,PE);
1840 if (theDecayChannel == 0) {
1844 G4cerr <<
" G4RadioactiveDecay::DoIt : cannot determine decay channel ";
1845 G4cerr <<
" for this nucleus; decay as if no biasing active ";
1850 tempprods =
DoDecay(*parentNucleus);
1855 tempprods = theDecayChannel->DecayIt(tempmass);
1856 weight *= (theDecayChannel->GetBR())*(decayTable->
entries());
1859 tempprods =
DoDecay(*parentNucleus);
1864 numberOfSecondaries = tempprods->
entries();
1865 currentTime = finalGlobalTime + theDecayTime;
1866 for (index = 0; index < numberOfSecondaries; index++) {
1869 pw.push_back(weight);
1870 ptime.push_back(currentTime);
1871 secondaryparticles.push_back(asecondaryparticle);
1874 else if (((
const G4Ions*)(asecondaryparticle->
GetDefinition()))->GetExcitationEnergy()>0. && weight>0.){
1886 totalNumberOfSecondaries = pw.size();
1888 for (index=0; index < totalNumberOfSecondaries; index++) {
1890 ptime[index], currentPosition);
1910 return &fParticleChangeForRadDecay ;
1932 if (theDecayChannel == 0) {
1936 G4Exception(
"G4RadioactiveDecay::DoDecay",
"HAD_RDM_013",
1942 G4cerr <<
"G4RadioactiveDecay::DoIt : selected decay channel addr:";
1959 if (origin == forceDecayDirection)
return;
1960 if (180.*
deg == forceDecayHalfAngle)
return;
1961 if (0 == products || 0 == products->
entries())
return;
1980 if (daughterType == electron || daughterType == positron ||
1981 daughterType == neutron || daughterType == gamma ||
1989 G4cout <<
"CollimateDecayProduct for daughter "
2002 if (origin == forceDecayDirection)
return origin;
2003 if (forceDecayHalfAngle == 180.*
deg)
return origin;
2008 if (forceDecayHalfAngle > 0.) {
2011 G4double cosMin = std::cos(forceDecayHalfAngle);
2020 G4cout <<
" ChooseCollimationDirection returns " << dir <<
G4endl;
2029 std::vector<double>& weights_v,
2030 std::vector<double>& times_v,
2031 std::vector<G4DynamicParticle*>& secondaries_v)
2033 G4double elevel=((
const G4Ions*)(apartDef))->GetExcitationEnergy();
2035 while (life_time <halflifethreshold && elevel>0.) {
2039 for (
G4int ind = 0; ind < nb_pevapSecondaries; ind++) {
2043 weights_v.push_back(weight);
2044 times_v.push_back(currentTime);
2045 secondaries_v.push_back(a_pevap_secondary);
2050 elevel=((
const G4Ions*)(apartDef))->GetExcitationEnergy();
G4DecayProducts * DoDecay(const G4ParticleDefinition &theParticleDef)
void SetBR(G4double value)
static G4LossTableManager * Instance()
G4double GetLocalTime() const
void SelectAVolume(const G4String aVolume)
std::map< G4String, G4DecayTable * > DecayTableMap
std::ostringstream G4ExceptionDescription
G4double GetKineticEnergy() const
G4bool IsRateTableReady(const G4ParticleDefinition &)
const G4DynamicParticle * GetDynamicParticle() const
void SetHLThreshold(G4double HLT)
void SetARM(G4bool onoff)
G4double ConvolveSourceTimeProfile(const G4double, const G4double)
std::vector< ExP01TrackerHit * > a
void SetTaos(std::vector< G4double > value)
G4String strip(G4int strip_Type=trailing, char c=' ')
void SetDecayRateC(std::vector< G4double > value)
const G4LevelManager * GetLevelManager(G4int Z, G4int A)
G4float LifeTime(size_t i) const
G4bool GetPDGStable() const
G4ParticleDefinition * GetIon(G4int Z, G4int A, G4int lvl=0)
static G4Alpha * Definition()
const G4ThreeVector & GetPosition() const
void AddSecondary(G4Track *aSecondary)
G4TrackStatus GetTrackStatus() const
G4RadioactiveDecayMode GetDecayMode()
static G4Electron * Definition()
void SetTouchableHandle(const G4TouchableHandle &apValue)
G4VDecayChannel * GetDecayChannel(G4int index) const
G4double GetMeanLifeTime(const G4Track &theTrack, G4ForceCondition *condition)
G4int GetVerboseLevel() const
void SetMomentumDirection(const G4ThreeVector &aDirection)
virtual G4DecayProducts * DecayIt(G4double)
G4ParticleDefinition * GetDefinition() const
void SetSourceTimeProfile(G4String filename)
G4bool IsApplicable(const G4ParticleDefinition &)
void Boost(G4double totalEnergy, const G4ThreeVector &momentumDirection)
void SetGeneration(G4int value)
static G4Positron * Definition()
void ClearNumberOfInteractionLengthLeft()
static constexpr double nanosecond
#define G4MUTEX_INITIALIZER
const G4String & GetParticleName() const
void SetWeight(G4double aValue)
void ProposeLocalEnergyDeposit(G4double anEnergyPart)
void SetItsRates(G4RadioactiveDecayRates arate)
G4double GetTotalMomentum() const
static G4Proton * Definition()
void ProposeWeight(G4double finalWeight)
virtual void Initialize(const G4Track &)
G4IonTable * GetIonTable() const
static G4Ions::G4FloatLevelBase FloatLevelBase(char flbChar)
G4GLOB_DLL std::ostream G4cout
double A(double temperature)
void ProposeLocalTime(G4double t)
static constexpr double m
void SetDecayRate(G4int, G4int, G4double, G4int, std::vector< G4double >, std::vector< G4double >)
const G4ThreeVector & GetMomentumDirection() const
void CollimateDecayProduct(G4DynamicParticle *product)
G4VDecayChannel * SelectADecayChannel(G4double parentMass=-1.)
static constexpr double cm
G4DeexPrecoParameters * GetParameters()
static G4LogicalVolumeStore * GetInstance()
G4ThreeVector ChooseCollimationDirection() const
size_t NumberOfTransitions() const
G4int GetDecayTimeBin(const G4double aDecayTime)
void SetProcessSubType(G4int)
void SetUseFilesNEW(G4bool)
void DeselectAllVolumes()
const G4String & GetParticleType() const
const G4ParticleDefinition * GetParticleDefinition() const
G4double GetGlobalTime() const
G4float NearestLevelEnergy(G4double energy, size_t index=0) const
const G4TouchableHandle & GetTouchableHandle() const
G4ParticleDefinition * GetDaughterNucleus()
size_t NearestLevelIndex(G4double energy, size_t index=0) const
G4DecayTable * GetDecayTable(const G4ParticleDefinition *)
static constexpr double eV
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
void Insert(G4VDecayChannel *aChannel)
G4double GetDaughterExcitation()
void SetARM(G4bool onoff)
G4double GetMeanFreePath(const G4Track &theTrack, G4double previousStepSize, G4ForceCondition *condition)
static constexpr double deg
G4LogicalVolume * GetLogicalVolume() const
G4double GetPDGMass() const
static G4ParticleTable * GetParticleTable()
void GetDecayRateTable(const G4ParticleDefinition &)
void SetNumberOfSecondaries(G4int totSecondaries)
G4DynamicParticle * PopProducts()
G4VParticleChange * pParticleChange
void AddDecayRateTable(const G4ParticleDefinition &)
G4DecayTable * LoadDecayTable(const G4ParticleDefinition &theParentNucleus)
static G4Neutron * Definition()
static constexpr double GeV
G4VPhysicalVolume * GetVolume() const
G4double GetWeight() const
void SetIonName(G4String name)
G4double GetPDGLifeTime() const
G4RadioactiveDecay(const G4String &processName="RadioactiveDecay")
static constexpr double MeV
static constexpr double pi
G4VAtomDeexcitation * AtomDeexcitation()
virtual G4DecayProducts * DecayIt(G4double parentMass=-1.0)=0
const G4String & GetName() const
void ProposeTrackStatus(G4TrackStatus status)
void BuildPhysicsTable(const G4ParticleDefinition &)
static constexpr double deg
static constexpr double L
void SetAnalogueMonteCarlo(G4bool r)
static const G4double alpha
void DeselectAVolume(const G4String aVolume)
static constexpr double keV
void AddDeexcitationSpectrumForBiasMode(G4ParticleDefinition *apartDef, G4double weight, G4double currenTime, std::vector< double > &weights_v, std::vector< double > ×_v, std::vector< G4DynamicParticle * > &secondaries_v)
void SetE(G4double value)
static G4NuclearLevelData * GetInstance()
void AddUserDecayDataFile(G4int Z, G4int A, G4String filename)
void CollimateDecay(G4DecayProducts *products)
void SetDecayBias(G4String filename)
static G4Gamma * Definition()
void SetGoodForTrackingFlag(G4bool value=true)
G4VParticleChange * DecayIt(const G4Track &theTrack, const G4Step &theStep)
G4GLOB_DLL std::ostream G4cerr
G4int GetBaryonNumber() const