68auto main(
int argc,
char** argv) ->
int
70 using namespace std::string_literals;
77 auto help = programOptions.create_option<
bool>(
"help,h",
"help message",
false);
78 auto is_cal_disabled = programOptions.create_option<
bool>(
"dis-cal",
"disable cal level analysis",
false);
79 auto is_hit_disabled = programOptions.create_option<
bool>(
"dis-hit",
"disable hit level analysis",
false);
80 auto is_infinite_run = programOptions.create_option<
bool>(
"infi",
"set to infinite run",
false);
81 auto input_fstream = programOptions.create_option<std::string>(
"inStream,i",
"set the input data stream");
83 programOptions.create_option<std::string>(
"par",
"set the path of the parameter file (only one allowed)");
84 auto no_trig_neuland = programOptions.create_option<
bool>(
"no-trig",
"NeuLAND trigger times are disabled",
false);
85 auto logLevel = programOptions.create_option<std::string>(
"logLevel,v",
"set log level of fairlog",
"info");
86 auto eventNum = programOptions.create_option<
int>(
"eventNum,n",
"set the event number", -1);
87 auto inputRunID = programOptions.create_option<
int>(
"runID,r",
"set the input runID",
DEFAULT_RUNID);
88 auto neulandDP = programOptions.create_option<
int>(
90 auto wr_ID = programOptions.create_option<std::string>(
"wrID",
"set the white rabbit id",
"0x1000U");
91 auto unpacker_path = programOptions.create_option<std::string>(
92 "unpack",
"set the path of unpacker executable relative to ${UCESB_DIR}/../unexps/",
DEFAULT_UNPACKER_PATH);
94 programOptions.create_option<
int>(
"port,p",
"set the port number of the output https server",
DEFAULT_PORT_NUM);
96 if (!programOptions.verify(argc, argv))
101 FairLogger::GetLogger()->SetLogScreenLevel(logLevel().c_str());
103 auto random_gen = TRandom3{};
104 random_gen.SetSeed(0);
106 const auto whiterabbit_id = std::stoi(wr_ID(),
nullptr, 16);
107 const unsigned int planeNum = neulandDP() * 2;
108 const auto runID = inputRunID();
109 const auto ntuple_options =
"RAW,time-stitch=4000"s;
111 auto const* ucesb_dir = getenv(
"UCESB_DIR");
112 if (ucesb_dir ==
nullptr)
114 R3BLOG(error,
"ucesb_dir is not defined!");
117 const auto upexps_dir = std::string{ ucesb_dir } +
"/../upexps"s;
118 const auto upexps_exe = fs::path{ upexps_dir } / unpacker_path();
119 const auto max_event_num = (eventNum() == 0) ? -1 : eventNum();
121 const auto lmd_file_path = input_fstream();
122 const auto parFile = parameter_file();
124 auto ucesb_command = upexps_exe.string() +
" --allow-errors --input-buffer=150Mi"s;
125 ucesb_command = std::regex_replace(ucesb_command, std::regex(
"//"),
"/");
128 auto source = std::make_unique<R3BUcesbSource2>(
129 lmd_file_path, ntuple_options, ucesb_command, &ucesbStruct,
sizeof(ucesbStruct));
130 source->SetMaxEvents(max_event_num);
131 if (is_infinite_run.value())
133 source->SetInfiniteRun();
138 source->AddReader(std::make_unique<R3BUnpackReader>(&ucesbStruct.unpack, offsetof(
EXT_STR_h101, unpack)));
139 source->AddReader(std::make_unique<R3BTrloiiTpatReader>(&ucesbStruct.tpat, offsetof(
EXT_STR_h101, tpat)));
140 auto* los_reader = source->AddReader(std::make_unique<R3BLosReader>(&ucesbStruct.los, offsetof(
EXT_STR_h101, los)));
141 los_reader->SetOnline(
true);
142 auto* neulandReader = source->AddReader(
143 std::make_unique<R3BNeulandTamexReader2>(&ucesbStruct.raw_nnp, offsetof(
EXT_STR_h101, raw_nnp)));
145 neulandReader->SetMaxNbPlanes(planeNum);
146 neulandReader->SetOnline(
true);
147 if (no_trig_neuland())
149 R3BLOG(info,
"Disable NeuLAND trigger times");
150 neulandReader->SetSkipTriggerTimes();
152 source->AddReader(std::make_unique<R3BWhiterabbitMasterReader>(
153 static_cast<EXT_STR_h101_WRMASTER*
>(&ucesbStruct.wrmaster), offsetof(
EXT_STR_h101, wrmaster), whiterabbit_id));
156 auto* source_ptr = source.get();
157 auto run = FairRunOnline{ source.release() };
158 run.SetRunId(inputRunID());
160 auto EvntHeader = std::make_unique<R3BEventHeader>();
161 run.SetEventHeader(EvntHeader.release());
166 auto fileio = std::make_unique<FairParRootFileIo>(
false);
167 fileio->open(parFile.c_str());
168 run.GetRuntimeDb()->setFirstInput(fileio.release());
172 if (not is_cal_disabled.value())
174 auto losMapped2Cal = std::make_unique<R3BLosMapped2Cal>(
"LosTCalPar", 1);
175 constexpr auto LOS_MODULE_NUM = 8;
176 losMapped2Cal->SetNofModules(1, LOS_MODULE_NUM);
177 losMapped2Cal->SetTrigger(1);
178 losMapped2Cal->SetOnline(
true);
179 run.AddTask(losMapped2Cal.release());
181 auto map2Cal = std::make_unique<R3BNeulandMapped2Cal2>();
183 map2Cal->SetDisableHist();
184 run.AddTask(map2Cal.release());
187 if (not is_hit_disabled.value())
189 run.AddTask(std::make_unique<R3BLosProvideTStart>().release());
190 auto cal2hit = std::make_unique<R3B::Neuland::Cal2HitTask>();
193 cal2hit->SetDisableHist();
194 run.AddTask(cal2hit.release());
197 auto online_spectra = std::make_unique<R3B::Neuland::OnlineSpectra>();
198 online_spectra->SetRandomGenerator(&random_gen);
199 online_spectra->SetUcesbSource(source_ptr);
203 if (not is_cal_disabled.value())
209 if (not is_hit_disabled.value())
218 run.AddTask(online_spectra.release());
223 run.Run(-1, eventNum());
227 std::cout <<
"A runtime error has occured: \n";
228 std::cerr << ex.what();
234 std::cout <<
"A logic error has occured: \n";
235 std::cerr << ex.what();