20#include "TProfile2D.h"
24#include <fairlogger/Logger.h>
109void WindowFiller::fillDigitsInStrip(std::vector<Strip>* strips,
int channel,
int tdc,
int tot, uint64_t nbc, UInt_t istrip, uint32_t triggerorbit, uint16_t triggerbunch)
112 (*strips)[istrip].addDigit(channel, tdc, tot, nbc, 0, triggerorbit, triggerbunch);
142 strip.fillOutputContainer(
digits);
154 int eventcounter = -1;
176 if (eventcounter == -1 ||
mCrateHeaderData[irow].eventCounter[icrate] < eventcounter) {
183 if (bc_shift == -1) {
186 if (eventcounter == -1) {
199 unsigned int irow = it->row;
207 LOG(error) <<
"One pattern skipped because appears to occur early of the current row " << it->row <<
" < " <<
mReadoutWindowCurrent <<
" ?!";
209 uint32_t cpatt = it->pattern;
211 uint8_t slot = dpatt->slotID;
218 for (
int ibit = 0; ibit < 28; ibit++) {
219 if (dpatt->faultBits & cbit) {
249 if (
digits.size() || npatterns) {
280 [](
PatternData a,
PatternData b) { if(a.row == b.row) { return a.icrate > b.icrate; }
else { return a.row > b.row; } });
282 for (Int_t
i = 0;
i < MAXWINDOWS;
i++) {
284 for (
int j = 0;
j < mStrips[
i].size();
j++) {
285 n += ((mStrips[
i])[
j]).getNumberOfDigits();
289 checkIfReuseFutureDigitsRO();
292 fillOutputContainer(
digits);
294 for (Int_t
i = 0;
i < MAXWINDOWS;
i++) {
295 fillOutputContainer(
digits);
296 checkIfReuseFutureDigitsRO();
300 while (mFutureDigits.size()) {
302 fillOutputContainer(
digits);
303 checkIfReuseFutureDigitsRO();
308 for (Int_t
i = 0;
i < MAXWINDOWS;
i++) {
309 if (mReadoutWindowData.size() < nwindowperTF) {
310 fillOutputContainer(
digits);
315 while ((mReadoutWindowData.size() % nwindowperTF)) {
316 fillOutputContainer(
digits);
337 int bclimit = 999999;
341 if (digit->getBC() > bclimit) {
349 LOG(
debug) <<
"Digit lost because we jump too ahead in future. Current RO window=" << isnext <<
"\n";
352 int labelremoved = digit->getLabel();
367 fillDigitsInStrip(strips, digit->getChannel(), digit->getTDC(), digit->getTOT(), digit->getBC(), digit->getChannel() /
Geo::NPADS);
373 bclimit = digit->getBC();
390 if (a.getTriggerOrbit() != b.getTriggerOrbit()) {
391 return a.getTriggerOrbit() > b.getTriggerOrbit();
393 if (
a.getTriggerBunch() !=
b.getTriggerBunch()) {
394 return a.getTriggerBunch() > b.getTriggerBunch();
396 return a.getBC() >
b.getBC();
401 int idigit = mFutureDigits.size() - 1;
403 int rolimit = 999999;
405 for (std::vector<Digit>::reverse_iterator digit = mFutureDigits.rbegin(); digit != mFutureDigits.rend(); ++digit) {
407 int row = (digit->getTriggerOrbit() - mFirstIR.orbit) *
Geo::BC_IN_ORBIT + (digit->getTriggerBunch() - mFirstIR.bc) + 100;
415 int isnext =
row - mReadoutWindowCurrent;
418 LOG(
debug) <<
"Digit lost because we jump too ahead in future. Current RO window=" << isnext <<
"\n";
421 int labelremoved = digit->getLabel();
422 mFutureDigits.erase(mFutureDigits.begin() + idigit);
429 if (isnext < MAXWINDOWS - 1) {
430 std::vector<Strip>* strips = mStripsCurrent;
433 strips = mStripsNext[isnext - 1];
436 if (mMaskNoiseRate < 0 || mChannelCounts[digit->getChannel()] < mMaskNoiseRate) {
437 fillDigitsInStrip(strips, digit->getChannel(), digit->getTDC(), digit->getTOT(), digit->getBC(), digit->getChannel() /
Geo::NPADS);
441 mFutureDigits.erase(mFutureDigits.begin() + idigit);
451 bool isTOFempty =
true;
457 for (
int ic = 0; ic < 72; ic++) {
468 int lastdia = fd + dia;
471 for (
int dd = fd; dd < lastdia; dd++) {
480 if (dd + 1 == lastdia ||
mPatterns[dd + 1] >= 28) {
496 masknoise = -masknoise;
501 int additionalMask = 0;
504 additionalMask += (1 << 19);
506 additionalMask += (1 << 20);
uint32_t fillEmptyCrate(int crate, uint32_t frequency=1)
uint32_t fillEmptyTOF(uint32_t frequency=1)
static ULong64_t getTRMKey(int crate, int trm)
uint32_t fill(ULong64_t pattern)
uint32_t fillNoisy(int channel, int frequency=1)
TOF digit implementation.
static constexpr Int_t NPADS
static constexpr double BC_IN_WINDOW_INV
static constexpr Double_t READOUTWINDOW_INV
static constexpr Double_t BC_TIME
static constexpr int NCHANNELS
static constexpr Float_t TDCBIN
TDC bin width [ps].
static constexpr int BC_IN_WINDOW
static constexpr int BC_IN_ORBIT
static constexpr int NWINDOW_IN_ORBIT
static constexpr Int_t NSTRIPS
static uint32_t getNOrbitInTF()
void addCrateHeaderData(unsigned long orbit, int crate, int32_t bc, uint32_t eventCounter)
void fillDigitsInStrip(std::vector< Strip > *strips, int channel, int tdc, int tot, uint64_t nbc, UInt_t istrip, uint32_t triggerorbit=0, uint16_t triggerbunch=0)
int mIcurrentReadoutWindow
std::vector< CrateHeaderData > mCrateHeaderData
uint64_t mReadoutWindowCurrent
void checkIfReuseFutureDigits()
std::vector< Strip > mStrips[MAXWINDOWS]
static const int MAXWINDOWS
std::vector< PatternData > mCratePatterns
std::vector< Strip > * mStripsCurrent
void checkIfReuseFutureDigitsRO()
int mChannelCounts[o2::tof::Geo::NCHANNELS]
std::vector< Strip > * mStripsNext[MAXWINDOWS - 1]
void flushOutputContainer(std::vector< Digit > &digits)
std::vector< ReadoutWindowData > mReadoutWindowDataFiltered
std::vector< uint8_t > mPatterns
Diagnostic mDiagnosticFrequency
std::vector< Digit > mDigitsPerTimeFrame
std::vector< Digit > mFutureDigits
void fillDiagnosticFrequency()
std::vector< ReadoutWindowData > mReadoutWindowData
void fillOutputContainer(std::vector< Digit > &digits)
InteractionRecord mFirstIR
GLboolean GLboolean GLboolean b
GLboolean GLboolean GLboolean GLboolean a
uint16_t bc
bunch crossing ID of interaction
void setEventCounter(int ev)
void setEmptyCrate(int crate)
void setBCData(int orbit, int bc)
void setFirstEntryDia(int first)
void addedDiagnostic(int crate)
void setNEntriesDia(int ne)
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"
std::vector< Digit > digits