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 <R3BUcesbLauncher.h>
19#include <R3BUcesbMappingFlag.h>
20#include <R3BUcesbStructInfo.h>
21#include <ext_data_clnt.hh>
22
23struct EXT_STR_h101_t;
25
26namespace R3B
27{
28 class UcesbSource : public FairSource
29 {
30 public:
31 UcesbSource() = default;
32 UcesbSource(std::string_view lmdfile_name,
33 std::string_view ntuple_options,
34 std::string_view ucesb_path,
35 EventStructType* event_struct,
36 size_t event_struct_size);
37 // rule of five:
38 ~UcesbSource() override;
39 UcesbSource(const UcesbSource&) = delete;
43
44 // setters:
45 void SetMaxEvents(int max_event_num) { max_event_num_ = max_event_num; }
46 void SetLMDFileName(std::string_view lmdfile_name) { lmdfile_name_ = lmdfile_name; }
47 void SetNTupleOptions(std::string_view ntuple_options) { ntuple_options_ = ntuple_options; }
48 void SetUcesbPath(std::string_view ucesb_path) { ucesb_path_ = ucesb_path; }
49 void SetEventStructSize(size_t event_size) { event_struct_size_ = event_size; }
50 void SetInfiniteRun(bool is_infinite = true) { is_infinite_run_ = is_infinite; }
51 // non-owning
52 void SetEventStruct(EventStructType* event_struct) { event_struct_ = event_struct; }
53 void SetRawDataPrint(bool print_raw_data) { has_raw_data_printing_ = print_raw_data; }
54 void SetRunID(unsigned int run_id) { run_id_ = run_id; }
55 void AllowExtraMap(UcesbMap flag) { ucesb_client_struct_info_.SetExtraMapFlags(flag); }
56
57 void RestartUcesbServer();
58
59 template <typename ReaderType>
60 auto AddReader(std::unique_ptr<ReaderType> reader) -> ReaderType*;
61 template <typename ReaderType, typename... Args>
62 auto AddReader(Args&&... args) -> ReaderType*;
63 // TODO: C++20 concepts
64 template <typename UnaryOp>
65 void ForEachReader(UnaryOp&& opt);
66
67 template <typename Predicate>
68 auto FindReaderIf(Predicate&& pred) -> R3BReader*;
69
70 // deprecate the old API because of bad memory managerment
71 [[deprecated("Please use smart pointer method to add a reader")]] auto* AddReader(R3BReader* a_reader)
72 {
73 return AddReader(std::unique_ptr<R3BReader>(a_reader));
74 }
75
76 private:
77 bool has_raw_data_printing_ = false;
78 bool is_infinite_run_ = false;
79 unsigned int run_id_ = 0;
80 int max_event_num_ = 0;
81 size_t event_struct_size_ = 0;
82 EventStructType* event_struct_ = nullptr; // non-owning
83 R3BEventHeader* event_header_ = nullptr; // non-owning
84 std::vector<std::unique_ptr<R3BReader>> readers_;
85 std::string lmdfile_name_;
86 std::string ntuple_options_;
87 std::string ucesb_path_;
88 std::mutex event_reader_mutex_;
89 std::chrono::time_point<std::chrono::system_clock> last_start_time_ = std::chrono::system_clock::now();
90 std::chrono::minutes waiting_time_{ 0 };
91
92 ext_data_clnt ucesb_client_;
93 UcesbStructInfo ucesb_client_struct_info_;
94 UcesbServerLauncher ucesb_server_launcher_ = UcesbServerLauncher{ &ucesb_client_ };
95
96 // private non-virtual methods:
97
98 void init_runID();
99 void init_ucesb();
100 void init_ucesb_bp();
101 void init_readers();
102 void setup_ucesb();
103 void print_raw_data();
104 void restart_ucesb_server();
105 void restart_ucesb_server_delayed();
106
107 // private virtual methods:
108 bool Init() override;
109 bool InitUnpackers() override;
110 bool ReInitUnpackers() override;
111 void Close() override {}
112 void SetParUnpackers() override
113 {
114 ForEachReader([](auto& reader) { reader->SetParContainers(); });
115 }
116 void Reset() override
117 {
118 ForEachReader([](auto& reader) { reader->Reset(); });
119 }
120 void FillEventHeader(FairEventHeader* feh) override;
121 int ReadEvent(unsigned int eventID = 0) override;
122 int CheckMaxEventNo(int EvtEnd = 0) override;
123 bool SpecifyRunId() override { return true; }
124 Source_Type GetSourceType() override { return kONLINE; }
125
126 public:
128 };
129
130 template <typename ReaderType>
131 auto UcesbSource::AddReader(std::unique_ptr<ReaderType> reader) -> ReaderType*
132 {
133 auto& reader_ref = readers_.emplace_back(std::move(reader));
134 return static_cast<ReaderType*>(reader_ref.get());
135 }
136
137 template <typename ReaderType, typename... Args>
138 auto UcesbSource::AddReader(Args&&... args) -> ReaderType*
139 {
140 static_assert(std::is_base_of_v<R3BReader, ReaderType>, "The reader type must be derived from R3BReader!");
141 return AddReader(std::make_unique<ReaderType>(std::forward<Args>(args)...));
142 }
143
144 template <typename UnaryOp>
145 void UcesbSource::ForEachReader(UnaryOp&& opt)
146 {
147 for (auto& reader : readers_)
148 {
149 opt(reader);
150 }
151 }
152
153 template <typename Predicate>
154 auto UcesbSource::FindReaderIf(Predicate&& pred) -> R3BReader*
155 {
156 auto res = std::find_if(readers_.begin(), readers_.end(), [&pred](auto& reader) { return pred(reader.get()); });
157 return (res == readers_.end()) ? nullptr : res->get();
158 }
159} // namespace R3B
160
EXT_STR_h101_t EventStructType
R3B::UcesbSource R3BUcesbSource2
ClassDefInlineOverride(R3B::UcesbSource, 1)
UcesbSource & operator=(const UcesbSource &)=delete
void SetEventStruct(EventStructType *event_struct)
void SetLMDFileName(std::string_view lmdfile_name)
void SetEventStructSize(size_t event_size)
bool SpecifyRunId() override
void Close() override
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
void SetNTupleOptions(std::string_view ntuple_options)
void FillEventHeader(FairEventHeader *feh) override
void AllowExtraMap(UcesbMap flag)
void ForEachReader(UnaryOp &&opt)
UcesbSource()=default
int ReadEvent(unsigned int eventID=0) override
UcesbSource(const UcesbSource &)=delete
Source_Type GetSourceType() override
int CheckMaxEventNo(int EvtEnd=0) override
void SetInfiniteRun(bool is_infinite=true)
void SetRawDataPrint(bool print_raw_data)
void SetRunID(unsigned int run_id)
auto FindReaderIf(Predicate &&pred) -> R3BReader *
void SetParUnpackers() override
UcesbSource & operator=(UcesbSource &&)=delete
UcesbSource(UcesbSource &&)=delete
auto AddReader(std::unique_ptr< ReaderType > reader) -> ReaderType *
void Reset() override