132 static int nMaxCpvWordsPerPage = (mDataFormat == 2 ? (nMaxGbtWordsPerPage * 16 / 10) : nMaxGbtWordsPerPage);
135 for (
auto& payload : mPayload) {
140 bool preformatted =
true;
142 int cpvWordCounter[kNGBTLinks] = {0, 0, 0};
143 int cpvWordCounterBeforeCPVTrailer[kNGBTLinks] = {0, 0, 0};
144 bool isHeaderClosedWithTrailer[kNGBTLinks] = {
false,
false,
false};
145 for (
auto& trg : trgs) {
147 currentIR += mLM_L0_delay;
148 LOG(
debug) <<
"RawWriter::processOrbit() : "
149 <<
"I start to process trigger record (orbit = " << currentIR.
orbit
150 <<
", BC = " << currentIR.
bc <<
")";
151 LOG(
debug) <<
"First entry = " << trg.getFirstEntry() <<
", Number of objects = " << trg.getNumberOfObjects();
154 for (
int i = kNcc;
i--;) {
155 for (
int j = kNDilogic;
j--;) {
156 for (
int k = kNGasiplex; k--;) {
157 mPadCharge[
i][
j][k].clear();
163 int nDigsInTrg[kNGBTLinks] = {0, 0, 0};
164 for (
auto& dig : gsl::span(digitsbranch.data() + trg.getFirstEntry(), trg.getNumberOfObjects())) {
166 short absId = dig.getAbsId();
167 short ccId, dil, gas, pad;
175 mPadCharge[ccId][dil][gas].emplace_back(
charge, pad);
176 nDigsInTrg[ccId / (kNcc / kNGBTLinks)]++;
178 LOG(
debug) <<
"I produced " << nDigsInTrg <<
" digits for this trigger record";
181 for (
int iLink = 0; iLink < kNGBTLinks; iLink++) {
182 cpvWordCounterBeforeCPVTrailer[iLink] = 0;
183 if (nMaxCpvWordsPerPage - cpvWordCounter[iLink] < 3) {
184 LOG(
debug) <<
"RawWriter::processOrbit() : before header: adding preformatted dma page of size " << mPayload[iLink].size();
186 if (mDataFormat == 2 && mPayload[iLink].
size() % 16) {
187 for (
int i = 0;
i < 16 - (mPayload[iLink].size() % 16);
i++) {
188 mPayload[iLink].push_back(
char(0xff));
191 mRawWriter->addData(
links[iLink].feeId,
links[iLink].cruId,
links[iLink].linkId,
links[iLink].endPointId, currentIR,
192 gsl::span<char>(mPayload[iLink].
data(), mPayload[iLink].
size()), preformatted);
193 mPayload[iLink].clear();
194 cpvWordCounter[iLink] = 0;
195 cpvWordCounterBeforeCPVTrailer[iLink] = 0;
199 CpvHeader header(currentIR,
false,
false);
200 for (
int i = 0;
i < 10;
i++) {
201 mPayload[iLink].push_back(header.
mBytes[
i]);
204 if (mDataFormat == 0) {
205 for (
int i = 0;
i < 6;
i++) {
206 mPayload[iLink].push_back(
char(0));
209 isHeaderClosedWithTrailer[iLink] =
false;
210 LOG(
debug) <<
"RawWriter::processOrbit() : "
211 <<
"I wrote cpv header for orbit = " << currentIR.
orbit
212 <<
" and BC = " << currentIR.
bc;
214 cpvWordCounter[iLink]++;
215 cpvWordCounterBeforeCPVTrailer[iLink]++;
217 int nDigsToWriteLeft = nDigsInTrg[iLink];
219 for (
char ccId = iLink * (kNcc / kNGBTLinks); (ccId < (iLink + 1) * (kNcc / kNGBTLinks)) && (ccId < kNcc); ccId++) {
220 int ccWordCounter = 0;
221 for (
char dil = 0; dil < kNDilogic; dil++) {
222 for (
char gas = 0; gas < kNGasiplex; gas++) {
226 currentword.
charge = pc.charge;
228 currentword.
gas = gas;
229 currentword.
dil = dil;
230 mPayload[iLink].push_back(currentword.
mBytes[0]);
231 mPayload[iLink].push_back(currentword.
mBytes[1]);
232 mPayload[iLink].push_back(currentword.
mBytes[2]);
235 if (ccWordCounter % 3 == 0) {
236 mPayload[iLink].push_back(ccId);
237 if (mDataFormat == 0) {
238 for (
int i = 6;
i--;) {
239 mPayload[iLink].push_back(
char(0));
242 cpvWordCounter[iLink]++;
243 cpvWordCounterBeforeCPVTrailer[iLink]++;
244 if (nMaxCpvWordsPerPage - cpvWordCounter[iLink] == 1) {
245 CpvTrailer tr(cpvWordCounterBeforeCPVTrailer[iLink], currentIR.
bc, nDigsToWriteLeft == 0);
246 for (
int i = 0;
i < 10;
i++) {
247 mPayload[iLink].push_back(tr.
mBytes[
i]);
250 if (mDataFormat == 0) {
251 for (
int i = 0;
i < 6;
i++) {
252 mPayload[iLink].push_back(
char(0));
256 isHeaderClosedWithTrailer[iLink] =
true;
257 LOG(
debug) <<
"RawWriter::processOrbit() : middle of payload: adding preformatted dma page of size " << mPayload[iLink].size();
259 if (mDataFormat == 2 && mPayload[iLink].
size() % 16) {
260 for (
int i = 0;
i < 16 - (mPayload[iLink].size() % 16);
i++) {
261 mPayload[iLink].push_back(
char(0xff));
264 mRawWriter->addData(
links[iLink].feeId,
links[iLink].cruId,
links[iLink].linkId,
links[iLink].endPointId, currentIR,
265 gsl::span<char>(mPayload[iLink].
data(), mPayload[iLink].
size()), preformatted);
267 mPayload[iLink].clear();
268 cpvWordCounter[iLink] = 0;
269 cpvWordCounterBeforeCPVTrailer[iLink] = 0;
270 if (nDigsToWriteLeft) {
271 CpvHeader newHeader(currentIR,
false,
true);
272 for (
int i = 0;
i < 10;
i++) {
273 mPayload[iLink].push_back(newHeader.
mBytes[
i]);
276 if (mDataFormat == 0) {
277 for (
int i = 0;
i < 6;
i++) {
278 mPayload[iLink].push_back(
char(0));
281 isHeaderClosedWithTrailer[iLink] =
false;
282 cpvWordCounter[iLink]++;
283 cpvWordCounterBeforeCPVTrailer[iLink]++;
290 if (ccWordCounter % 3 != 0) {
291 while (ccWordCounter % 3 != 0) {
292 mPayload[iLink].push_back(
char(255));
293 mPayload[iLink].push_back(
char(255));
294 mPayload[iLink].push_back(
char(255));
297 mPayload[iLink].push_back(ccId);
298 if (mDataFormat == 0) {
299 for (
int i = 6;
i--;) {
300 mPayload[iLink].push_back(
char(0));
303 cpvWordCounter[iLink]++;
304 cpvWordCounterBeforeCPVTrailer[iLink]++;
305 if (nMaxCpvWordsPerPage - cpvWordCounter[iLink] == 1) {
306 CpvTrailer tr(cpvWordCounterBeforeCPVTrailer[iLink], currentIR.
bc, nDigsToWriteLeft == 0);
307 for (
int i = 0;
i < 10;
i++) {
308 mPayload[iLink].push_back(tr.
mBytes[
i]);
310 if (mDataFormat == 0) {
311 for (
int i = 6;
i--;) {
312 mPayload[iLink].push_back(
char(0));
316 isHeaderClosedWithTrailer[iLink] =
true;
317 LOG(
debug) <<
"RawWriter::processOrbit() : middle of payload (after filling empty words): adding preformatted dma page of size " << mPayload[iLink].size();
319 if (mDataFormat == 2 && mPayload[iLink].
size() % 16) {
320 for (
int i = 0;
i < 16 - (mPayload[iLink].size() % 16);
i++) {
321 mPayload[iLink].push_back(
char(0xff));
324 mRawWriter->addData(
links[iLink].feeId,
links[iLink].cruId,
links[iLink].linkId,
links[iLink].endPointId, currentIR,
325 gsl::span<char>(mPayload[iLink].
data(), mPayload[iLink].
size()), preformatted);
327 mPayload[iLink].clear();
328 cpvWordCounter[iLink] = 0;
329 cpvWordCounterBeforeCPVTrailer[iLink] = 0;
330 if (nDigsToWriteLeft) {
331 for (
int i = 0;
i < 10;
i++) {
332 mPayload[iLink].push_back(header.
mBytes[
i]);
334 if (mDataFormat == 0) {
335 for (
int i = 6;
i--;) {
336 mPayload[iLink].push_back(
char(0));
340 isHeaderClosedWithTrailer[iLink] =
false;
341 cpvWordCounter[iLink]++;
342 cpvWordCounterBeforeCPVTrailer[iLink]++;
347 if (!isHeaderClosedWithTrailer[iLink]) {
348 CpvTrailer tr(cpvWordCounterBeforeCPVTrailer[iLink], currentIR.
bc,
true);
349 for (
int i = 0;
i < 10;
i++) {
350 mPayload[iLink].push_back(tr.
mBytes[
i]);
352 if (mDataFormat == 0) {
353 for (
int i = 6;
i--;) {
354 mPayload[iLink].push_back(
char(0));
358 isHeaderClosedWithTrailer[iLink] =
true;
359 cpvWordCounterBeforeCPVTrailer[iLink] = 0;
360 cpvWordCounter[iLink]++;
366 for (
int iLink = 0; iLink < kNGBTLinks; iLink++) {
367 if (mPayload[iLink].
size()) {
368 LOG(
debug) <<
"RawWriter::processOrbit() : final payload: adding preformatted dma page of size " << mPayload[iLink].size();
370 if (mDataFormat == 2 && mPayload[iLink].
size() % 16) {
371 for (
int i = 0;
i < 16 - (mPayload[iLink].size() % 16);
i++) {
372 mPayload[iLink].push_back(
char(0xff));
375 mRawWriter->addData(
links[iLink].feeId,
links[iLink].cruId,
links[iLink].linkId,
links[iLink].endPointId,
376 trgs.back().getBCData(), gsl::span<char>(mPayload[iLink].
data(), mPayload[iLink].
size()), preformatted);
377 mPayload[iLink].clear();