63 std::string processorName =
"tpc-zsEncoder";
66 using DigitArray = std::array<gsl::span<const o2::tpc::Digit>, NSectors>;
69 std::unique_ptr<uint64_t[]> zsoutput;
70 std::unique_ptr<IonTailCorrection> itcorr;
71 std::vector<unsigned int>
sizes;
72 std::vector<int> tpcSectors;
74 GPUSettingsO2 globalConfig;
77 bool finished =
false;
80 auto initFunction = [tpcSectors, outRaw, tpcSectorMask](
InitContext& ic) {
81 auto processAttributes = std::make_shared<ProcessAttributes>();
82 auto& zsoutput = processAttributes->zsoutput;
83 processAttributes->tpcSectors = tpcSectors;
84 auto& verify = processAttributes->verify;
85 auto&
sizes = processAttributes->sizes;
86 auto&
verbosity = processAttributes->verbosity;
87 processAttributes->globalConfig = processAttributes->config.ReadConfigurableParam();
88 if (processAttributes->globalConfig.zsOnTheFlyDigitsFilter) {
91 auto processingFct = [processAttributes, outRaw, tpcSectorMask](
93 if (processAttributes->finished) {
97 auto& zsoutput = processAttributes->zsoutput;
98 auto& verify = processAttributes->verify;
99 auto&
sizes = processAttributes->sizes;
100 auto&
verbosity = processAttributes->verbosity;
102 processAttributes->config.configGRP.solenoidBzNominalGPU = 5.00668;
103 std::function<
void(std::vector<o2::tpc::Digit>&)> digitsFilter =
nullptr;
104 if (processAttributes->globalConfig.zsOnTheFlyDigitsFilter) {
105 digitsFilter = [processAttributes](std::vector<o2::tpc::Digit>&
digits) {
106 LOG(info) <<
"Running TPC digits IonTail filter";
107 static std::atomic_flag lock = ATOMIC_FLAG_INIT;
108 while (lock.test_and_set()) {
110 processAttributes->itcorr->filterDigitsDirect(
digits);
115 const auto& inputs = getWorkflowTPCInput(pc, 0,
false,
false, tpcSectorMask,
true);
116 sizes.resize(NSectors * NEndpoints);
118 o2::gpu::GPUO2InterfaceUtils::RunZSEncoder<DigitArray>(inputs->inputDigits, &zsoutput,
sizes.data(),
nullptr, &
ir, processAttributes->config, 4, verify,
false, digitsFilter);
121 for (
unsigned int i = 0;
i < NSectors;
i++) {
122 unsigned int pageSector = 0;
123 for (
unsigned int j = 0;
j < NEndpoints;
j++) {
124 if (
sizes[
i * NEndpoints +
j] != 0) {
125 pageSector +=
sizes[
i * NEndpoints +
j];
131 gsl::span<ZeroSuppressedContainer8kb> outp(&page[0],
offset);
141 uint32_t rdhV = o2::raw::RDHUtils::getVersion<o2::header::RAWDataHeader>();
142 writer.useRDHVersion(rdhV);
143 writer.doLazinessCheck(
false);
144 std::string outDir =
"./";
145 const unsigned int defaultLink = 0;
146 enum LinksGrouping {
All,
149 auto useGrouping =
Sector;
151 for (
unsigned int i = 0;
i < NSectors;
i++) {
152 for (
unsigned int j = 0;
j < NEndpoints;
j++) {
153 const unsigned int cruInSector =
j / 2;
154 const unsigned int cruID =
i * 10 + cruInSector;
156 std::string outfname;
157 if (useGrouping == LinksGrouping::All) {
158 outfname = fmt::format(
"{}tpc_all.raw", outDir);
159 }
else if (useGrouping == LinksGrouping::Sector) {
160 outfname = fmt::format(
"{}tpc_sector{}.raw", outDir,
i);
161 }
else if (useGrouping == LinksGrouping::Link) {
162 outfname = fmt::format(
"{}cru{}_{}.raw", outDir, cruID,
j & 1);
164 writer.registerLink(feeid, cruID, defaultLink,
j & 1, outfname);
167 if (useGrouping != LinksGrouping::Link) {
172 writer.writeConfFile(
"TPC",
"RAWDATA", fmt::format(
"{}tpcraw.cfg", outDir));
174 zsoutput.reset(
nullptr);
177 return processingFct;
180 auto createInputSpecs = [tpcSectors]() {
184 return std::move(
mergeInputs(inputs, tpcSectors.size(),
188 input.binding += std::to_string(tpcSectors[index]);
189 DataSpecUtils::updateMatchingSubspec(input, tpcSectors[index]);
194 auto createOutputSpecs = []() {
195 std::vector<OutputSpec> outputSpecs = {};
201 outputSpecs.emplace_back(label2,
gDataOriginTPC, datadesc2, 0, Lifetime::Timeframe);
202 return std::move(outputSpecs);
206 {createInputSpecs()},
207 {createOutputSpecs()},
213 std::string processorName =
"tpc-zs-to-Digits";
218 std::array<std::vector<Digit>, NSectors> outDigits;
219 std::unique_ptr<unsigned long[]> zsinput;
220 std::vector<unsigned int>
sizes;
221 std::unique_ptr<o2::tpc::ZeroSuppress> decoder;
222 std::vector<int> tpcSectors;
225 bool finished =
false;
231 for (
auto&
digits : outDigits) {
232 std::sort(
digits.begin(),
digits.end(), [](
const auto&
a,
const auto&
b) {
233 if (a.getTimeStamp() < b.getTimeStamp()) {
236 if ((
a.getTimeStamp() ==
b.getTimeStamp()) && (
a.getRow() <
b.getRow())) {
245 auto initFunction = [tpcSectors](
InitContext& ic) {
246 auto processAttributes = std::make_shared<ProcessAttributes>();
247 processAttributes->tpcSectors = tpcSectors;
248 auto& outDigits = processAttributes->outDigits;
249 auto& decoder = processAttributes->decoder;
250 decoder = std::make_unique<o2::tpc::ZeroSuppress>();
251 auto&
verbosity = processAttributes->verbosity;
253 auto processingFct = [processAttributes](
255 if (processAttributes->finished) {
258 std::array<unsigned int, NEndpoints * NSectors>
sizes;
259 gsl::span<const ZeroSuppressedContainer8kb> inputZS;
260 std::array<gsl::span<const ZeroSuppressedContainer8kb>, NSectors> inputZSSector;
261 auto& outDigits = processAttributes->outDigits;
262 auto& decoder = processAttributes->decoder;
263 auto&
verbosity = processAttributes->verbosity;
264 unsigned int firstOrbit = 0;
266 for (
unsigned int i = 0;
i < NSectors;
i++) {
267 outDigits[
i].clear();
274 const gsl::span<const char> raw = pc.inputs().get<gsl::span<char>>(
ref);
277 const unsigned char*
ptr =
nullptr;
280 size_t totalSize = 0;
281 for (
auto it = parser.begin(); it != parser.end(); it++) {
282 const unsigned char* current = it.raw();
284 if (it.size() == 0) {
289 FEEID = o2::raw::RDHUtils::getFEEID(*rdh);
290 cruID =
int(o2::raw::RDHUtils::getCRUID(*rdh));
291 unsigned int sector = cruID / 10;
292 gsl::span<const ZeroSuppressedContainer8kb> z0in(
reinterpret_cast<const ZeroSuppressedContainer8kb*
>(
ptr), 1);
293 decoder->DecodeZSPages(&z0in, &outDigits[sector], firstOrbit);
298 LOG(info) <<
"digits in sector " <<
i <<
" : " << outDigits[
i].size();
303 return processingFct;
306 auto createInputSpecs = []() {
310 return std::move(inputs);
313 auto createOutputSpecs = []() {
314 std::vector<OutputSpec> outputSpecs = {};
318 outputSpecs.emplace_back(gDataOriginTPC,
"DIGITS",
i, Lifetime::Timeframe);
320 return std::move(outputSpecs);
324 {createInputSpecs()},
325 {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)