TkN 2.7.1
Toolkit for Nuclei
Loading...
Searching...
No Matches
tklevel_scheme.cpp
1/********************************************************************************
2 * Copyright (c) : Université de Lyon 1, CNRS/IN2P3, UMR5822, *
3 * IP2I, F-69622 Villeurbanne Cedex, France *
4 * Normandie Université, ENSICAEN, UNICAEN, CNRS/IN2P3, *
5 * LPC Caen, F-14000 Caen, France *
6 * Contibutor(s) : *
7 * Jérémie Dudouet jeremie.dudouet@cnrs.fr [2020] *
8 * Diego Gruyer diego.gruyer@cnrs.fr [2020] *
9 * *
10 * Licensed under the MIT License <http://opensource.org/licenses/MIT>. *
11 * SPDX-License-Identifier: MIT *
12 ********************************************************************************/
13
14#ifdef HAS_DEBUG
15#include <algorithm>
16#include <chrono>
17#endif
18
19#include "tkdb_table.h"
20#include "tklevel_scheme.h"
21#include "tkstring.h"
22#include "tklog.h"
23#include "tkdatabase.h"
24#include "tkmanager.h"
25
26namespace tkn {
44}
45
46using namespace tkn;
47
48tklevel_scheme::tklevel_scheme(const tkstring &_nuc, int _zz, int _aa, bool _load_default_dataset) : fnucleus(_nuc), fA(_aa), fZ(_zz)
49{
50 if (fA < 0 || fZ < 0) return;
51 init(_load_default_dataset);
52}
53
71std::vector<shared_ptr<tklevel>> tklevel_scheme::get_levels(const std::function<bool(shared_ptr<tklevel>)> &_selection)
72{
73 vector<shared_ptr<tklevel>> res;
74 const auto &levels = get_levels();
75 std::copy_if(levels.begin(), levels.end(), std::back_inserter(res),
76 [&_selection](const auto &lvl) { return _selection(lvl); });
77 return res;
78}
79
94std::vector<shared_ptr<tkdecay>> tklevel_scheme::get_decays(const std::function<bool(shared_ptr<tkdecay>)> &_selection)
95{
96 vector<shared_ptr<tkdecay>> res;
97 const auto &decays = get_decays();
98 std::copy_if(decays.begin(), decays.end(), std::back_inserter(res),
99 [&_selection](const auto &dec) { return _selection(dec); });
100 return res;
101}
102
124void tklevel_scheme::print(const tkstring &_data, const tkstring &_option)
125{
126 if (_data.is_empty()) {
127 glog << info << " Level scheme of " << fnucleus << do_endl;
128 glog << info << " Options : 'dataset', 'level', 'decay'" << do_endl;
129 }
130 if (_data.contains("dataset")) {
131 auto print_group = [&](const tkstring &source_label) {
132 bool header_printed = false;
133 for (auto &dts : fmap_of_dataset) {
134 if (dts.second->get_source() != source_label) continue;
135 if (!header_printed) {
136 glog << info << "--- " << source_label << " ---" << do_endl;
137 header_printed = true;
138 }
139 glog << info << dts.second->get_name() << " (" << dts.first << ")";
140 if (dts.second->has_date()) glog << " [" << dts.second->get_date() << "]";
141 glog << do_endl;
142 if (_option.contains("com") && dts.second->has_comment()) {
143 const size_t comment_prefix_size = 13;
144 const size_t content_col = comment_prefix_size + 2;
145 glog << comment << " " << wrap_text(dts.second->get_comment(), content_col, content_col) << do_endl;
146 }
147 }
148 };
149 print_group("ENSDF");
150 print_group("XUNDL");
151 glog << comment << "Current dataset is '" << get_dataset()->get_name() << "'" << " (" << get_dataset()->get_id() << ")" << do_endl;
152 }
153 if (_data.contains("level") || _data.contains("decay")) {
154 fmap_of_dataset[fdatasetid]->print(_data, _option);
155 }
156 if (_data == "*") {
157 int _current_data_set = fdatasetid;
158 for (auto &dataset : fmap_of_dataset) {
159 glog << info << "dataset : " << dataset.second->get_name() << do_endl;
160 select_dataset(dataset.first);
161 dataset.second->print("leveldecay");
162 }
163 // to select back the current dataset
164 select_dataset(_current_data_set);
165 }
166}
167
172bool tklevel_scheme::select_dataset(const tkstring &_dataset_name)
173{
174 if (fmap_of_dataset_name_id.count(_dataset_name) == 0) {
175 glog << warning << "dataset '" << _dataset_name << "' do not exist for " << fnucleus << do_endl;
176 print("dataset");
177 return false;
178 }
179 fdatasetid = fmap_of_dataset_name_id[_dataset_name];
180 return select_dataset(fdatasetid);
181}
182
188{
189 if (fmap_of_dataset.count(_dataset_id) == 0) {
190 glog << warning << "dataset with id '" << _dataset_id << "' do not exist for " << fnucleus << do_endl;
191 print("dataset");
192 return false;
193 }
194
195 fdatasetid = _dataset_id;
196 fmap_of_dataset[fdatasetid]->load_dataset();
197 return true;
198}
199
212shared_ptr<tklevel> tklevel_scheme::get_level(const tkstring &_name, bool _exact)
213{
214 // get a specific level [spin][parity][rank] (ex: 0+1 for the first 0+ state)
215 string spin;
216 int rank;
217
218 const char *sep = "";
219 if (_name.contains("+")) {
220 sep = "+";
221 } else if (_name.contains("-")) {
222 sep = "-";
223 }
224
225 auto array = _name.tokenize(sep);
226 if (array.size() != 2) {
227 glog << error << " <nuclear_level_scheme::get_level_energy()> invalid argument '" << _name << "'. Syntax: '[spin][parity][rank]'." << do_endl;
228 return nullptr;
229 }
230
231 spin = array.at(0);
232 rank = array.at(1).atoi();
233
234 int idx = 0;
235 for (const auto &lvlp : get_levels([](auto lvl) { return (lvl->get_spin_parity() != nullptr); })) {
236 auto jpistr = lvlp->get_spin_parity()->get_jpi_str();
237 bool ok = false;
238 if (!_exact) {
239 if (jpistr.equal_to(tkstring::form("%s%s", spin.data(), sep)) ||
240 jpistr.equal_to(tkstring::form("(%s%s)", spin.data(), sep)) ||
241 jpistr.equal_to(tkstring::form("(%s)%s", spin.data(), sep)) ||
242 jpistr.equal_to(tkstring::form("%s(%s)", spin.data(), sep))) {
243 ok = true;
244 }
245 } else if (jpistr.equal_to(tkstring::form("%s%s", spin.data(), sep))) {
246 ok = true;
247 }
248 if (ok) {
249 idx++;
250 if (idx == rank) return lvlp;
251 }
252 }
253 return nullptr;
254}
255
264shared_ptr<tklevel> tklevel_scheme::get_level(double _energy, tkstring _offset)
265{
266 const bool require_decay = _offset.contains("dec");
268 shared_ptr<tklevel> clostest_lev;
269 double best_ediff = 1e6;
270 for (const auto &lev : get_levels()) {
271 if (!_offset.is_empty() && !_offset.contains("*")) {
272 if (_offset != lev->get_offset_bandhead()) continue;
273 }
274 if (_offset.is_empty() && !lev->get_offset_bandhead().is_empty()) continue;
275 if (require_decay && lev->get_decays_down().empty()) continue;
276 double ediff = abs(lev->get_energy(tkunit_manager::units_keys::keV, true) - _energy);
277 if (ediff < best_ediff) {
278 best_ediff = ediff;
279 clostest_lev = lev;
280 }
281 }
282 return clostest_lev;
283}
284
286{
287 const auto name = fnucleus + " : ADOPTED LEVELS, GAMMAS";
288 const auto id = fmap_of_dataset_name_id.find(name);
289 if (id == fmap_of_dataset_name_id.end()) return nullptr;
290 const auto dataset = fmap_of_dataset.at(id->second);
291 dataset->load_dataset();
292 for (const auto &level : dataset->get_levels()) {
293 if (!level->is_energy_offset() && level->get_energy() == 0.) return level;
294 }
295 return nullptr;
296}
297
298void tklevel_scheme::init(bool _load_default_dataset)
299{
300 gdatabase->begin("dataset.dataset_id, dataset.dataset_name, dataset.dataset_comment, dataset.dataset_date, dataset.dataset_source",
301 "dataset INNER JOIN isotope on dataset.isotope_id=isotope.isotope_id INNER JOIN element on isotope.element_id=element.element_id",
302 tkstring::form("element.charge=%d AND isotope.mass=%d AND EXISTS (SELECT 1 FROM level WHERE level.dataset_id=dataset.dataset_id)", fZ, fA),
303 tkstring::form("read_dataset_%s", fnucleus.data()));
304
305 while (gdatabase->next(tkstring::form("read_dataset_%s", fnucleus.data()))) {
306 tkdb_table &datasets = (*gdatabase)["DATASET"];
307 int ds_id = datasets["dataset_id"].get_value().atoi();
308 fmap_of_dataset_name_id[datasets["dataset_name"].get_value()] = ds_id;
309 auto ds = make_shared<tkdataset>(tkdataset(fnucleus, fZ, fA, datasets["dataset_name"].get_value(), ds_id));
310 if (!datasets["dataset_comment"].is_empty()) ds->fdataset_comment = datasets["dataset_comment"].get_value();
311 if (!datasets["dataset_date"].is_empty()) ds->fdataset_date = datasets["dataset_date"].get_value();
312 if (!datasets["dataset_source"].is_empty()) ds->fdataset_source = datasets["dataset_source"].get_value();
313 fmap_of_dataset[ds_id] = ds;
314 }
315 tkstring default_dataset = fnucleus.data();
316 default_dataset += " : ADOPTED LEVELS, GAMMAS";
317 gdebug << "looking for dataset : " << default_dataset << do_endl;
318 bool found = (fmap_of_dataset_name_id.count(default_dataset) > 0);
319 gdebug << (found ? "" : "not ") << "found " << (found ? fmap_of_dataset_name_id[default_dataset.data()] : -1) << do_endl;
320
321 if (found) {
322 fdatasetid = fmap_of_dataset_name_id[default_dataset.data()];
323 if (_load_default_dataset) select_dataset(fdatasetid);
324 } else {
325 for (const auto &dts : fmap_of_dataset) {
326 glog << warning << tkstring::form("%5s", fnucleus.data()) << " -- no 'ADOPTED LEVELS' dataset : '" << dts.second->get_name() << "' used instead." << do_endl;
327 fdatasetid = dts.first;
328 if (_load_default_dataset) select_dataset(fdatasetid);
329 break;
330 }
331 }
332 if (fmap_of_dataset.empty()) {
333 tkstring datasetname = "EMPTY";
334 fdatasetid = 0;
335 fmap_of_dataset_name_id[datasetname] = fdatasetid;
336 fmap_of_dataset[fdatasetid] = make_shared<tkdataset>(tkdataset(fnucleus, fZ, fA, datasetname, fdatasetid));
337 }
338
339 floaded = true;
340}
341
342void tkdataset::check_yrast(shared_ptr<tklevel> _lvl)
343{
344 // check Yrast
345 if (_lvl->get_spin_parity()->get_spin().is_known()) {
346 int TwoJ = (int)(_lvl->get_spin_parity()->get_spin().get_value() * 2 + 0.5);
347 if (!fyrastmap_exact.count(TwoJ)) {
348 fyrastmap_exact[TwoJ] = _lvl;
349 _lvl->fisYrast_exact = true;
350 // cout<<"exact yrast: 2J:"<<TwoJ<<" "<<lvl->get_spin_parity_str()<<" "<<lvl->get_energy()<<endl;
351 }
352 if (!fyrastmap_uncertain.count(TwoJ)) {
353 fyrastmap_uncertain[TwoJ] = _lvl;
354 _lvl->fisYrast_uncertain = true;
355 // cout<<"uncertain yrast: 2J:"<<TwoJ<<" "<<lvl->get_spin_parity_str()<<" "<<lvl->get_energy()<<endl;
356 }
357 } else if (!_lvl->get_spin_parity_str().is_empty() && !_lvl->get_spin_parity_str().contains(",")) {
358 tkstring tmp = _lvl->get_spin_parity_str().copy().remove_all("(").remove_all(")").remove_all("+").remove_all("-");
359 int TwoJ;
360 if (tmp.contains("/2"))
361 TwoJ = tmp.remove_all("/2").atoi();
362 else
363 TwoJ = tmp.atoi() * 2;
364 if (!fyrastmap_uncertain.count(TwoJ)) {
365 fyrastmap_uncertain[TwoJ] = _lvl;
366 _lvl->fisYrast_uncertain = true;
367 // cout<<"uncertain yrast: 2J:"<<TwoJ<<" "<<lvl->get_spin_parity_str()<<" "<<lvl->get_energy()<<endl;
368 }
369 }
370}
371
372void tkdataset::load_dataset()
373{
374 if (floaded) return;
375
376#ifdef HAS_DEBUG
377 auto t_0 = std::chrono::high_resolution_clock::now();
378 gdebug << "loading levels for dataset '" << fname << "' of " << fnucleus << do_endl;
379#endif
380
381 gdatabase->begin("level.*", "level", tkstring::form("dataset_id=%d", fid));
382
383 tkdb_table *levels = &(*gdatabase)["LEVEL"];
384 const auto energy_columns = levels->get_measure_columns("level_energy");
385 const auto lifetime_columns = levels->get_measure_columns("level_lifetime");
386 const auto magnetic_dipole_columns =
387 levels->get_measure_columns("level_magnetic_dipole");
388 const auto electric_quadrupole_columns =
389 levels->get_measure_columns("level_electric_quadrupole");
390
391 while (gdatabase->next()) {
392 tkdb_column *col = &(*levels)["level_id"];
393 int id = col->get_value().atoi();
394
395 gmanager->set_max_level_id(id);
396
397 tkdb_table::measure_data_struct energy_struc;
398 levels->read_measure(energy_struc, energy_columns);
399
400 shared_ptr<tklevel> lvl = make_shared<tklevel>(id, energy_struc);
401 lvl->fbelongs_to_nucleus = fnucleus;
402
403 double spin = -1.;
404 int parity = -1.;
405 tkstring spin_parity_str = "";
406
407 col = &(*levels)["level_spin_parity"];
408 if (!col->is_empty()) spin_parity_str = col->get_value();
409 col = &(*levels)["level_spin"];
410 if (!col->is_empty()) spin = col->get_value().atof();
411 col = &(*levels)["level_parity"];
412 if (!col->is_empty()) parity = col->get_value().atoi();
413
414 if (!spin_parity_str.is_empty()) lvl->set_jpi(spin, parity, spin_parity_str);
415
416 tkdb_table::measure_data_struct lifetime_struc;
417 levels->read_measure(lifetime_struc, lifetime_columns);
418 if (lifetime_struc.filled) lvl->set_lifetime(lifetime_struc);
419
420 tkdb_table::measure_data_struct magnetic_dipole_struc;
421 levels->read_measure(magnetic_dipole_struc, magnetic_dipole_columns);
422 if (magnetic_dipole_struc.filled) lvl->set_magnetic_dipole(magnetic_dipole_struc);
423
424 tkdb_table::measure_data_struct electric_quadrupole_struc;
425 levels->read_measure(electric_quadrupole_struc, electric_quadrupole_columns);
426 if (electric_quadrupole_struc.filled) lvl->set_electric_quadrupole(electric_quadrupole_struc);
427
428 col = &(*levels)["level_comment"];
429 if (!col->is_empty()) lvl->set_comment(col->get_value());
430 col = &(*levels)["level_uncertain"];
431 if (!col->is_empty()) lvl->set_uncertain_level(col->get_value());
432
433 flevels.push_back(lvl);
434
435 check_yrast(lvl);
436 }
437 for (const auto &lvl : flevels) {
438 fmapoflevels[lvl->get_id()] = lvl;
439 }
440
441#ifdef HAS_DEBUG
442 auto t_1 = std::chrono::high_resolution_clock::now();
443 gdebug << "loading decays for dataset '" << fname << "' of " << fnucleus << do_endl;
444#endif
445
446 gdatabase->begin("decay.*", "decay INNER JOIN level on decay.level_from_id=level.level_id ", tkstring::form("dataset_id=%d", fid));
447
448 while (gdatabase->next()) {
449 int dectype = -1;
450 int level_from = -1.;
451 int level_to = -1.;
452
453 tkdb_table *decay = &(*gdatabase)["DECAY"];
454 tkdb_column *col = &(*decay)["decay_id"];
455 int id = col->get_value().atoi();
456
457 gmanager->set_max_decay_id(id);
458
459 col = &(*decay)["decay_type"];
460 if (!col->is_empty()) dectype = col->get_value().atoi();
461 col = &(*decay)["level_from_id"];
462 if (!col->is_empty()) level_from = col->get_value().atoi();
463 col = &(*decay)["level_to_id"];
464 if (!col->is_empty()) level_to = col->get_value().atoi();
465
466 shared_ptr<tkdecay> dec = nullptr;
467
468 tkdb_table::measure_data_struct energy_struc;
469 decay->read_measure(energy_struc, "decay_energy");
470
471 if (dectype == tkdecay::kgamma) {
472 dec = make_shared<tkgammadecay>(id, level_from, level_to, energy_struc);
473 shared_ptr<tkgammadecay> gamma = dynamic_pointer_cast<tkgammadecay>(dec);
474
475 tkdb_table::measure_data_struct relative_intensity_struc;
476 decay->read_measure(relative_intensity_struc, "decay_relative_intensity");
477 if (relative_intensity_struc.filled) gamma->set_relative_intensity(relative_intensity_struc);
478
479 col = &(*decay)["decay_multipolarity"];
480 if (!col->is_empty()) gamma->set_multipolarity(col->get_value());
481
482 tkdb_table::measure_data_struct mixing_ratio_struc;
483 decay->read_measure(mixing_ratio_struc, "decay_mixing_ratio");
484 if (mixing_ratio_struc.filled) gamma->set_mixing_ratio(mixing_ratio_struc);
485
486 tkdb_table::measure_data_struct conv_coeff_struc;
487 decay->read_measure(conv_coeff_struc, "decay_conv_coeff");
488 if (conv_coeff_struc.filled) gamma->set_conv_coeff(conv_coeff_struc);
489
490 // transition probabilities
491 tkdb_table::measure_data_struct transprob_struc;
492 decay->read_measure(transprob_struc, "decay_BE");
493 if (transprob_struc.filled) gamma->set_transition_probability(transprob_struc);
494 transprob_struc.clear();
495 decay->read_measure(transprob_struc, "decay_BEW");
496 if (transprob_struc.filled) gamma->set_transition_probability(transprob_struc);
497 transprob_struc.clear();
498 decay->read_measure(transprob_struc, "decay_BM");
499 if (transprob_struc.filled) gamma->set_transition_probability(transprob_struc);
500 transprob_struc.clear();
501 decay->read_measure(transprob_struc, "decay_BMW");
502 if (transprob_struc.filled) gamma->set_transition_probability(transprob_struc);
503 } else
504 continue;
505
506 col = &(*decay)["decay_comment"];
507 if (!col->is_empty()) dec->set_comment(col->get_value());
508 col = &(*decay)["decay_uncertain"];
509 if (!col->is_empty()) dec->set_uncertain_decay(col->get_value());
510
511 fdecays.push_back(dec);
512 fdecays.back()->set_levels(fmapoflevels.at(level_from), fmapoflevels.at(level_to));
513 }
514 for (auto &dec : fdecays) {
515 fmapoflevels.at(dec->get_level_from_id())->add_decay_down(dec);
516 fmapoflevels.at(dec->get_level_to_id())->add_decay_up(dec);
517 }
518
519#ifdef HAS_DEBUG
520 auto t_2 = std::chrono::high_resolution_clock::now();
521
522 auto dt01 = std::chrono::duration<double, std::milli>(t_1 - t_0).count() * 0.001; // open db time
523 auto dt12 = std::chrono::duration<double, std::milli>(t_2 - t_1).count() * 0.001; // first read loop with views
524
525 gdebug << std::fixed << std::setprecision(4) << "time level: "
526 << dt01
527 << " s" << do_endl;
528
529 gdebug << std::fixed << std::setprecision(4) << "time decays: "
530 << dt12
531 << " s" << do_endl;
532#endif
533
534 floaded = true;
535}
536
541void tkdataset::print(const tkstring &_data, const tkstring &_option)
542{
543 if (_data.contains("level") && _data.contains("decay")) {
544 glog << info << "dataset '" << fname << "' contains " << flevels.size() << " levels" << do_endl;
545 glog << info << "dataset '" << fname << "' contains " << fdecays.size() << " decays" << do_endl;
546 bool first_level_printed = false;
547 for (auto &lev : flevels) {
548 if (_option.contains("yrastt") && !lev->is_yrast(true))
549 continue;
550 else if (_option.contains("yrast") && !_option.contains("yrastt") && !lev->is_yrast())
551 continue;
552 if (first_level_printed) cout << std::endl;
553 first_level_printed = true;
554 lev->print(_option);
555 for (auto &dec : lev->get_decays_down()) {
556 tkstring decay_option = "quiet;levto";
557 if (_option.contains("com")) decay_option += ";com";
558 cout << setw(13) << "" << "-> ";
559 dec->print(decay_option);
560 }
561 }
562 } else if (_data.contains("level")) {
563 if (_option.contains("tab")) {
564 std::cout << std::setw(15) << left << "symbol" << std::setw(15) << "levelid"
565 << std::setw(15) << left << "energy (keV)"
566 << std::setw(15) << left << "energy error"
567 << std::setw(15) << left << "spin parity"
568 << std::setw(15) << left << "t1/2"
569 << std::setw(15) << left << "t1/2 error"
570 << std::setw(15) << left << "t1/2 unit" << std::endl;
571 } else
572 glog << info << "dataset '" << fname << "' contains " << flevels.size() << " levels:" << do_endl;
573 for (auto &lev : flevels) {
574 if (_option.contains("yrastt") && !lev->is_yrast(true))
575 continue;
576 else if (_option.contains("yrast") && !_option.contains("yrastt") && !lev->is_yrast())
577 continue;
578 if (_option.contains("tab")) std::cout << std::setw(15) << left << fnucleus;
579 lev->print(_option);
580 }
581 } else if (_data.contains("decay")) {
582 if (_option.contains("tab"))
583 std::cout << std::setw(15) << left << "symbol" << std::setw(15) << left << "decayid" << std::setw(15) << left << "energy (keV)" << std::setw(15) << left << "energy error (keV)" << std::endl;
584 else
585 glog << info << "dataset '" << fname << "' contains " << fdecays.size() << " decays:" << do_endl;
586 for (auto &dec : fdecays) {
587 if (_option.contains("tab")) std::cout << std::setw(15) << left << fnucleus;
588 dec->print(_option);
589 }
590 }
591}
592
605shared_ptr<tklevel> tkdataset::add_level(double _ener, double _unc, tkstring _unit, tkstring _jpistr)
606{
607 tkspin spin;
608 tkparity parity;
609 double spin_val = -1.;
610 int parity_val = -1.;
611
612 tkdb_table::measure_data_struct lvl_properties{_ener, _unc, 0, 0, _unit};
613 shared_ptr<tklevel> lvl = make_shared<tklevel>(gmanager->get_new_level_id(), lvl_properties);
614
615 spin.set(_jpistr);
616 parity.set(_jpistr);
617 if (spin.is_known()) spin_val = spin.get_value();
618 if (parity.is_known()) parity_val = (parity.is_parity(tkparity::eparity::kParityMinus));
619
620 lvl->set_jpi(spin_val, parity_val, _jpistr);
621
622 // needs to generate a unique id for the level
623 lvl->fbelongs_to_nucleus = fnucleus;
624
625 // find the good position in the vector to be sorted by energy
626 auto it = std::lower_bound(flevels.begin(), flevels.end(), lvl,
627 [](const std::shared_ptr<tklevel> &a, const std::shared_ptr<tklevel> &b) {
628 return a->get_energy() < b->get_energy();
629 });
630 flevels.insert(it, lvl);
631
632 check_yrast(lvl);
633 fmapoflevels[lvl->get_id()] = lvl;
634
635 return lvl;
636}
637
654shared_ptr<tkgammadecay> tkdataset::add_gamma_decay(shared_ptr<tklevel> _lvlfrom, shared_ptr<tklevel> _lvlto, double _ener, double _unc)
655{
656 if (_ener == 0.) _ener = _lvlfrom->get_energy() - _lvlto->get_energy();
657
658 tkdb_table::measure_data_struct energy_struc{_ener, _unc, 0., 0., "keV"};
659
660 shared_ptr<tkgammadecay> decay = make_shared<tkgammadecay>(gmanager->get_new_decay_id(), _lvlfrom->get_id(), _lvlto->get_id(), energy_struc);
661 decay->set_levels(_lvlfrom, _lvlto);
662 fdecays.push_back(decay);
663 _lvlfrom->add_decay_down(decay);
664 _lvlto->add_decay_up(decay);
665
666 return decay;
667}
668
669#ifdef HAS_ROOT
670ClassImp(tklevel_scheme);
671#endif
Represents a dataset of nuclear levels and decays for a given nucleus.
shared_ptr< tklevel > add_level(double _ener, double _unc, tkstring _unit, tkstring _jpistr)
manually add a new level to the dataset
shared_ptr< tkgammadecay > add_gamma_decay(shared_ptr< tklevel > _lvlfrom, shared_ptr< tklevel > _lvlto, double _ener=0., double _unc=0.)
add a new decay between two levels to the dataset
tkstring get_value() const
Definition tkdb_column.h:38
Representaiton of a sqlite data table.
Definition tkdb_table.h:31
void read_measure(measure_data_struct &_struct, const tkstring &_col_base_name)
measure_columns get_measure_columns(const tkstring &_col_base_name)
Manages the available datasets for a given nucleus.
void print(const tkstring &_data="", const tkstring &_option="")
print the level scheme information
const std::vector< shared_ptr< tklevel > > & get_levels()
get the vector containing all the levels
shared_ptr< tklevel > get_ground_state()
bool select_dataset(const tkstring &_dataset_name)
select a dataset using its name
const shared_ptr< tkdataset > & get_dataset()
returns the current dataset
shared_ptr< tklevel > get_level(const tkstring &_name, bool _exact=true)
get the level corresponding to the given name
tklevel_scheme(const tkstring &_nuc, int _zz, int _aa, bool _load_default_dataset=true)
const std::vector< shared_ptr< tkdecay > > & get_decays()
get the vector containing all the decays
Nuclear excited state parity.
virtual void set(const tkstring &_st)
define the parity from a string
virtual bool is_parity(tkparity::eparity _parity) const
test the parity value
bool is_known() const
to get some information about this data
Definition tkproperty.h:68
Nuclear excited state spin.
double get_value() const
To get the spin as a double.
void set(int n, int d=1)
define the spin value
std::string with usefull tricks from TString (ROOT) and KVString (KaliVeda) and more....
Definition tkstring.h:33
tkstring strip_all_extra_white_space() const
Definition tkstring.cpp:550
static const char * form(const char *_format,...)
Definition tkstring.cpp:438
std::vector< tkstring > tokenize(const tkstring &_delim=" ") const
Create a vector of string separated by at least one delimiter.
Definition tkstring.cpp:292
bool is_empty() const
Definition tkstring.h:145
tkstring & remove_all(const tkstring &_s1)
Definition tkstring.h:208
int atoi() const
Converts a string to integer value.
Definition tkstring.cpp:210
bool contains(const char *_pat, ECaseCompare _cmp=kExact) const
Definition tkstring.h:184
double atof() const
Converts a string to double value.
Definition tkstring.cpp:226
Definition tklog.cpp:16
std::string wrap_text(const tkstring &_text, size_t _first_content_col, size_t _continuation_col, size_t _max_line_width=80)
Definition tkstring.cpp:75
tklog & info(tklog &log)
Definition tklog.h:313
tklog & error(tklog &log)
Definition tklog.h:344
tklog & do_endl(tklog &log)
Definition tklog.h:212
tklog & warning(tklog &log)
Definition tklog.h:331
tklog & comment(tklog &log)
Definition tklog.h:319
data structure used to fill a tkmeasure object from the sqlite database
Definition tkdb_table.h:51