Hyperiso 1.0.3
Modular flavour-physics calculations, Wilson coefficients and statistical inference
Loading...
Searching...
No Matches
JsonWriter.cpp
Go to the documentation of this file.
1#include "JsonWriter.h"
2
4 if (std::holds_alternative<std::monostate>(v)) {
5 return std::shared_ptr<DBNode>(nullptr);
6 }
7 if (auto p = std::get_if<double>(&v)) return *p;
8 if (auto p = std::get_if<int64_t>(&v)) return static_cast<int>(*p);
9 if (auto p = std::get_if<bool>(&v)) return *p;
10 if (auto p = std::get_if<std::string>(&v)) return BlockName(*p);
11
12 return std::shared_ptr<DBNode>(nullptr);
13}
14
15std::shared_ptr<DBNode> make_object_node() {
16 return std::make_shared<DBNode>();
17}
18
19std::shared_ptr<DBNode> make_scalar_node(const Value& v) {
20 auto n = std::make_shared<DBNode>();
21 n->set(to_dbnode_value(v), "");
22 return n;
23}
24
25DBNode::Value make_array_value(const std::vector<std::shared_ptr<DBNode>>& elems) {
26 return elems;
27}
28
29std::shared_ptr<DBNode> dataset_to_dbnode(const DataSet& ds, const OutputSpec& spec) {
30 auto root = make_object_node();
31
32 {
33 auto meta = make_object_node();
34 for (const auto& [k,v] : ds.meta) {
35 meta->set(to_dbnode_value(v), k);
36 }
37 root->set(meta, "meta");
38 }
39
40 {
41 std::vector<std::shared_ptr<DBNode>> varsArr;
42 varsArr.reserve(ds.vars.size());
43
44 for (const auto& v : ds.vars) {
45 auto o = make_object_node();
46 o->set(BlockName(v.name), "name");
47 o->set(BlockName(v.block), "block");
48 o->set(static_cast<int>(v.pdg), "pdg");
49 o->set(v.min, "min");
50 o->set(v.max, "max");
51 o->set(v.step, "step");
52 varsArr.push_back(o);
53 }
54
55 auto scan = make_object_node();
56 scan->set(make_array_value(varsArr), "vars");
57 root->set(scan, "scan");
58 }
59
60 if (!ds.outputs_schema.empty()) {
61 std::vector<std::shared_ptr<DBNode>> schemaArr;
62 schemaArr.reserve(ds.outputs_schema.size());
63 for (const auto& k : ds.outputs_schema) schemaArr.push_back(make_scalar_node(std::string(k)));
64 root->set(make_array_value(schemaArr), "outputs_schema");
65 }
66
67 {
68 std::unordered_set<std::string> wanted;
69 const bool filter = !spec.keys.empty();
70 if (filter) wanted = {spec.keys.begin(), spec.keys.end()};
71
72 std::vector<std::shared_ptr<DBNode>> pointsArr;
73 pointsArr.reserve(ds.points.size());
74
75 for (const auto& p : ds.points) {
76 auto jp = make_object_node();
77
78 auto xobj = make_object_node();
79 for (size_t i = 0; i < ds.vars.size(); ++i) {
80 const auto& var = ds.vars[i];
81 const double val = (i < p.x.size()) ? p.x[i] : 0.0;
82 xobj->set(val, var.name);
83 }
84 jp->set(xobj, "x");
85
86 auto yobj = make_object_node();
87 for (const auto& [k,v] : p.y) {
88 if (filter && !wanted.count(k)) continue;
89 yobj->set(to_dbnode_value(v), k);
90 }
91 jp->set(yobj, "y");
92
93 pointsArr.push_back(jp);
94 }
95
96 root->set(make_array_value(pointsArr), "points");
97 }
98
99 return root;
100}
101
102
103void JsonWriter::write(const DataSet& ds, const OutputSpec& spec) {
104 auto root = dataset_to_dbnode(ds, spec);
105
106 std::ofstream out(path_);
107 if (!out) throw std::runtime_error("Cannot open JSON file: " + path_);
108
109 root->printJSONToStream(out, 0);
110 out << "\n";
111}
112
113
DBNode::Value to_dbnode_value(const Value &v)
Definition JsonWriter.cpp:3
std::shared_ptr< DBNode > make_scalar_node(const Value &v)
std::shared_ptr< DBNode > dataset_to_dbnode(const DataSet &ds, const OutputSpec &spec)
std::shared_ptr< DBNode > make_object_node()
DBNode::Value make_array_value(const std::vector< std::shared_ptr< DBNode > > &elems)
std::shared_ptr< DBNode > dataset_to_dbnode(const DataSet &ds, const OutputSpec &spec)
std::variant< std::monostate, double, int64_t, bool, std::string > Value
Block identifier with alias support.
Definition BlockName.h:59
std::variant< BlockName, int, double, bool, std::shared_ptr< DBNode >, std::vector< std::shared_ptr< DBNode > > > Value
Variant type used to store values in the tree.
Definition DBNode.h:45
void write(const DataSet &ds, const OutputSpec &spec) override
std::vector< DataPoint > points
std::vector< std::string > outputs_schema
std::vector< ScanVar > vars
std::unordered_map< std::string, Value > meta
std::vector< std::string > keys