TkN 2.4
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 char * sErrMsg = nullptr;
54
55 fTable.add_column("element_id","INT PRIMARY KEY NOT NULL");
56
57 for(auto &idx: indexes) {
58 tkstring name = columns.at(idx);
59 tkstring type = types.at(idx);
60 fTable.add_column(name.data(),type.data());
61 if(units.at(idx) != "None") {
62 name += "_unit";
63 fTable.add_column(name.data(),"TEXT");
64 }
65 }
66 for(auto &xray: fxrays_possible_names) {
67 fTable.add_column(xray.data(),"FLOAT");
68 }
69 fTable.write_to_database();
70
71 // filling the database
72 int idx = 1;
73 for(auto &elt: fmap_of_atomic_properties) {
74 tkstring message = "Building '" + fTable.get_name() + "' table";
75 glog.progress_bar(fmap_of_atomic_properties.size(),idx,message.data());
76
77// fTable["element_id"].set_value(idx++);
78 int current_charge = get<2>(elt.second.at("charge")).atoi();
79 fTable["element_id"].set_value(current_charge+1);
80 tkstring element_symbol = get<2>(elt.second.at("symbol"));
81 if(element_symbol == "n") element_symbol = "neutron";
82
83 for(auto &prop : elt.second) {
84 tkstring name = get<0>(prop.second);
85 tkstring unit = get<1>(prop.second);
86 tkstring value = get<2>(prop.second);
87 tkstring type = get<3>(prop.second);
88
89 if(type.contains("INT")) fTable[name.data()].set_value(value.atoi());
90 else if(type.contains("TEXT")) fTable[name.data()].set_value(value.data());
91 else if(type.contains("FLOAT")) fTable[name.data()].set_value(value.atof());
92 if(unit !="None") fTable[tkstring::form("%s_unit",name.data())].set_value(unit.data());
93 }
94 if(fmap_of_xrays.count(current_charge)) {
95 for(auto &xray: fmap_of_xrays.at(current_charge)) {
96 tkstring name, unit; double value;
97 std::tie(name, unit, value) = xray;
98 fTable[name.data()].set_value(value);
99 }
100 }
101 bool do_push = (_only_charge==0 || _only_charge==current_charge);
102 if(do_push) {
103 fTable.push_row();
104 fDataBase->exec_sql(tkstring::form("CREATE VIEW elt%s as select * from element where element.charge=%d",element_symbol.data(),current_charge));
105 }
106 }
107
108 sqlite3_exec(fDataBase->get_sql_db(), "END TRANSACTION", nullptr, nullptr, &sErrMsg);
109 fDataBase->exec_sql("CREATE INDEX charge_index ON element(charge)");
110
111 glog.clear();
112
113 return 0;
114}
115
116void tkelement_builder::read_atomic_db(const char *_atomic_db) {
117
118 gdebug << "filling atomic database using : " << _atomic_db << do_endl;
119
120 std::ifstream f_in;
121 f_in.open(_atomic_db);
122 json jf = json::parse(f_in);
123
124
125
126 auto &table = jf.at("Table");
127
128 for(auto &entry: table.items()) {
129 if(entry.key()=="Columns") {
130 for(auto &col: entry.value().at("Column").items()) {
131 columns.push_back(col.value());
132 if(col.value()=="CPKHexColor") continue;
133 if(col.value()=="electronegativity") continue;
134 if(col.value()=="electron_affinity") continue;
135 if(col.value()=="oxidation_states") continue;
136
137 indexes.push_back(tkstring(col.key()).atoi());
138 }
139 }
140 else if(entry.key()=="Columns_Units") {
141 const auto &cols = entry.value().at("Column");
142 auto cols_items = cols.items();
143 units.reserve(units.size() + cols.size());
144 std::transform(cols_items.begin(), cols_items.end(), std::back_inserter(units),
145 [](const auto &col) { return col.value(); });
146 }
147 else if(entry.key()=="Columns_Types") {
148 const auto &cols = entry.value().at("Column");
149 auto cols_items = cols.items();
150 types.reserve(types.size() + cols.size());
151 std::transform(cols_items.begin(), cols_items.end(), std::back_inserter(types),
152 [](const auto &col) { return col.value(); });
153 }
154 else if(entry.key()=="Row") {
155 for(auto &elt: entry.value().items()) {
156 auto col = elt.value().at("Cell");
157 int atomic_number = col.at(0).get<tkstring>().atoi();
158 map<tkstring,atomic_properties> properties;
159 for(auto &i: indexes) {
160 if(col.at(i).get<tkstring>().length()==0) continue;
161 properties.insert({columns.at(i),{columns.at(i),units.at(i),col.at(i).get<tkstring>(),types.at(i)}});
162 }
163 fmap_of_atomic_properties.insert({atomic_number,properties});
164 }
165 }
166 }
167
168 // for(auto &elt: fmap_of_atomic_properties) {
169 // glog << info <<"New element: " << get<2>(elt.second.at("name")) << do_endl;
170 // for(auto &prop : elt.second) {
171 // cout << left << setw(40) << prop.first << " = " << get<2>(prop.second);
172 // if(get<1>(prop.second) != "None") cout << " " << get<1>(prop.second);
173 // cout<<endl;
174 // }
175 // }
176}
177
178void tkelement_builder::read_xrays_db(const char *_xrays_db) {
179
180 std::ifstream f_in;
181 f_in.open(_xrays_db);
182
183 json jf = json::parse(f_in);
184
185 auto &table = jf.at("Elements");
186
187 for(auto &entry: table.items()) {
188 auto Z = entry.value().at("Z");
189 auto element_name = entry.value().at("name");
190 auto xrays = entry.value().at("Xrays");
191
192 vector<atomic_xray> atom_xrays;
193 for(auto &xray: xrays) {
194 tkstring xray_name = xray.at("name").get<tkstring>();
195 xray_name.prepend("XRay_");
196 tkstring unit = xray.at("unit").get<tkstring>();
197 double value = xray.at("value").get<double>()/1000.;
198 atom_xrays.emplace_back(xray_name,unit,value);
199 if(!fxrays_possible_names.count(xray_name)) fxrays_possible_names.insert(xray_name);
200 }
201 if(!atom_xrays.empty()) fmap_of_xrays.insert({Z,atom_xrays});
202 }
203
204// tkstring name, unit;
205// double value;
206// for(auto &elt: fmap_of_xrays) {
207// cout << elt.first << " " << endl;
208// for(auto &xray: elt.second) {
209// std::tie(name, unit, value) = xray;
210// cout << " -- " << setw(10) << name << " : " << setw(10) << value << " " << unit << endl;
211// }
212// }
213}
214
215#ifdef HAS_ROOT
216ClassImp(tkelement_builder);
217#endif
Interface to the sqlite database.
Definition tkdatabase.h:34
Representaiton of a sqlite data table.
Definition tkdb_table.h:29
tkstring get_name()
Definition tkdb_table.h:93
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:31
static const char * form(const char *_format,...)
Definition tkstring.cpp:408
int atoi() const
Converts a string to integer value.
Definition tkstring.cpp:152
bool contains(const char *_pat, ECaseCompare _cmp=kExact) const
Definition tkstring.h:174
tkstring & prepend(const tkstring &_st)
Definition tkstring.h:201
double atof() const
Converts a string to double value.
Definition tkstring.cpp:168
Definition tklog.cpp:16
std::map< tkstring, pair< tkstring, tkstring > > properties
Definition tkmeasure.h:34
tklog & do_endl(tklog &log)
Definition tklog.h:212