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.
std::vector< o2::its::TrackITS > tracks
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
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