15#include <boost/program_options.hpp>
20#include <fmt/format.h>
58static constexpr const char* CRU_FLPS[361] = {
59 "alio2-cr1-flp070",
"alio2-cr1-flp069",
"alio2-cr1-flp070",
"alio2-cr1-flp069",
"alio2-cr1-flp072",
"alio2-cr1-flp071",
"alio2-cr1-flp072",
"alio2-cr1-flp071",
"alio2-cr1-flp072",
"alio2-cr1-flp071",
"alio2-cr1-flp002",
"alio2-cr1-flp001",
"alio2-cr1-flp002",
"alio2-cr1-flp001",
"alio2-cr1-flp004",
"alio2-cr1-flp003",
"alio2-cr1-flp004",
"alio2-cr1-flp003",
60 "alio2-cr1-flp004",
"alio2-cr1-flp003",
"alio2-cr1-flp006",
"alio2-cr1-flp005",
"alio2-cr1-flp006",
"alio2-cr1-flp005",
"alio2-cr1-flp008",
"alio2-cr1-flp007",
"alio2-cr1-flp008",
"alio2-cr1-flp007",
"alio2-cr1-flp008",
"alio2-cr1-flp007",
"alio2-cr1-flp010",
"alio2-cr1-flp009",
"alio2-cr1-flp010",
"alio2-cr1-flp009",
"alio2-cr1-flp012",
"alio2-cr1-flp011",
61 "alio2-cr1-flp012",
"alio2-cr1-flp011",
"alio2-cr1-flp012",
"alio2-cr1-flp011",
"alio2-cr1-flp014",
"alio2-cr1-flp013",
"alio2-cr1-flp014",
"alio2-cr1-flp013",
"alio2-cr1-flp016",
"alio2-cr1-flp015",
"alio2-cr1-flp016",
"alio2-cr1-flp015",
"alio2-cr1-flp016",
"alio2-cr1-flp015",
"alio2-cr1-flp018",
"alio2-cr1-flp017",
"alio2-cr1-flp018",
"alio2-cr1-flp017",
62 "alio2-cr1-flp020",
"alio2-cr1-flp019",
"alio2-cr1-flp020",
"alio2-cr1-flp019",
"alio2-cr1-flp020",
"alio2-cr1-flp019",
"alio2-cr1-flp022",
"alio2-cr1-flp021",
"alio2-cr1-flp022",
"alio2-cr1-flp021",
"alio2-cr1-flp024",
"alio2-cr1-flp023",
"alio2-cr1-flp024",
"alio2-cr1-flp023",
"alio2-cr1-flp024",
"alio2-cr1-flp023",
"alio2-cr1-flp026",
"alio2-cr1-flp025",
63 "alio2-cr1-flp026",
"alio2-cr1-flp025",
"alio2-cr1-flp028",
"alio2-cr1-flp027",
"alio2-cr1-flp028",
"alio2-cr1-flp027",
"alio2-cr1-flp028",
"alio2-cr1-flp027",
"alio2-cr1-flp030",
"alio2-cr1-flp029",
"alio2-cr1-flp030",
"alio2-cr1-flp029",
"alio2-cr1-flp032",
"alio2-cr1-flp031",
"alio2-cr1-flp032",
"alio2-cr1-flp031",
"alio2-cr1-flp032",
"alio2-cr1-flp031",
64 "alio2-cr1-flp034",
"alio2-cr1-flp033",
"alio2-cr1-flp034",
"alio2-cr1-flp033",
"alio2-cr1-flp036",
"alio2-cr1-flp035",
"alio2-cr1-flp036",
"alio2-cr1-flp035",
"alio2-cr1-flp036",
"alio2-cr1-flp035",
"alio2-cr1-flp038",
"alio2-cr1-flp037",
"alio2-cr1-flp038",
"alio2-cr1-flp037",
"alio2-cr1-flp040",
"alio2-cr1-flp039",
"alio2-cr1-flp040",
"alio2-cr1-flp039",
65 "alio2-cr1-flp040",
"alio2-cr1-flp039",
"alio2-cr1-flp042",
"alio2-cr1-flp041",
"alio2-cr1-flp042",
"alio2-cr1-flp041",
"alio2-cr1-flp044",
"alio2-cr1-flp043",
"alio2-cr1-flp044",
"alio2-cr1-flp043",
"alio2-cr1-flp044",
"alio2-cr1-flp043",
"alio2-cr1-flp046",
"alio2-cr1-flp045",
"alio2-cr1-flp046",
"alio2-cr1-flp045",
"alio2-cr1-flp048",
"alio2-cr1-flp047",
66 "alio2-cr1-flp048",
"alio2-cr1-flp047",
"alio2-cr1-flp048",
"alio2-cr1-flp047",
"alio2-cr1-flp050",
"alio2-cr1-flp049",
"alio2-cr1-flp050",
"alio2-cr1-flp049",
"alio2-cr1-flp052",
"alio2-cr1-flp051",
"alio2-cr1-flp052",
"alio2-cr1-flp051",
"alio2-cr1-flp052",
"alio2-cr1-flp051",
"alio2-cr1-flp054",
"alio2-cr1-flp053",
"alio2-cr1-flp054",
"alio2-cr1-flp053",
67 "alio2-cr1-flp056",
"alio2-cr1-flp055",
"alio2-cr1-flp056",
"alio2-cr1-flp055",
"alio2-cr1-flp056",
"alio2-cr1-flp055",
"alio2-cr1-flp058",
"alio2-cr1-flp057",
"alio2-cr1-flp058",
"alio2-cr1-flp057",
"alio2-cr1-flp060",
"alio2-cr1-flp059",
"alio2-cr1-flp060",
"alio2-cr1-flp059",
"alio2-cr1-flp060",
"alio2-cr1-flp059",
"alio2-cr1-flp062",
"alio2-cr1-flp061",
68 "alio2-cr1-flp062",
"alio2-cr1-flp061",
"alio2-cr1-flp064",
"alio2-cr1-flp063",
"alio2-cr1-flp064",
"alio2-cr1-flp063",
"alio2-cr1-flp064",
"alio2-cr1-flp063",
"alio2-cr1-flp066",
"alio2-cr1-flp065",
"alio2-cr1-flp066",
"alio2-cr1-flp065",
"alio2-cr1-flp068",
"alio2-cr1-flp067",
"alio2-cr1-flp068",
"alio2-cr1-flp067",
"alio2-cr1-flp068",
"alio2-cr1-flp067",
69 "alio2-cr1-flp074",
"alio2-cr1-flp073",
"alio2-cr1-flp074",
"alio2-cr1-flp073",
"alio2-cr1-flp076",
"alio2-cr1-flp075",
"alio2-cr1-flp076",
"alio2-cr1-flp075",
"alio2-cr1-flp076",
"alio2-cr1-flp075",
"alio2-cr1-flp078",
"alio2-cr1-flp077",
"alio2-cr1-flp078",
"alio2-cr1-flp077",
"alio2-cr1-flp080",
"alio2-cr1-flp079",
"alio2-cr1-flp080",
"alio2-cr1-flp079",
70 "alio2-cr1-flp080",
"alio2-cr1-flp079",
"alio2-cr1-flp082",
"alio2-cr1-flp081",
"alio2-cr1-flp082",
"alio2-cr1-flp081",
"alio2-cr1-flp084",
"alio2-cr1-flp083",
"alio2-cr1-flp084",
"alio2-cr1-flp083",
"alio2-cr1-flp084",
"alio2-cr1-flp083",
"alio2-cr1-flp086",
"alio2-cr1-flp085",
"alio2-cr1-flp086",
"alio2-cr1-flp085",
"alio2-cr1-flp088",
"alio2-cr1-flp087",
71 "alio2-cr1-flp088",
"alio2-cr1-flp087",
"alio2-cr1-flp088",
"alio2-cr1-flp087",
"alio2-cr1-flp090",
"alio2-cr1-flp089",
"alio2-cr1-flp090",
"alio2-cr1-flp089",
"alio2-cr1-flp092",
"alio2-cr1-flp091",
"alio2-cr1-flp092",
"alio2-cr1-flp091",
"alio2-cr1-flp092",
"alio2-cr1-flp091",
"alio2-cr1-flp094",
"alio2-cr1-flp093",
"alio2-cr1-flp094",
"alio2-cr1-flp093",
72 "alio2-cr1-flp096",
"alio2-cr1-flp095",
"alio2-cr1-flp096",
"alio2-cr1-flp095",
"alio2-cr1-flp096",
"alio2-cr1-flp095",
"alio2-cr1-flp098",
"alio2-cr1-flp097",
"alio2-cr1-flp098",
"alio2-cr1-flp097",
"alio2-cr1-flp100",
"alio2-cr1-flp099",
"alio2-cr1-flp100",
"alio2-cr1-flp099",
"alio2-cr1-flp100",
"alio2-cr1-flp099",
"alio2-cr1-flp102",
"alio2-cr1-flp101",
73 "alio2-cr1-flp102",
"alio2-cr1-flp101",
"alio2-cr1-flp104",
"alio2-cr1-flp103",
"alio2-cr1-flp104",
"alio2-cr1-flp103",
"alio2-cr1-flp104",
"alio2-cr1-flp103",
"alio2-cr1-flp106",
"alio2-cr1-flp105",
"alio2-cr1-flp106",
"alio2-cr1-flp105",
"alio2-cr1-flp108",
"alio2-cr1-flp107",
"alio2-cr1-flp108",
"alio2-cr1-flp107",
"alio2-cr1-flp108",
"alio2-cr1-flp107",
74 "alio2-cr1-flp110",
"alio2-cr1-flp109",
"alio2-cr1-flp110",
"alio2-cr1-flp109",
"alio2-cr1-flp112",
"alio2-cr1-flp111",
"alio2-cr1-flp112",
"alio2-cr1-flp111",
"alio2-cr1-flp112",
"alio2-cr1-flp111",
"alio2-cr1-flp114",
"alio2-cr1-flp113",
"alio2-cr1-flp114",
"alio2-cr1-flp113",
"alio2-cr1-flp116",
"alio2-cr1-flp115",
"alio2-cr1-flp116",
"alio2-cr1-flp115",
75 "alio2-cr1-flp116",
"alio2-cr1-flp115",
"alio2-cr1-flp118",
"alio2-cr1-flp117",
"alio2-cr1-flp118",
"alio2-cr1-flp117",
"alio2-cr1-flp120",
"alio2-cr1-flp119",
"alio2-cr1-flp120",
"alio2-cr1-flp119",
"alio2-cr1-flp120",
"alio2-cr1-flp119",
"alio2-cr1-flp122",
"alio2-cr1-flp121",
"alio2-cr1-flp122",
"alio2-cr1-flp121",
"alio2-cr1-flp124",
"alio2-cr1-flp123",
76 "alio2-cr1-flp124",
"alio2-cr1-flp123",
"alio2-cr1-flp124",
"alio2-cr1-flp123",
"alio2-cr1-flp126",
"alio2-cr1-flp125",
"alio2-cr1-flp126",
"alio2-cr1-flp125",
"alio2-cr1-flp128",
"alio2-cr1-flp127",
"alio2-cr1-flp128",
"alio2-cr1-flp127",
"alio2-cr1-flp128",
"alio2-cr1-flp127",
"alio2-cr1-flp130",
"alio2-cr1-flp129",
"alio2-cr1-flp130",
"alio2-cr1-flp129",
77 "alio2-cr1-flp132",
"alio2-cr1-flp131",
"alio2-cr1-flp132",
"alio2-cr1-flp131",
"alio2-cr1-flp132",
"alio2-cr1-flp131",
"alio2-cr1-flp134",
"alio2-cr1-flp133",
"alio2-cr1-flp134",
"alio2-cr1-flp133",
"alio2-cr1-flp136",
"alio2-cr1-flp135",
"alio2-cr1-flp136",
"alio2-cr1-flp135",
"alio2-cr1-flp136",
"alio2-cr1-flp135",
"alio2-cr1-flp138",
"alio2-cr1-flp137",
78 "alio2-cr1-flp138",
"alio2-cr1-flp137",
"alio2-cr1-flp140",
"alio2-cr1-flp139",
"alio2-cr1-flp140",
"alio2-cr1-flp139",
"alio2-cr1-flp140",
"alio2-cr1-flp139",
"alio2-cr1-flp142",
"alio2-cr1-flp141",
"alio2-cr1-flp142",
"alio2-cr1-flp141",
"alio2-cr1-flp144",
"alio2-cr1-flp143",
"alio2-cr1-flp144",
"alio2-cr1-flp143",
"alio2-cr1-flp144",
"alio2-cr1-flp143",
82 std::unique_ptr<unsigned long long int[]>
zsoutput;
83 std::vector<unsigned int>
sizes;
96 bool sectorBySector, uint32_t rdhV, uint32_t zsV,
bool stopPage,
bool padding,
bool createParentDir)
99 std::unique_ptr<TFile> o2simDigits(TFile::Open(digitsFile.data()));
100 if (!o2simDigits || !o2simDigits->IsOpen() || o2simDigits->IsZombie()) {
101 LOGP(error,
"Could not open file {}", digitsFile.data());
104 auto treeSim = (TTree*)o2simDigits->Get(
"o2sim");
106 LOGP(error,
"Could not read digits tree from file {}", digitsFile.data());
113 std::string outDir{outputPath};
114 if (outDir.empty()) {
117 if (outDir.back() !=
'/') {
122 if (!std::filesystem::exists(outDir)) {
123 if (createParentDir) {
126 LOGP(error,
"Requested output directory '{}' does not exists, consider removing '-n'", outDir);
137 writer.setAddSeparateHBFStopPage(stopPage);
140 for (
unsigned int i = 0;
i < NSectors + 1;
i++) {
141 for (
unsigned int j = 0;
j < NEndpoints;
j++) {
142 const unsigned int cruInSector =
j / 2;
143 const unsigned int cruID =
i * 10 + cruInSector;
144 const unsigned int rdhLink =
i == NSectors ? rdh_utils::SACLinkID : 0;
145 const unsigned int feeLink =
i == NSectors ? rdh_utils::SACLinkID : zsV <= 2 ? rdh_utils::UserLogicLinkID : zsV == 3 ? rdh_utils::ILBZSLinkID : rdh_utils::DLBZSLinkID;
147 std::string outfname;
148 if (fileFor ==
"all") {
149 outfname = fmt::format(
"{}tpc_all.raw", outDir);
150 }
else if (fileFor ==
"sector") {
151 outfname =
i == NSectors ? fmt::format(
"{}tpc_iac.raw", outDir) : fmt::format(
"{}tpc_sector{}.raw", outDir,
i);
152 }
else if (fileFor ==
"link" || fileFor ==
"cruendpoint") {
153 outfname = fmt::format(
"{}TPC_{}_cru{}_{}.raw", outDir, CRU_FLPS[cruID], cruID,
j & 1);
155 throw std::runtime_error(
"invalid option provided for file grouping");
157 writer.registerLink(feeid, cruID, rdhLink,
j & 1, outfname);
163 if (fileFor !=
"link") {
166 writer.doLazinessCheck(
false);
171 treeSim->SetBranchStatus(
"*", 0);
172 treeSim->SetBranchStatus(
"TPCDigit_*", 1);
181 if (globalConfig.zsOnTheFlyDigitsFilter) {
189 treeSim->ResetBranchAddresses();
191 if (sectorBySector) {
194 vDigitsPerSectorCollection[iSec] =
nullptr;
195 treeSim->SetBranchAddress(TString::Format(
"TPCDigit_%d", iSec), &vDigitsPerSectorCollection[iSec]);
196 if (sectorBySector) {
200 for (Long64_t ievent = 0; ievent < treeSim->GetEntries(); ++ievent) {
202 if (sectorBySector) {
203 treeSim->GetBranch(TString::Format(
"TPCDigit_%d", iSecBySec))->GetEntry(ievent);
205 treeSim->GetEntry(ievent);
209 if (sectorBySector) {
212 inputDigits[iSec] = *vDigitsPerSectorCollection[iSec];
213 if (sectorBySector) {
217 convert(inputDigits, &attr, writer);
219 delete vDigitsPerSectorCollection[iSec];
220 vDigitsPerSectorCollection[iSec] =
nullptr;
223 if (!sectorBySector) {
228 writer.writeConfFile(
"TPC",
"RAWDATA", fmt::format(
"{}tpcraw.cfg", outDir));
233 const auto zsThreshold = processAttributes->
zsThreshold;
242 bpo::variables_map vm;
243 bpo::options_description opt_general(
"Usage:\n " + std::string(argv[0]) +
245 " Tool will convert simulation digits to raw zero suppressed data\n"
246 "Commands / Options");
247 bpo::options_description opt_hidden(
"");
248 bpo::options_description opt_all;
249 bpo::positional_options_description opt_pos;
252 auto add_option = opt_general.add_options();
253 add_option(
"help,h",
"Print this help message");
254 add_option(
"verbose,v", bpo::value<uint32_t>()->default_value(0),
"Select verbosity level [0 = no output]");
255 add_option(
"input-file,i", bpo::value<std::string>()->default_value(
"tpcdigits.root"),
"Specifies input file.");
256 add_option(
"output-dir,o", bpo::value<std::string>()->default_value(
"./"),
"Specify output directory");
257 add_option(
"no-parent-directories,n",
"Do not create parent directories recursively");
258 add_option(
"sector-by-sector,s", bpo::value<bool>()->default_value(
false)->implicit_value(
true),
"Run one TPC sector after another");
259 add_option(
"file-for,f", bpo::value<std::string>()->default_value(
"sector"),
"single file per: link,sector,cruendpoint,all");
260 add_option(
"stop-page,p", bpo::value<bool>()->default_value(
false)->implicit_value(
true),
"HBF stop on separate CRU page");
261 add_option(
"padding", bpo::value<bool>()->default_value(
false)->implicit_value(
true),
"Pad all pages to 8kb");
262 uint32_t defRDH = o2::raw::RDHUtils::getVersion<o2::header::RAWDataHeader>();
264 add_option(
"rdh-version,r", bpo::value<uint32_t>()->default_value(defRDH),
"RDH version to use");
265 add_option(
"zs-version,r", bpo::value<uint32_t>()->default_value(2),
"ZS version to use");
266 add_option(
"configKeyValues", bpo::value<std::string>()->default_value(
""),
"comma-separated configKeyValues");
268 opt_all.add(opt_general).add(opt_hidden);
269 bpo::store(bpo::command_line_parser(argc, argv).options(opt_all).positional(opt_pos).run(), vm);
271 if (vm.count(
"help") || argc == 1) {
272 std::cout << opt_general << std::endl;
277 }
catch (bpo::error& e) {
278 std::cerr <<
"ERROR: " << e.what() << std::endl
280 std::cerr << opt_general << std::endl;
282 }
catch (std::exception& e) {
283 std::cerr << e.what() <<
", application will now exit" << std::endl;
287 std::string confDig = vm[
"hbfutils-config"].as<std::string>();
288 if (!confDig.empty() && confDig !=
"none") {
293 vm[
"input-file"].as<std::string>(),
294 vm[
"output-dir"].as<std::string>(),
295 vm[
"file-for"].as<std::string>(),
296 vm[
"sector-by-sector"].as<bool>(),
297 vm[
"rdh-version"].as<uint32_t>(),
298 vm[
"zs-version"].as<uint32_t>(),
299 vm[
"stop-page"].as<bool>(),
300 vm[
"padding"].as<bool>(),
301 !vm.count(
"no-parent-directories"));
Header of the General Run Parameters object.
Implementation of the ion tail correction from TPC digits.
Definition of the Names Generator class.
Utility class to write detectors data to (multiple) raw data file(s) respecting CRU format.
Definitions of TPC Zero Suppression Data Headers.
static std::string getGRPFileName(const std::string_view prefix=STANDARDSIMPREFIX)
static constexpr std::string_view DIGITIZATIONCONFIGFILE
static const HBFUtils & Instance()
static void updateFromFile(std::string const &, std::string const ¶msList="", bool unchangedOnly=false)
static void updateFromString(std::string const &)
static void RunZSEncoder(const S &in, std::unique_ptr< uint64_t[]> *outBuffer, uint32_t *outSizes, o2::raw::RawFileWriter *raw, const o2::InteractionRecord *ir, int32_t version, bool verify, float threshold=0.f, bool padding=false, std::function< void(std::vector< o2::tpc::Digit > &)> digitsFilter=nullptr)
static GRPObject * loadFrom(const std::string &grpFileName="")
void useRDHVersion(int v)
void filterDigitsDirect(std::vector< Digit > &digits)
static constexpr int MAXSECTOR
void convert(DigitArray &inputDigits, ProcessAttributes *processAttributes, o2::raw::RawFileWriter &writer)
std::array< gsl::span< const o2::tpc::Digit >, Sector::MAXSECTOR > DigitArray
void convertDigitsToZSfinal(std::string_view digitsFile, std::string_view outputPath, std::string_view fileFor, bool sectorBySector, uint32_t rdhV, uint32_t zsV, bool stopPage, bool padding, bool createParentDir)
typedef void(APIENTRYP PFNGLCULLFACEPROC)(GLenum mode)
void assertOutputDirectory(std::string_view outDirName)
Global TPC definitions and constants.
std::function< void(std::vector< o2::tpc::Digit > &)> digitsFilter
std::unique_ptr< unsigned long long int[]> zsoutput
MCLabelContainer mctruthArray
std::vector< unsigned int > sizes
std::vector< int > inputIds
uint16_t bc
bunch crossing ID of interaction
GPUSettingsO2 ReadConfigurableParam()
GPUSettingsRec configReconstruction
static constexpr uint32_t NENDPOINTS
IR getFirstSampledTFIR() const
get TF and HB (abs) for this IR
o2::InteractionRecord ir(0, 0)
std::vector< Digit > digits