R3BROOT
R3B analysis software
Loading...
Searching...
No Matches
neuland_online_monitor.cxx
Go to the documentation of this file.
1/******************************************************************************
2 * Copyright (C) 2019 GSI Helmholtzzentrum für Schwerionenforschung GmbH *
3 * Copyright (C) 2019-2023 Members of R3B Collaboration *
4 * *
5 * This software is distributed under the terms of the *
6 * GNU General Public Licence (GPL) version 3, *
7 * copied verbatim in the file "LICENSE". *
8 * *
9 * In applying this license GSI does not waive the privileges and immunities *
10 * granted to it by virtue of its status as an Intergovernmental Organization *
11 * or submit itself to any jurisdiction. *
12 ******************************************************************************/
13
14#include "R3BException.h"
15#include "R3BNeulandCalCanvas.h"
18#include "R3BNeulandHitCanvas.h"
25#include "R3BUcesbMappingFlag.h"
26#include "ext_h101_raw_nnp_tamex.h"
27#include <FairLogger.h>
28#include <FairParRootFileIo.h>
29#include <FairRunOnline.h>
30#include <FairRuntimeDb.h>
31#include <R3BEventHeader.h>
32#include <R3BLogger.h>
33#include <R3BLosMapped2Cal.h>
34#include <R3BLosProvideTStart.h>
35#include <R3BLosReader.h>
40#include <R3BProgramOptions.h>
41#include <R3BTrloiiTpatReader.h>
42#include <R3BUcesbSource.h>
43#include <R3BUcesbSource2.h>
44#include <R3BUnpackReader.h>
45#include <R3BWhiterabbitMasterReader.h>
46#include <TRandom3.h>
47#include <TStopwatch.h>
48#include <bits/basic_string.h>
49#include <cstddef>
50#include <cstdlib>
51#include <ext_h101_los.h>
52#include <ext_h101_tpat.h>
53#include <ext_h101_unpack.h>
54#include <ext_h101_wrmaster.h>
55
56#include <filesystem>
57#include <iostream>
58#include <memory>
59#include <regex>
60#include <string>
61#include <string_view>
62
63namespace fs = std::filesystem;
64
65struct EXT_STR_h101_t
66{
67 EXT_STR_h101_unpack_t unpack;
68 EXT_STR_h101_TPAT_t tpat;
69 EXT_STR_h101_raw_nnp_tamex_onion_t raw_nnp;
70 EXT_STR_h101_LOS_t los;
71 EXT_STR_h101_WRMASTER_t wrmaster;
72};
73
74constexpr int DEFAULT_PORT_NUM = 11000;
75constexpr int DEFAULT_REFRESH_RATE = 1;
76constexpr int DEFAULT_RUNID = 999;
77// constexpr int DEFAULT_OFFSPILL_POS = 14;
78constexpr auto DEFAULT_UNPACKER_PATH = "202205_s509/202205_s509";
79constexpr auto NEULAND_DEFAULT_DOUBLE_PLANE = 13;
80constexpr auto NEULAND_GLOBAL_TIME_OFFSET_NS = -400.;
81
82auto main(int argc, char** argv) -> int
83{
84 using namespace std::string_literals;
85 TStopwatch timer;
86 timer.Start();
87
88 //====================================================================================
89 // Program options:
90 auto programOptions = R3B::ProgramOptions("Online monitor for neuland data");
91 auto help = programOptions.create_option<bool>("help,h", "help message", false);
92 auto is_cal_disabled = programOptions.create_option<bool>("dis-cal", "disable cal level analysis", false);
93 auto is_hit_disabled = programOptions.create_option<bool>("dis-hit", "disable hit level analysis", false);
94 auto is_infinite_run = programOptions.create_option<bool>("infi", "set to infinite run", false);
95 auto input_fstream = programOptions.create_option<std::string>("inStream,i", "set the input data stream");
96 auto parameter_file =
97 programOptions.create_option<std::string>("par", "set the path of the parameter file (only one allowed)");
98 auto no_trig_neuland = programOptions.create_option<bool>("no-trig", "NeuLAND trigger times are disabled", false);
99 auto logLevel = programOptions.create_option<std::string>("logLevel,v", "set log level of fairlog", "info");
100 auto eventNum = programOptions.create_option<int>("eventNum,n", "set the event number", -1);
101 auto inputRunID = programOptions.create_option<int>("runID,r", "set the input runID", DEFAULT_RUNID);
102 auto neulandDP = programOptions.create_option<int>(
103 "dp", "set the number of double planes for neuland", NEULAND_DEFAULT_DOUBLE_PLANE);
104 auto wr_ID = programOptions.create_option<std::string>("wrID", "set the white rabbit id", "0x1000U");
105 auto unpacker_path = programOptions.create_option<std::string>(
106 "unpack", "set the path of unpacker executable relative to ${UCESB_DIR}/../unexps/", DEFAULT_UNPACKER_PATH);
107 auto port_number =
108 programOptions.create_option<int>("port,p", "set the port number of the output https server", DEFAULT_PORT_NUM);
109
110 if (!programOptions.verify(argc, argv))
111 {
112 return EXIT_FAILURE;
113 }
114
115 FairLogger::GetLogger()->SetLogScreenLevel(logLevel().c_str());
116
117 auto random_gen = TRandom3{};
118 random_gen.SetSeed(0);
119
120 const auto whiterabbit_id = std::stoi(wr_ID(), nullptr, 16);
121 const int planeNum = neulandDP() * 2;
122 const auto runID = inputRunID();
123 const auto ntuple_options = "RAW,time-stitch=4000"s;
124 // const auto ntuple_options = "RAW"s;
125 auto const* ucesb_dir = getenv("UCESB_DIR");
126 if (ucesb_dir == nullptr)
127 {
128 R3BLOG(error, "ucesb_dir is not defined!");
129 return 1;
130 }
131 const auto upexps_dir = std::string{ ucesb_dir } + "/../upexps"s;
132 const auto upexps_exe = fs::path{ upexps_dir } / unpacker_path();
133 const auto max_event_num = (eventNum() == 0) ? -1 : eventNum();
134
135 const auto lmd_file_path = input_fstream();
136 const auto parFile = parameter_file();
137
138 auto ucesb_command = upexps_exe.string() + " --allow-errors --input-buffer=150Mi"s;
139 ucesb_command = std::regex_replace(ucesb_command, std::regex("//"), "/");
140
141 auto ucesbStruct = EXT_STR_h101{};
142 auto source = std::make_unique<R3BUcesbSource2>(
143 lmd_file_path, ntuple_options, ucesb_command, &ucesbStruct, sizeof(ucesbStruct));
144 source->SetMaxEvents(max_event_num);
145 if (is_infinite_run.value())
146 {
147 source->SetInfiniteRun();
148 }
149
150 //====================================================================================
151 // Adding readers
152 source->AddReader(std::make_unique<R3BUnpackReader>(&ucesbStruct.unpack, offsetof(EXT_STR_h101, unpack)));
153 source->AddReader(std::make_unique<R3BTrloiiTpatReader>(&ucesbStruct.tpat, offsetof(EXT_STR_h101, tpat)));
154 auto* los_reader = source->AddReader(std::make_unique<R3BLosReader>(&ucesbStruct.los, offsetof(EXT_STR_h101, los)));
155 los_reader->SetOnline(true);
156 auto* neulandReader = source->AddReader(
157 std::make_unique<R3BNeulandTamexReader2>(&ucesbStruct.raw_nnp, offsetof(EXT_STR_h101, raw_nnp)));
158 neulandReader->AddExtraConditions(R3B::UcesbMap::array_fewer);
159 neulandReader->SetMaxNbPlanes(planeNum);
160 neulandReader->SetOnline(true);
161 if (no_trig_neuland())
162 {
163 R3BLOG(info, "Disable NeuLAND trigger times");
164 neulandReader->SetSkipTriggerTimes();
165 }
166 source->AddReader(std::make_unique<R3BWhiterabbitMasterReader>(
167 static_cast<EXT_STR_h101_WRMASTER*>(&ucesbStruct.wrmaster), offsetof(EXT_STR_h101, wrmaster), whiterabbit_id));
168
169 // FairRun:
170 auto* source_ptr = source.get();
171 auto run = FairRunOnline{ source.release() };
172 run.SetRunId(inputRunID());
173 run.ActivateHttpServer(DEFAULT_REFRESH_RATE, port_number());
174 auto EvntHeader = std::make_unique<R3BEventHeader>();
175 run.SetEventHeader(EvntHeader.release());
176 run.SetRunId(runID);
177
178 //=====================================================================================
179 // set parameter files:
180 auto fileio = std::make_unique<FairParRootFileIo>(false);
181 fileio->open(parFile.c_str());
182 run.GetRuntimeDb()->setFirstInput(fileio.release());
183
184 //=====================================================================================
185 // add tasks
186 if (not is_cal_disabled.value())
187 {
188 auto losMapped2Cal = std::make_unique<R3BLosMapped2Cal>("LosTCalPar", 1);
189 constexpr auto LOS_MODULE_NUM = 8;
190 losMapped2Cal->SetNofModules(1, LOS_MODULE_NUM);
191 losMapped2Cal->SetTrigger(1);
192 losMapped2Cal->SetOnline(true);
193 run.AddTask(losMapped2Cal.release());
194
195 auto map2Cal = std::make_unique<R3BNeulandMapped2Cal2>();
196 map2Cal->SetTrigger(R3B::Neuland::CalTrigger::allspill);
197 map2Cal->SetDisableHist();
198 run.AddTask(map2Cal.release());
199 }
200
201 if (not is_hit_disabled.value())
202 {
203 run.AddTask(std::make_unique<R3BLosProvideTStart>().release());
204 auto cal2hit = std::make_unique<R3B::Neuland::Cal2HitTask>();
205 cal2hit->SetTrigger(R3B::Neuland::CalTrigger::allspill);
206 cal2hit->SetGlobalTimeOffset(NEULAND_GLOBAL_TIME_OFFSET_NS);
207 cal2hit->SetDisableHist();
208 run.AddTask(cal2hit.release());
209 }
210
211 auto online_spectra = std::make_unique<R3B::Neuland::OnlineSpectra>();
212 online_spectra->SetRandomGenerator(&random_gen);
213 online_spectra->SetUcesbSource(source_ptr);
214 online_spectra->AddCanvas<R3B::Neuland::EventHeaderCanvas>("EventHeader");
215 online_spectra->AddCanvas<R3B::Neuland::MappedCanvas>("NeulandMapped");
216
217 if (not is_cal_disabled.value())
218 {
219 online_spectra->AddCanvas<R3B::Neuland::CalCanvas>("NeulandCal", R3B::Neuland::CalTrigger::allspill);
220 online_spectra->AddCanvas<R3B::Neuland::TJumpCanvas>("NeulandJumps");
221 }
222
223 if (not is_hit_disabled.value())
224 {
225 online_spectra->AddCanvas<R3B::Neuland::CountRateCanvas>("NeulandCountRate", R3B::Neuland::CalTrigger::all);
226 online_spectra->AddCanvas<R3B::Neuland::HitCanvas>("NeulandHit", R3B::Neuland::CalTrigger::onspill);
227 online_spectra->AddCanvas<R3B::Neuland::HitXYCanvas>("NeulandPlaneXY", R3B::Neuland::CalTrigger::onspill);
228 online_spectra->AddCanvas<R3B::Neuland::HitCosmicCanvas>("NeulandHitCosmics",
230 online_spectra->AddCanvas<R3B::Neuland::TimingCanvas>("NeulandTiming", R3B::Neuland::CalTrigger::onspill);
231 }
232 run.AddTask(online_spectra.release());
233
234 try
235 {
236 run.Init();
237 run.Run(-1, eventNum());
238 }
239 catch (R3B::runtime_error& ex)
240 {
241 std::cout << "A runtime error has occured: \n";
242 std::cerr << ex.what();
243 std::cout << "\n\n";
244 return 0;
245 }
246 catch (R3B::logic_error& ex)
247 {
248 std::cout << "A logic error has occured: \n";
249 std::cerr << ex.what();
250 std::cout << "\n\n";
251 return 0;
252 }
253
254 return 0;
255}
#define R3BLOG(severity, x)
Definition R3BLogger.h:32
struct EXT_STR_h101_t EXT_STR_h101
constexpr auto NEULAND_GLOBAL_TIME_OFFSET_NS
constexpr auto DEFAULT_UNPACKER_PATH
constexpr auto NEULAND_DEFAULT_DOUBLE_PLANE
auto main(int argc, char **argv) -> int
constexpr int DEFAULT_PORT_NUM
constexpr int DEFAULT_RUNID
constexpr int DEFAULT_REFRESH_RATE
EXT_STR_h101_TPAT_t tpat
EXT_STR_h101_WRMASTER_t wrmaster
EXT_STR_h101_raw_nnp_tamex_onion_t raw_nnp
EXT_STR_h101_LOS_t los
EXT_STR_h101_unpack_t unpack