196
210
spnts_t2_trk2[i]->set_station(i+1);
197
211
spnts_t2_trk2[i]->set_used(false);
200
spnts_t1_trk1[0]->set_position(ThreeVector(10.46, -13.81, 1100.41));
201
spnts_t1_trk1[1]->set_position(ThreeVector(5.48, -23.30, 750.48));
202
spnts_t1_trk1[2]->set_position(ThreeVector(0.50, -14.67, 450.48));
203
spnts_t1_trk1[3]->set_position(ThreeVector(8.47, -11.22, 200.62));
204
spnts_t1_trk1[4]->set_position(ThreeVector(12.70, -14.24, 0.65));
206
spnts_t1_trk2[0]->set_position(ThreeVector(0.50, 31.06, 1100.41));
207
spnts_t1_trk2[1]->set_position(ThreeVector(9.96, 0.00, 750.48));
208
spnts_t1_trk2[2]->set_position(ThreeVector(-20.42, 6.04, 450.48));
209
spnts_t1_trk2[3]->set_position(ThreeVector(-10.96, 29.34, 200.62));
210
spnts_t1_trk2[4]->set_position(ThreeVector(9.47, 23.30, 0.65));
212
spnts_t2_trk1[0]->set_position(ThreeVector(-18.93, 1.73, 0.65));
213
spnts_t2_trk1[1]->set_position(ThreeVector(0.75, 9.92, 200.65));
214
spnts_t2_trk1[2]->set_position(ThreeVector(14.45, -12.94, 450.65));
215
spnts_t2_trk1[3]->set_position(ThreeVector(-13.95, -24.16, 750.65));
216
spnts_t2_trk1[4]->set_position(ThreeVector(-9.47, 7.77, 1100.65));
218
spnts_t2_trk2[0]->set_position(ThreeVector(6.73, -22.00, 0.65));
219
spnts_t2_trk2[1]->set_position(ThreeVector(-9.96, -24.16, 200.65));
220
spnts_t2_trk2[2]->set_position(ThreeVector(-13.95, -6.90, 450.65));
221
spnts_t2_trk2[3]->set_position(ThreeVector(5.98, -4.31, 750.65));
222
spnts_t2_trk2[4]->set_position(ThreeVector(-3.74, -23.73, 1100.65));
213
std::vector<SciFiSpacePoint*> spnts_t2_trk3;
214
for ( size_t i = 0; i < 5; ++i ) {
215
spnts_t2_trk3.push_back(new SciFiSpacePoint());
216
spnts_t2_trk3[i]->set_tracker(1);
217
spnts_t2_trk3[i]->set_station(i+1);
218
spnts_t2_trk3[i]->set_used(false);
220
std::vector<SciFiSpacePoint*> spnts_t2_trk4;
221
for ( size_t i = 0; i < 5; ++i ) {
222
spnts_t2_trk4.push_back(new SciFiSpacePoint());
223
spnts_t2_trk4[i]->set_tracker(1);
224
spnts_t2_trk4[i]->set_station(i+1);
225
spnts_t2_trk4[i]->set_used(false);
230
spnts_t1_trk1[0]->set_position(ThreeVector(0.0, 66.44, 1100.0));
231
spnts_t1_trk1[1]->set_position(ThreeVector(-26.4, 47.46, 750.5));
232
spnts_t1_trk1[2]->set_position(ThreeVector(-2.491, 28.47, 450.5));
233
spnts_t1_trk1[3]->set_position(ThreeVector(14.45, 49.18, 200.6));
234
spnts_t1_trk1[4]->set_position(ThreeVector(1.993, 69.03, 0.6523));
236
spnts_t2_trk1[0]->set_position(ThreeVector(-26.4, 56.09, 0.6523));
237
spnts_t2_trk1[1]->set_position(ThreeVector(-25.9, -1.726, 200.7));
238
spnts_t2_trk1[2]->set_position(ThreeVector(43.84, -17.26, 450.7));
239
spnts_t2_trk1[3]->set_position(ThreeVector(57.79, 63.85, 750.7));
240
spnts_t2_trk1[4]->set_position(ThreeVector(-32.38, 47.46, 1101));
243
spnts_t1_trk2[0]->set_position(ThreeVector(-16.44, 15.53, 1100.0));
244
spnts_t1_trk2[1]->set_position(ThreeVector(-19.93, 10.35, 750.5 ));
245
spnts_t1_trk2[2]->set_position(ThreeVector(-15.44, 9.491, 450.5));
246
spnts_t1_trk2[3]->set_position(ThreeVector(-15.44, 12.94, 200.6));
247
spnts_t1_trk2[4]->set_position(ThreeVector(-18.93, 13.81, 0.6523));
249
spnts_t2_trk2[0]->set_position(ThreeVector(-4.982, 15.53, 0.6523));
250
spnts_t2_trk2[1]->set_position(ThreeVector(-12.7, -5.609, 200.7));
251
spnts_t2_trk2[2]->set_position(ThreeVector(10.71, -20.28, 450.7));
252
spnts_t2_trk2[3]->set_position(ThreeVector(23.41, 9.491, 750.7));
253
spnts_t2_trk2[4]->set_position(ThreeVector(-12.95, 5.177, 1101 ));
256
spnts_t1_trk3[0]->set_position(ThreeVector(-50.81, -23.3, 1100));
257
spnts_t1_trk3[1]->set_position(ThreeVector(33.88, 8.628, 750.5));
258
spnts_t1_trk3[2]->set_position(ThreeVector(-41.35, 44.01, 450.5));
259
spnts_t1_trk3[3]->set_position(ThreeVector(-43.84, -31.06, 200.6));
260
spnts_t1_trk3[4]->set_position(ThreeVector(18.93, -27.61, 0.6523 ));
262
spnts_t2_trk3[0]->set_position(ThreeVector(-3.487, 47.46, 0.6523 ));
263
spnts_t2_trk3[1]->set_position(ThreeVector(13.95, 24.16, 200.7));
264
spnts_t2_trk3[2]->set_position(ThreeVector(40.85, 44.87, 450.7));
265
spnts_t2_trk3[3]->set_position(ThreeVector(8.469, 61.26, 750.7 ));
266
spnts_t2_trk3[4]->set_position(ThreeVector(18.43, 26.75, 1101 ));
269
spnts_t1_trk4[0]->set_position(ThreeVector(-0.4982, 31.06, 1100));
270
spnts_t1_trk4[1]->set_position(ThreeVector(-9.465, -0.8628, 750.5));
271
spnts_t1_trk4[2]->set_position(ThreeVector(20.42, 4.314, 450.5));
272
spnts_t1_trk4[3]->set_position(ThreeVector(11.46, 30.2, 200.6));
273
spnts_t1_trk4[4]->set_position(ThreeVector(-9.465, 25.02, 0.6523));
275
spnts_t2_trk4[0]->set_position(ThreeVector(-2.491, -19.85, 0.6523));
276
spnts_t2_trk4[1]->set_position(ThreeVector(12.95, -24.16, 200.7));
277
spnts_t2_trk4[2]->set_position(ThreeVector(18.93, -6.903, 450.7));
278
spnts_t2_trk4[3]->set_position(ThreeVector(-2.491, -4.314, 750.7));
279
spnts_t2_trk4[4]->set_position(ThreeVector(7.971, -25.89, 1101.0));
224
281
std::vector<SciFiSpacePoint*> spnts(spnts_t1_trk1);
225
282
spnts.insert(spnts.end(), spnts_t1_trk2.begin(), spnts_t1_trk2.end());
283
spnts.insert(spnts.end(), spnts_t1_trk3.begin(), spnts_t1_trk3.end());
284
spnts.insert(spnts.end(), spnts_t1_trk4.begin(), spnts_t1_trk4.end());
226
285
spnts.insert(spnts.end(), spnts_t2_trk1.begin(), spnts_t2_trk1.end());
227
286
spnts.insert(spnts.end(), spnts_t2_trk2.begin(), spnts_t2_trk2.end());
287
spnts.insert(spnts.end(), spnts_t2_trk3.begin(), spnts_t2_trk3.end());
288
spnts.insert(spnts.end(), spnts_t2_trk4.begin(), spnts_t2_trk4.end());
229
290
evt1.set_spacepoints(spnts);
292
// Randomise things a bit to make it harder
293
SciFiSpacePoint *sp1, *sp2;
231
304
pr.process(true, false, evt1); // Helical on, Straight off
233
306
std::vector<SciFiStraightPRTrack*> strks;
235
308
strks = evt1.straightprtracks();
236
309
htrks = evt1.helicalprtracks();
238
ASSERT_EQ(4u, htrks.size());
311
ASSERT_EQ(8u, htrks.size());
239
312
EXPECT_EQ(0u, strks.size());
240
313
EXPECT_EQ(5, htrks[0]->get_num_points());
241
314
EXPECT_EQ(5, htrks[1]->get_num_points());
242
315
EXPECT_EQ(5, htrks[2]->get_num_points());
243
316
EXPECT_EQ(5, htrks[3]->get_num_points());
244
EXPECT_NEAR(0.03771, htrks[0]->get_dsdz(), 0.001);
245
EXPECT_NEAR(0.1160, htrks[1]->get_dsdz(), 0.01);
246
EXPECT_NEAR(0.1172, htrks[2]->get_dsdz(), 0.01);
247
EXPECT_NEAR(0.07349, htrks[3]->get_dsdz(), 0.001);
317
EXPECT_EQ(5, htrks[4]->get_num_points());
318
EXPECT_EQ(5, htrks[5]->get_num_points());
319
EXPECT_EQ(5, htrks[6]->get_num_points());
320
EXPECT_EQ(5, htrks[7]->get_num_points());
321
EXPECT_NEAR(-0.1156, htrks[0]->get_dsdz(), 0.001);
322
EXPECT_NEAR(-0.01834, htrks[1]->get_dsdz(), 0.01);
323
EXPECT_NEAR(-0.342, htrks[2]->get_dsdz(), 0.01);
324
EXPECT_NEAR(-0.1178, htrks[3]->get_dsdz(), 0.01);
325
EXPECT_NEAR(0.3126, htrks[4]->get_dsdz(), 0.001);
326
EXPECT_NEAR(0.1257, htrks[5]->get_dsdz(), 0.001);
327
EXPECT_NEAR(0.1504, htrks[6]->get_dsdz(), 0.001);
328
EXPECT_NEAR(0.08396, htrks[7]->get_dsdz(), 0.001);
249
330
// evt descoping will delete the spacepoints
253
333
TEST_F(PatternRecognitionTest, test_make_tracks) {
957
1037
EXPECT_FALSE(pr.set_end_stations(ignore_stations, outer_st_num, inner_st_num));
960
TEST_F(PatternRecognitionTest, test_sort_by_station) {
962
PatternRecognition pr;
964
SciFiSpacePoint *sp1 = new SciFiSpacePoint();
965
SciFiSpacePoint *sp2 = new SciFiSpacePoint();
966
SciFiSpacePoint *sp3 = new SciFiSpacePoint();
967
SciFiSpacePoint *sp4 = new SciFiSpacePoint();
968
SciFiSpacePoint *sp5 = new SciFiSpacePoint();
976
std::vector<SciFiSpacePoint*> spnts;
977
spnts.push_back(sp5);
978
spnts.push_back(sp2);
979
spnts.push_back(sp3);
980
spnts.push_back(sp1);
981
spnts.push_back(sp4);
983
std::vector< std::vector<SciFiSpacePoint*> > spnts_by_station(5);
984
pr.sort_by_station(spnts, spnts_by_station);
985
EXPECT_EQ(sp1, spnts_by_station[0][0]);
986
EXPECT_EQ(sp2, spnts_by_station[1][0]);
987
EXPECT_EQ(sp3, spnts_by_station[2][0]);
988
EXPECT_EQ(sp4, spnts_by_station[3][0]);
989
EXPECT_EQ(sp5, spnts_by_station[4][0]);
998
TEST_F(PatternRecognitionTest, test_stations_with_unused_sp) {
1000
// Set up spacepoints, leaving station 3 empty to check function copes with an empty station
1001
SciFiSpacePoint *sp1 = new SciFiSpacePoint();
1002
SciFiSpacePoint *sp2 = new SciFiSpacePoint();
1003
// SciFiSpacePoint *sp3 = new SciFiSpacePoint();
1004
SciFiSpacePoint *sp4 = new SciFiSpacePoint();
1005
SciFiSpacePoint *sp4_1 = new SciFiSpacePoint();
1006
SciFiSpacePoint *sp5 = new SciFiSpacePoint();
1008
sp1->set_station(1);
1009
sp2->set_station(2);
1010
// sp3->set_station(3);
1011
sp4->set_station(4);
1012
sp4_1->set_station(4);
1013
sp5->set_station(5);
1015
sp1->set_used(true);
1016
sp2->set_used(true);
1017
// sp3->set_used(true);
1018
sp4->set_used(false);
1019
sp4_1->set_used(true);
1020
sp5->set_used(false);
1022
std::vector<SciFiSpacePoint*> spnts;
1023
spnts.push_back(sp5);
1024
spnts.push_back(sp2);
1025
// spnts.push_back(sp3);
1026
spnts.push_back(sp1);
1027
spnts.push_back(sp4);
1028
spnts.push_back(sp4_1);
1030
SpacePoint2dPArray spnts_by_station(5);
1032
PatternRecognition pr;
1033
pr.sort_by_station(spnts, spnts_by_station);
1034
ASSERT_EQ(5u, spnts_by_station.size());
1035
ASSERT_EQ(1u, spnts_by_station[0].size());
1036
ASSERT_EQ(1u, spnts_by_station[1].size());
1037
ASSERT_EQ(2u, spnts_by_station[3].size());
1038
ASSERT_EQ(1u, spnts_by_station[4].size());
1040
std::vector<int> stations_hit, stations_not_hit;
1041
pr.stations_with_unused_spnts(spnts_by_station, stations_hit, stations_not_hit);
1043
ASSERT_EQ(2u, stations_hit.size());
1044
ASSERT_EQ(3u, stations_not_hit.size());
1045
EXPECT_EQ(3, stations_hit[0]);
1046
EXPECT_EQ(4, stations_hit[1]);
1047
EXPECT_EQ(0, stations_not_hit[0]);
1048
EXPECT_EQ(1, stations_not_hit[1]);
1049
EXPECT_EQ(2, stations_not_hit[2]);
1051
int stats_with_unused = pr.num_stations_with_unused_spnts(spnts_by_station);
1052
EXPECT_EQ(2, stats_with_unused);
1061
1040
TEST_F(PatternRecognitionTest, test_find_dsdz) {
1063
1042
PatternRecognition pr;
1131
TEST_F(PatternRecognitionTest, test_make_3pt_circle) {
1112
TEST_F(PatternRecognitionTest, test_find_n_turns) {
1133
1114
PatternRecognition pr;
1135
SciFiSpacePoint *sp1 = new SciFiSpacePoint();
1136
SciFiSpacePoint *sp2 = new SciFiSpacePoint();
1137
SciFiSpacePoint *sp3 = new SciFiSpacePoint();
1139
// Set up spacepoints corresponding to circle of radius 2 mm, centred at (1,2)
1140
ThreeVector pos(1.0, 4.0, 0.0);
1141
sp1->set_position(pos);
1142
pos.set(3.0, 2.0, 0.0);
1143
sp2->set_position(pos);
1144
pos.set(1.0, 0.0, 0.0);
1145
sp3->set_position(pos);
1147
SimpleCircle c = pr.make_3pt_circle(sp1, sp2, sp3);
1117
double arr_z[] = {1100.41, 750.48, 450.48, 200.617, 0.6523};
1118
std::vector<double> z(arr_z, arr_z + sizeof(arr_z) / sizeof(double));
1119
double arr_phi[] = {1.80696, 3.93027, 5.81611, 1.16642, 2.39529};
1120
std::vector<double> phi(arr_phi, arr_phi + sizeof(arr_phi) / sizeof(double));
1121
std::vector<double> true_phi;
1123
pr.find_n_turns(z, phi, true_phi, charge);
1152
1124
double epsilon = 0.01;
1154
EXPECT_NEAR(c.get_x0(), x0, epsilon);
1155
EXPECT_NEAR(c.get_y0(), y0, epsilon);
1156
EXPECT_NEAR(c.get_R(), R, epsilon);
1158
// Now check for a circle of radius 2mm, centred at (0,0) (involves singular matrices)
1159
pos.set(0.0, 2.0, 0.0);
1160
sp1->set_position(pos);
1161
pos.set(2.0, 0.0, 0.0);
1162
sp2->set_position(pos);
1163
pos.set(0.0, -2.0, 0.0);
1164
sp3->set_position(pos);
1166
c = pr.make_3pt_circle(sp1, sp2, sp3);
1173
EXPECT_NEAR(c.get_x0(), x0, epsilon);
1174
EXPECT_NEAR(c.get_y0(), y0, epsilon);
1175
EXPECT_NEAR(c.get_R(), R, epsilon);
1125
ASSERT_EQ(charge, 1);
1126
ASSERT_EQ(true_phi.size(), 5);
1127
EXPECT_NEAR(true_phi[0], 1.80696, epsilon);
1128
EXPECT_NEAR(true_phi[1], 3.93027, epsilon);
1129
EXPECT_NEAR(true_phi[2], 5.81611, epsilon);
1130
EXPECT_NEAR(true_phi[3], 7.44961, epsilon);
1131
EXPECT_NEAR(true_phi[4], 8.67847, epsilon);
1182
1134
} // ~namespace MAUS