13#include <ROOT/RNTupleFillContext.hxx>
14#include <ROOT/RNTupleFillStatus.hxx>
15#include <ROOT/RNTupleModel.hxx>
16#include <ROOT/RNTupleParallelWriter.hxx>
19#include <SHiP/SimHit.hpp>
20#include <SHiP/SimParticle.hpp>
21#include <SHiP/TrackFitResult.hpp>
22#include <SHiP/detectors/CaloHit.hpp>
23#include <SHiP/detectors/SBTHit.hpp>
24#include <SHiP/detectors/StrawTubesHit.hpp>
25#include <SHiP/detectors/TimeDetHit.hpp>
26#include <SHiP/detectors/UBTHit.hpp>
31#include <oneapi/tbb/enumerable_thread_specific.h>
52template <std::
size_t N>
56 constexpr operator std::string_view()
const {
return {
value, N - 1}; }
59template <FixedString Name,
typename Hit>
61 static constexpr auto name = Name;
68 : file_{TFile::Open(filename.c_str(),
"RECREATE")} {
69 if (!file_ || file_->IsZombie()) {
70 throw std::runtime_error{
"Could not create ROOT output file: " + filename};
74 TFile&
file() {
return *file_; }
75 std::mutex&
mutex() {
return mutex_; }
78 std::unique_ptr<TFile> file_;
82template <
typename Hit>
86 : file_service_{file_service} {
87 auto model = ROOT::RNTupleModel::CreateBare();
88 model->MakeField<Hit>(
"hit");
90 std::scoped_lock lock{file_service_.mutex()};
92 writer_ = ROOT::RNTupleParallelWriter::Append(std::move(model), ntuple_name,
93 file_service_.file());
97 auto& state = states_.local();
100 state.context = writer_->CreateFillContext();
101 state.entry = state.context->CreateEntry();
104 *state.entry->template GetPtr<Hit>(
"hit") = hit;
106 ROOT::RNTupleFillStatus status;
107 state.context->FillNoFlush(*state.entry, status);
109 if (status.ShouldFlushCluster()) {
110 state.context->FlushColumns();
112 std::scoped_lock lock{file_service_.mutex()};
113 state.context->FlushCluster();
119 std::shared_ptr<ROOT::RNTupleFillContext> context;
120 std::unique_ptr<ROOT::REntry> entry;
123 RNTupleFileService& file_service_;
124 std::unique_ptr<ROOT::RNTupleParallelWriter> writer_;
125 tbb::enumerable_thread_specific<FillState> states_;
133template <
typename... NamedHits>
137 : writers_{
TypedHitWriter<typename NamedHits::type>{file_service, NamedHits::name}...} {}
139 template <
typename Hit>
141 return std::get<TypedHitWriter<Hit>>(writers_);
145 std::tuple<TypedHitWriter<typename NamedHits::type>...> writers_;
149 NamedHit<
"spectrometer_tracks", SHiP::TrackFitResult>,
150 NamedHit<
"upstream_tagger", SHiP::UBTHit>,
NamedHit<
"surround_tagger", SHiP::SBTHit>,
151 NamedHit<
"calorimeter", SHiP::CaloHit>,
NamedHit<
"timing_detector", SHiP::TimeDetHit>>;
154 NamedHit<
"sim_particles", SHiP::SimParticle>>;
159 : file_service_{filename}, writers_{file_service_} {
161 sim_writers_.emplace(file_service_);
169 template <
typename Hit>
170 void write(std::vector<Hit>
const& hits) {
171 write_all(hits, writers_.template get<Hit>());
179 template <
typename Hit>
180 void write_sim(std::shared_ptr<std::vector<Hit>>
const& hits) {
182 write_all(*hits, sim_writers_->template get<Hit>());
186 template <
typename Hit>
188 for (
auto const& hit : hits) {
194 RNTupleFileService file_service_;
196 ReconstructedWriters writers_;
199 std::optional<SimTruthWriters> sim_writers_;
void write_sim(std::shared_ptr< std::vector< Hit > > const &hits)
Definition typed_rntuple_writer.hpp:180
HitRNTupleWriter(std::string const &filename, bool isSim)
Definition typed_rntuple_writer.hpp:158
void write(std::vector< Hit > const &hits)
Definition typed_rntuple_writer.hpp:170
Definition typed_rntuple_writer.hpp:65
std::mutex & mutex()
Definition typed_rntuple_writer.hpp:75
TFile & file()
Definition typed_rntuple_writer.hpp:74
RNTupleFileService(std::string const &filename)
Definition typed_rntuple_writer.hpp:67
Definition typed_rntuple_writer.hpp:83
void write(Hit const &hit)
Definition typed_rntuple_writer.hpp:96
TypedHitWriter(RNTupleFileService &file_service, std::string_view ntuple_name)
Definition typed_rntuple_writer.hpp:85
Definition typed_rntuple_writer.hpp:134
TypedHitWriter< Hit > & get()
Definition typed_rntuple_writer.hpp:140
TypedHitWriters(RNTupleFileService &file_service)
Definition typed_rntuple_writer.hpp:136
Definition fit_seed.cpp:16
TypedHitWriters< NamedHit<"sim_hits", SHiP::SimHit >, NamedHit<"sim_particles", SHiP::SimParticle > > SimTruthWriters
Definition typed_rntuple_writer.hpp:153
std::vector< SHiP::SimParticle > SimParticles
Definition typed_rntuple_writer.hpp:46
std::vector< SHiP::UBTHit > UpstreamTaggerObjects
Definition typed_rntuple_writer.hpp:41
std::vector< SHiP::SimHit > SimHits
Definition typed_rntuple_writer.hpp:45
TypedHitWriters< NamedHit<"spectrometer_tracks", SHiP::TrackFitResult >, NamedHit<"upstream_tagger", SHiP::UBTHit >, NamedHit<"surround_tagger", SHiP::SBTHit >, NamedHit<"calorimeter", SHiP::CaloHit >, NamedHit<"timing_detector", SHiP::TimeDetHit > > ReconstructedWriters
Definition typed_rntuple_writer.hpp:148
std::vector< SHiP::TrackFitResult > SpectrometerTracks
Definition typed_rntuple_writer.hpp:40
std::vector< SHiP::CaloHit > CalorimeterObjects
Definition typed_rntuple_writer.hpp:43
std::vector< SHiP::SBTHit > SurroundTaggerObjects
Definition typed_rntuple_writer.hpp:42
std::vector< SHiP::TimeDetHit > TimingDetectorObjects
Definition typed_rntuple_writer.hpp:44
char value[N]
Definition typed_rntuple_writer.hpp:55
constexpr FixedString(char const (&s)[N])
Definition typed_rntuple_writer.hpp:54
Definition typed_rntuple_writer.hpp:60
Hit type
Definition typed_rntuple_writer.hpp:62
static constexpr auto name
Definition typed_rntuple_writer.hpp:61