43 #include "G4String.hh"
64 threshold_of_half_life(1000.0*
ns),
65 minimum_threshold_of_half_life(
DBL_MAX),
66 fUserDefinedList(NULL),
68 flevelTolerance(1.0*
eV)
81 for ( std::map<
G4int , std::multimap< G4double , G4IsotopeProperty* > >::iterator
88 for ( std::map<
G4int , std::multimap< G4double , G4IsotopeProperty* > >::iterator
97 delete (*fIsotopeList)[i];
118 if ( Z == (*it)->GetAtomicNumber() && A == (*it)->GetAtomicMass() ) {
121 if( flb == (*it)->GetFloatLevelBase() )
131 G4int ionCode = 1000*Z +
A;
132 std::map< G4int , std::multimap< G4double , G4IsotopeProperty* > >::iterator itf =
map_pre_load_list.find( ionCode );
135 std::multimap< G4double , G4IsotopeProperty* >::iterator lower_bound_itr = itf ->
second.lower_bound ( E -
flevelTolerance/2 );
146 while ( lower_bound_itr != itf ->
second.end() ) {
147 levelE = lower_bound_itr->first;
149 if ( flb == (lower_bound_itr->second)->GetFloatLevelBase() )
return lower_bound_itr->second;
183 char* path = getenv(
"G4ENSDFSTATEDATA");
187 FatalException,
"G4ENSDFSTATEDATA environment variable must be set");
193 filename +=
"/ENSDFSTATE.dat";
195 ifs.open( filename.c_str() );
216 ifs >> ionZ >> ionA >> ionE >> ionFL >> ionLife >> ionJ >> ionMu;
218 while ( ifs.good() ) {
220 if ( ionCode != 1000*ionZ + ionA ) {
222 ionCode = 1000*ionZ + ionA;
238 if ( ionE > 0 ) iLevel++;
239 if ( iLevel > 9 ) iLevel=9;
256 std::map< G4int , std::multimap< G4double , G4IsotopeProperty* > >::iterator itf =
map_full_list.find( ionCode );
258 std::multimap<G4double, G4IsotopeProperty*> aMultiMap;
260 itf = (
map_full_list.insert( std::pair<
G4int , std::multimap< G4double , G4IsotopeProperty* > > ( ionCode , aMultiMap ) ) ).
first;
262 itf ->
second.insert( std::pair< G4double, G4IsotopeProperty* >( ionE , fProperty ) );
265 ifs >> ionZ >> ionA >> ionE >> ionFL >> ionLife >> ionJ >> ionMu;
274 for ( std::map<
G4int , std::multimap< G4double , G4IsotopeProperty* > >::iterator
281 for ( std::map<
G4int , std::multimap< G4double , G4IsotopeProperty* > >::iterator
284 G4int ionCode = it->first;
285 std::map< G4int , std::multimap< G4double , G4IsotopeProperty* > >::iterator itf =
map_pre_load_list.find( ionCode );
287 std::multimap<G4double, G4IsotopeProperty*> aMultiMap;
288 itf = (
map_pre_load_list.insert( std::pair<
G4int , std::multimap< G4double , G4IsotopeProperty* > > ( ionCode , aMultiMap ) ) ).
first;
291 for ( std::multimap< G4double , G4IsotopeProperty* >::iterator
292 itt = it->second.begin(); itt != it->second.end(); itt++ ) {
295 G4double meanLife = itt->second->GetLifeTime();
300 if ( itt->first != 0.0 ) iLevel++;
301 if ( iLevel > 9 ) iLevel=9;
302 itt->second->SetIsomerLevel( iLevel );
304 itf ->
second.insert( std::pair< G4double, G4IsotopeProperty* >( exEnergy , itt->second ) );
316 AddState(ionZ,ionA,ionE,flbIndex,ionLife,ionJ,ionMu);
390 if ( sFLB.size() < 1 || 2 < sFLB.size() ) {
393 text +=
" is not valid indicator of G4Ions::G4FloatLevelBase. You may use a wrong version of ENSDFSTATE data. Please use G4ENSDFSTATE2.0 or later.";
399 if ( !(sFLB ==
'-') ) {
void SetEnergy(G4double E)
G4NuclideTableMessenger * fMessenger
void AddState(G4int, G4int, G4double, G4double, G4int ionJ=0, G4double ionMu=0.0)
static constexpr double keV
G4double threshold_of_half_life
virtual G4IsotopeProperty * GetIsotopeByIsoLvl(G4int Z, G4int A, G4int lvl=0)
G4IsotopeList * fUserDefinedList
static constexpr double second
G4IsotopeList * fIsotopeList
void SetAtomicNumber(G4int Z)
std::map< G4int, std::multimap< G4double, G4IsotopeProperty * > > map_pre_load_list
void SetAtomicMass(G4int A)
std::map< G4int, std::multimap< G4double, G4IsotopeProperty * > > map_full_list
typedef int(XMLCALL *XML_NotStandaloneHandler)(void *userData)
double A(double temperature)
void SetIsomerLevel(G4int level)
static constexpr double eV
void SetDecayTable(G4DecayTable *table)
void SetThresholdOfHalfLife(G4double)
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
G4double minimum_threshold_of_half_life
void SetFloatLevelBase(G4Ions::G4FloatLevelBase flb)
void SetMagneticMoment(G4double M)
void SetLifeTime(G4double T)
virtual ~G4NuclideTable()
static MCTruthManager * instance
static constexpr double joule
G4double StripFloatLevelBase(G4double E, G4int &flbIndex)
G4double GetEnergy() const
static G4Ions::G4FloatLevelBase FloatLevelBase(char flbChar)
static G4NuclideTable * GetInstance()
std::vector< G4IsotopeProperty * > G4IsotopeList
virtual G4IsotopeProperty * GetIsotope(G4int Z, G4int A, G4double E, G4Ions::G4FloatLevelBase flb=G4Ions::G4FloatLevelBase::no_Float)
static constexpr double tesla