62 std::string processorName =
"tpc-zsEncoder";
65 using DigitArray = std::array<gsl::span<const o2::tpc::Digit>, NSectors>;
68 std::unique_ptr<uint64_t[]> zsoutput;
69 std::unique_ptr<IonTailCorrection> itcorr;
70 std::vector<unsigned int>
sizes;
71 std::vector<int> tpcSectors;
73 GPUSettingsO2 globalConfig;
76 bool finished =
false;
79 auto initFunction = [tpcSectors, outRaw, tpcSectorMask](
InitContext& ic) {
80 auto processAttributes = std::make_shared<ProcessAttributes>();
81 auto& zsoutput = processAttributes->zsoutput;
82 processAttributes->tpcSectors = tpcSectors;
83 auto& verify = processAttributes->verify;
84 auto&
sizes = processAttributes->sizes;
85 auto&
verbosity = processAttributes->verbosity;
86 processAttributes->globalConfig = processAttributes->config.ReadConfigurableParam();
87 if (processAttributes->globalConfig.zsOnTheFlyDigitsFilter) {
90 auto processingFct = [processAttributes, outRaw, tpcSectorMask](
92 if (processAttributes->finished) {
96 auto& zsoutput = processAttributes->zsoutput;
97 auto& verify = processAttributes->verify;
98 auto&
sizes = processAttributes->sizes;
99 auto&
verbosity = processAttributes->verbosity;
101 processAttributes->config.configGRP.solenoidBzNominalGPU = 5.00668;
102 std::function<
void(std::vector<o2::tpc::Digit>&)> digitsFilter =
nullptr;
103 if (processAttributes->globalConfig.zsOnTheFlyDigitsFilter) {
104 digitsFilter = [processAttributes](std::vector<o2::tpc::Digit>&
digits) {
105 LOG(info) <<
"Running TPC digits IonTail filter";
106 static std::atomic_flag lock = ATOMIC_FLAG_INIT;
107 while (lock.test_and_set()) {
109 processAttributes->itcorr->filterDigitsDirect(
digits);
114 const auto& inputs = getWorkflowTPCInput(pc, 0,
false,
false, tpcSectorMask,
true);
115 sizes.resize(NSectors * NEndpoints);
117 o2::gpu::GPUO2InterfaceUtils::RunZSEncoder<DigitArray>(inputs->inputDigits, &zsoutput,
sizes.data(),
nullptr, &
ir, processAttributes->config, 4, verify,
false, digitsFilter);
120 for (
unsigned int i = 0;
i < NSectors;
i++) {
121 unsigned int pageSector = 0;
122 for (
unsigned int j = 0;
j < NEndpoints;
j++) {
123 if (
sizes[
i * NEndpoints +
j] != 0) {
124 pageSector +=
sizes[
i * NEndpoints +
j];
130 gsl::span<ZeroSuppressedContainer8kb> outp(&
page[0],
offset);
140 uint32_t rdhV = o2::raw::RDHUtils::getVersion<o2::header::RAWDataHeader>();
141 writer.useRDHVersion(rdhV);
142 writer.doLazinessCheck(
false);
143 std::string outDir =
"./";
144 const unsigned int defaultLink = 0;
145 enum LinksGrouping {
All,
148 auto useGrouping =
Sector;
150 for (
unsigned int i = 0;
i < NSectors;
i++) {
151 for (
unsigned int j = 0;
j < NEndpoints;
j++) {
152 const unsigned int cruInSector =
j / 2;
153 const unsigned int cruID =
i * 10 + cruInSector;
155 std::string outfname;
156 if (useGrouping == LinksGrouping::All) {
157 outfname = fmt::format(
"{}tpc_all.raw", outDir);
158 }
else if (useGrouping == LinksGrouping::Sector) {
159 outfname = fmt::format(
"{}tpc_sector{}.raw", outDir,
i);
160 }
else if (useGrouping == LinksGrouping::Link) {
161 outfname = fmt::format(
"{}cru{}_{}.raw", outDir, cruID,
j & 1);
163 writer.registerLink(feeid, cruID, defaultLink,
j & 1, outfname);
166 if (useGrouping != LinksGrouping::Link) {
171 writer.writeConfFile(
"TPC",
"RAWDATA", fmt::format(
"{}tpcraw.cfg", outDir));
173 zsoutput.reset(
nullptr);
176 return processingFct;
179 auto createInputSpecs = [tpcSectors]() {
183 return std::move(
mergeInputs(inputs, tpcSectors.size(),
187 input.binding += std::to_string(tpcSectors[index]);
188 DataSpecUtils::updateMatchingSubspec(input, tpcSectors[index]);
193 auto createOutputSpecs = []() {
194 std::vector<OutputSpec> outputSpecs = {};
200 outputSpecs.emplace_back(label2,
gDataOriginTPC, datadesc2, 0, Lifetime::Timeframe);
201 return std::move(outputSpecs);
205 {createInputSpecs()},
206 {createOutputSpecs()},
212 std::string processorName =
"tpc-zs-to-Digits";
217 std::array<std::vector<Digit>, NSectors> outDigits;
218 std::unique_ptr<unsigned long[]> zsinput;
219 std::vector<unsigned int>
sizes;
220 std::unique_ptr<o2::tpc::ZeroSuppress> decoder;
221 std::vector<int> tpcSectors;
224 bool finished =
false;
230 for (
auto&
digits : outDigits) {
231 std::sort(
digits.begin(),
digits.end(), [](
const auto&
a,
const auto&
b) {
232 if (a.getTimeStamp() < b.getTimeStamp()) {
235 if ((
a.getTimeStamp() ==
b.getTimeStamp()) && (
a.getRow() <
b.getRow())) {
244 auto initFunction = [tpcSectors](
InitContext& ic) {
245 auto processAttributes = std::make_shared<ProcessAttributes>();
246 processAttributes->tpcSectors = tpcSectors;
247 auto& outDigits = processAttributes->outDigits;
248 auto& decoder = processAttributes->decoder;
249 decoder = std::make_unique<o2::tpc::ZeroSuppress>();
250 auto&
verbosity = processAttributes->verbosity;
252 auto processingFct = [processAttributes](
254 if (processAttributes->finished) {
257 std::array<unsigned int, NEndpoints * NSectors>
sizes;
258 gsl::span<const ZeroSuppressedContainer8kb> inputZS;
259 std::array<gsl::span<const ZeroSuppressedContainer8kb>, NSectors> inputZSSector;
260 auto& outDigits = processAttributes->outDigits;
261 auto& decoder = processAttributes->decoder;
262 auto&
verbosity = processAttributes->verbosity;
263 unsigned int firstOrbit = 0;
265 for (
unsigned int i = 0;
i < NSectors;
i++) {
266 outDigits[
i].clear();
273 const gsl::span<const char>
raw = pc.inputs().get<gsl::span<char>>(
ref);
276 const unsigned char*
ptr =
nullptr;
279 size_t totalSize = 0;
280 for (
auto it = parser.begin(); it != parser.end(); it++) {
281 const unsigned char* current = it.raw();
283 if (it.size() == 0) {
288 FEEID = o2::raw::RDHUtils::getFEEID(*rdh);
289 cruID =
int(o2::raw::RDHUtils::getCRUID(*rdh));
290 unsigned int sector = cruID / 10;
291 gsl::span<const ZeroSuppressedContainer8kb> z0in(
reinterpret_cast<const ZeroSuppressedContainer8kb*
>(
ptr), 1);
292 decoder->DecodeZSPages(&z0in, &outDigits[sector], firstOrbit);
297 LOG(info) <<
"digits in sector " <<
i <<
" : " << outDigits[
i].size();
302 return processingFct;
305 auto createInputSpecs = []() {
309 return std::move(inputs);
312 auto createOutputSpecs = []() {
313 std::vector<OutputSpec> outputSpecs = {};
317 outputSpecs.emplace_back(gDataOriginTPC,
"DIGITS",
i, Lifetime::Timeframe);
319 return std::move(outputSpecs);
323 {createInputSpecs()},
324 {createOutputSpecs()},
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)