53 gsl::span<const LayerId> sourceSurfaces)
56 if (
tracks.size() > std::numeric_limits<uint32_t>::max()) {
59 std::vector<uint32_t> selection;
61 selection.reserve(
tracks.size());
62 for (uint32_t globalIndex = 0; globalIndex <
tracks.size(); ++globalIndex) {
63 const auto& track =
tracks[globalIndex];
64 if (!isValidTrackRange(track,
static_cast<uint32_t
>(references.size()))) {
67 bool requested =
false;
69 for (uint32_t
i = track.firstClusterRef;
i < track.clusterRefEnd; ++
i) {
74 const bool match = std::find(sourceSurfaces.begin(), sourceSurfaces.end(),
reference.layer) != sourceSurfaces.end();
78 if (requested && foreign) {
82 selection.push_back(globalIndex);
89 const TimeFrame& frame, std::vector<uint32_t> selection,
93 for (
const auto index : selection) {
95 if (!std::isfinite(timestamp.getTimeStamp()) || !std::isfinite(timestamp.getTimeStampError()) ||
96 timestamp.getTimeStampError() <= 0.f) {
102 std::sort(selection.begin(), selection.end(), [&](uint32_t
left, uint32_t
right) {
103 const auto& leftTrack = tracks[left];
104 const auto& rightTrack = tracks[right];
105 const auto leftTime = makeOutputTimestamp(leftTrack.timestamp, clock);
106 const auto rightTime = makeOutputTimestamp(rightTrack.timestamp, clock);
107 const auto leftLower = leftTime.getTimeStamp() - leftTime.getTimeStampError();
108 const auto rightLower = rightTime.getTimeStamp() - rightTime.getTimeStampError();
109 if (leftLower != rightLower) {
110 return leftLower < rightLower;
112 return leftTrack.chi2 < rightTrack.chi2;
117inline void finalizeROFs(std::vector<o2::itsmft::ROFRecord>& rofs,
const std::vector<o2::its::TimeStamp>&
times,
120 for (
auto& rof : rofs) {
121 rof.setFirstEntry(0);
125 const int rof = context.
clock.getROF(
time);
126 if (rof < 0 ||
static_cast<size_t>(rof) >= rofs.size()) {
130 rofs[rof].setNEntries(rofs[rof].getNEntries() + 1);
132 std::vector<int> counts(rofs.size());
133 for (
size_t i = 0;
i < rofs.size(); ++
i) {
134 counts[
i] = rofs[
i].getNEntries();
136 std::exclusive_scan(counts.begin(), counts.end(), counts.begin(), 0);
137 for (
size_t i = 0;
i < rofs.size(); ++
i) {
138 rofs[
i].setFirstEntry(counts[
i]);
gsl::span< const o2::itsmft::ROFRecord > inputROFs