|
16 | 16 | #include <cstring> |
17 | 17 | #include <iostream> |
18 | 18 | #include <iomanip> |
| 19 | +#include <memory> |
19 | 20 | #include <sstream> |
20 | 21 | #include <iostream> |
21 | 22 | #include "DetectorsRaw/RawFileReader.h" |
|
26 | 27 | #include "Framework/Logger.h" |
27 | 28 |
|
28 | 29 | #include <Common/Configuration.h> |
| 30 | +#include <TStopwatch.h> |
| 31 | +#include <fcntl.h> |
29 | 32 |
|
30 | 33 | using namespace o2::raw; |
31 | 34 | namespace o2h = o2::header; |
@@ -358,65 +361,58 @@ int RawFileReader::getLinkLocalID(const RDHAny& rdh, const o2::header::DataOrigi |
358 | 361 | bool RawFileReader::preprocessFile(int ifl) |
359 | 362 | { |
360 | 363 | // preprocess file, check RDH data, build statistics |
| 364 | + std::unique_ptr<char[]> buffer = std::make_unique<char[]>(mBufferSize); |
361 | 365 | FILE* fl = mFiles[ifl]; |
362 | 366 | mCurrentFileID = ifl; |
363 | | - RDHAny rdh; |
364 | | - |
365 | 367 | LinkSpec_t specPrev = 0xffffffffffffffff; |
366 | 368 | int lIDPrev = -1; |
367 | 369 | mMultiLinkFile = false; |
368 | 370 | rewind(fl); |
369 | 371 | long int nr = 0; |
370 | 372 | mPosInFile = 0; |
371 | | - int nRDHread = 0; |
372 | | - bool ok = true; |
373 | | - int readBytes = sizeof(RDHAny); |
374 | | - while ((nr = fread(&rdh, 1, readBytes, fl))) { |
375 | | - if (nr < readBytes) { |
376 | | - LOG(ERROR) << "EOF was unexpected, only " << nr << " bytes were read for RDH"; |
377 | | - ok = false; |
378 | | - break; |
379 | | - } |
380 | | - if (!(ok = RDHUtils::checkRDH(rdh))) { |
381 | | - break; |
382 | | - } |
383 | | - nRDHread++; |
384 | | - LinkSpec_t spec = createSpec(mDataSpecs[mCurrentFileID].first, RDHUtils::getSubSpec(rdh)); |
385 | | - int lID = lIDPrev; |
386 | | - if (spec != specPrev) { // link has changed |
387 | | - specPrev = spec; |
388 | | - if (lIDPrev != -1) { |
389 | | - mMultiLinkFile = true; |
| 373 | + size_t nRDHread = 0, boffs; |
| 374 | + bool ok = true, readMore = true; |
| 375 | + while (readMore && (nr = fread(buffer.get(), 1, mBufferSize, fl))) { |
| 376 | + boffs = 0; |
| 377 | + while (1) { |
| 378 | + auto& rdh = *reinterpret_cast<RDHUtils::RDHAny*>(&buffer[boffs]); |
| 379 | + nRDHread++; |
| 380 | + LinkSpec_t spec = createSpec(mDataSpecs[mCurrentFileID].first, RDHUtils::getSubSpec(rdh)); |
| 381 | + int lID = lIDPrev; |
| 382 | + if (spec != specPrev) { // link has changed |
| 383 | + specPrev = spec; |
| 384 | + if (lIDPrev != -1) { |
| 385 | + mMultiLinkFile = true; |
| 386 | + } |
| 387 | + lID = getLinkLocalID(rdh, mDataSpecs[mCurrentFileID].first); |
390 | 388 | } |
391 | | - lID = getLinkLocalID(rdh, mDataSpecs[mCurrentFileID].first); |
392 | | - } |
393 | | - bool newSPage = lID != lIDPrev; |
394 | | - mLinksData[lID].preprocessCRUPage(rdh, newSPage); |
395 | | - if (mLinksData[lID].nTimeFrames > mMaxTFToRead) { // limit reached, discard the last read |
396 | | - mLinksData[lID].nTimeFrames--; |
397 | | - mLinksData[lID].blocks.pop_back(); |
398 | | - if (mLinksData[lID].nHBFrames > 0) { |
399 | | - mLinksData[lID].nHBFrames--; |
| 389 | + bool newSPage = lID != lIDPrev; |
| 390 | + mLinksData[lID].preprocessCRUPage(rdh, newSPage); |
| 391 | + if (mLinksData[lID].nTimeFrames > mMaxTFToRead) { // limit reached, discard the last read |
| 392 | + mLinksData[lID].nTimeFrames--; |
| 393 | + mLinksData[lID].blocks.pop_back(); |
| 394 | + if (mLinksData[lID].nHBFrames > 0) { |
| 395 | + mLinksData[lID].nHBFrames--; |
| 396 | + } |
| 397 | + if (mLinksData[lID].nCRUPages > 0) { |
| 398 | + mLinksData[lID].nCRUPages--; |
| 399 | + } |
| 400 | + lIDPrev = -1; // last block is closed |
| 401 | + readMore = false; |
| 402 | + break; |
400 | 403 | } |
401 | | - if (mLinksData[lID].nCRUPages > 0) { |
402 | | - mLinksData[lID].nCRUPages--; |
| 404 | + boffs += RDHUtils::getOffsetToNext(rdh); |
| 405 | + mPosInFile += RDHUtils::getOffsetToNext(rdh); |
| 406 | + lIDPrev = lID; |
| 407 | + if (boffs + sizeof(RDHUtils::RDHAny) >= nr) { |
| 408 | + if (fseek(fl, mPosInFile, SEEK_SET)) { |
| 409 | + readMore = false; |
| 410 | + break; |
| 411 | + } |
| 412 | + break; |
403 | 413 | } |
404 | | - lIDPrev = -1; // last block is closed |
405 | | - break; |
406 | 414 | } |
407 | | - // |
408 | | - mPosInFile += RDHUtils::getOffsetToNext(rdh); |
409 | | - if (fseek(fl, mPosInFile, SEEK_SET)) { |
410 | | - break; |
411 | | - } |
412 | | - lIDPrev = lID; |
413 | 415 | } |
414 | | - mPosInFile = ftell(fl); |
415 | | - if (lIDPrev != -1) { // close last block |
416 | | - auto& lastBlock = mLinksData[lIDPrev].blocks.back(); |
417 | | - lastBlock.size = mPosInFile - lastBlock.offset; |
418 | | - } |
419 | | - |
420 | 416 | LOGF(INFO, "File %3d : %9li bytes scanned, %6d RDH read for %4d links from %s", |
421 | 417 | mCurrentFileID, mPosInFile, nRDHread, int(mLinkEntries.size()), mFileNames[mCurrentFileID]); |
422 | 418 | return ok; |
|
0 commit comments