17#define BOOST_TEST_MODULE midClustering
18#define BOOST_TEST_DYN_LINK
19#include <boost/test/unit_test.hpp>
22#include <boost/test/data/monomorphic.hpp>
23#include <boost/test/data/monomorphic/generators/xrange.hpp>
24#include <boost/test/data/test_case.hpp>
42 std::vector<ColumnData> columns;
46 columns.back().deId = 31;
47 columns.back().columnId = 1;
48 columns.back().setNonBendPattern(1 << 4 | 1 << 5 | 1 << 7);
49 columns.back().setBendPattern(1 << 14 | 1 << 15, 0);
50 columns.back().setBendPattern(1 << 0 | 1 << 1, 1);
52 columns.back().deId = 31;
53 columns.back().columnId = 2;
54 columns.back().setNonBendPattern(1 << 0);
55 columns.back().setBendPattern(1 << 0, 1);
59 columns.back().deId = 68;
60 columns.back().columnId = 0;
61 columns.back().setNonBendPattern(1 << 2 | 1 << 3 | 1 << 15);
62 columns.back().setBendPattern(1 << 14 | 1 << 15, 2);
63 columns.back().setBendPattern(1 << 0 | 1 << 1, 3);
65 columns.back().deId = 68;
66 columns.back().columnId = 1;
67 columns.back().setNonBendPattern(1 << 0);
68 columns.back().setBendPattern(1 << 1, 3);
72 columns.back().deId = 31;
73 columns.back().columnId = 1;
74 columns.back().setNonBendPattern(1 << 7);
75 columns.back().setBendPattern(1 << 14 | 1 << 15, 0);
76 columns.back().setBendPattern(1 << 0 | 1 << 1, 1);
78 columns.back().deId = 31;
79 columns.back().columnId = 2;
80 columns.back().setNonBendPattern(1 << 0);
81 columns.back().setBendPattern(1 << 14 | 1 << 15, 0);
82 columns.back().setBendPattern(1 << 0 | 1 << 1, 1);
85 std::cerr <<
"Event " <<
event <<
"not defined" << std::endl;
98 clus.
xCoor = -98.0417;
99 clus.
yCoor = -18.2403;
100 clus.
xErr = 1.3163814;
101 clus.
yErr = 1.3163814;
104 clus.
xCoor = -91.8856;
105 clus.
yCoor = -18.1263;
106 clus.
xErr = 1.1247177;
107 clus.
yErr = 1.2082798;
112 clus.
xCoor = -129.962;
113 clus.
yCoor = 18.2403;
114 clus.
xErr = 1.3163814;
115 clus.
yErr = 1.3163814;
118 clus.
xCoor = -101.006;
119 clus.
yCoor = 18.5823;
120 clus.
xErr = 1.1247177;
121 clus.
yErr = 1.3695948;
126 clus.
xCoor = -91.2016;
127 clus.
yCoor = -18.2403;
128 clus.
xErr = 1.3163814;
129 clus.
yErr = 1.3163814;
133 std::cerr <<
"Event " <<
event <<
"not defined" << std::endl;
144 std::cerr <<
"Id: " <<
static_cast<int>(cl1.
deId) <<
" != " <<
static_cast<int>(cl2.
deId) << std::endl;
149 std::cerr <<
"xCoor: " << cl1.
xCoor <<
" != " << cl2.
xCoor << std::endl;
154 std::cerr <<
"yCoor: " << cl1.
yCoor <<
" != " << cl2.
yCoor << std::endl;
159 std::cerr <<
"xErr: " << cl1.
xErr <<
" != " << cl2.
xErr << std::endl;
164 std::cerr <<
"yErr: " << cl1.
yErr <<
" != " << cl2.
yErr << std::endl;
183BOOST_DATA_TEST_CASE_F(
MyFixture, MID_Clustering_Fixed, boost::unit_test::data::xrange(3))
186 gsl::span<const PreCluster>
preClusters(preClusterizer.getPreClusters().data(), preClusterizer.getPreClusters().size());
192 if (clusterizer.getClusters().size() <
minNcl) {
193 minNcl = clusterizer.getClusters().size();
195 for (
size_t icl = 0; icl <
minNcl; ++icl) {
202 std::string
str[2] = {
"x",
"y"};
203 float inputPos[2] = {xPos, yPos};
207 for (
int icoor = 0; icoor < 2; ++icoor) {
208 if (err[icoor] > 5. || std::abs(recoPos[icoor] - inputPos[icoor]) > 5 * err[icoor]) {
209 std::cerr <<
str[icoor] <<
" position input " << inputPos[icoor] <<
" reco " << recoPos[icoor] <<
" sigma "
210 << err[icoor] << std::endl;
223 std::vector<ColumnData> columns;
224 for (
int cathode = 1; cathode >= 0; --cathode) {
229 std::vector<Mapping::MpStripIndex> neighbours = mapping.
getNeighbours(stripIndex, cathode, deId);
230 neighbours.push_back(stripIndex);
231 for (
auto& neigh : neighbours) {
233 for (
auto& currCol : columns) {
234 if (currCol.columnId == neigh.column) {
235 columnStruct = &currCol;
246 columnStruct = &columns.back();
247 columnStruct->
deId = deId;
248 columnStruct->
columnId = neigh.column;
250 columnStruct->
addStrip(neigh.strip, cathode, neigh.line);
256BOOST_DATA_TEST_CASE_F(MyFixture, MID_Clustering_Random, boost::unit_test::data::xrange(72), deId)
258 std::random_device
rd;
260 std::uniform_real_distribution<float>
distX(-127.5, 127.5);
261 std::uniform_real_distribution<float>
distY(-68., 68.);
263 for (
int ievt = 0; ievt < 1000; ++ievt) {
266 std::vector<ColumnData> columns =
getFiredStrips(xPos, yPos, deId, mapping);
267 if (columns.size() == 0) {
271 preClusterizer.process(columns);
272 gsl::span<const PreCluster>
preClusters(preClusterizer.getPreClusters().data(), preClusterizer.getPreClusters().size());
274 BOOST_TEST(clusterizer.getClusters().size() == 1);
276 for (
const auto& clus : clusterizer.
getClusters()) {
Strip pattern (aka digits)
Cluster reconstruction algorithm for MID.
Pre-cluster reconstruction algorithm for MID.
Clusterizing algorithm for MID.
bool init(std::function< void(size_t, size_t)> func=[](size_t, size_t) {})
MpStripIndex stripByPosition(double xPos, double yPos, int cathode, int deId, bool warn=true) const
std::vector< MpStripIndex > getNeighbours(const Mapping::MpStripIndex &stripIndex, int cathode, int deId) const
PreClusterizer preClusterizer
Pre-clustering algorithm for MID.
GLenum GLint GLint * precision
std::vector< ColumnData > getFiredStrips(float xPos, float yPos, int deId, const Mapping &mapping)
bool isWithinUncertainties(float xPos, float yPos, const Cluster &cl)
std::uniform_real_distribution< float > distX(-127.5, 127.5)
std::uniform_real_distribution< float > distY(-68., 68.)
BOOST_TEST(clusters.size()==clusterizer.getClusters().size())
bool areClustersEqual(const Cluster &cl1, const Cluster &cl2)
std::vector< Cluster > clusters
std::vector< Cluster > getClusters(int event)
gsl::span< const PreCluster > preClusters(preClusterizer.getPreClusters().data(), preClusterizer.getPreClusters().size())
std::vector< ColumnData > getColumnsFixed(int event)
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
cluster structure for MID
float yErr
Cluster resolution along y.
float xErr
Cluster resolution along x.
uint8_t deId
Detection element ID.
Column data structure for MID.
uint8_t columnId
Column in DE.
void addStrip(int strip, int cathode, int line)
uint8_t deId
Index of the detection element.
Indexes required to define a strip in the detection element.
bool isValid()
Check if Strip is Valid.