32int main(
int argc,
char* argv[])
35 std::vector<std::string> fnames;
36 std::string config, configKeyValues;
37 bpo::variables_map vm;
38 bpo::options_description descOpt(
"Options");
39 auto desc_add_option = descOpt.add_options();
40 desc_add_option(
"help,h",
"print this help message.");
41 desc_add_option(
"input-conf,c", bpo::value(&config)->default_value(
""),
"read input from configuration file");
42 desc_add_option(
"max-tf,m", bpo::value<uint32_t>()->default_value(0xffffffff),
" ID to read (counts from 0)");
43 desc_add_option(
"verbosity,v", bpo::value<int>()->default_value(reader.
getVerbosity()),
"1: long report, 2 or 3: print or dump all RDH");
44 desc_add_option(
"spsize,s", bpo::value<int>()->default_value(reader.
getNominalSPageSize()),
"nominal super-page size in bytes");
45 desc_add_option(
"buffer-size,b", bpo::value<size_t>()->default_value(reader.
getNominalSPageSize()),
"buffer size for files preprocessing");
46 desc_add_option(
"detect-tf0",
"autodetect HBFUtils start Orbit/BC from 1st TF seen");
47 desc_add_option(
"calculate-tf-start",
"calculate TF start instead of using TType");
48 desc_add_option(
"rorc",
"impose RORC as default detector mode");
49 desc_add_option(
"tfs-per-chunk,n", bpo::value<uint32_t>()->default_value(0xffffffff),
" number of output TFs per chunk");
50 desc_add_option(
"output-dir-prefix,o", bpo::value<std::string>()->default_value(
"./chunk"),
"output directory prefix for raw data chunk (chunk ID will be added)");
51 desc_add_option(
"file-for,f", bpo::value<std::string>()->default_value(
"all"),
"single file per: all,cru,link");
53 desc_add_option(
"configKeyValues", bpo::value(&configKeyValues)->default_value(
""),
"semicolon separated key=value strings");
59 bpo::options_description hiddenOpt(
"hidden");
60 hiddenOpt.add_options()(
"files", bpo::value(&fnames)->composing(),
"");
62 bpo::options_description fullOpt(
"cmd");
63 fullOpt.add(descOpt).add(hiddenOpt);
65 bpo::positional_options_description posOpt;
66 posOpt.add(
"files", -1);
69 stream <<
"Usage: " << argv[0] <<
" [options] file0 [... fileN]" << std::endl;
70 stream << descOpt << std::endl;
71 stream <<
" (input files are optional if config file was provided)" << std::endl;
75 bpo::store(bpo::command_line_parser(argc, argv)
82 if (argc == 1 || vm.count(
"help") || (fnames.empty() && config.empty())) {
87 }
catch (
const bpo::error& e) {
88 std::cerr << e.what() <<
"\n\n";
89 std::cerr <<
"Error parsing command line arguments\n";
95 LOG(info) <<
"RawDataHeader v" <<
int(rdh.
version) <<
" is assumed";
104 reader.
setTFAutodetect(vm.count(
"detect-tf0") ? RawFileReader::FirstTFDetection::Pending : RawFileReader::FirstTFDetection::Disabled);
107 std::string_view fileFor = vm[
"file-for"].as<std::string>();
121 if (!config.empty()) {
126 for (
int i = 0;
i < fnames.size();
i++) {
137 int maxTFPerChunk = vm[
"tfs-per-chunk"].as<uint32_t>();
138 std::string outDirPrefix = vm[
"output-dir-prefix"].as<std::string>(), outDir =
"";
141 std::vector<RawFileReader::PartStat> partsSP;
143 std::unique_ptr<RawFileWriter> writer;
146 for (
int itf = 0; itf < ntf; itf++) {
148 bool reinitWriter =
false;
149 if ((itf % maxTFPerChunk) == 0) {
153 for (
int il = 0; il < nlinks; il++) {
154 auto& link = reader.
getLink(il);
155 if (!link.rewindToTF(itf)) {
159 for (
int ip = 0; ip < nParts; ip++) {
161 auto bread = link.readNextSuperPage(
buffer.data(), &partsSP[ip]);
162 if (bread != partsSP[ip].
size) {
163 LOG(error) <<
"Link " << il <<
" read " << bread <<
" bytes instead of " << partsSP[ip].size <<
" expected in TF=" << itf <<
" part=" << ip;
172 if (!std::filesystem::exists(outDir)) {
173 if (!std::filesystem::create_directories(outDir)) {
174 LOG(fatal) <<
"could not create output directory " << outDir;
176 LOG(info) <<
"created output directory " << outDir;
179 writer = std::make_unique<RawFileWriter>(link.origin, link.cruDetector);
181 reinitWriter =
false;
183 if (!writer->isLinkRegistered(
RDHUtils::getSubSpec(RDHUtils::getCRUID(link.rdhl), RDHUtils::getLinkID(link.rdhl), RDHUtils::getEndPointID(link.rdhl), RDHUtils::getFEEID(link.rdhl)))) {
184 std::string outFileName;
186 if (fileFor ==
"all") {
188 }
else if (fileFor ==
"cru") {
190 }
else if (fileFor ==
"link") {
197 throw std::runtime_error(
"invalid option provided for file grouping");
200 writer->registerLink(link.rdhl, outFileName);
203 auto& linkW = writer->getLinkWithSubSpec(link.rdhl);
204 auto& outF = writer->getOutputFileForLink(linkW);
205 outF.write(
buffer.data(), bread);