82auto main(
int argc,
char** argv) ->
int
84 using namespace std::string_literals;
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");
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>(
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);
108 programOptions.create_option<
int>(
"port,p",
"set the port number of the output https server",
DEFAULT_PORT_NUM);
110 if (!programOptions.verify(argc, argv))
115 FairLogger::GetLogger()->SetLogScreenLevel(logLevel().c_str());
117 auto random_gen = TRandom3{};
118 random_gen.SetSeed(0);
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;
125 auto const* ucesb_dir = getenv(
"UCESB_DIR");
126 if (ucesb_dir ==
nullptr)
128 R3BLOG(error,
"ucesb_dir is not defined!");
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();
135 const auto lmd_file_path = input_fstream();
136 const auto parFile = parameter_file();
138 auto ucesb_command = upexps_exe.string() +
" --allow-errors --input-buffer=150Mi"s;
139 ucesb_command = std::regex_replace(ucesb_command, std::regex(
"//"),
"/");
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())
147 source->SetInfiniteRun();
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)));
159 neulandReader->SetMaxNbPlanes(planeNum);
160 neulandReader->SetOnline(
true);
161 if (no_trig_neuland())
163 R3BLOG(info,
"Disable NeuLAND trigger times");
164 neulandReader->SetSkipTriggerTimes();
166 source->AddReader(std::make_unique<R3BWhiterabbitMasterReader>(
167 static_cast<EXT_STR_h101_WRMASTER*
>(&ucesbStruct.wrmaster), offsetof(
EXT_STR_h101, wrmaster), whiterabbit_id));
170 auto* source_ptr = source.get();
171 auto run = FairRunOnline{ source.release() };
172 run.SetRunId(inputRunID());
174 auto EvntHeader = std::make_unique<R3BEventHeader>();
175 run.SetEventHeader(EvntHeader.release());
180 auto fileio = std::make_unique<FairParRootFileIo>(
false);
181 fileio->open(parFile.c_str());
182 run.GetRuntimeDb()->setFirstInput(fileio.release());
186 if (not is_cal_disabled.value())
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());
195 auto map2Cal = std::make_unique<R3BNeulandMapped2Cal2>();
197 map2Cal->SetDisableHist();
198 run.AddTask(map2Cal.release());
201 if (not is_hit_disabled.value())
203 run.AddTask(std::make_unique<R3BLosProvideTStart>().release());
204 auto cal2hit = std::make_unique<R3B::Neuland::Cal2HitTask>();
207 cal2hit->SetDisableHist();
208 run.AddTask(cal2hit.release());
211 auto online_spectra = std::make_unique<R3B::Neuland::OnlineSpectra>();
212 online_spectra->SetRandomGenerator(&random_gen);
213 online_spectra->SetUcesbSource(source_ptr);
217 if (not is_cal_disabled.value())
223 if (not is_hit_disabled.value())
232 run.AddTask(online_spectra.release());
237 run.Run(-1, eventNum());
241 std::cout <<
"A runtime error has occured: \n";
242 std::cerr << ex.what();
248 std::cout <<
"A logic error has occured: \n";
249 std::cerr << ex.what();