14#include "tkensdf_builder.h"
21#include "tkensdf_level_rec.h"
22#include "tkensdf_gamma_rec.h"
37 fensdf_reader(_input_folder)
49 fDataBase->begin(
"charge,mass,symbol,isotope_id",
"isotope INNER JOIN element ON isotope.element_id=element.element_id",
"charge>0");
54 message =
"Building '" + flevel_builder->get_table().get_name() +
"' table";
58 fDataBase->exec_sql(
"BEGIN TRANSACTION");
60 while (fDataBase->next()) {
61 tkstring nuc =
tkstring::form(
"%s%s", (*fDataBase)[
"ISOTOPE"][
"mass"].get_value().data(), (*fDataBase)[
"ELEMENT"][
"symbol"].get_value().data());
62 tkstring zz = (*fDataBase)[
"ELEMENT"][
"charge"].get_value();
63 fIsotopeIndex = ((
tkstring)(*fDataBase)[
"ISOTOPE"][
"isotope_id"].get_value()).
atoi();
66 if (curZ < 1)
continue;
69 fensdf_reader.open_nuc(nuc,
kensdf);
73 for (
auto &dataset : *fensdf_reader.get_datasets()) {
74 if (dataset.fdsid.begins_with(
"COMMENTS"))
continue;
76 if (date.length() == 6) date = date.
substr(0, 4) +
"-" + date.
substr(4, 2);
77 int datasetIdx =
add_dataset(dataset, nuc.data(), get_dataset_comment(&dataset), date,
"ENSDF");
78 read_dataset(&dataset, datasetIdx);
82 fensdf_reader.open_nuc(nuc,
kxundl);
84 for (
auto &dataset : *fensdf_reader.get_datasets()) {
85 if (dataset.fdsid.begins_with(
"COMMENTS"))
continue;
87 if (date.length() == 6) date = date.
substr(0, 4) +
"-" + date.
substr(4, 2);
88 int datasetIdx =
add_dataset(dataset, nuc.data(), get_dataset_comment(&dataset), date,
"XUNDL");
89 read_dataset(&dataset, datasetIdx);
93 glog.progress_bar(117, curZ, message.data());
98 fDataBase->exec_sql(
"COMMIT");
100 fDataBase->exec_sql(
"CREATE INDEX isotope_index ON level(isotope_id)");
101 fDataBase->exec_sql(
"CREATE INDEX dataset_index ON level(dataset_id)");
102 fDataBase->exec_sql(
"CREATE INDEX dataset_isotope_index ON dataset(isotope_id)");
104 fDataBase->exec_sql(
"CREATE INDEX levelfrom_index ON decay(level_from_id)");
105 fDataBase->exec_sql(
"CREATE INDEX levelto_index ON decay(level_to_id)");
107 fensdf_reader.print_record_counters();
121 newname =
tkstring::form(
"%s : ADOPTED LEVELS, GAMMAS", _nucleus.data());
126 (*fDataBase)[
"DATASET"][
"dataset_name"].set_value(newname);
127 (*fDataBase)[
"DATASET"][
"isotope_id"].set_value(fIsotopeIndex);
128 if (!_dataset_comment.
is_empty()) (*fDataBase)[
"DATASET"][
"dataset_comment"].set_value(_dataset_comment);
129 if (!_dataset_date.
is_empty()) (*fDataBase)[
"DATASET"][
"dataset_date"].set_value(_dataset_date);
130 if (!_dataset_source.
is_empty()) (*fDataBase)[
"DATASET"][
"dataset_source"].set_value(_dataset_source);
131 (*fDataBase)[
"DATASET"][
"dataset_id"].set_value(fDatasetIndex++);
132 (*fDataBase)[
"DATASET"].push_row();
134 return (fDatasetIndex - 1);
140 bool is_record = fensdf_reader.
first_record(_data_set, record);
147 is_record = fensdf_reader.
next_record(_data_set, record);
154 is_record = fensdf_reader.
next_record(_data_set, record);
160bool tkensdf_builder::read_dataset(
tkensdf_ident_rec *_data_set,
int _dataset_idx)
162 glog.set_class(
"db_ensdf_builder");
163 glog.set_method(
tkstring::form(
"read_levels(%s,%d)", _data_set->
fdsid.data(), _dataset_idx));
165 tkensdf_record the_record;
166 tkensdf_level_rec the_level_record;
167 tkensdf_gamma_rec the_gamma_record;
170 bool is_record = fensdf_reader.first_record(_data_set, record);
172 std::vector<tkensdf_level_rec> flist_of_levels;
178 is_record = fensdf_reader.next_record(_data_set, record);
187 if (flist_of_levels.empty() && the_record.
is_comment()) {
216 the_gamma_record.
clear();
219 tkensdf_level_rec *level_to =
nullptr;
222 is_record = fensdf_reader.next_record(_data_set, record);
229 is_record = fensdf_reader.next_record(_data_set, record);
246 for (
auto it = flist_of_levels.rbegin() + 1; it != flist_of_levels.rend(); ++it) {
254 if (level_to ==
nullptr) {
259 double last_diff = numeric_limits<double>::max();
260 for (
auto it = flist_of_levels.rbegin() + 1; it != flist_of_levels.rend(); ++it) {
262 if (the_level_record.
get_energy_offset() != level->get_energy_offset())
continue;
263 double diff = abs(lev_to_approx_energy - level->get_energy().value);
264 if (diff > last_diff)
break;
269 if (level_to ==
nullptr) {
270 gdebug <<
"Level_to not found !" <<
do_endl;
273 cout <<
"Level from record: ";
276 cout <<
" record -> " << the_level_record.
get_record() << endl;
278 cout <<
" record -> " << the_gamma_record.
get_record() << endl;
279 if (the_gamma_record.
is_final_level_set()) cout <<
"gamma levels manually set !" << endl;
280 cout <<
" Looking for a level at: ";
282 cout << lev_to_approx_energy <<
" keV in:" << endl;
283 for (
auto it = flist_of_levels.rbegin() + 1; it != flist_of_levels.rend(); ++it) {
285 if (it->is_energy_offset()) cout << it->get_energy_offset() <<
" + ";
286 cout << it->get_energy().value <<
" keV" << endl;
294 gdebug <<
"High energy difference !" <<
do_endl;
297 cout <<
"Level from record: ";
300 cout <<
" record -> " << the_level_record.
get_record() << endl;
302 cout <<
" record -> " << the_gamma_record.
get_record() << endl;
303 if (the_gamma_record.
is_final_level_set()) cout <<
"gamma levels manually set !" << endl;
304 cout <<
" Looking for a level at: ";
306 cout << lev_to_approx_energy <<
" keV in:" << endl;
307 for (
auto it = flist_of_levels.rbegin() + 1; it != flist_of_levels.rend(); ++it) {
309 if (it->is_energy_offset()) cout << it->get_energy_offset() <<
" + ";
310 cout << it->get_energy().value <<
" keV" << endl;
312 cout <<
" Found a level at: " << level_to->
get_energy().
value <<
" keV ==> Diff= " << last_diff <<
" keV" << endl;
319 fdecay_builder->fill_gamma(the_level_record.
flevelid, level_to->
flevelid, the_gamma_record);
321 the_level_record.
clear();
325 is_record = fensdf_reader.next_record(_data_set, record);
332 is_record = fensdf_reader.next_record(_data_set, record);
343 tkensdf_level_rec dummy_rec;
346 flevel_builder->fill_level(_dataset_idx, fIsotopeIndex, dummy_rec, _data_set->
fis_adopted);
347 dummy_rec.
flevelid = flevel_builder->get_level_id();
348 flist_of_levels.emplace_back(dummy_rec);
351 flevel_builder->fill_level(_dataset_idx, fIsotopeIndex, the_level_record, _data_set->
fis_adopted);
352 the_level_record.
flevelid = flevel_builder->get_level_id();
353 flist_of_levels.emplace_back(the_level_record);
357 std::vector<pair<int, tkensdf_level_rec *>> vec;
359 for (
auto it = flist_of_levels.begin(); it != flist_of_levels.end(); it++, idx++) {
361 vec.push_back({idx, (&(*it))});
364 if (vec.size() > 1 && (vec.at(vec.size() - 1).second->get_energy().value < vec.at(vec.size() - 2).second->get_energy().value)) {
365 gdebug <<
"Inverted levels in: " << _data_set->
fnuclide.data() <<
": " << _data_set->
fdsid.data() <<
" [ " << flist_of_levels.at(vec.at(vec.size() - 1).first).get_energy_offset() <<
"+" << flist_of_levels.at(vec.at(vec.size() - 1).first).get_energy().value <<
" ; " << flist_of_levels.at(vec.at(vec.size() - 2).first).get_energy_offset() <<
"+" << flist_of_levels.at(vec.at(vec.size() - 2).first).get_energy().value <<
"]" <<
do_endl;
366 swap(flist_of_levels[vec.at(vec.size() - 1).first], flist_of_levels[vec.at(vec.size() - 2).first]);
369 }
else if (flist_of_levels.size() > 1 && (flist_of_levels.at(flist_of_levels.size() - 1).get_energy().value < flist_of_levels.at(flist_of_levels.size() - 2).get_energy().value)) {
370 gdebug <<
"Inverted levels in: " << _data_set->
fnuclide.data() <<
": " << _data_set->
fdsid.data() <<
" [" << flist_of_levels.at(flist_of_levels.size() - 1).get_energy().value <<
" ; " << flist_of_levels.at(flist_of_levels.size() - 2).get_energy().value <<
"]" <<
do_endl;
371 swap(flist_of_levels[flist_of_levels.size() - 1], flist_of_levels[flist_of_levels.size() - 2]);
375 is_record = fensdf_reader.next_record(_data_set, record);
Interface to the sqlite database.
Main class dedicated to the ENSDF records decoding.
virtual ~tkensdf_builder()
int add_dataset(tkensdf_ident_rec &_dataset, const tkstring &_nucleus, const tkstring &_dataset_comment="", const tkstring &_dataset_date="", const tkstring &_dataset_source="")
tkensdf_builder(tkdatabase *_database, const tkstring &_input_folder)
virtual void analyse_record() override
analyse the record content
virtual bool set_record(const tkstring &_record) override
define the record from a string
bool is_final_level_set()
return true if the information on the final level is manually defined
double get_final_level_energy()
return true if the information on the final level is manually defined
void set_final_level_set(bool _status)
return true if the information on the final level is manually defined
Decodding of the ENSDF identification record properties.
virtual void analyse_record() override
analyse the record content
virtual bool set_record(const tkstring &_record) override
define the record from a string
bool first_record(tkensdf_ident_rec *_dataset, tkstring &record)
return the identification record and set its physical 1-based line position
bool next_record(tkensdf_ident_rec *_dataset, tkstring &record)
return the next record; on false, the terminator is not returned and record is unchanged
Decodding of the ENSDF records.
const tkstring & get_record()
get record
virtual void add_comment_record(const tkstring &_comment_record, bool _is_continuation=false)
add a continuation record from a string
bool is_energy_offset()
to now if the energy is given with an offset
virtual bool set_record(const tkstring &_record)
define the record from a string. Option false only checks if the record is an identification record
bool is_continuation_record()
to now if the record is a continuation record or not
tkstring fglobal_time_unit
virtual const tkstring & get_comment_record() const
get the continuation record
const tkdb_table::measure_data_struct & get_energy() const
tkstring get_energy_offset()
get_energy_offset
virtual void add_continuation_record(const tkstring &_continuation_record)
add a continuation record from a string
record_type get_record_type()
get record type
bool is_comment()
to now if the record is a comment
std::string with usefull tricks from TString (ROOT) and KVString (KaliVeda) and more....
tkstring copy() const
Returns a copy of this string.
static const char * form(const char *_format,...)
tkstring & remove_all(const tkstring &_s1)
tkstring substr(size_type __pos=0, size_type __n=npos) const
Inlines.
int atoi() const
Converts a string to integer value.
tkstring & remove_all_extra_white_space()
bool contains(const char *_pat, ECaseCompare _cmp=kExact) const
bool begins_with(const char *_s, ECaseCompare _cmp=kExact) const
tkstring & replace_all(const tkstring &_s1, const tkstring &_s2)
tklog & error_v(tklog &log)
tklog & do_endl(tklog &log)