Skip to content

Commit ac5e647

Browse files
committed
ITS: account for layer ROF bias in tracker
Signed-off-by: Felix Schlepper <felix.schlepper@cern.ch>
1 parent 28c8f1e commit ac5e647

File tree

3 files changed

+51
-49
lines changed

3 files changed

+51
-49
lines changed

Detectors/ITSMFT/ITS/tracking/include/ITStracking/ROFLookupTables.h

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
#include <cstddef>
1616
#include <cstdint>
1717
#include <limits>
18+
#include <format>
19+
#include <string>
1820
#include <numeric>
1921
#include <vector>
2022

@@ -34,15 +36,16 @@ struct LayerTiming {
3436
using BCType = uint32_t;
3537
BCType mNROFsTF{0}; // number of ROFs per timeframe
3638
BCType mROFLength{0}; // ROF length in BC
37-
BCType mROFDelay{0}; // delay of ROFs wrt LHC orbit
38-
BCType mROFAddTimeErr{0}; // additionally imposed uncertainty on ROF time
39+
BCType mROFDelay{0}; // delay of ROFs wrt start of first orbit in TF in BC
40+
BCType mROFBias{0}; // bias wrt to the LHC clock in BC
41+
BCType mROFAddTimeErr{0}; // additionally imposed uncertainty on ROF time in BC
3942

4043
// return start of ROF in BC
4144
// this does not account for the opt. error!
4245
GPUhdi() BCType getROFStartInBC(BCType rofId) const noexcept
4346
{
4447
assert(rofId < mNROFsTF && rofId >= 0);
45-
return (mROFLength * rofId) + mROFDelay;
48+
return (mROFLength * rofId) + mROFDelay + mROFBias;
4649
}
4750

4851
// return end of ROF in BCs
@@ -54,7 +57,6 @@ struct LayerTiming {
5457
}
5558

5659
// return (clamped) time-interval of rof
57-
// the time-stamp here is symmetrical e.g. [t0-e, t0+e]
5860
GPUhdi() TimeEstBC getROFTimeBounds(BCType rofId, bool withError = false) const noexcept
5961
{
6062
if (withError) {
@@ -66,13 +68,13 @@ struct LayerTiming {
6668
return {BCType(start) + half, static_cast<uint16_t>(half)};
6769
}
6870
const BCType start = getROFStartInBC(rofId);
69-
const BCType half = (getROFEndInBC(rofId) - start) / BCType(2);
71+
const BCType half = mROFLength / BCType(2);
7072
return {start + half, static_cast<uint16_t>(half)};
7173
}
7274

7375
GPUh() std::string asString() const
7476
{
75-
return std::format("NROFsPerTF {:4} ROFLength {:4} ({:4} per Orbit) ROFDelay {:4} ROFAddTimeErr {:4}", mNROFsTF, mROFLength, (o2::constants::lhc::LHCMaxBunches / mROFLength), mROFDelay, mROFAddTimeErr);
77+
return std::format("NROFsPerTF {:4} ROFLength {:4} ({:4} per Orbit) ROFDelay {:4} ROFBias {:4} ROFAddTimeErr {:4}", mNROFsTF, mROFLength, (o2::constants::lhc::LHCMaxBunches / mROFLength), mROFDelay, mROFBias, mROFAddTimeErr);
7678
}
7779

7880
GPUh() void print() const
@@ -92,10 +94,10 @@ class LayerTimingBase
9294
using T = LayerTiming::BCType;
9395
GPUdDefault() LayerTimingBase() = default;
9496

95-
GPUh() void defineLayer(int32_t layer, T nROFsTF, T rofLength, T rofDelay, T rofTE)
97+
GPUh() void defineLayer(int32_t layer, T nROFsTF, T rofLength, T rofDelay, T rofBias, T rofTE)
9698
{
9799
assert(layer >= 0 && layer < NLayers);
98-
mLayers[layer] = {nROFsTF, rofLength, rofDelay, rofTE};
100+
mLayers[layer] = {nROFsTF, rofLength, rofDelay, rofBias, rofTE};
99101
}
100102

101103
GPUh() void defineLayer(int32_t layer, const LayerTiming& timing)
@@ -307,8 +309,8 @@ class ROFOverlapTable : public LayerTimingBase<NLayers>
307309
int64_t fromStart = o2::gpu::CAMath::Max((int64_t)layerFrom.getROFStartInBC(iROF) - (int64_t)layerFrom.mROFAddTimeErr, int64_t(0));
308310
int64_t fromEnd = (int64_t)layerFrom.getROFEndInBC(iROF) + layerFrom.mROFAddTimeErr;
309311

310-
int32_t firstROFTo = o2::gpu::CAMath::Max(0, (int32_t)((fromStart - (int64_t)layerTo.mROFDelay) / (int64_t)layerTo.mROFLength));
311-
int32_t lastROFTo = (int32_t)((fromEnd - (int64_t)layerTo.mROFDelay - 1) / (int64_t)layerTo.mROFLength);
312+
int32_t firstROFTo = o2::gpu::CAMath::Max(0, (int32_t)((fromStart - (int64_t)layerTo.mROFDelay - (int64_t)layerTo.mROFBias) / (int64_t)layerTo.mROFLength));
313+
int32_t lastROFTo = (int32_t)((fromEnd - (int64_t)layerTo.mROFDelay - (int64_t)layerTo.mROFBias - 1) / (int64_t)layerTo.mROFLength);
312314
firstROFTo = o2::gpu::CAMath::Max(0, firstROFTo);
313315
lastROFTo = o2::gpu::CAMath::Min((int32_t)layerTo.mNROFsTF - 1, lastROFTo);
314316

Detectors/ITSMFT/ITS/tracking/src/TrackingInterface.cxx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ void ITSTrackingInterface::run(framework::ProcessingContext& pc)
9797
const auto& trackParams = mTracker->getParameters();
9898
for (int iLayer = 0; iLayer < NLayers; ++iLayer) {
9999
const unsigned int nROFsPerOrbit = o2::constants::lhc::LHCMaxBunches / par.getROFLengthInBC(iLayer);
100-
const LayerTiming timing{.mNROFsTF = (nROFsPerOrbit * nOrbitsPerTF), .mROFLength = (uint32_t)par.getROFLengthInBC(iLayer), .mROFDelay = (uint32_t)par.getROFDelayInBC(iLayer), .mROFAddTimeErr = trackParams[0].AddTimeError[iLayer]};
100+
const LayerTiming timing{.mNROFsTF = (nROFsPerOrbit * nOrbitsPerTF), .mROFLength = (uint32_t)par.getROFLengthInBC(iLayer), .mROFDelay = (uint32_t)par.getROFDelayInBC(iLayer), .mROFBias = (uint32_t)par.getROFBiasInBC(iLayer), .mROFAddTimeErr = trackParams[0].AddTimeError[iLayer]};
101101
rofTable.defineLayer(iLayer, timing);
102102
vtxTable.defineLayer(iLayer, timing);
103103
}

Detectors/ITSMFT/ITS/tracking/test/testROFLookupTables.cxx

Lines changed: 38 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
BOOST_AUTO_TEST_CASE(layertiming_basic)
2323
{
2424
o2::its::ROFOverlapTable<1> table;
25-
table.defineLayer(0, 10, 594, 100, 50);
25+
table.defineLayer(0, 10, 594, 100, 0, 50);
2626
const auto& layer = table.getLayer(0);
2727

2828
// test ROF time calculations
@@ -40,9 +40,9 @@ BOOST_AUTO_TEST_CASE(layertiming_basic)
4040
BOOST_AUTO_TEST_CASE(layertiming_base)
4141
{
4242
o2::its::ROFOverlapTable<3> table;
43-
table.defineLayer(0, 10, 500, 0, 0);
44-
table.defineLayer(1, 12, 600, 50, 0);
45-
table.defineLayer(2, 8, 400, 100, 0);
43+
table.defineLayer(0, 10, 500, 0, 0, 0);
44+
table.defineLayer(1, 12, 600, 50, 0, 0);
45+
table.defineLayer(2, 8, 400, 100, 0, 0);
4646
const auto& layer1 = table.getLayer(1);
4747
BOOST_CHECK_EQUAL(layer1.mNROFsTF, 12);
4848
BOOST_CHECK_EQUAL(layer1.mROFLength, 600);
@@ -53,8 +53,8 @@ BOOST_AUTO_TEST_CASE(rofoverlap_basic)
5353
{
5454
// define 2 layers with the same definitions (no staggering)
5555
o2::its::ROFOverlapTable<2> table;
56-
table.defineLayer(0, 12, 594, 0, 0);
57-
table.defineLayer(1, 12, 594, 0, 0);
56+
table.defineLayer(0, 12, 594, 0, 0, 0);
57+
table.defineLayer(1, 12, 594, 0, 0, 0);
5858
table.init();
5959
const auto view = table.getView();
6060
// each rof in layer 0 should be compatible with its layer 1 equivalent
@@ -69,8 +69,8 @@ BOOST_AUTO_TEST_CASE(rofoverlap_staggered)
6969
{
7070
// test staggered layers with ROF delay
7171
o2::its::ROFOverlapTable<2> table;
72-
table.defineLayer(0, 10, 500, 0, 0);
73-
table.defineLayer(1, 10, 500, 250, 0); // 250 BC delay
72+
table.defineLayer(0, 10, 500, 0, 0, 0);
73+
table.defineLayer(1, 10, 500, 250, 0, 0); // 250 BC delay
7474
table.init();
7575
const auto view = table.getView();
7676

@@ -93,7 +93,7 @@ BOOST_AUTO_TEST_CASE(rofoverlap_staggered_pp)
9393
const uint32_t rofDelay{rofLen / rofBins};
9494
o2::its::ROFOverlapTable<3> table;
9595
for (uint32_t lay{0}; lay < 3; ++lay) {
96-
table.defineLayer(lay, 6, rofLen, lay * rofDelay, 0);
96+
table.defineLayer(lay, 6, rofLen, lay * rofDelay, 0, 0);
9797
}
9898
table.init();
9999
const auto view = table.getView();
@@ -104,9 +104,9 @@ BOOST_AUTO_TEST_CASE(rofoverlap_staggered_alllayers)
104104
{
105105
// test staggered layers with ROF delay
106106
o2::its::ROFOverlapTable<3> table;
107-
table.defineLayer(0, 2, 3, 0, 0);
108-
table.defineLayer(1, 3, 2, 0, 0);
109-
table.defineLayer(2, 6, 1, 0, 0);
107+
table.defineLayer(0, 2, 3, 0, 0, 0);
108+
table.defineLayer(1, 3, 2, 0, 0, 0);
109+
table.defineLayer(2, 6, 1, 0, 0, 0);
110110
table.init();
111111
const auto view = table.getView();
112112
// verify overlap range
@@ -226,9 +226,9 @@ BOOST_AUTO_TEST_CASE(rofoverlap_staggered_alllayers_delay_delta)
226226
{
227227
// test staggered layers with ROF delay
228228
o2::its::ROFOverlapTable<3> table;
229-
table.defineLayer(0, 2, 3, 0, 0);
230-
table.defineLayer(1, 3, 2, 1, 0);
231-
table.defineLayer(2, 6, 1, 0, 1);
229+
table.defineLayer(0, 2, 3, 0, 0, 0);
230+
table.defineLayer(1, 3, 2, 1, 0, 0);
231+
table.defineLayer(2, 6, 1, 0, 0, 1);
232232
table.init();
233233
const auto view = table.getView();
234234

@@ -349,8 +349,8 @@ BOOST_AUTO_TEST_CASE(rofoverlap_with_delta)
349349
{
350350
// test with ROF delta for compatibility window
351351
o2::its::ROFOverlapTable<2> table;
352-
table.defineLayer(0, 8, 600, 0, 100); // +/- 100 BC delta
353-
table.defineLayer(1, 8, 600, 0, 100);
352+
table.defineLayer(0, 8, 600, 0, 0, 100); // +/- 100 BC delta
353+
table.defineLayer(1, 8, 600, 0, 0, 100);
354354
table.init();
355355
const auto view = table.getView();
356356

@@ -370,7 +370,7 @@ BOOST_AUTO_TEST_CASE(rofoverlap_same_layer)
370370
{
371371
// test same layer compatibility
372372
o2::its::ROFOverlapTable<1> table;
373-
table.defineLayer(0, 10, 500, 0, 0);
373+
table.defineLayer(0, 10, 500, 0, 0, 0);
374374
table.init();
375375
const auto view = table.getView();
376376

@@ -383,10 +383,10 @@ BOOST_AUTO_TEST_CASE(rofoverlap_same_layer)
383383
BOOST_AUTO_TEST_CASE(rofoverlap_timestamp_basic)
384384
{
385385
o2::its::ROFOverlapTable<4> table;
386-
table.defineLayer(0, 4, 100, 0, 0);
387-
table.defineLayer(1, 4, 100, 0, 0);
388-
table.defineLayer(2, 8, 50, 0, 0);
389-
table.defineLayer(3, 7, 50, 50, 0);
386+
table.defineLayer(0, 4, 100, 0, 0, 0);
387+
table.defineLayer(1, 4, 100, 0, 0, 0);
388+
table.defineLayer(2, 8, 50, 0, 0, 0);
389+
table.defineLayer(3, 7, 50, 50, 0, 0);
390390
table.init();
391391
const auto& view = table.getView();
392392

@@ -410,10 +410,10 @@ BOOST_AUTO_TEST_CASE(rofoverlap_timestamp_basic)
410410
BOOST_AUTO_TEST_CASE(rofoverlap_timestamp_complex)
411411
{
412412
o2::its::ROFOverlapTable<4> table;
413-
table.defineLayer(0, 4, 100, 0, 0);
414-
table.defineLayer(1, 4, 100, 0, 10);
415-
table.defineLayer(2, 8, 50, 0, 0);
416-
table.defineLayer(3, 7, 50, 50, 10);
413+
table.defineLayer(0, 4, 100, 0, 0, 0);
414+
table.defineLayer(1, 4, 100, 0, 0, 10);
415+
table.defineLayer(2, 8, 50, 0, 0, 0);
416+
table.defineLayer(3, 7, 50, 50, 0, 10);
417417
table.init();
418418
const auto& view = table.getView();
419419

@@ -438,7 +438,7 @@ BOOST_AUTO_TEST_CASE(rofoverlap_timestamp_complex)
438438
BOOST_AUTO_TEST_CASE(rofvertex_basic)
439439
{
440440
o2::its::ROFVertexLookupTable<1> table;
441-
table.defineLayer(0, 6, 594, 0, 0);
441+
table.defineLayer(0, 6, 594, 0, 0, 0);
442442
table.init();
443443
std::vector<o2::its::Vertex> vertices;
444444
o2::its::Vertex vert0;
@@ -456,8 +456,8 @@ BOOST_AUTO_TEST_CASE(rofvertex_basic)
456456
BOOST_AUTO_TEST_CASE(rofvertex_init_with_vertices)
457457
{
458458
o2::its::ROFVertexLookupTable<2> table;
459-
table.defineLayer(0, 10, 500, 0, 0);
460-
table.defineLayer(1, 10, 500, 0, 0);
459+
table.defineLayer(0, 10, 500, 0, 0, 0);
460+
table.defineLayer(1, 10, 500, 0, 0, 0);
461461

462462
// create vertices at different timestamps
463463
std::vector<o2::its::Vertex> vertices;
@@ -479,7 +479,7 @@ BOOST_AUTO_TEST_CASE(rofvertex_init_with_vertices)
479479
BOOST_AUTO_TEST_CASE(rofvertex_max_vertices)
480480
{
481481
o2::its::ROFVertexLookupTable<1> table;
482-
table.defineLayer(0, 3, 1000, 0, 500);
482+
table.defineLayer(0, 3, 1000, 0, 0, 500);
483483

484484
std::vector<o2::its::Vertex> vertices;
485485
for (int i = 0; i < 10; ++i) {
@@ -499,10 +499,10 @@ BOOST_AUTO_TEST_CASE(rofvertex_max_vertices)
499499
BOOST_AUTO_TEST_CASE(rofvertex_vertex_more)
500500
{
501501
o2::its::ROFVertexLookupTable<4> table;
502-
table.defineLayer(0, 4, 100, 0, 0);
503-
table.defineLayer(1, 4, 100, 0, 10);
504-
table.defineLayer(2, 8, 50, 0, 0);
505-
table.defineLayer(3, 7, 50, 50, 10);
502+
table.defineLayer(0, 4, 100, 0, 0, 0);
503+
table.defineLayer(1, 4, 100, 0, 0, 10);
504+
table.defineLayer(2, 8, 50, 0, 0, 0);
505+
table.defineLayer(3, 7, 50, 50, 0, 10);
506506
table.init();
507507

508508
std::vector<o2::its::Vertex> vertices;
@@ -632,10 +632,10 @@ BOOST_AUTO_TEST_CASE(rofvertex_vertex_more)
632632
BOOST_AUTO_TEST_CASE(rofvertex_exact_compatibility)
633633
{
634634
o2::its::ROFVertexLookupTable<4> table;
635-
table.defineLayer(0, 4, 100, 0, 0);
636-
table.defineLayer(1, 4, 100, 0, 10);
637-
table.defineLayer(2, 8, 50, 0, 0);
638-
table.defineLayer(3, 7, 50, 50, 10);
635+
table.defineLayer(0, 4, 100, 0, 0, 0);
636+
table.defineLayer(1, 4, 100, 0, 0, 10);
637+
table.defineLayer(2, 8, 50, 0, 0, 0);
638+
table.defineLayer(3, 7, 50, 50, 0, 10);
639639
table.init();
640640

641641
// sorted by lower bound (timestamp - error)

0 commit comments

Comments
 (0)