248
238
void MapCppTrackerRecon::track_fit(SciFiEvent &evt) const {
250
std::cerr << "KALMAN_TEST ACTIVE\n";
252
std::cerr << "PATREC ACTIVE\n";
253
size_t number_helical_tracks = evt.helicalprtracks().size();
254
size_t number_straight_tracks = evt.straightprtracks().size();
256
for (size_t track_i = 0; track_i < number_helical_tracks; track_i++) {
257
SciFiHelicalPRTrack* helical = evt.helicalprtracks().at(track_i);
258
SciFiSpacePointPArray spacepoints = helical->get_spacepoints_pointers();
260
Kalman::Track data_track = BuildSpacepointTrack(spacepoints, &_geometry_helper,
261
_spacepoint_recon_plane);
263
Kalman::State seed = ComputeSeed(helical, &_geometry_helper, false, _seed_value);
265
std::cerr << Kalman::print_state(seed, "Helical Seed");
266
seed.GetCovariance().Print();
268
std::cerr << "Helical Track\n";
269
print_helical(helical);
271
_spacepoint_helical_track_fitter->SetSeed(seed);
272
_spacepoint_helical_track_fitter->SetData(data_track);
274
_spacepoint_helical_track_fitter->Filter(false);
275
_spacepoint_helical_track_fitter->Smooth(false);
277
Kalman::Track predicted = _spacepoint_helical_track_fitter->GetPredicted();
278
Kalman::Track filtered = _spacepoint_helical_track_fitter->GetFiltered();
279
Kalman::Track smoothed = _spacepoint_helical_track_fitter->GetSmoothed();
280
std::cerr << "Data Track\n";
281
std::cerr << Kalman::print_track(data_track);
282
std::cerr << "Measured Predicted\n";
283
SciFiSpacepointMeasurements<5>* temp_measurement = new SciFiSpacepointMeasurements<5>(1.0);
284
for (unsigned int k = 0; k < predicted.GetLength(); ++k) {
285
Kalman::State temp_state = temp_measurement->Measure(predicted[k]);
286
std::cerr << Kalman::print_state(temp_state);
288
std::cerr << "Predicted Track\n";
289
std::cerr << Kalman::print_track(predicted);
290
std::cerr << "Filtered Track\n";
291
std::cerr << Kalman::print_track(filtered);
292
std::cerr << "Smoothed Track\n";
293
std::cerr << Kalman::print_track(smoothed);
294
delete temp_measurement;
296
SciFiTrack* track = ConvertToSciFiTrack(_spacepoint_helical_track_fitter,
297
&_geometry_helper, helical);
298
// SciFiTrack* track = ConvertToSciFiTrack(_spacepoint_helical_track_fitter->GetFiltered(),
299
// &_geometry_helper);
300
evt.add_scifitrack(track);
302
for (size_t track_i = 0; track_i < number_straight_tracks; track_i++) {
303
SciFiStraightPRTrack* straight = evt.straightprtracks().at(track_i);
304
SciFiSpacePointPArray spacepoints = straight->get_spacepoints_pointers();
306
Kalman::Track data_track = BuildSpacepointTrack(spacepoints, &_geometry_helper,
307
_spacepoint_recon_plane);
308
Kalman::State seed = ComputeSeed(straight, &_geometry_helper, _seed_value);
310
std::cerr << Kalman::print_state(seed, "Helical Seed");
311
std::cerr << "Straight Track\n";
312
print_straight(straight);
314
_spacepoint_straight_track_fitter->SetSeed(seed);
315
_spacepoint_straight_track_fitter->SetData(data_track);
317
_spacepoint_straight_track_fitter->Filter(false);
318
_spacepoint_straight_track_fitter->Smooth(false);
320
Kalman::Track predicted = _spacepoint_straight_track_fitter->GetPredicted();
321
Kalman::Track filtered = _spacepoint_straight_track_fitter->GetFiltered();
322
Kalman::Track smoothed = _spacepoint_straight_track_fitter->GetSmoothed();
324
std::cerr << "Data Track\n";
325
std::cerr << Kalman::print_track(data_track);
326
std::cerr << "Predicted Track\n";
327
std::cerr << Kalman::print_track(predicted);
328
std::cerr << "Filtered Track\n";
329
std::cerr << Kalman::print_track(filtered);
330
std::cerr << "Smoothed Track\n";
331
std::cerr << Kalman::print_track(smoothed);
333
SciFiTrack* track = ConvertToSciFiTrack(_spacepoint_straight_track_fitter,
334
&_geometry_helper, straight);
335
evt.add_scifitrack(track);
337
} else { // PATREC Not Active
338
std::cerr << "PATREC NOT ACTIVE\n";
340
SciFiSpacePointPArray event_spacepoints = evt.spacepoints();
341
for (int tracker = 0; tracker < 2; ++tracker) {
343
SciFiSpacePointPArray spacepoints = find_spacepoints(event_spacepoints, tracker);
344
std::cerr << " USING " << spacepoints.size() << " SPACEPOINTS from TRACKER : "
346
if (spacepoints.size() != 5) break;
348
int id = ((4*3 + 1) + _spacepoint_recon_plane) * (tracker == 0 ? -1 : 1);
349
Kalman::Track data_track = BuildSpacepointTrack(spacepoints, &_geometry_helper,
350
_spacepoint_recon_plane);
351
Kalman::State seed(5);
354
bool seed_found = false;
355
for (SciFiSpacePointPArray::iterator it_s = spacepoints.begin();
356
it_s != spacepoints.end(); ++it_s) {
357
if ((*it_s)->get_station() == 5) {
359
ThreeVector pos = (*it_s)->get_true_position();
360
ThreeVector mom = (*it_s)->get_true_momentum();
361
std::cerr << pos.x() << ", " << pos.y() << ", " << pos.z() << " ; " << mom.x()
362
<< ", " << mom.y() << ", " << mom.z() << "\n";
364
TMatrixD state(5, 1);
365
state(0, 0) = pos.x();
366
state(1, 0) = mom.x();
367
state(2, 0) = pos.y();
368
state(3, 0) = mom.y();
369
state(4, 0) = 1.0 / mom.z();
371
seed.SetVector(state);
372
seed.SetPosition(pos.z());
377
if (!seed_found) continue;
379
TMatrixD seed_cov(5, 5);
380
seed_cov(0, 0) = _seed_value;
381
seed_cov(1, 1) = _seed_value;
382
seed_cov(2, 2) = _seed_value;
383
seed_cov(3, 3) = _seed_value;
384
seed_cov(4, 4) = _seed_value;
385
seed.SetCovariance(seed_cov);
387
std::cerr << Kalman::print_state(seed, "Helical Seed");
389
_spacepoint_helical_track_fitter->SetSeed(seed);
390
_spacepoint_helical_track_fitter->SetData(data_track);
392
_spacepoint_helical_track_fitter->Filter(false);
393
_spacepoint_helical_track_fitter->Smooth(false);
395
Kalman::Track predicted = _spacepoint_helical_track_fitter->GetPredicted();
396
Kalman::Track filtered = _spacepoint_helical_track_fitter->GetFiltered();
397
Kalman::Track smoothed = _spacepoint_helical_track_fitter->GetSmoothed();
398
std::cerr << "Data Track\n";
399
std::cerr << Kalman::print_track(data_track);
400
std::cerr << "Measured Predicted\n";
401
SciFiSpacepointMeasurements<5>* temp_measurement = new SciFiSpacepointMeasurements<5>(1.0);
402
for (unsigned int k = 0; k < predicted.GetLength(); ++k) {
403
Kalman::State temp_state = temp_measurement->Measure(predicted[k]);
404
std::cerr << Kalman::print_state(temp_state);
406
std::cerr << "Predicted Track\n";
407
std::cerr << Kalman::print_track(predicted);
408
std::cerr << "Filtered Track\n";
409
std::cerr << Kalman::print_track(filtered);
410
std::cerr << "Smoothed Track\n";
411
std::cerr << Kalman::print_track(smoothed);
412
delete temp_measurement;
414
SciFiTrack* track = ConvertToSciFiTrack(_spacepoint_helical_track_fitter,
415
&_geometry_helper, helical);
416
// SciFiTrack* track = ConvertToSciFiTrack(_spacepoint_helical_track_fitter->GetFiltered(),
417
// &_geometry_helper);
418
evt.add_scifitrack(track);
423
size_t number_helical_tracks = evt.helicalprtracks().size();
424
size_t number_straight_tracks = evt.straightprtracks().size();
425
for (size_t track_i = 0; track_i < number_helical_tracks; track_i++) {
426
SciFiHelicalPRTrack* helical = evt.helicalprtracks().at(track_i);
428
Kalman::Track data_track = BuildTrack(helical, &_geometry_helper);
429
Kalman::State seed = ComputeSeed(helical, &_geometry_helper, _use_eloss, _seed_value);
431
_helical_track_fitter->SetData(data_track);
432
_helical_track_fitter->SetSeed(seed);
434
_helical_track_fitter->Filter(false);
435
_helical_track_fitter->Smooth(false);
437
SciFiTrack* track = ConvertToSciFiTrack(_helical_track_fitter, &_geometry_helper, helical);
438
calculate_track_rating(track);
440
evt.add_scifitrack(track);
442
for (size_t track_i = 0; track_i < number_straight_tracks; track_i++) {
443
SciFiStraightPRTrack* straight = evt.straightprtracks().at(track_i);
444
Kalman::Track data_track = BuildTrack(straight, &_geometry_helper);
446
Kalman::State seed = ComputeSeed(straight, &_geometry_helper, _seed_value);
448
_straight_track_fitter->SetData(data_track);
449
_straight_track_fitter->SetSeed(seed);
451
_straight_track_fitter->Filter(false);
452
_straight_track_fitter->Smooth(false);
454
SciFiTrack* track = ConvertToSciFiTrack(_straight_track_fitter, &_geometry_helper, straight);
455
calculate_track_rating(track);
457
evt.add_scifitrack(track);
459
} else { // PatRec Not Switched on. => Assume EVERYTHING is a single track.
460
throw Exception(Exception::nonRecoverable,
461
"No pattern recognition, required to seed Kalman",
462
"MapCppTrackerRecon::track_fit()" );
465
SciFiClusterPArray event_clusters = evt.clusters();
466
for (int tracker = 0; tracker < 2; ++tracker) {
468
SciFiClusterPArray clusters = find_clusters(event_clusters, tracker);
469
if (clusters.size() != 15) break;
471
Kalman::Track data_track = BuildTrack(clusters, &_geometry_helper);
472
Kalman::State seed(5);
474
bool seed_found = false;
475
for (SciFiClusterPArray::iterator it_c = clusters.begin(); it_c != clusters.end(); ++it_c) {
476
if (((*it_c)->get_station() == 5) && ((*it_c)->get_plane() == 2)) {
478
ThreeVector pos = (*it_c)->get_true_position();
479
ThreeVector mom = (*it_c)->get_true_momentum();
481
TMatrixD state(5, 1);
482
state(0, 0) = pos.x();
483
state(1, 0) = mom.x();
484
state(2, 0) = pos.y();
485
state(3, 0) = mom.y();
486
state(4, 0) = 1.0 / mom.z();
488
seed.SetVector(state);
489
seed.SetPosition(pos.z());
494
if (!seed_found) continue;
496
TMatrixD seed_cov(5, 5);
497
seed_cov(0, 0) = _seed_value;
498
seed_cov(1, 1) = _seed_value;
499
seed_cov(2, 2) = _seed_value;
500
seed_cov(3, 3) = _seed_value;
501
seed_cov(4, 4) = _seed_value;
502
seed.SetCovariance(seed_cov);
504
_helical_track_fitter->SetData(data_track);
505
_helical_track_fitter->SetSeed(seed);
507
_helical_track_fitter->Filter(false);
508
_helical_track_fitter->Smooth(false);
510
SciFiTrack* track = ConvertToSciFiTrack(_helical_track_fitter, &_geometry_helper);
512
evt.add_scifitrack(track);
239
size_t number_helical_tracks = evt.helicalprtracks().size();
240
size_t number_straight_tracks = evt.straightprtracks().size();
241
for (size_t track_i = 0; track_i < number_helical_tracks; track_i++) {
242
SciFiHelicalPRTrack* helical = evt.helicalprtracks().at(track_i);
244
Kalman::Track data_track = BuildTrack(helical, &_geometry_helper);
245
Kalman::State seed = ComputeSeed(helical, &_geometry_helper, _use_eloss, _seed_value);
247
_helical_track_fitter->SetData(data_track);
248
_helical_track_fitter->SetSeed(seed);
250
_helical_track_fitter->Filter(false);
251
_helical_track_fitter->Smooth(false);
253
SciFiTrack* track = ConvertToSciFiTrack(_helical_track_fitter, &_geometry_helper, helical);
254
calculate_track_rating(track);
256
evt.add_scifitrack(track);
258
for (size_t track_i = 0; track_i < number_straight_tracks; track_i++) {
259
SciFiStraightPRTrack* straight = evt.straightprtracks().at(track_i);
260
Kalman::Track data_track = BuildTrack(straight, &_geometry_helper);
262
Kalman::State seed = ComputeSeed(straight, &_geometry_helper, _seed_value);
264
_straight_track_fitter->SetData(data_track);
265
_straight_track_fitter->SetSeed(seed);
267
_straight_track_fitter->Filter(false);
268
_straight_track_fitter->Smooth(false);
270
SciFiTrack* track = ConvertToSciFiTrack(_straight_track_fitter, &_geometry_helper, straight);
271
calculate_track_rating(track);
273
evt.add_scifitrack(track);
519
278
void MapCppTrackerRecon::extrapolate_helical_reference(SciFiEvent& event) const {
520
279
SciFiHelicalPRTrackPArray helicals = event.helicalprtracks();
521
280
size_t num_tracks = helicals.size();
665
448
std::cerr << '\n';
667
450
std::cerr << std::endl;
673
std::cerr << "Helix Pz Recon:\n";
674
SciFiHelicalPRTrackPArray helices = event.helicalprtracks();
675
for (unsigned int i = 0; i < helices.size(); ++i)
677
double radius = helices[i]->get_R();
678
double patrec_pt = 1.19*radius;
679
double patrec_pz = patrec_pt / helices[i]->get_dsdz();
680
std::cerr << "Pz = " << patrec_pz << '\n';
682
DoubleArray phis = helices[i]->get_phi();
683
double start_phi = phis[0];
684
double end_phi = phis[ phis.size()-1 ];
686
double delta_phi = end_phi - start_phi;
688
double Z = (1100.0 * 2.0 * CLHEP::pi) / delta_phi;
689
double pz = (1.19 * Z) / (2.0 * CLHEP::pi);
691
std::cerr << "Pz = " << pz << "\n\n";
693
for (unsigned int j = 0; j < phis.size(); ++j)
695
std::cerr << phis[j] << '\n';
698
std::cerr << std::endl;
702
Squeak::mout(Squeak::info) << event.digits().size() << " "
703
<< event.clusters().size() << " "
704
<< event.spacepoints().size() << "; "
705
<< event.straightprtracks().size() << " "
706
<< event.helicalprtracks().size() << "; ";
707
for (size_t track_i = 0; track_i < event.scifitracks().size(); track_i++) {
708
Squeak::mout(Squeak::info) << " Chi2: " << event.scifitracks()[track_i]->f_chi2() << "; "
709
<< " Chi2: " << event.scifitracks()[track_i]->s_chi2() << "; "
710
<< " P-Value: " << event.scifitracks()[track_i]->P_value() << "; ";
712
Squeak::mout(Squeak::info) << std::endl;
716
void print_helical(SciFiHelicalPRTrack* helical) {
717
SciFiSpacePointPArray spacepoints = helical->get_spacepoints_pointers();
718
size_t numb_spacepoints = spacepoints.size();
720
std::cerr << "HELICAL TRACK:\n";
722
double r = helical->get_R();
723
double sz = helical->get_line_sz_c();
724
double charge = helical->get_charge();
725
std::cerr << "Radius = " << r << " Sz = " << sz << " Charge = " << charge
726
<< " Phi_0 = " << sz/r << "\n";
728
for (size_t i = 0; i < numb_spacepoints; ++i) {
729
SciFiSpacePoint *spacepoint = spacepoints[i];
731
std::cerr << spacepoint->get_tracker() << ", "
732
<< spacepoint->get_station() << " - "
733
<< spacepoint->get_position().x() << ", "
734
<< spacepoint->get_position().y() << ", "
735
<< spacepoint->get_position().z() << "\n";
738
std::cerr << std::endl;
741
void print_straight(SciFiStraightPRTrack* straight) {
742
SciFiSpacePointPArray spacepoints = straight->get_spacepoints_pointers();
743
size_t numb_spacepoints = spacepoints.size();
745
std::cerr << "STRAIGHT TRACK:\n";
746
for (size_t i = 0; i < numb_spacepoints; ++i) {
747
SciFiSpacePoint *spacepoint = spacepoints[i];
749
std::cerr << spacepoint->get_tracker() << ", "
750
<< spacepoint->get_station() << " - "
751
<< spacepoint->get_position().x() << ", "
752
<< spacepoint->get_position().y() << ", "
753
<< spacepoint->get_position().z() << "\n";
756
std::cerr << std::endl;
759
SciFiClusterPArray find_clusters(SciFiClusterPArray cluster_array, int tracker) {
760
SciFiClusterPArray found_clusters;
762
for (SciFiClusterPArray::iterator cl_it = cluster_array.begin();
763
cl_it != cluster_array.end(); ++cl_it) {
764
if ((*cl_it)->get_tracker() == tracker) {
765
found_clusters.push_back((*cl_it));
769
return found_clusters;
772
SciFiSpacePointPArray find_spacepoints(SciFiSpacePointPArray spacepoint_array, int tracker) {
773
SciFiSpacePointPArray found_spacepoints;
775
for (SciFiSpacePointPArray::iterator sp_it = spacepoint_array.begin();
776
sp_it != spacepoint_array.end(); ++sp_it) {
777
if ((*sp_it)->get_tracker() == tracker) {
778
found_spacepoints.push_back((*sp_it));
782
return found_spacepoints;
785
void MapCppTrackerRecon::set_spacepoint_global_output(SciFiSpacePointPArray spoints) const {
786
for (auto sp : spoints) {
787
int tracker_id = sp->get_tracker();
789
ThreeVector reference_position = _geometry_helper.GetReferencePosition(tracker_id);
790
CLHEP::HepRotation reference_rotation = _geometry_helper.GetReferenceRotation(tracker_id);
792
ThreeVector global_position = sp->get_position();
793
global_position *= reference_rotation;
794
global_position += reference_position;
796
sp->set_global_position(global_position);
801
// Find the plane id of the middle plane for this station
803
switch ( station_id ) {
821
std::cerr << "WARNING: MapCppTrackerRecon: Failed to find spacepoint plane_id";
825
// Use the geometry helper to find the global position of this plane
826
ThreeVector plane_global_position = _geometry_helper.GeometryMap().find(tracker_id)->second.Planes.find(plane_id)->second.GlobalPosition;
829
453
} // ~namespace MAUS