12#ifndef TRACKINGITSU_INCLUDE_ROFOVERLAPTABLE_H_
13#define TRACKINGITSU_INCLUDE_ROFOVERLAPTABLE_H_
50 assert(rofId < mNROFsTF && rofId >= 0);
89 const BCType bc = (ts.getTimeStamp() < ts.getTimeStampError()) ?
BCType(0) :
static_cast<BCType>(o2::gpu::CAMath::Floor(ts.getTimeStamp() - ts.getTimeStampError()));
110template <
int32_t NLayers>
138 GPUhdi() constexpr int32_t getEntries() noexcept {
return NLayers; }
143 LOGP(info,
"Imposed time structure:");
144 for (int32_t iL{0}; iL < NLayers; ++iL) {
152template <
int32_t NLayers,
typename TableEntry,
typename TableIndex>
168 uint32_t maxNROFs{0};
169 for (int32_t iL{0}; iL < NLayers; ++iL) {
170 const auto&
layer = getLayer(iL);
174 if (
layer.mNROFsTF > maxNROFs) {
176 maxNROFs =
layer.mNROFsTF;
189 assert(from < NLayers &&
to < NLayers);
239 for (int32_t
i = 0;
i < NLayers; ++
i) {
240 for (int32_t
j = 0;
j < NLayers; ++
j) {
252 LOGP(error,
"No self-lookup supported");
256 constexpr int w_index = 10;
261 LOGF(info,
"Overlap mapping: Layer %d -> Layer %d", from,
to);
265 LOGF(info,
"%.*s-+-%.*s-+-%.*s-+-%.*s", w_index,
"----------",
w_first,
"------------",
w_last,
"------------",
w_count,
"----------");
269 for (int32_t
i = 0;
i <
idx.getEntries(); ++
i) {
270 const auto&
overlap = getOverlap(from,
to,
i);
277 uint32_t totalEntries{0};
278 size_t flatTableSize{0};
280 for (int32_t
i = 0;
i < NLayers; ++
i) {
281 for (int32_t
j = 0;
j < NLayers; ++
j) {
285 totalEntries +=
idx.getEntries();
286 flatTableSize +=
idx.getEntries();
291 for (int32_t
i = 0;
i < NLayers; ++
i) {
295 const uint32_t totalBytes = (flatTableSize *
sizeof(TableEntry)) + (
static_cast<unsigned long>(NLayers * NLayers) *
sizeof(TableIndex));
296 LOGF(info,
"------------------------------------------------------------");
297 LOGF(info,
"Total overlap table size: %u entries", totalEntries);
298 LOGF(info,
"Flat table size: %zu entries", flatTableSize);
299 LOGF(info,
"Total view size: %u bytes", totalBytes);
300 LOGF(info,
"------------------------------------------------------------");
306template <
int32_t NLayers>
319 std::vector<TableEntry> table[NLayers][NLayers];
320 for (int32_t
i{0};
i < NLayers; ++
i) {
321 for (int32_t
j{0};
j < NLayers; ++
j) {
323 buildMapping(
i,
j, table[
i][
j]);
344 view.mLayers = deviceLayerTimingPtr;
349 static GPUh() constexpr
size_t getIndicesSize() {
return static_cast<size_t>(NLayers * NLayers); }
354 const auto& layerFrom = this->
mLayers[from];
355 const auto& layerTo = this->
mLayers[to];
356 table.resize(layerFrom.mNROFsTF);
358 for (int32_t iROF{0}; iROF < layerFrom.mNROFsTF; ++iROF) {
360 int64_t fromEnd = (
int64_t)layerFrom.getROFEndInBC(iROF) + layerFrom.mROFAddTimeErr;
362 int32_t firstROFTo = o2::gpu::CAMath::Max(0, (int32_t)((fromStart - (
int64_t)layerTo.mROFAddTimeErr - (
int64_t)layerTo.mROFDelay - (
int64_t)layerTo.mROFBias) / (
int64_t)layerTo.mROFLength));
363 auto lastROFTo = (int32_t)((fromEnd + (
int64_t)layerTo.mROFAddTimeErr - (
int64_t)layerTo.mROFDelay - (
int64_t)layerTo.mROFBias - 1) / (
int64_t)layerTo.mROFLength);
364 firstROFTo = o2::gpu::CAMath::Max(0, firstROFTo);
365 lastROFTo = o2::gpu::CAMath::Min((int32_t)layerTo.mNROFsTF - 1, lastROFTo);
367 while (firstROFTo <= lastROFTo) {
369 int64_t toEnd = (
int64_t)layerTo.getROFEndInBC(firstROFTo) + layerTo.mROFAddTimeErr;
370 if (toEnd > fromStart && toStart < fromEnd) {
375 while (lastROFTo >= firstROFTo) {
377 int64_t toEnd = (
int64_t)layerTo.getROFEndInBC(lastROFTo) + layerTo.mROFAddTimeErr;
378 if (toEnd > fromStart && toStart < fromEnd) {
383 int32_t
count = (firstROFTo <= lastROFTo) ? (lastROFTo - firstROFTo + 1) : 0;
384 table[iROF] = {
static_cast<T>(firstROFTo),
static_cast<T>(
count)};
391 for (int32_t
i{0};
i < NLayers; ++
i) {
392 for (int32_t
j{0};
j < NLayers; ++
j) {
394 total += table[
i][
j].size();
401 for (int32_t
i{0};
i < NLayers; ++
i) {
402 for (int32_t
j{0};
j < NLayers; ++
j) {
403 size_t idx = (
i * NLayers) +
j;
420template <
int32_t NLayers,
typename TableEntry,
typename TableIndex>
445 for (int32_t
i = 0;
i <
idx.getEntries(); ++
i) {
468 for (int32_t
i = 0;
i < NLayers; ++
i) {
476 constexpr int w_rof = 10;
477 constexpr int w_first = 12;
478 constexpr int w_last = 12;
479 constexpr int w_count = 10;
481 LOGF(info,
"Vertex lookup: Layer %d",
layer);
482 LOGF(info,
"%*s | %*s | %*s | %*s", w_rof,
"ROF.index", w_first,
"First.Vtx", w_last,
"Last.Vtx", w_count,
"Count");
483 LOGF(info,
"%.*s-+-%.*s-+-%.*s-+-%.*s", w_rof,
"----------", w_first,
"------------", w_last,
"------------", w_count,
"----------");
486 for (int32_t
i = 0;
i <
idx.getEntries(); ++
i) {
491 LOGF(info,
"%*d | %*d | %*d | %*d", w_rof,
i, w_first,
first, w_last, last, w_count,
count);
497 uint32_t totalROFs{0};
498 uint32_t totalVertexRefs{0};
500 for (int32_t
i = 0;
i < NLayers; ++
i) {
502 totalROFs +=
idx.getEntries();
504 for (int32_t
j = 0;
j <
idx.getEntries(); ++
j) {
506 totalVertexRefs +=
entry.getEntries();
510 const uint32_t totalBytes = (totalROFs *
sizeof(TableEntry)) + (NLayers *
sizeof(TableIndex));
511 LOGF(info,
"------------------------------------------------------------");
512 LOGF(info,
"Total ROFs in table: %u", totalROFs);
513 LOGF(info,
"Total vertex references: %u", totalVertexRefs);
514 LOGF(info,
"Total view size: %u bytes", totalBytes);
515 LOGF(info,
"------------------------------------------------------------");
525template <
int32_t NLayers>
538 static GPUh() constexpr
size_t getIndicesSize() {
return NLayers; }
544 if (
nVertices > std::numeric_limits<T>::max()) {
545 LOGF(fatal,
"too many vertices %zu, max supported is %u",
nVertices, std::numeric_limits<T>::max());
548 std::vector<TableEntry> table[NLayers];
578 size_t nROFs = idx.getEntries();
579 for (
size_t iROF = 0; iROF < nROFs; ++iROF) {
600 view.mLayers = deviceLayerTimingPtr;
609 table.resize(layerDef.mNROFsTF);
610 size_t vertexSearchStart = 0;
611 for (int32_t iROF{0}; iROF < layerDef.mNROFsTF; ++iROF) {
613 int64_t rofUpper = (
int64_t)layerDef.getROFEndInBC(iROF) + layerDef.mROFAddTimeErr;
614 size_t lastVertex = binarySearchFirst(vertices,
nVertices, vertexSearchStart, rofUpper);
615 size_t firstVertex = vertexSearchStart;
616 while (firstVertex < lastVertex) {
617 auto vUpper = (
int64_t)vertices[firstVertex].getTimeStamp().upper();
618 if (vUpper > rofLower) {
623 size_t count = (lastVertex > firstVertex) ? (lastVertex - firstVertex) : 0;
624 table[iROF] = {
static_cast<T>(firstVertex),
static_cast<T>(
count)};
625 vertexSearchStart = firstVertex;
634 int64_t rofUpper = (
int64_t)layerDef.getROFEndInBC(iROF) + layerDef.mROFAddTimeErr;
635 size_t lastVertex = binarySearchFirst(vertices,
nVertices, 0, rofUpper);
636 size_t firstVertex = 0;
637 while (firstVertex < lastVertex) {
640 if (vUpper > rofLower) {
645 size_t count = (lastVertex > firstVertex) ? (lastVertex - firstVertex) : 0;
646 mFlatTable[flatTableIdx].setFirstEntry(
static_cast<T>(firstVertex));
653 size_t left = searchStart;
658 if (lower < targetBC) {
672 for (int32_t
i{0};
i < NLayers; ++
i) {
673 total += table[
i].size();
679 for (int32_t
i{0};
i < NLayers; ++
i) {
691template <
int32_t NLayers,
typename TableEntry,
typename TableIndex>
705 for (int32_t
i = 0;
i < NLayers; ++
i) {
712 constexpr int w_rof = 10;
713 constexpr int w_active = 10;
715 LOGF(info,
"Mask table: Layer %d",
layer);
716 LOGF(info,
"%*s | %*s", w_rof,
"ROF", w_active,
"Enabled");
717 LOGF(info,
"%.*s-+-%.*s", w_rof,
"----------", w_active,
"----------");
718 for (int32_t
i = 0;
i < nROFs; ++
i) {
719 LOGF(info,
"%*d | %*d", w_rof,
i, w_active, (
int)isROFEnabled(
layer,
i));
726 int32_t enabledROFs = 0;
727 for (int32_t
j = 0;
j < nROFs; ++
j) {
728 if (isROFEnabled(
layer,
j)) {
732 return std::format(
"ROFMask on Layer {} ROFs enabled: {}/{}",
layer, enabledROFs, nROFs);
743template <
int32_t NLayers>
758 int32_t totalROFs = 0;
760 mLayerROFOffsets[
layer] = totalROFs;
761 totalROFs += this->getLayer(
layer).mNROFsTF;
763 mLayerROFOffsets[NLayers] = totalROFs;
776 GPUh()
void setROFsEnabled(int32_t
layer, int32_t firstRof, int32_t nRofs, uint8_t
state = 1) noexcept
779 assert(firstRof >= 0);
780 assert(firstRof + nRofs <= mLayerROFOffsets[
layer + 1] - mLayerROFOffsets[
layer]);
787 const int32_t bcStart = t.getFirstEntry();
788 const int32_t bcEnd = t.getEntriesBound();
790 const auto& lay = this->getLayer(
layer);
793 if (
static_cast<int32_t
>(lay.getROFStartInBC(
rofId)) < bcEnd &&
794 static_cast<int32_t
>(lay.getROFEndInBC(
rofId)) > bcStart) {
805 for (
const auto& t : ts) {
810 GPUh()
void resetMask(uint8_t s = 0u)
823 std::swap(mLayerROFOffsets,
other.mLayerROFOffsets);
830 view.mLayerROFOffsets = mLayerROFOffsets;
837 view.mFlatMask = deviceFlatMaskPtr;
838 view.mLayerROFOffsets = deviceOffsetPtr;
843 TableIndex mLayerROFOffsets[NLayers + 1] = {0};
std::string asString(TDataMember const &dm, char *pointer)
Header to collect LHC related constants.
Class to refer to the 1st entry and N elements of some group in the continuous container.
GPUhdi() const LayerTiming &getLayer(int32_t layer) const
const LayerTiming & timing
GPUh() void defineLayer(int32_t layer
LayerTiming mLayers[NLayers]
GPUhdi() const expr int32_t getEntries() noexcept
LayerTimingBase()=default
GPUh() void print() const
GPUh() explicit ROFMaskTable(const LayerTimingBase< NLayers > &timingBase)
dataformats::RangeReference< T, T > BCRange
GPUh() size_t getFlatMaskSize() const noexcept
ROFMaskTableView< NLayers, TableEntry, TableIndex > View
GPUh() void setROFEnabled(int32_t layer
LayerTimingBase< NLayers >::T T
std::vector< TableEntry > mFlatMask
dataformats::RangeReference< T, T > TableEntry
LayerTimingBase< NLayers >::T T
const TableIndex * deviceIndicesPtr
GPUh() View getView() const
static GPUh() const expr size_t getIndicesSize()
ROFOverlapTable()=default
GPUh() size_t getFlatTableSize() const noexcept
dataformats::RangeReference< T, T > TableIndex
const TableIndex const LayerTiming *deviceLayerTimingPtr const
const TableIndex * deviceIndicesPtr
LayerTiming::BCType BCType
const TableIndex const LayerTiming *deviceLayerTimingPtr const
GPUh() View getView() const
ROFVertexLookupTable()=default
dataformats::RangeReference< T, T > TableEntry
GPUh() void update(const Vertex *vertices
dataformats::RangeReference< T, T > TableIndex
static GPUh() const expr size_t getIndicesSize()
GPUh() size_t getFlatTableSize() const noexcept
GPUh() void init(const Vertex *vertices
LayerTimingBase< NLayers >::T T
typedef void(APIENTRYP PFNGLCULLFACEPROC)(GLenum mode)
GLenum GLuint GLint GLint layer
GLuint GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat t0
GLuint GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat t1
constexpr int LHCMaxBunches
o2::dataformats::Vertex< o2::its::TimeEstBC > Vertex
uint16_t TimeStampErrorType
uint64_t getTimeStamp(o2::framework::ProcessingContext &pc)
GPUhdi() BCType getROFStartInBC(BCType rofId) const noexcept
GPUhdi() TimeEstBC getROFTimeBounds(BCType rofId
GPUhdi() BCType getROFEndInBC(BCType rofId) const noexcept
GPUhdi() bool isROFEnabled(int32_t layer
GPUh() void printLayer(int32_t layer) const
const TableIndex * mLayerROFOffsets
GPUh() void printAll() const
const TableEntry * mFlatMask
int32_t rofId const noexcept
const size_t lastCompatible
LOGP(info, "From: {}", mLayers[from].asString())
LOGF(info, "%*s | %*s | %*s | %*s", w_index, "ROF.index", w_first, "First.ROF", w_last, "Last.ROF", w_count, "Count")
GPUhdi() const LayerTiming &getLayer(int32_t layer) const noexcept
const LayerTiming * mLayers
const TableIndex * mIndices
GPUhdi() bool doROFsOverlap(int32_t layer0
assert(rofIdx< idx.getEntries())
int32_t size_t rofIdx const noexcept
GPUh() void printSummary() const
LOGF(info, "Overlap mapping: Layer %d -> Layer %d", from, to)
GPUh() const LayerTiming &getClockLayer() const noexcept
const size_t firstCompatible
GPUh() void printAll() const
Print functions.
GPUh() int32_t getClock() const noexcept
GPUhdi() const TableEntry &getOverlap(int32_t from
GPUhdi() TimeEstBC getTimeStamp(int32_t layer0
LOGP(info, "To : {}", mLayers[to].asString())
LOGF(info, "%.*s-+-%.*s-+-%.*s-+-%.*s", w_index, "----------", w_first, "------------", w_last, "------------", w_count, "----------")
assert(doROFsOverlap(layer0, rof0, layer1, rof1))
const TableEntry * mFlatTable
size_t rofIdx const noexcept
assert(rofIdx< idx.getEntries())
GPUh() void printLayer(int32_t layer) const
GPUhdi() const LayerTiming &getLayer(int32_t layer) const noexcept
const TableEntry * mFlatTable
const LayerTiming * mLayers
const TableIndex * mIndices
GPUh() void printAll() const
GPUh() int32_t getMaxVerticesPerROF() const noexcept
GPUh() void printSummary() const
GPUhdi() const TableEntry &getVertices(int32_t layer
GPUhdi() bool isVertexCompatible(int32_t layer
VectorOfTObjectPtrs other
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"