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;
659 if (lower < targetBC) {
673 for (int32_t
i{0};
i < NLayers; ++
i) {
674 total += table[
i].size();
680 for (int32_t
i{0};
i < NLayers; ++
i) {
692template <
int32_t NLayers,
typename TableEntry,
typename TableIndex>
706 for (int32_t
i = 0;
i < NLayers; ++
i) {
713 constexpr int w_rof = 10;
714 constexpr int w_active = 10;
716 LOGF(info,
"Mask table: Layer %d",
layer);
717 LOGF(info,
"%*s | %*s", w_rof,
"ROF", w_active,
"Enabled");
718 LOGF(info,
"%.*s-+-%.*s", w_rof,
"----------", w_active,
"----------");
719 for (int32_t
i = 0;
i < nROFs; ++
i) {
720 LOGF(info,
"%*d | %*d", w_rof,
i, w_active, (
int)isROFEnabled(
layer,
i));
727 int32_t enabledROFs = 0;
728 for (int32_t
j = 0;
j < nROFs; ++
j) {
729 if (isROFEnabled(
layer,
j)) {
733 return std::format(
"ROFMask on Layer {} ROFs enabled: {}/{}",
layer, enabledROFs, nROFs);
744template <
int32_t NLayers>
759 int32_t totalROFs = 0;
761 mLayerROFOffsets[
layer] = totalROFs;
762 totalROFs += this->getLayer(
layer).mNROFsTF;
764 mLayerROFOffsets[NLayers] = totalROFs;
777 GPUh()
void setROFsEnabled(int32_t
layer, int32_t firstRof, int32_t nRofs, uint8_t
state = 1) noexcept
780 assert(firstRof >= 0);
781 assert(firstRof + nRofs <= mLayerROFOffsets[
layer + 1] - mLayerROFOffsets[
layer]);
788 const int32_t bcStart = t.getFirstEntry();
789 const int32_t bcEnd = t.getEntriesBound();
791 const auto& lay = this->getLayer(
layer);
794 if (
static_cast<int32_t
>(lay.getROFStartInBC(
rofId)) < bcEnd &&
795 static_cast<int32_t
>(lay.getROFEndInBC(
rofId)) > bcStart) {
806 for (
const auto& t : ts) {
811 GPUh()
void resetMask(uint8_t s = 0u)
824 std::swap(mLayerROFOffsets,
other.mLayerROFOffsets);
831 view.mLayerROFOffsets = mLayerROFOffsets;
838 view.mFlatMask = deviceFlatMaskPtr;
839 view.mLayerROFOffsets = deviceOffsetPtr;
844 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"