Project
Loading...
Searching...
No Matches
bench_Clusterizer.cxx
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
16
17#include "benchmark/benchmark.h"
18#include <random>
19#include <gsl/gsl>
20#include "MIDBase/Mapping.h"
25
26o2::mid::ColumnData& getColumn(std::vector<o2::mid::ColumnData>& patterns, uint8_t icolumn, uint8_t deId)
27{
28 for (auto& currColumn : patterns) {
29 if (currColumn.columnId == icolumn) {
30 return currColumn;
31 }
32 }
33
34 patterns.emplace_back(o2::mid::ColumnData{deId, icolumn});
35 return patterns.back();
36}
37
38bool addStrip(o2::mid::ColumnData& column, int cathode, int line, int strip)
39{
40 uint16_t pattern = column.getPattern(cathode, line);
41 uint16_t currStrip = (1 << strip);
42 if (pattern & currStrip) {
43 return false;
44 }
45 column.addStrip(strip, cathode, line);
46 return true;
47}
48
49void addNeighbour(std::vector<o2::mid::ColumnData>& patterns, o2::mid::Mapping::MpStripIndex stripIndex, int cathode,
50 int deId, const o2::mid::Mapping& midMapping, int& nAdded, int maxAdded)
51{
52 std::vector<o2::mid::Mapping::MpStripIndex> neighbours = midMapping.getNeighbours(stripIndex, cathode, deId);
53 for (auto& neigh : neighbours) {
54 o2::mid::ColumnData& column = getColumn(patterns, static_cast<uint8_t>(neigh.column), static_cast<uint8_t>(deId));
55 if (!addStrip(column, cathode, neigh.line, neigh.strip)) {
56 continue;
57 }
58 ++nAdded;
59 if (nAdded >= maxAdded) {
60 return;
61 }
62 addNeighbour(patterns, neigh, cathode, deId, midMapping, nAdded, maxAdded);
63 if (nAdded >= maxAdded) {
64 return;
65 }
66 }
67}
68
69std::vector<o2::mid::ColumnData> generateTestData(int deId, int nClusters, int clusterSize,
70 const o2::mid::Mapping& midMapping)
71{
72 int firstColumnInDE = midMapping.getFirstColumn(deId);
73
74 std::uniform_int_distribution<int> distColumn(firstColumnInDE, 6);
75
76 std::random_device rd;
77 std::mt19937 mt(rd());
78
79 std::vector<o2::mid::ColumnData> patterns;
81 std::vector<o2::mid::Mapping::MpStripIndex> neighbours;
82
83 for (int icl = 0; icl < nClusters; ++icl) {
84 int icolumn = distColumn(mt);
85 for (int cathode = 0; cathode < 2; ++cathode) {
86 int iline = (cathode == 1) ? 0 : midMapping.getFirstBoardBP(icolumn, deId);
87 int nStrips = (cathode == 0) ? 16 : midMapping.getNStripsNBP(icolumn, deId);
88 std::uniform_int_distribution<int> distStrip(0, nStrips - 1);
89 stripIndex.column = icolumn;
90 stripIndex.line = iline;
91 stripIndex.strip = distStrip(mt);
92 o2::mid::ColumnData& column = getColumn(patterns, static_cast<uint8_t>(icolumn), static_cast<uint8_t>(deId));
93 addStrip(column, cathode, iline, stripIndex.strip);
94 int nAdded = 1;
95 if (nAdded < clusterSize) {
96 addNeighbour(patterns, stripIndex, cathode, deId, midMapping, nAdded, clusterSize);
97 }
98 }
99 }
100 return patterns;
101}
102
114
115BENCHMARK_DEFINE_F(BenchClustering, clustering)
116(benchmark::State& state)
117{
118
119 int deId = state.range(0);
120 int nClusters = state.range(1);
121 int clusterSize = state.range(2);
122 double num{0};
123
124 std::vector<o2::mid::ColumnData> inputData;
125
126 for (auto _ : state) {
127 state.PauseTiming();
128 inputData = generateTestData(deId, nClusters, clusterSize, midMapping);
129 state.ResumeTiming();
130 preClusterizer.process(inputData);
131 gsl::span<const o2::mid::PreCluster> preClusters(preClusterizer.getPreClusters().data(), preClusterizer.getPreClusters().size());
132 clusterizer.process(preClusters);
133 ++num;
134 }
135
136 state.counters["num"] = benchmark::Counter(num, benchmark::Counter::kIsRate);
137}
138
139static void CustomArguments(benchmark::internal::Benchmark* bench)
140{
141 std::vector<int> deIdList = {63, 66, 67, 68, 69};
142 for (auto& deId : deIdList) {
143 for (int nClusters = 1; nClusters < 4; ++nClusters) {
144 for (int clustSize = 1; clustSize < 4; ++clustSize) {
145 bench->Args({deId, nClusters, clustSize});
146 }
147 }
148 }
149}
150
151BENCHMARK_REGISTER_F(BenchClustering, clustering)->Apply(CustomArguments)->Unit(benchmark::kNanosecond);
152
Strip pattern (aka digits)
Pre-cluster structure for MID.
Mapping for MID.
Cluster reconstruction algorithm for MID.
Pre-cluster reconstruction algorithm for MID.
std::vector< o2::mid::ColumnData > inputData
int clusterSize
void addNeighbour(std::vector< o2::mid::ColumnData > &patterns, o2::mid::Mapping::MpStripIndex stripIndex, int cathode, int deId, const o2::mid::Mapping &midMapping, int &nAdded, int maxAdded)
BENCHMARK_MAIN()
std::vector< o2::mid::ColumnData > generateTestData(int deId, int nClusters, int clusterSize, const o2::mid::Mapping &midMapping)
bool addStrip(o2::mid::ColumnData &column, int cathode, int line, int strip)
BENCHMARK_REGISTER_F(BenchClustering, clustering) -> Apply(CustomArguments) ->Unit(benchmark::kNanosecond)
int nClusters
o2::mid::ColumnData & getColumn(std::vector< o2::mid::ColumnData > &patterns, uint8_t icolumn, uint8_t deId)
benchmark::State & state
double num
o2::mid::PreClusterizer preClusterizer
o2::mid::Clusterizer clusterizer
o2::mid::Mapping midMapping
Clusterizing algorithm for MID.
Definition Clusterizer.h:38
bool init(std::function< void(size_t, size_t)> func=[](size_t, size_t) {})
int getNStripsNBP(int column, int deId) const
Definition Mapping.cxx:159
int getFirstColumn(int deId) const
Definition Mapping.cxx:169
int getFirstBoardBP(int column, int deId) const
Definition Mapping.cxx:178
std::vector< MpStripIndex > getNeighbours(const Mapping::MpStripIndex &stripIndex, int cathode, int deId) const
Definition Mapping.cxx:227
Pre-clustering algorithm for MID.
Column data structure for MID.
Definition ColumnData.h:29
void addStrip(int strip, int cathode, int line)
uint16_t getPattern(int cathode, int line) const
Indexes required to define a strip in the detection element.
Definition Mapping.h:34
int strip
Line of the local board in the column.
Definition Mapping.h:39
int line
Column in the DE.
Definition Mapping.h:38
std::random_device rd
std::array< uint16_t, 5 > pattern