ACTS
Experiment-independent tracking
Loading...
Searching...
No Matches
detector_reader.hpp
1// This file is part of the ACTS project.
2//
3// Copyright (C) 2016 CERN for the benefit of the ACTS project
4//
5// This Source Code Form is subject to the terms of the Mozilla Public
6// License, v. 2.0. If a copy of the MPL was not distributed with this
7// file, You can obtain one at https://mozilla.org/MPL/2.0/.
8
9#pragma once
10
11// Project include(s)
12#include "detray/builders/detector_builder.hpp"
13#include "detray/io/frontend/detail/detector_components_reader.hpp"
14#include "detray/io/frontend/detector_reader_config.hpp"
15#include "detray/io/frontend/impl/json_readers.hpp"
16#include "detray/utils/consistency_checker.hpp"
17#include "detray/utils/logging.hpp"
18#include "detray/utils/print_detector.hpp"
19
20// System include(s)
21#include <filesystem>
22#include <ios>
23#include <memory>
24#include <stdexcept>
25#include <string>
26#include <utility>
27#include <vector>
28
29namespace detray::io {
30
35template <class detector_t, std::size_t CAP = 0u, std::size_t DIM = 2u>
36void read_components_from_file(const std::vector<std::string>& file_names,
37 detector_builder<typename detector_t::metadata,
38 volume_builder>& det_builder) {
39 // Hold all required readers (one for every component)
40 detail::detector_components_reader<detector_t> readers;
41
42 // Register the readers for the files in json format
43 detail::add_json_readers<CAP, DIM>(readers, file_names);
44
45 // Make sure that all files will be read
46 if (readers.size() != file_names.size()) {
47 std::stringstream err_str{};
48 for (const auto& [file_name, reader] : readers.readers_map()) {
49 err_str << "-> " << file_name << std::endl;
50 }
51 DETRAY_ERROR_HOST("Not all files were registered to a reader. "
52 << "Successfully registered files:\n"
53 << err_str.str());
54 }
55
56 // Read the data into the detector builder
57 readers.read(det_builder);
58}
59
72template <class detector_t, std::size_t CAP = 0u, std::size_t DIM = 2u,
73 template <typename> class volume_builder_t = volume_builder>
74auto read_detector(vecmem::memory_resource& resc,
75 const detector_reader_config& cfg) noexcept(false) {
76 // Map the volume names to their indices
77 typename detector_t::name_map names{};
78
80
81 DETRAY_INFO_HOST("Reading detector files... ");
82
83 // Register readers for the respective detector component and file format
84 // and read the data into the detector_builder
86
87 DETRAY_INFO_HOST("Done reading files");
88
89 // Build and return the detector
90 auto det = det_builder.build(resc, cfg.builder_options(), names);
91
92 if (cfg.do_check()) {
93 // This will throw an exception in case of inconsistencies
94 detray::detail::check_consistency(det, cfg.verbose_check(), names);
95 }
96
97 DETRAY_DEBUG_HOST("\n" << detray::utils::print_detector(det, names));
98
99 return std::make_pair(std::move(det), std::move(names));
100}
101
102} // namespace detray::io
Provides functionality to build a detray detector volume by volume.
Definition detector_builder.hpp:40
auto build(vecmem::memory_resource &resource, const volume_builder_options &opt) -> detector_type
Assembles the final detector from the volumes builders and allocates the detector containers with the...
Definition detector_builder.hpp:133
Provides basic functionality to build detector volumes.
Definition volume_builder.hpp:36
The following enums are global for all detectors.
Definition concepts.hpp:18
auto read_detector(vecmem::memory_resource &resc, const detector_reader_config &cfg) noexcept(false)
Reader function for detray detectors.
Definition detector_reader.hpp:74
void read_components_from_file(const std::vector< std::string > &file_names, detector_builder< typename detector_t::metadata, volume_builder > &det_builder)
Read detector components from a list of files.
Definition detector_reader.hpp:36
config struct for detector reading.
Definition detector_reader_config.hpp:22