R3BROOT
R3B analysis software
Loading...
Searching...
No Matches
R3BUcesbSource2.h
Go to the documentation of this file.
1#pragma once
2
3/******************************************************************************
4 * Copyright (C) 2019 GSI Helmholtzzentrum für Schwerionenforschung GmbH *
5 * Copyright (C) 2019-2025 Members of R3B Collaboration *
6 * *
7 * This software is distributed under the terms of the *
8 * GNU General Public Licence (GPL) version 3, *
9 * copied verbatim in the file "LICENSE". *
10 * *
11 * In applying this license GSI does not waive the privileges and immunities *
12 * granted to it by virtue of its status as an Intergovernmental Organization *
13 * or submit itself to any jurisdiction. *
14 ******************************************************************************/
15
16#include "R3BReader.h"
17#include <FairSource.h>
18#include <R3BUcesbMappingFlag.h>
19#include <R3BUcesbStructInfo.h>
20#include <Rtypes.h>
21#include <chrono>
22#include <cstddef>
23#include <ext_data_clnt.hh>
24#include <memory>
25#include <mutex>
26#include <string>
27#include <string_view>
28#include <vector>
29
30struct EXT_STR_h101_t;
32
33namespace R3B
34{
35 class UcesbServerLauncher;
36 class UcesbSource : public FairSource
37 {
38 public:
40 UcesbSource(std::string_view lmdfile_name,
41 std::string_view ntuple_options,
42 std::string_view ucesb_path,
43 EventStructType* event_struct,
44 size_t event_struct_size);
45
46 // rule of five:
47 ~UcesbSource() override;
48 UcesbSource(const UcesbSource&) = delete;
52
53 // setters:
54 void SetMaxEvents(int max_event_num) { max_event_num_ = max_event_num; }
55 void SetLMDFileName(std::string_view lmdfile_name) { lmdfile_name_ = lmdfile_name; }
56 void SetNTupleOptions(std::string_view ntuple_options) { ntuple_options_ = ntuple_options; }
57 void SetUcesbPath(std::string_view ucesb_path) { ucesb_path_ = ucesb_path; }
58 void SetEventStructSize(size_t event_size) { event_struct_size_ = event_size; }
59 void SetInfiniteRun(bool is_infinite = true) { is_infinite_run_ = is_infinite; }
60 // non-owning
61 void SetEventStruct(EventStructType* event_struct) { event_struct_ = event_struct; }
63 void SetRunID(unsigned int run_id) { run_id_ = run_id; }
64 void AllowExtraMap(UcesbMap flag) { ucesb_client_struct_info_.SetExtraMapFlags(flag); }
65
66 void RestartUcesbServer();
67
68 template <typename ReaderType>
69 auto AddReader(std::unique_ptr<ReaderType> reader) -> ReaderType*;
70 template <typename ReaderType, typename... Args>
71 auto AddReader(Args&&... args) -> ReaderType*;
72 // TODO: C++20 concepts
73 template <typename UnaryOp>
74 void ForEachReader(UnaryOp opt);
75
76 template <typename Predicate>
77 auto FindReaderIf(Predicate pred) -> R3BReader*;
78
79 // deprecate the old API because of bad memory managerment
80 [[deprecated("Please use smart pointer method to add a reader")]] auto* AddReader(R3BReader* a_reader)
81 {
82 return AddReader(std::unique_ptr<R3BReader>(a_reader));
83 }
84
85 private:
87 bool is_infinite_run_ = false;
88 unsigned int run_id_ = 0;
91 EventStructType* event_struct_ = nullptr; // non-owning
92 R3BEventHeader* event_header_ = nullptr; // non-owning
93 std::vector<std::unique_ptr<R3BReader>> readers_;
94 std::string lmdfile_name_;
95 std::string ntuple_options_;
96 std::string ucesb_path_;
98 std::chrono::time_point<std::chrono::system_clock> last_start_time_ = std::chrono::system_clock::now();
99 std::chrono::minutes waiting_time_{ 0 };
100
101 ext_data_clnt ucesb_client_;
103 std::unique_ptr<UcesbServerLauncher> ucesb_server_launcher_;
104
105 // private non-virtual methods:
106
107 void init_runID();
108 void init_ucesb();
110 void init_readers();
111 void setup_ucesb();
112 void print_raw_data();
115
116 // private virtual methods:
117 bool Init() override;
118 bool InitUnpackers() override;
119 bool ReInitUnpackers() override;
120 void Close() override {}
121 void SetParUnpackers() override
122 {
123 ForEachReader([](auto& reader) { reader->SetParContainers(); });
124 }
125 void Reset() override
126 {
127 ForEachReader([](auto& reader) { reader->Reset(); });
128 }
129 void FillEventHeader(FairEventHeader* feh) override;
130 int ReadEvent(unsigned int eventID = 0) override;
131 int CheckMaxEventNo(int EvtEnd = 0) override;
132 bool SpecifyRunId() override { return true; }
133 Source_Type GetSourceType() override { return kONLINE; }
134
135 public:
137 };
138
139 template <typename ReaderType>
140 auto UcesbSource::AddReader(std::unique_ptr<ReaderType> reader) -> ReaderType*
141 {
142 auto& reader_ref = readers_.emplace_back(std::move(reader));
143 return static_cast<ReaderType*>(reader_ref.get());
144 }
145
146 template <typename ReaderType, typename... Args>
147 auto UcesbSource::AddReader(Args&&... args) -> ReaderType*
148 {
149 static_assert(std::is_base_of_v<R3BReader, ReaderType>, "The reader type must be derived from R3BReader!");
150 return AddReader(std::make_unique<ReaderType>(std::forward<Args>(args)...));
151 }
152
153 template <typename UnaryOp>
155 {
156 for (auto& reader : readers_)
157 {
158 opt(reader);
159 }
160 }
161
162 template <typename Predicate>
163 auto UcesbSource::FindReaderIf(Predicate pred) -> R3BReader*
164 {
165 auto res = std::find_if(readers_.begin(), readers_.end(), [&pred](auto& reader) { return pred(reader.get()); });
166 return (res == readers_.end()) ? nullptr : res->get();
167 }
168} // namespace R3B
169
EXT_STR_h101_t EventStructType
R3B::UcesbSource R3BUcesbSource2
UcesbSource & operator=(const UcesbSource &)=delete
void SetEventStruct(EventStructType *event_struct)
std::string ntuple_options_
void SetLMDFileName(std::string_view lmdfile_name)
std::chrono::time_point< std::chrono::system_clock > last_start_time_
R3BEventHeader * event_header_
void SetEventStructSize(size_t event_size)
bool SpecifyRunId() override
ext_data_clnt ucesb_client_
void Close() override
std::unique_ptr< UcesbServerLauncher > ucesb_server_launcher_
std::mutex event_reader_mutex_
void SetUcesbPath(std::string_view ucesb_path)
bool InitUnpackers() override
auto * AddReader(R3BReader *a_reader)
bool Init() override
void SetMaxEvents(int max_event_num)
bool ReInitUnpackers() override
UcesbStructInfo ucesb_client_struct_info_
unsigned int run_id_
auto FindReaderIf(Predicate pred) -> R3BReader *
void SetNTupleOptions(std::string_view ntuple_options)
ClassDefOverride(R3B::UcesbSource, 1)
void FillEventHeader(FairEventHeader *feh) override
void AllowExtraMap(UcesbMap flag)
std::string lmdfile_name_
int ReadEvent(unsigned int eventID=0) override
void restart_ucesb_server_delayed()
UcesbSource(const UcesbSource &)=delete
Source_Type GetSourceType() override
int CheckMaxEventNo(int EvtEnd=0) override
std::chrono::minutes waiting_time_
void SetInfiniteRun(bool is_infinite=true)
void SetRawDataPrint(bool print_raw_data)
void SetRunID(unsigned int run_id)
void ForEachReader(UnaryOp opt)
void SetParUnpackers() override
UcesbSource & operator=(UcesbSource &&)=delete
std::string ucesb_path_
UcesbSource(UcesbSource &&)=delete
std::vector< std::unique_ptr< R3BReader > > readers_
EventStructType * event_struct_
auto AddReader(std::unique_ptr< ReaderType > reader) -> ReaderType *
void Reset() override