TkN 2.7.1
Toolkit for Nuclei
Loading...
Searching...
No Matches
tkelement_builder.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#include "tkelement_builder.h"
15
16#include <fstream>
17
18#include "tklog.h"
19#include "json.hpp"
20
21namespace tkn {
28}
29
30using namespace tkn;
31using namespace std;
32using json = nlohmann::json;
33
34tkelement_builder::tkelement_builder(tkdatabase *_database, const char *_table_name) : fDataBase(_database), fTableName(_table_name)
35{
36}
37
39
40int tkelement_builder::fill_database(const char *_atomic_db, const char* _xrays_db, int _only_charge)
41{
42 glog.set_class("db_element_builder");
43 glog.set_method(tkstring::form("fill_database('%s')",_atomic_db));
44
45 gdebug << "calling tkelement_builder::fill_database(...)" << do_endl;
46
47 tkdb_table &fTable = fDataBase->new_table(fTableName);
48 read_atomic_db(_atomic_db);
49 read_xrays_db(_xrays_db);
50
51 // table initialisation
52
53 fTable.add_column("element_id","INTEGER PRIMARY KEY NOT NULL");
54
55 for(auto &idx: indexes) {
56 tkstring name = columns.at(idx);
57 tkstring type = types.at(idx);
58 fTable.add_column(name.data(),type.data());
59 if(units.at(idx) != "None") {
60 name += "_unit";
61 fTable.add_column(name.data(),"TEXT");
62 }
63 }
64 for(auto &xray: fxrays_possible_names) {
65 fTable.add_column(xray.data(),"FLOAT");
66 }
67 fTable.write_to_database();
68
69 // filling the database
70 fDataBase->exec_sql("BEGIN TRANSACTION");
71 int idx = 1;
72 for(auto &elt: fmap_of_atomic_properties) {
73 tkstring message = "Building '" + fTable.get_name() + "' table";
74 glog.progress_bar(fmap_of_atomic_properties.size(),idx,message.data());
75
76// fTable["element_id"].set_value(idx++);
77 int current_charge = get<2>(elt.second.at("charge")).atoi();
78 fTable["element_id"].set_value(current_charge+1);
79
80 for(auto &prop : elt.second) {
81 tkstring name = get<0>(prop.second);
82 tkstring unit = get<1>(prop.second);
83 tkstring value = get<2>(prop.second);
84 tkstring type = get<3>(prop.second);
85
86 if(type.contains("INT")) fTable[name.data()].set_value(value.atoi());
87 else if(type.contains("TEXT")) fTable[name.data()].set_value(value.data());
88 else if(type.contains("FLOAT")) fTable[name.data()].set_value(value.atof());
89 if(unit !="None") fTable[tkstring::form("%s_unit",name.data())].set_value(unit.data());
90 }
91 if(fmap_of_xrays.count(current_charge)) {
92 for(auto &xray: fmap_of_xrays.at(current_charge)) {
93 tkstring name, unit; double value;
94 std::tie(name, unit, value) = xray;
95 fTable[name.data()].set_value(value);
96 }
97 }
98 bool do_push = (_only_charge==0 || _only_charge==current_charge);
99 if(do_push) {
100 fTable.push_row();
101 }
102 }
103
104 fDataBase->exec_sql("COMMIT");
105 fDataBase->exec_sql("CREATE INDEX charge_index ON element(charge)");
106
107 glog.clear();
108
109 return 0;
110}
111
112void tkelement_builder::read_atomic_db(const char *_atomic_db) {
113
114 gdebug << "filling atomic database using : " << _atomic_db << do_endl;
115
116 std::ifstream f_in;
117 f_in.open(_atomic_db);
118 json jf = json::parse(f_in);
119
120
121
122 auto &table = jf.at("Table");
123
124 for(auto &entry: table.items()) {
125 if(entry.key()=="Columns") {
126 for(auto &col: entry.value().at("Column").items()) {
127 columns.push_back(col.value());
128 if(col.value()=="CPKHexColor") continue;
129 if(col.value()=="electronegativity") continue;
130 if(col.value()=="electron_affinity") continue;
131 if(col.value()=="oxidation_states") continue;
132
133 indexes.push_back(tkstring(col.key()).atoi());
134 }
135 }
136 else if(entry.key()=="Columns_Units") {
137 const auto &cols = entry.value().at("Column");
138 auto cols_items = cols.items();
139 units.reserve(units.size() + cols.size());
140 std::transform(cols_items.begin(), cols_items.end(), std::back_inserter(units),
141 [](const auto &col) { return col.value(); });
142 }
143 else if(entry.key()=="Columns_Types") {
144 const auto &cols = entry.value().at("Column");
145 auto cols_items = cols.items();
146 types.reserve(types.size() + cols.size());
147 std::transform(cols_items.begin(), cols_items.end(), std::back_inserter(types),
148 [](const auto &col) { return col.value(); });
149 }
150 else if(entry.key()=="Row") {
151 for(auto &elt: entry.value().items()) {
152 auto col = elt.value().at("Cell");
153 int atomic_number = col.at(0).get<tkstring>().atoi();
154 map<tkstring,atomic_properties> properties;
155 for(auto &i: indexes) {
156 if(col.at(i).get<tkstring>().length()==0) continue;
157 properties.insert({columns.at(i),{columns.at(i),units.at(i),col.at(i).get<tkstring>(),types.at(i)}});
158 }
159 fmap_of_atomic_properties.insert({atomic_number,properties});
160 }
161 }
162 }
163
164 // for(auto &elt: fmap_of_atomic_properties) {
165 // glog << info <<"New element: " << get<2>(elt.second.at("name")) << do_endl;
166 // for(auto &prop : elt.second) {
167 // cout << left << setw(40) << prop.first << " = " << get<2>(prop.second);
168 // if(get<1>(prop.second) != "None") cout << " " << get<1>(prop.second);
169 // cout<<endl;
170 // }
171 // }
172}
173
174void tkelement_builder::read_xrays_db(const char *_xrays_db) {
175
176 std::ifstream f_in;
177 f_in.open(_xrays_db);
178
179 json jf = json::parse(f_in);
180
181 auto &table = jf.at("Elements");
182
183 for(auto &entry: table.items()) {
184 auto Z = entry.value().at("Z");
185 auto element_name = entry.value().at("name");
186 auto xrays = entry.value().at("Xrays");
187
188 vector<atomic_xray> atom_xrays;
189 for(auto &xray: xrays) {
190 tkstring xray_name = xray.at("name").get<tkstring>();
191 xray_name.prepend("XRay_");
192 tkstring unit = xray.at("unit").get<tkstring>();
193 double value = xray.at("value").get<double>()/1000.;
194 atom_xrays.emplace_back(xray_name,unit,value);
195 if(!fxrays_possible_names.count(xray_name)) fxrays_possible_names.insert(xray_name);
196 }
197 if(!atom_xrays.empty()) fmap_of_xrays.insert({Z,atom_xrays});
198 }
199
200// tkstring name, unit;
201// double value;
202// for(auto &elt: fmap_of_xrays) {
203// cout << elt.first << " " << endl;
204// for(auto &xray: elt.second) {
205// std::tie(name, unit, value) = xray;
206// cout << " -- " << setw(10) << name << " : " << setw(10) << value << " " << unit << endl;
207// }
208// }
209}
210
211#ifdef HAS_ROOT
212ClassImp(tkelement_builder);
213#endif
Interface to the sqlite database.
Definition tkdatabase.h:39
Representaiton of a sqlite data table.
Definition tkdb_table.h:31
tkstring get_name()
Definition tkdb_table.h:102
void write_to_database()
void add_column(const char *_colname, const char *_coltype)
Decoding of the element properties.
virtual ~tkelement_builder()
int fill_database(const char *_atomic_db, const char *_xrays_db, int _only_charge=0)
tkelement_builder(tkdatabase *_database, const char *_table_name="ELEMENT")
std::string with usefull tricks from TString (ROOT) and KVString (KaliVeda) and more....
Definition tkstring.h:33
static const char * form(const char *_format,...)
Definition tkstring.cpp:438
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
tkstring & prepend(const tkstring &_st)
Definition tkstring.h:217
double atof() const
Converts a string to double value.
Definition tkstring.cpp:226
Definition tklog.cpp:16
std::map< tkstring, pair< tkstring, tkstring > > properties
Definition tkmeasure.h:33
tklog & do_endl(tklog &log)
Definition tklog.h:212