Project
Loading...
Searching...
No Matches
testTracker.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#define BOOST_TEST_MODULE midTracking
18#define BOOST_TEST_DYN_LINK
19#include <boost/test/unit_test.hpp>
20
21#include <boost/test/data/monomorphic/generators/xrange.hpp>
22#include <boost/test/data/test_case.hpp>
23#include <cstdint>
24#include <string>
25#include <sstream>
26#include <vector>
29#include "MIDBase/HitFinder.h"
30#include "MIDBase/Mapping.h"
31#include "MIDBase/MpArea.h"
33#include "MIDTracking/Tracker.h"
35
36namespace o2
37{
38namespace mid
39{
40
43 std::vector<Cluster> clusters;
45 bool isReconstructible() { return nFiredChambers > 2; }
46};
47
63
64static Helper helper;
65
67{
68 TrackClusters trCl;
69 trCl.track = track;
70 trCl.nFiredChambers = 0;
71 Mapping::MpStripIndex stripIndex;
72 MpArea area;
73 Cluster cl;
74 for (int ich = 0; ich < 4; ++ich) {
75 auto hits = helper.hitFinder.getLocalPositions(track, ich);
76 bool isFired = false;
77 for (auto& hit : hits) {
78 int deId = hit.deId;
79 float xPos = hit.xCoor;
80 float yPos = hit.yCoor;
81 stripIndex = helper.mapping.stripByPosition(xPos, yPos, 0, deId, false);
82 if (!stripIndex.isValid()) {
83 continue;
84 }
85 cl.deId = deId;
86 cl.zCoor = 0.;
87 area = helper.mapping.stripByLocation(stripIndex.strip, 0, stripIndex.line, stripIndex.column, deId);
88 cl.yCoor = area.getCenterY();
89 cl.yErr = area.getHalfSizeY() / std::sqrt(3.);
90 stripIndex = helper.mapping.stripByPosition(xPos, yPos, 1, deId, false);
91 area = helper.mapping.stripByLocation(stripIndex.strip, 1, stripIndex.line, stripIndex.column, deId);
92 cl.xCoor = area.getCenterX();
93 cl.xErr = area.getHalfSizeX() / std::sqrt(3.);
94 cl.setBothFired();
95 trCl.clusters.push_back(cl);
96 isFired = true;
97 } // loop on fired pos
98 if (isFired) {
99 ++(trCl.nFiredChambers);
100 }
101 }
102 return trCl;
103}
104
105std::vector<TrackClusters> getTrackClusters(int nTracks)
106{
107 std::vector<TrackClusters> trackClusters;
108 std::vector<Track> tracks = helper.trackGen.generate(nTracks);
109 for (auto& track : tracks) {
110 trackClusters.push_back(getTrackClusters(track));
111 }
112 return trackClusters;
113}
114
115std::string getTrackInfo(const Track& track)
116{
117 std::stringstream ss;
118 ss << track << " clusters: ";
119 for (int ich = 0; ich < 4; ++ich) {
120 ss << " " << track.getClusterMatched(ich);
121 }
122 return ss.str();
123}
124
125BOOST_DATA_TEST_CASE(TestMultipleTracks, boost::unit_test::data::xrange(1, 9), nTracksPerEvent)
126{
127 float chi2Cut = helper.tracker.getSigmaCut() * helper.tracker.getSigmaCut();
129 for (int ievt = 0; ievt < 1000; ++ievt) {
130 std::vector<TrackClusters> trackClusters = getTrackClusters(nTracksPerEvent);
131 std::vector<Cluster> clusters;
132
133 // Fill string for debugging
134 std::stringstream ss;
135 ss << "\n";
136 int itr = -1;
137 for (auto& trCl : trackClusters) {
138 ++itr;
139 ss << "Track " << itr << ": " << trCl.track << "\n";
140 for (auto& cl : trCl.clusters) {
141 clusters.push_back(cl);
142 ss << " deId " << (int)cl.deId << " pos: (" << cl.xCoor << ", " << cl.yCoor << ")";
143 }
144 ss << "\n";
145 }
146
147 // Run tracker algorithm
148 helper.tracker.process(clusters);
149
150 // Further strings for debugging
151 ss << " Reconstructed tracks:\n";
152 for (size_t ireco = 0; ireco < helper.tracker.getTracks().size(); ++ireco) {
153 ss << " " << helper.tracker.getTracks()[ireco] << "\n";
154 }
155
156 // Check that all reconstructible tracks are reconstructed
157 size_t nReconstructible = 0;
158 itr = -1;
159 for (auto& trCl : trackClusters) {
160 ++itr;
161 bool isReco = false;
162 for (size_t ireco = 0; ireco < helper.tracker.getTracks().size(); ++ireco) {
163 if (helper.tracker.getTracks()[ireco].isCompatible(trCl.track, chi2Cut)) {
164 isReco = true;
165 break;
166 }
167 }
168 bool isReconstructible = trCl.isReconstructible();
169 // If the number of tracks is small, we can check that:
170 // 1) all reconstructible tracks are reconstructed
171 // 2) all non-reconstructible tracks are not
172 // Case 2), however, is not always valid when we have many tracks,
173 // since we can combine clusters from different tracks to build fakes
174 bool testTrack = (isReconstructible || nTracksPerEvent < 4);
175 if (testTrack) {
176 BOOST_TEST(isReco == isReconstructible, ss.str() << " track " << itr << " reco " << isReco
177 << " != reconstructible " << isReconstructible);
178 }
179 if (isReconstructible) {
181 }
182 } // loop on input tracks
184 int nFakes = helper.tracker.getTracks().size() - nReconstructible;
185 if (nFakes > 0) {
186 ++nTotFakes;
187 }
188 } // loop on events
189 // To show the following message, run the test with: --log_level=message
190 BOOST_TEST_MESSAGE("Fraction of fake tracks: " << (double)nTotFakes / (double)nTotReconstructible);
191}
192
193BOOST_DATA_TEST_CASE(TestAlgorithms, boost::unit_test::data::xrange(2, 3), nTracksPerEvent)
194{
195 float chi2Cut = helper.tracker.getSigmaCut() * helper.tracker.getSigmaCut();
196 int nTotFakes = 0, nTotReconstructible = 0;
197 for (int ievt = 0; ievt < 1000; ++ievt) {
198 std::vector<TrackClusters> trackClusters = getTrackClusters(nTracksPerEvent);
199 std::vector<Cluster> clusters;
200 for (auto& trCl : trackClusters) {
201 for (auto& cl : trCl.clusters) {
202 clusters.push_back(cl);
203 }
204 }
205
206 // Run tracker algorithm
207 helper.tracker.process(clusters);
209
210 BOOST_TEST(helper.tracker.getTracks().size() <= helper.trackerAll.getTracks().size());
211
212 for (auto& track : helper.tracker.getTracks()) {
213 bool isCompatible = false;
214 std::stringstream ss;
215 ss << "\n"
216 << getTrackInfo(track) << " has no match in:\n";
217 for (auto& trackAll : helper.trackerAll.getTracks()) {
218 ss << getTrackInfo(trackAll) << "\n";
219 if (trackAll.isCompatible(track, chi2Cut)) {
220 isCompatible = true;
221 break;
222 }
223 }
224 BOOST_TEST(isCompatible, ss.str());
225 }
226 }
227}
228
229BOOST_AUTO_TEST_CASE(TestHitMapBuilder)
230{
231 for (int ievt = 0; ievt < 100; ++ievt) {
232 std::vector<TrackClusters> trackClusters = getTrackClusters(1);
233 for (auto& trCl : trackClusters) {
234 // Run tracker algorithm
235 helper.tracker.process(trCl.clusters);
236 std::vector<Track> tracks = helper.tracker.getTracks();
237 for (auto& track : tracks) {
238 helper.hitMapBuilder.buildTrackInfo(track, trCl.clusters);
239 BOOST_TEST(track.getEfficiencyFlag() >= 1);
240 }
241 }
242 }
243}
244} // namespace mid
245} // namespace o2
Reconstructed MID cluster.
Reconstructed MID track.
Hit finder for MID.
Utility to build the MID track hit maps.
Mapping for MID.
Track reconstruction algorithm for MID.
Mapping area for MID.
Fast track generator for MID.
Class to find the impact point of a track on the chamber.
Definition HitFinder.h:31
std::vector< Cluster > getLocalPositions(const Track &track, int chamber, bool withUncertainties=false) const
Hit map builder for MID.
void buildTrackInfo(Track &track, gsl::span< const Cluster > clusters) const
MpStripIndex stripByPosition(double xPos, double yPos, int cathode, int deId, bool warn=true) const
Definition Mapping.cxx:592
MpArea stripByLocation(int strip, int cathode, int line, int column, int deId, bool warn=true) const
Definition Mapping.cxx:487
Class to generate tracks for MID.
std::vector< Track > generate()
This class defines the MID track.
Definition Track.h:30
int getClusterMatched(int chamber) const
Definition Track.cxx:47
Tracking algorithm for MID.
Definition Tracker.h:34
bool init(bool keepAll=false)
Definition Tracker.cxx:38
void process(gsl::span< const Cluster > clusters, bool accumulate=false)
Definition Tracker.cxx:109
float getSigmaCut() const
Gets number of sigmas for cuts.
Definition Tracker.h:41
const std::vector< Track > & getTracks()
Gets the array of reconstructes tracks.
Definition Tracker.h:48
GLsizeiptr size
Definition glcorearb.h:659
BOOST_TEST_MESSAGE("Fraction of fake tracks: "<<(double) nTotFakes/(double) nTotReconstructible)
unsigned long int nReconstructible
int nTotReconstructible
BOOST_DATA_TEST_CASE(MID_DigitMerger, boost::unit_test::data::make(getDEList()), deId)
TrackClusters getTrackClusters(const Track &track)
BOOST_TEST(clusters.size()==clusterizer.getClusters().size())
std::string getTrackInfo(const Track &track)
GeometryTransformer createDefaultTransformer()
std::vector< Cluster > clusters
unsigned long int nFakes
BOOST_AUTO_TEST_CASE(mask)
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
cluster structure for MID
Definition Cluster.h:30
float yErr
Cluster resolution along y.
Definition Cluster.h:35
void setBothFired()
Sets a flag specifying that both BP and NBP were fired.
Definition Cluster.h:45
float yCoor
y coordinate
Definition Cluster.h:32
float xErr
Cluster resolution along x.
Definition Cluster.h:34
float xCoor
x coordinate
Definition Cluster.h:31
uint8_t deId
Detection element ID.
Definition Cluster.h:36
float zCoor
z coordinate
Definition Cluster.h:33
HitMapBuilder hitMapBuilder
GeometryTransformer geoTrans
TrackGenerator trackGen
HitFinder hitFinder
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
bool isValid()
Check if Strip is Valid.
Definition Mapping.h:36
int line
Column in the DE.
Definition Mapping.h:38
std::vector< Cluster > clusters