File indexing completed on 2026-05-27 07:24:07
0001
0002
0003
0004
0005
0006
0007
0008
0009 #pragma once
0010
0011
0012 #include "detray/builders/detector_builder.hpp"
0013 #include "detray/io/backend/concepts.hpp"
0014 #include "detray/io/frontend/reader_interface.hpp"
0015 #include "detray/io/frontend/writer_interface.hpp"
0016 #include "detray/io/json/json.hpp"
0017 #include "detray/io/json/json_io.hpp"
0018 #include "detray/io/utils/file_handle.hpp"
0019
0020
0021 #include <ios>
0022 #include <iostream>
0023 #include <string>
0024
0025 namespace detray::io {
0026
0027
0028 template <class detector_t, class backend_t>
0029 class json_converter {};
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039 template <class detector_t, class backend_t>
0040 requires concepts::reader_backend<detector_t, backend_t>
0041 class json_converter<detector_t, backend_t> final
0042 : public reader_interface<detector_t> {
0043 using io_backend = backend_t;
0044
0045 public:
0046
0047 json_converter() : reader_interface<detector_t>(".json") {}
0048
0049
0050 void read(detector_builder<typename detector_t::metadata, volume_builder>&
0051 det_builder,
0052 const std::string& file_name) override {
0053
0054 io::file_handle file{file_name, std::ios_base::in | std::ios_base::binary};
0055
0056
0057 nlohmann::json in_json;
0058 *file >> in_json;
0059
0060
0061 io_backend::template from_payload<detector_t>(det_builder, in_json["data"]);
0062 }
0063 };
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073 template <class detector_t, class backend_t>
0074 requires concepts::writer_backend<detector_t, backend_t>
0075 class json_converter<detector_t, backend_t> final
0076 : public writer_interface<detector_t> {
0077 using io_backend = backend_t;
0078
0079 public:
0080
0081 json_converter() : writer_interface<detector_t>(".json") {}
0082
0083
0084 std::string write(const detector_t& det,
0085 const typename detector_t::name_map& names,
0086 const std::ios_base::openmode mode = std::ios::out |
0087 std::ios::binary,
0088 const std::filesystem::path& file_path = {"./"}) override {
0089
0090 assert(((mode == std::ios_base::out) ||
0091 (mode == (std::ios_base::out | std::ios_base::binary)) ||
0092 (mode == (std::ios_base::out | std::ios_base::trunc)) ||
0093 (mode == (std::ios_base::out | std::ios_base::trunc |
0094 std::ios_base::binary))) &&
0095 "Illegal file mode for json writer");
0096
0097 std::string det_name = det.name(names);
0098
0099
0100 std::string file_stem{det_name + "_" + std::string(io_backend::tag)};
0101 io::file_handle file{file_path / file_stem, this->file_extension(), mode};
0102
0103
0104 nlohmann::ordered_json out_json;
0105 out_json["header"] = io_backend::header_to_payload(det, det_name);
0106
0107
0108
0109 out_json["data"] = io_backend::to_payload(det, names);
0110
0111
0112 *file << std::setw(4) << out_json << std::endl;
0113
0114 return file_stem + this->file_extension();
0115 }
0116 };
0117
0118 }