91
std::vector<SciFiSpacePoint*> set_up_multiple_track_spacepoints() {
92
// Here we use the npe just to keep track of which tracker and
93
// track number each sp belongs to
94
std::vector<SciFiSpacePoint*> spnts_t1_trk1;
95
for ( size_t i = 0; i < 5; ++i ) {
96
spnts_t1_trk1.push_back(new SciFiSpacePoint());
97
spnts_t1_trk1[i]->set_tracker(0);
98
spnts_t1_trk1[i]->set_station(5-i);
99
spnts_t1_trk1[i]->set_used(false);
100
spnts_t1_trk1[i]->set_npe(11);
102
std::vector<SciFiSpacePoint*> spnts_t1_trk2;
103
for ( size_t i = 0; i < 5; ++i ) {
104
spnts_t1_trk2.push_back(new SciFiSpacePoint());
105
spnts_t1_trk2[i]->set_tracker(0);
106
spnts_t1_trk2[i]->set_station(5-i);
107
spnts_t1_trk2[i]->set_used(false);
108
spnts_t1_trk2[i]->set_npe(12);
110
std::vector<SciFiSpacePoint*> spnts_t1_trk3;
111
for ( size_t i = 0; i < 5; ++i ) {
112
spnts_t1_trk3.push_back(new SciFiSpacePoint());
113
spnts_t1_trk3[i]->set_tracker(0);
114
spnts_t1_trk3[i]->set_station(5-i);
115
spnts_t1_trk3[i]->set_used(false);
116
spnts_t1_trk3[i]->set_npe(13);
118
std::vector<SciFiSpacePoint*> spnts_t1_trk4;
119
for ( size_t i = 0; i < 5; ++i ) {
120
spnts_t1_trk4.push_back(new SciFiSpacePoint());
121
spnts_t1_trk4[i]->set_tracker(0);
122
spnts_t1_trk4[i]->set_station(5-i);
123
spnts_t1_trk4[i]->set_used(false);
124
spnts_t1_trk4[i]->set_npe(14);
127
std::vector<SciFiSpacePoint*> spnts_t2_trk1;
128
for ( size_t i = 0; i < 5; ++i ) {
129
spnts_t2_trk1.push_back(new SciFiSpacePoint());
130
spnts_t2_trk1[i]->set_tracker(1);
131
spnts_t2_trk1[i]->set_station(i+1);
132
spnts_t2_trk1[i]->set_used(false);
133
spnts_t2_trk1[i]->set_npe(21);
135
std::vector<SciFiSpacePoint*> spnts_t2_trk2;
136
for ( size_t i = 0; i < 5; ++i ) {
137
spnts_t2_trk2.push_back(new SciFiSpacePoint());
138
spnts_t2_trk2[i]->set_tracker(1);
139
spnts_t2_trk2[i]->set_station(i+1);
140
spnts_t2_trk2[i]->set_used(false);
141
spnts_t2_trk2[i]->set_npe(22);
143
std::vector<SciFiSpacePoint*> spnts_t2_trk3;
144
for ( size_t i = 0; i < 5; ++i ) {
145
spnts_t2_trk3.push_back(new SciFiSpacePoint());
146
spnts_t2_trk3[i]->set_tracker(1);
147
spnts_t2_trk3[i]->set_station(i+1);
148
spnts_t2_trk3[i]->set_used(false);
149
spnts_t2_trk3[i]->set_npe(23);
151
std::vector<SciFiSpacePoint*> spnts_t2_trk4;
152
for ( size_t i = 0; i < 5; ++i ) {
153
spnts_t2_trk4.push_back(new SciFiSpacePoint());
154
spnts_t2_trk4[i]->set_tracker(1);
155
spnts_t2_trk4[i]->set_station(i+1);
156
spnts_t2_trk4[i]->set_used(false);
157
spnts_t2_trk4[i]->set_npe(24);
161
spnts_t1_trk1[0]->set_position(ThreeVector(0.0, 66.44, 1100.0));
162
spnts_t1_trk1[1]->set_position(ThreeVector(-26.4, 47.46, 750.5));
163
spnts_t1_trk1[2]->set_position(ThreeVector(-2.491, 28.47, 450.5));
164
spnts_t1_trk1[3]->set_position(ThreeVector(14.45, 49.18, 200.6));
165
spnts_t1_trk1[4]->set_position(ThreeVector(1.993, 69.03, 0.6523));
167
spnts_t2_trk1[0]->set_position(ThreeVector(-26.4, 56.09, 0.6523));
168
spnts_t2_trk1[1]->set_position(ThreeVector(-25.9, -1.726, 200.7));
169
spnts_t2_trk1[2]->set_position(ThreeVector(43.84, -17.26, 450.7));
170
spnts_t2_trk1[3]->set_position(ThreeVector(57.79, 63.85, 750.7));
171
spnts_t2_trk1[4]->set_position(ThreeVector(-32.38, 47.46, 1101));
174
spnts_t1_trk2[0]->set_position(ThreeVector(-16.44, 15.53, 1100.0));
175
spnts_t1_trk2[1]->set_position(ThreeVector(-19.93, 10.35, 750.5 ));
176
spnts_t1_trk2[2]->set_position(ThreeVector(-15.44, 9.491, 450.5));
177
spnts_t1_trk2[3]->set_position(ThreeVector(-15.44, 12.94, 200.6));
178
spnts_t1_trk2[4]->set_position(ThreeVector(-18.93, 13.81, 0.6523));
180
spnts_t2_trk2[0]->set_position(ThreeVector(-4.982, 15.53, 0.6523));
181
spnts_t2_trk2[1]->set_position(ThreeVector(-12.7, -5.609, 200.7));
182
spnts_t2_trk2[2]->set_position(ThreeVector(10.71, -20.28, 450.7));
183
spnts_t2_trk2[3]->set_position(ThreeVector(23.41, 9.491, 750.7));
184
spnts_t2_trk2[4]->set_position(ThreeVector(-12.95, 5.177, 1101 ));
187
spnts_t1_trk3[0]->set_position(ThreeVector(-50.81, -23.3, 1100));
188
spnts_t1_trk3[1]->set_position(ThreeVector(33.88, 8.628, 750.5));
189
spnts_t1_trk3[2]->set_position(ThreeVector(-41.35, 44.01, 450.5));
190
spnts_t1_trk3[3]->set_position(ThreeVector(-43.84, -31.06, 200.6));
191
spnts_t1_trk3[4]->set_position(ThreeVector(18.93, -27.61, 0.6523 ));
193
spnts_t2_trk3[0]->set_position(ThreeVector(-3.487, 47.46, 0.6523 ));
194
spnts_t2_trk3[1]->set_position(ThreeVector(13.95, 24.16, 200.7));
195
spnts_t2_trk3[2]->set_position(ThreeVector(40.85, 44.87, 450.7));
196
spnts_t2_trk3[3]->set_position(ThreeVector(8.469, 61.26, 750.7 ));
197
spnts_t2_trk3[4]->set_position(ThreeVector(18.43, 26.75, 1101 ));
200
spnts_t1_trk4[0]->set_position(ThreeVector(-0.4982, 31.06, 1100));
201
spnts_t1_trk4[1]->set_position(ThreeVector(-9.465, -0.8628, 750.5));
202
spnts_t1_trk4[2]->set_position(ThreeVector(20.42, 4.314, 450.5));
203
spnts_t1_trk4[3]->set_position(ThreeVector(11.46, 30.2, 200.6));
204
spnts_t1_trk4[4]->set_position(ThreeVector(-9.465, 25.02, 0.6523));
206
spnts_t2_trk4[0]->set_position(ThreeVector(-2.491, -19.85, 0.6523));
207
spnts_t2_trk4[1]->set_position(ThreeVector(12.95, -24.16, 200.7));
208
spnts_t2_trk4[2]->set_position(ThreeVector(18.93, -6.903, 450.7));
209
spnts_t2_trk4[3]->set_position(ThreeVector(-2.491, -4.314, 750.7));
210
spnts_t2_trk4[4]->set_position(ThreeVector(7.971, -25.89, 1101.0));
212
std::vector<SciFiSpacePoint*> spnts(spnts_t1_trk1);
213
spnts.insert(spnts.end(), spnts_t1_trk2.begin(), spnts_t1_trk2.end());
214
spnts.insert(spnts.end(), spnts_t1_trk3.begin(), spnts_t1_trk3.end());
215
spnts.insert(spnts.end(), spnts_t1_trk4.begin(), spnts_t1_trk4.end());
216
spnts.insert(spnts.end(), spnts_t2_trk1.begin(), spnts_t2_trk1.end());
217
spnts.insert(spnts.end(), spnts_t2_trk2.begin(), spnts_t2_trk2.end());
218
spnts.insert(spnts.end(), spnts_t2_trk3.begin(), spnts_t2_trk3.end());
219
spnts.insert(spnts.end(), spnts_t2_trk4.begin(), spnts_t2_trk4.end());
92
225
TEST_F(PatternRecognitionTest, test_constructor) {
219
TEST_F(PatternRecognitionTest, test_multiple_evts_per_trigger) {
356
TEST_F(PatternRecognitionTest, test_multiple_evts_per_trigger_lsq) {
221
358
PatternRecognition pr;
222
359
pr.set_parameters_to_default();
360
pr.set_circle_fitter(0);
224
362
// Set up the spacepoints vector
225
std::vector<SciFiSpacePoint*> spnts_t1_trk1;
226
for ( size_t i = 0; i < 5; ++i ) {
227
spnts_t1_trk1.push_back(new SciFiSpacePoint());
228
spnts_t1_trk1[i]->set_tracker(0);
229
spnts_t1_trk1[i]->set_station(5-i);
230
spnts_t1_trk1[i]->set_used(false);
232
std::vector<SciFiSpacePoint*> spnts_t1_trk2;
233
for ( size_t i = 0; i < 5; ++i ) {
234
spnts_t1_trk2.push_back(new SciFiSpacePoint());
235
spnts_t1_trk2[i]->set_tracker(0);
236
spnts_t1_trk2[i]->set_station(5-i);
237
spnts_t1_trk2[i]->set_used(false);
239
std::vector<SciFiSpacePoint*> spnts_t1_trk3;
240
for ( size_t i = 0; i < 5; ++i ) {
241
spnts_t1_trk3.push_back(new SciFiSpacePoint());
242
spnts_t1_trk3[i]->set_tracker(0);
243
spnts_t1_trk3[i]->set_station(5-i);
244
spnts_t1_trk3[i]->set_used(false);
246
std::vector<SciFiSpacePoint*> spnts_t1_trk4;
247
for ( size_t i = 0; i < 5; ++i ) {
248
spnts_t1_trk4.push_back(new SciFiSpacePoint());
249
spnts_t1_trk4[i]->set_tracker(0);
250
spnts_t1_trk4[i]->set_station(5-i);
251
spnts_t1_trk4[i]->set_used(false);
254
std::vector<SciFiSpacePoint*> spnts_t2_trk1;
255
for ( size_t i = 0; i < 5; ++i ) {
256
spnts_t2_trk1.push_back(new SciFiSpacePoint());
257
spnts_t2_trk1[i]->set_tracker(1);
258
spnts_t2_trk1[i]->set_station(i+1);
259
spnts_t2_trk1[i]->set_used(false);
261
std::vector<SciFiSpacePoint*> spnts_t2_trk2;
262
for ( size_t i = 0; i < 5; ++i ) {
263
spnts_t2_trk2.push_back(new SciFiSpacePoint());
264
spnts_t2_trk2[i]->set_tracker(1);
265
spnts_t2_trk2[i]->set_station(i+1);
266
spnts_t2_trk2[i]->set_used(false);
268
std::vector<SciFiSpacePoint*> spnts_t2_trk3;
269
for ( size_t i = 0; i < 5; ++i ) {
270
spnts_t2_trk3.push_back(new SciFiSpacePoint());
271
spnts_t2_trk3[i]->set_tracker(1);
272
spnts_t2_trk3[i]->set_station(i+1);
273
spnts_t2_trk3[i]->set_used(false);
275
std::vector<SciFiSpacePoint*> spnts_t2_trk4;
276
for ( size_t i = 0; i < 5; ++i ) {
277
spnts_t2_trk4.push_back(new SciFiSpacePoint());
278
spnts_t2_trk4[i]->set_tracker(1);
279
spnts_t2_trk4[i]->set_station(i+1);
280
spnts_t2_trk4[i]->set_used(false);
285
spnts_t1_trk1[0]->set_position(ThreeVector(0.0, 66.44, 1100.0));
286
spnts_t1_trk1[1]->set_position(ThreeVector(-26.4, 47.46, 750.5));
287
spnts_t1_trk1[2]->set_position(ThreeVector(-2.491, 28.47, 450.5));
288
spnts_t1_trk1[3]->set_position(ThreeVector(14.45, 49.18, 200.6));
289
spnts_t1_trk1[4]->set_position(ThreeVector(1.993, 69.03, 0.6523));
291
spnts_t2_trk1[0]->set_position(ThreeVector(-26.4, 56.09, 0.6523));
292
spnts_t2_trk1[1]->set_position(ThreeVector(-25.9, -1.726, 200.7));
293
spnts_t2_trk1[2]->set_position(ThreeVector(43.84, -17.26, 450.7));
294
spnts_t2_trk1[3]->set_position(ThreeVector(57.79, 63.85, 750.7));
295
spnts_t2_trk1[4]->set_position(ThreeVector(-32.38, 47.46, 1101));
298
spnts_t1_trk2[0]->set_position(ThreeVector(-16.44, 15.53, 1100.0));
299
spnts_t1_trk2[1]->set_position(ThreeVector(-19.93, 10.35, 750.5 ));
300
spnts_t1_trk2[2]->set_position(ThreeVector(-15.44, 9.491, 450.5));
301
spnts_t1_trk2[3]->set_position(ThreeVector(-15.44, 12.94, 200.6));
302
spnts_t1_trk2[4]->set_position(ThreeVector(-18.93, 13.81, 0.6523));
304
spnts_t2_trk2[0]->set_position(ThreeVector(-4.982, 15.53, 0.6523));
305
spnts_t2_trk2[1]->set_position(ThreeVector(-12.7, -5.609, 200.7));
306
spnts_t2_trk2[2]->set_position(ThreeVector(10.71, -20.28, 450.7));
307
spnts_t2_trk2[3]->set_position(ThreeVector(23.41, 9.491, 750.7));
308
spnts_t2_trk2[4]->set_position(ThreeVector(-12.95, 5.177, 1101 ));
311
spnts_t1_trk3[0]->set_position(ThreeVector(-50.81, -23.3, 1100));
312
spnts_t1_trk3[1]->set_position(ThreeVector(33.88, 8.628, 750.5));
313
spnts_t1_trk3[2]->set_position(ThreeVector(-41.35, 44.01, 450.5));
314
spnts_t1_trk3[3]->set_position(ThreeVector(-43.84, -31.06, 200.6));
315
spnts_t1_trk3[4]->set_position(ThreeVector(18.93, -27.61, 0.6523 ));
317
spnts_t2_trk3[0]->set_position(ThreeVector(-3.487, 47.46, 0.6523 ));
318
spnts_t2_trk3[1]->set_position(ThreeVector(13.95, 24.16, 200.7));
319
spnts_t2_trk3[2]->set_position(ThreeVector(40.85, 44.87, 450.7));
320
spnts_t2_trk3[3]->set_position(ThreeVector(8.469, 61.26, 750.7 ));
321
spnts_t2_trk3[4]->set_position(ThreeVector(18.43, 26.75, 1101 ));
324
spnts_t1_trk4[0]->set_position(ThreeVector(-0.4982, 31.06, 1100));
325
spnts_t1_trk4[1]->set_position(ThreeVector(-9.465, -0.8628, 750.5));
326
spnts_t1_trk4[2]->set_position(ThreeVector(20.42, 4.314, 450.5));
327
spnts_t1_trk4[3]->set_position(ThreeVector(11.46, 30.2, 200.6));
328
spnts_t1_trk4[4]->set_position(ThreeVector(-9.465, 25.02, 0.6523));
330
spnts_t2_trk4[0]->set_position(ThreeVector(-2.491, -19.85, 0.6523));
331
spnts_t2_trk4[1]->set_position(ThreeVector(12.95, -24.16, 200.7));
332
spnts_t2_trk4[2]->set_position(ThreeVector(18.93, -6.903, 450.7));
333
spnts_t2_trk4[3]->set_position(ThreeVector(-2.491, -4.314, 750.7));
334
spnts_t2_trk4[4]->set_position(ThreeVector(7.971, -25.89, 1101.0));
336
std::vector<SciFiSpacePoint*> spnts(spnts_t1_trk1);
337
spnts.insert(spnts.end(), spnts_t1_trk2.begin(), spnts_t1_trk2.end());
338
spnts.insert(spnts.end(), spnts_t1_trk3.begin(), spnts_t1_trk3.end());
339
spnts.insert(spnts.end(), spnts_t1_trk4.begin(), spnts_t1_trk4.end());
340
spnts.insert(spnts.end(), spnts_t2_trk1.begin(), spnts_t2_trk1.end());
341
spnts.insert(spnts.end(), spnts_t2_trk2.begin(), spnts_t2_trk2.end());
342
spnts.insert(spnts.end(), spnts_t2_trk3.begin(), spnts_t2_trk3.end());
343
spnts.insert(spnts.end(), spnts_t2_trk4.begin(), spnts_t2_trk4.end());
363
std::vector<SciFiSpacePoint*> spnts = set_up_multiple_track_spacepoints();
345
365
evt1.set_spacepoints(spnts);
385
413
EXPECT_NEAR(htrks[5]->get_dsdz(), 0.3126, 0.001);
386
414
EXPECT_NEAR(htrks[6]->get_dsdz(), 0.08396, 0.001);
387
415
EXPECT_NEAR(htrks[7]->get_dsdz(), 0.1257, 0.001);
389
// evt descoping will delete the spacepoints
418
TEST_F(PatternRecognitionTest, test_multiple_evts_per_trigger_rootfit) {
420
PatternRecognition pr;
421
pr.set_parameters_to_default();
422
pr.set_circle_fitter(1);
424
// Set up the spacepoints vector
425
std::vector<SciFiSpacePoint*> spnts = set_up_multiple_track_spacepoints();
427
evt1.set_spacepoints(spnts);
429
// Randomise things a bit to make it harder
430
SciFiSpacePoint *sp1, *sp2;
441
pr.set_up_helical_pr_on(true);
442
pr.set_down_helical_pr_on(true);
443
pr.set_up_straight_pr_on(false);
444
pr.set_down_straight_pr_on(false);
447
std::vector<SciFiStraightPRTrack*> strks;
448
std::vector<SciFiHelicalPRTrack*> htrks;
449
strks = evt1.straightprtracks();
450
htrks = evt1.helicalprtracks();
452
ASSERT_EQ(8u, htrks.size());
453
EXPECT_EQ(0u, strks.size());
454
EXPECT_EQ(5, htrks[0]->get_num_points());
455
EXPECT_EQ(5, htrks[1]->get_num_points());
456
EXPECT_EQ(5, htrks[2]->get_num_points());
457
EXPECT_EQ(5, htrks[3]->get_num_points());
458
EXPECT_EQ(5, htrks[4]->get_num_points());
459
EXPECT_EQ(5, htrks[5]->get_num_points());
460
EXPECT_EQ(5, htrks[6]->get_num_points());
461
EXPECT_EQ(5, htrks[7]->get_num_points());
462
// Check npe, which we used to encode which sp belongs to which tracks
463
for (SciFiHelicalPRTrack* trk : htrks) {
464
std::vector<SciFiSpacePoint*> spnts = trk->get_spacepoints_pointers();
465
EXPECT_NEAR(spnts[1]->get_npe(), spnts[0]->get_npe(), 0.01);
466
EXPECT_NEAR(spnts[2]->get_npe(), spnts[0]->get_npe(), 0.01);
467
EXPECT_NEAR(spnts[3]->get_npe(), spnts[0]->get_npe(), 0.01);
468
EXPECT_NEAR(spnts[4]->get_npe(), spnts[0]->get_npe(), 0.01);
470
EXPECT_NEAR(htrks[0]->get_dsdz(), -0.342, 0.01);
471
EXPECT_NEAR(htrks[1]->get_dsdz(), -0.1156, 0.005);
472
EXPECT_NEAR(htrks[2]->get_dsdz(), -0.01834, 0.01);
473
EXPECT_NEAR(htrks[3]->get_dsdz(), -0.1178, 0.01);
474
EXPECT_NEAR(htrks[4]->get_dsdz(), 0.08396, 0.001);
475
EXPECT_NEAR(htrks[5]->get_dsdz(), 0.3126, 0.001);
476
EXPECT_NEAR(htrks[6]->get_dsdz(), 0.1257, 0.001);
477
EXPECT_NEAR(htrks[7]->get_dsdz(), 0.1504, 0.001);
392
480
TEST_F(PatternRecognitionTest, test_make_tracks) {
394
482
// Set up the spacepoints vector
395
std::vector<SciFiSpacePoint*> spnts_all = set_up_spacepoints();
483
std::vector<SciFiSpacePoint*> spnts_all = set_up_single_track_spacepoints();
396
484
std::vector<SciFiSpacePoint*> spnts;
397
485
spnts.push_back(spnts_all[4]);
398
486
spnts.push_back(spnts_all[1]);
740
TEST_F(PatternRecognitionTest, test_make_straight_tracks) {
744
PatternRecognition pr;
745
pr.set_parameters_to_default();
747
// Set up the spacepoints vector
748
std::vector<SciFiSpacePoint*> spnts = set_up_spacepoints();
828
TEST_F(PatternRecognitionTest, test_make_straight_tracks_lsq) {
832
PatternRecognition pr;
833
pr.set_parameters_to_default();
834
pr.set_line_fitter(0);
836
// Set up the spacepoints vector
837
std::vector<SciFiSpacePoint*> spnts = set_up_single_track_spacepoints();
839
// Set up the spacepoints by station 2D vector
840
std::vector< std::vector<SciFiSpacePoint*> > spnts_by_station(n_stations);
841
SciFiTools::sort_by_station(spnts, spnts_by_station);
843
// Check the spacepoints have setup correctly
844
EXPECT_EQ(spnts[0], spnts_by_station[0][0]);
845
EXPECT_EQ(spnts[1], spnts_by_station[1][0]);
846
EXPECT_EQ(spnts[2], spnts_by_station[2][0]);
847
EXPECT_EQ(spnts[3], spnts_by_station[3][0]);
848
EXPECT_EQ(spnts[4], spnts_by_station[4][0]);
849
EXPECT_EQ(-68.24883333333334, spnts_by_station[0][0]->get_position().x());
851
std::vector<int> ignore_stations;
852
std::vector<SciFiStraightPRTrack*> strks;
854
// The track parameters that should be reconstructed from the spacepoints
856
double x_chisq = 22.87148204;
857
double y_chisq = 20.99052559;
858
double y0 = -58.85201389;
859
double x0 = -68.94108927;
860
double my = 0.03755825;
861
double mx = -0.02902014;
863
// Make the track from the spacepoints
864
pr.make_straight_tracks(num_points, tracker_num, ignore_stations, spnts_by_station, strks);
866
// Check it matches to within a tolerance epsilon
867
double epsilon = 0.000001;
868
EXPECT_EQ(1u, strks.size());
869
EXPECT_NEAR(x0, strks[0]->get_x0(), epsilon);
870
EXPECT_NEAR(mx, strks[0]->get_mx(), epsilon);
871
EXPECT_NEAR(x_chisq, strks[0]->get_x_chisq(), epsilon);
872
EXPECT_NEAR(y0, strks[0]->get_y0(), epsilon);
873
EXPECT_NEAR(my, strks[0]->get_my(), epsilon);
874
EXPECT_NEAR(y_chisq, strks[0]->get_y_chisq(), epsilon);
877
std::vector<SciFiSpacePoint*>::iterator it;
878
for (it = spnts.begin(); it != spnts.end(); ++it) {
881
std::vector<SciFiStraightPRTrack*>::iterator strack;
882
for (strack = strks.begin(); strack != strks.end(); ++strack) {
887
TEST_F(PatternRecognitionTest, test_make_straight_tracks_rootfit) {
891
PatternRecognition pr;
892
pr.set_parameters_to_default();
893
pr.set_line_fitter(1);
895
// Set up the spacepoints vector
896
std::vector<SciFiSpacePoint*> spnts = set_up_single_track_spacepoints();
750
898
// Set up the spacepoints by station 2D vector
751
899
std::vector< std::vector<SciFiSpacePoint*> > spnts_by_station(n_stations);