Analysis Software
Documentation for sPHENIX simulation software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
SvtxTrackEval.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file SvtxTrackEval.cc
1 #include "SvtxTrackEval.h"
2 
3 #include "SvtxClusterEval.h"
4 #include "SvtxTruthEval.h"
5 
6 #include <g4main/PHG4Hit.h>
7 #include <g4main/PHG4Particle.h>
9 
10 #include <trackbase/TrkrDefs.h> // for cluskey, getLayer
11 
17 
18 #include <phool/getClass.h>
19 
20 #include <cassert>
21 #include <cfloat>
22 #include <iostream>
23 #include <set>
24 
26  : _clustereval(topNode)
27 {
28  get_node_pointers(topNode);
29 }
30 
32 {
33  if (_verbosity > 0)
34  {
35  if ((_errors > 0) || (_verbosity > 1))
36  {
37  std::cout << "SvtxTrackEval::~SvtxTrackEval() - Error Count: " << _errors << std::endl;
38  }
39  }
40 }
41 
43 {
44  _cache_all_truth_hits.clear();
55  _clustereval.next_event(topNode);
56 
57  get_node_pointers(topNode);
58 }
59 
60 std::set<PHG4Hit*> SvtxTrackEval::all_truth_hits(SvtxTrack* track)
61 {
62  if (!has_node_pointers())
63  {
64  return std::set<PHG4Hit*>();
65  }
66 
67  if (_strict)
68  {
69  assert(track);
70  }
71  else if (!track)
72  {
73  ++_errors;
74  return std::set<PHG4Hit*>();
75  }
76 
77  if (_do_cache)
78  {
79  std::map<SvtxTrack*, std::set<PHG4Hit*> >::iterator iter =
80  _cache_all_truth_hits.find(track);
81  if (iter != _cache_all_truth_hits.end())
82  {
83  return iter->second;
84  }
85  }
86 
87  std::set<PHG4Hit*> truth_hits;
88  std::vector<TrkrDefs::cluskey> cluster_keys = get_track_ckeys(track);
89 
90  // loop over all clusters...
91  for (const auto& cluster_key : cluster_keys)
92  {
93  // if (_strict)
94  // {
95  // assert(cluster_key);
96  // }
97  // else if (!cluster_key)
98  // {
99  // ++_errors;
100  // continue;
101  // }
102 
103  std::set<PHG4Hit*> new_hits = _clustereval.all_truth_hits(cluster_key);
104 
105  for (auto new_hit : new_hits)
106  {
107  truth_hits.insert(new_hit);
108  }
109  }
110 
111  if (_do_cache)
112  {
113  _cache_all_truth_hits.insert(std::make_pair(track, truth_hits));
114  }
115 
116  return truth_hits;
117 }
118 
119 std::set<PHG4Particle*> SvtxTrackEval::all_truth_particles(SvtxTrack* track)
120 {
121  if (!has_node_pointers())
122  {
123  return std::set<PHG4Particle*>();
124  }
125  if (_strict)
126  {
127  assert(track);
128  }
129 
130  else if (!track)
131  {
132  ++_errors;
133  return std::set<PHG4Particle*>();
134  }
135 
137  {
139  std::set<PHG4Particle*> returnset;
140 
141  for (const auto& [weight, truthTrackSet] : map)
142  {
143  for (const int& g4partid : truthTrackSet)
144  {
145  returnset.insert(_truthinfo->GetParticle(g4partid));
146  }
147  }
148  return returnset;
149  }
150 
151  if (_do_cache)
152  {
153  std::map<SvtxTrack*, std::set<PHG4Particle*> >::iterator iter =
154  _cache_all_truth_particles.find(track);
155  if (iter != _cache_all_truth_particles.end())
156  {
157  return iter->second;
158  }
159  }
160  std::set<PHG4Particle*> truth_particles;
161  SvtxTrack_FastSim* fastsim_track = dynamic_cast<SvtxTrack_FastSim*>(track);
162 
163  if (fastsim_track)
164  {
165  // exception for fast sim track
166  unsigned int track_id = fastsim_track->get_truth_track_id();
167  truth_particles.insert(get_truth_eval()->get_particle(track_id));
168  }
169  else
170  {
171  // loop over all clusters...
172  std::vector<TrkrDefs::cluskey> cluster_keys = get_track_ckeys(track);
173  for (const auto& cluster_key : cluster_keys)
174  {
175  // if (_strict)
176  // {
177  // assert(cluster_key);
178  // }
179  // else if (!cluster_key)
180  // {
181  // ++_errors;
182  // continue;
183  // }
184 
185  std::set<PHG4Particle*> new_particles = _clustereval.all_truth_particles(cluster_key);
186 
187  for (auto new_particle : new_particles)
188  {
189  truth_particles.insert(new_particle);
190  }
191  }
192  }
193 
194  if (_do_cache)
195  {
196  _cache_all_truth_particles.insert(std::make_pair(track, truth_particles));
197  }
198 
199  return truth_particles;
200 }
201 
203 {
204  if (!has_node_pointers())
205  {
206  return nullptr;
207  }
208 
209  if (_strict)
210  {
211  assert(track);
212  }
213  else if (!track)
214  {
215  ++_errors;
216  return nullptr;
217  }
218 
220  {
222  if (map.size() == 0)
223  {
224  return nullptr;
225  }
226  auto itr = map.end();
227  --itr;
228  std::set<int> bestPartSet = itr->second;
229  int bestpart = *bestPartSet.begin();
230  return _truthinfo->GetParticle(bestpart);
231  }
232 
233  if (_do_cache)
234  {
235  std::map<SvtxTrack*, PHG4Particle*>::iterator iter =
237  if (iter != _cache_max_truth_particle_by_nclusters.end())
238  {
239  return iter->second;
240  }
241  }
242 
243  std::set<PHG4Particle*> particles = all_truth_particles(track);
244  PHG4Particle* max_particle = nullptr;
245 
246  SvtxTrack_FastSim* fastsim_track = dynamic_cast<SvtxTrack_FastSim*>(track);
247  if (fastsim_track)
248  {
249  // exception for fast sim track
250  unsigned int track_id = fastsim_track->get_truth_track_id();
251  max_particle = get_truth_eval()->get_particle(track_id);
252  }
253  else
254  {
255  unsigned int max_nclusters = 0;
256 
257  for (auto candidate : particles)
258  {
259  unsigned int nclusters = get_nclusters_contribution(track, candidate);
260  if (nclusters > max_nclusters)
261  {
262  max_nclusters = nclusters;
263  max_particle = candidate;
264  }
265  }
266  }
267 
268  if (_do_cache)
269  {
270  _cache_max_truth_particle_by_nclusters.insert(std::make_pair(track, max_particle));
271  }
272 
273  return max_particle;
274 }
275 
276 std::set<SvtxTrack*> SvtxTrackEval::all_tracks_from(PHG4Particle* truthparticle)
277 {
278  if (!has_node_pointers())
279  {
280  return std::set<SvtxTrack*>();
281  }
282 
283  if (_strict)
284  {
285  assert(truthparticle);
286  }
287  else if (!truthparticle)
288  {
289  ++_errors;
290  return std::set<SvtxTrack*>();
291  }
292 
294  {
295  std::set<SvtxTrack*> returnset;
296 
298 
299  for (const auto& [weight, recoTrackSet] : map)
300  {
301  for (const unsigned int& trackid : recoTrackSet)
302  {
303  returnset.insert(_trackmap->get(trackid));
304  }
305  }
306  return returnset;
307  }
308 
309  if (_do_cache)
310  {
311  std::map<PHG4Particle*, std::set<SvtxTrack*> >::iterator iter =
312  _cache_all_tracks_from_particle.find(truthparticle);
313  if (iter != _cache_all_tracks_from_particle.end())
314  {
315  return iter->second;
316  }
317  }
318 
319  std::set<SvtxTrack*> tracks;
320 
321  // loop over all SvtxTracks
322  for (auto& iter : *_trackmap)
323  {
324  SvtxTrack* track = iter.second;
325  std::vector<TrkrDefs::cluskey> cluster_keys = get_track_ckeys(track);
326  for (const auto& cluster_key : cluster_keys)
327  {
328  // remove this check as cluster key = 0 is MVTX layer 0 cluster #0.
329  // if (_strict)
330  // {
331  // assert(cluster_key);
332  // }
333  // else if (!cluster_key)
334  // {
335  // ++_errors;
336  // continue;
337  // }
338 
339  // loop over all particles
340  std::set<PHG4Particle*> particles = _clustereval.all_truth_particles(cluster_key);
341  for (auto candidate : particles)
342  {
343  if (get_truth_eval()->are_same_particle(candidate, truthparticle))
344  {
345  tracks.insert(track);
346  }
347  }
348  }
349  }
350 
351  if (_do_cache)
352  {
353  _cache_all_tracks_from_particle.insert(std::make_pair(truthparticle, tracks));
354  }
355 
356  return tracks;
357 }
358 
359 std::set<SvtxTrack*> SvtxTrackEval::all_tracks_from(PHG4Hit* truthhit)
360 {
361  if (!has_node_pointers())
362  {
363  ++_errors;
364  return std::set<SvtxTrack*>();
365  }
366 
367  if (_strict)
368  {
369  assert(truthhit);
370  }
371  else if (!truthhit)
372  {
373  ++_errors;
374  return std::set<SvtxTrack*>();
375  }
376 
377  if (_do_cache)
378  {
379  std::map<PHG4Hit*, std::set<SvtxTrack*> >::iterator iter =
380  _cache_all_tracks_from_g4hit.find(truthhit);
381  if (iter != _cache_all_tracks_from_g4hit.end())
382  {
383  return iter->second;
384  }
385  }
386 
387  std::set<SvtxTrack*> tracks;
388 
389  // loop over all SvtxTracks
390  for (auto& iter : *_trackmap)
391  {
392  SvtxTrack* track = iter.second;
393  std::vector<TrkrDefs::cluskey> cluster_keys = get_track_ckeys(track);
394  // loop over all clusters
395  for (const auto& cluster_key : cluster_keys)
396  {
397  // if (_strict)
398  // {
399  // assert(cluster_key);
400  // }
401  // else if (!cluster_key)
402  // {
403  // ++_errors;
404  // continue;
405  // }
406 
407  // loop over all hits
408  std::set<PHG4Hit*> hits = _clustereval.all_truth_hits(cluster_key);
409  for (auto candidate : hits)
410  {
411  // if track id matches argument add to output
412  if (candidate->get_trkid() == truthhit->get_trkid())
413  {
414  tracks.insert(track);
415  }
416  }
417  }
418  }
419 
420  if (_do_cache)
421  {
422  _cache_all_tracks_from_g4hit.insert(std::make_pair(truthhit, tracks));
423  }
424 
425  return tracks;
426 }
427 
429 {
430  if (!has_node_pointers())
431  {
432  ++_errors;
433  return nullptr;
434  }
435 
436  if (_strict)
437  {
438  assert(truthparticle);
439  }
440  else if (!truthparticle)
441  {
442  ++_errors;
443  return nullptr;
444  }
445 
447  {
450  if (map.size() == 0)
451  {
452  return nullptr;
453  }
454  auto itr = map.end();
455  --itr;
456  std::set<unsigned int> bestPartSet = itr->second;
457  int bestpart = *bestPartSet.begin();
458  return _trackmap->get(bestpart);
459  }
460 
461  if (_do_cache)
462  {
463  std::map<PHG4Particle*, SvtxTrack*>::iterator iter =
464  _cache_best_track_from_particle.find(truthparticle);
465  if (iter != _cache_best_track_from_particle.end())
466  {
467  return iter->second;
468  }
469  }
470 
471  SvtxTrack* best_track = nullptr;
472  unsigned int best_count = 0;
473  std::set<SvtxTrack*> tracks = all_tracks_from(truthparticle);
474  for (auto track : tracks)
475  {
476  unsigned int count = get_nclusters_contribution(track, truthparticle);
477  if (count > best_count)
478  {
479  best_track = track;
480  best_count = count;
481  }
482  }
483 
484  if (_do_cache)
485  {
486  _cache_best_track_from_particle.insert(std::make_pair(truthparticle, best_track));
487  }
488 
489  return best_track;
490 }
491 
493 {
494  if (!has_node_pointers())
495  {
496  ++_errors;
497  return;
498  }
499 
500  // loop over all SvtxTracks
501  for (auto& iter : *_trackmap)
502  {
503  SvtxTrack* track = iter.second;
504  std::vector<TrkrDefs::cluskey> cluster_keys = get_track_ckeys(track);
505 
506  // loop over all clusters
507  for (const auto& candidate_key : cluster_keys)
508  {
509  // unsigned int cluster_layer = TrkrDefs::getLayer(candidate_key);
510  // if (_strict)
511  // {
512  // assert(candidate_key);
513  // }
514  // else if (!candidate_key)
515  // {
516  // ++_errors;
517  // continue;
518  // }
519 
520  // check if cluster has an entry in cache
521  std::map<TrkrDefs::cluskey, std::set<SvtxTrack*> >::iterator cliter =
522  _cache_all_tracks_from_cluster.find(candidate_key);
523  if (cliter != _cache_all_tracks_from_cluster.end())
524  { // got entry
525  cliter->second.insert(track); // add track to list;
526  }
527  else
528  {
529  std::set<SvtxTrack*> tracks;
530  tracks.insert(track);
531  _cache_all_tracks_from_cluster.insert(std::make_pair(candidate_key, tracks));
532  }
533  }
534  }
536 
537  return;
538 }
539 
540 std::set<SvtxTrack*> SvtxTrackEval::all_tracks_from(TrkrDefs::cluskey cluster_key)
541 {
542  if (!has_node_pointers())
543  {
544  ++_errors;
545  return std::set<SvtxTrack*>();
546  }
547 
548  // if (_strict)
549  // {
550  // assert(cluster_key);
551  // }
552  // else if (!cluster_key)
553  // {
554  // ++_errors;
555  // return std::set<SvtxTrack*>();
556  // }
557 
558  std::set<SvtxTrack*> tracks;
559 
560  if (_do_cache)
561  {
563  {
565  }
566  std::map<TrkrDefs::cluskey, std::set<SvtxTrack*> >::iterator iter =
567  _cache_all_tracks_from_cluster.find(cluster_key);
568  if (iter != _cache_all_tracks_from_cluster.end())
569  {
570  return iter->second;
571  }
572  else
573  {
574  return tracks;
575  }
576  }
577 
578  // loop over all SvtxTracks
579  for (auto& iter : *_trackmap)
580  {
581  SvtxTrack* track = iter.second;
582  std::vector<TrkrDefs::cluskey> cluster_keys = get_track_ckeys(track);
583 
584  // loop over all clusters
585  for (const auto& candidate : cluster_keys)
586  {
587  // if (_strict)
588  // {
589  // assert(candidate);
590  // }
591  // else if (!candidate)
592  // {
593  // ++_errors;
594  // continue;
595  // }
596 
597  if (cluster_key == candidate)
598  {
599  tracks.insert(track);
600  }
601  }
602  }
603 
604  if (_do_cache)
605  {
606  _cache_all_tracks_from_cluster.insert(std::make_pair(cluster_key, tracks));
607  }
608 
609  return tracks;
610 }
611 
613 {
614  if (!has_node_pointers())
615  {
616  ++_errors;
617  return nullptr;
618  }
619 
620  // if (_strict)
621  // {
622  // assert(cluster_key);
623  // }
624  // else if (!cluster_key)
625  // {
626  // ++_errors;
627  // return nullptr;
628  // }
629 
630  if (_do_cache)
631  {
632  std::map<TrkrDefs::cluskey, SvtxTrack*>::iterator iter =
633  _cache_best_track_from_cluster.find(cluster_key);
634  if (iter != _cache_best_track_from_cluster.end())
635  {
636  return iter->second;
637  }
638  }
639 
640  SvtxTrack* best_track = nullptr;
641  float best_quality = FLT_MAX;
642 
643  std::set<SvtxTrack*> tracks = all_tracks_from(cluster_key);
644  // loop over all SvtxTracks
645  for (auto candidate : tracks)
646  {
647  if (candidate->get_quality() < best_quality)
648  {
649  best_quality = candidate->get_quality();
650  best_track = candidate;
651  }
652  }
653 
654  if (_do_cache)
655  {
656  _cache_best_track_from_cluster.insert(std::make_pair(cluster_key, best_track));
657  }
658  return best_track;
659 }
660 
661 // overlap calculations
663 {
664  if (!has_node_pointers())
665  {
666  ++_errors;
667  return 0;
668  }
669 
670  if (_strict)
671  {
672  assert(track);
673  assert(particle);
674  }
675  else if (!track || !particle)
676  {
677  ++_errors;
678  return 0;
679  }
680 
681  calc_cluster_contribution(track, particle);
682 
683  std::map<std::pair<SvtxTrack*, PHG4Particle*>, unsigned int>::iterator iter =
684  _cache_get_nclusters_contribution.find(std::make_pair(track, particle));
685  if (iter != _cache_get_nclusters_contribution.end())
686  {
687  return iter->second;
688  }
689 
690  return 0;
691 }
693 {
694  if (!has_node_pointers())
695  {
696  ++_errors;
697  return 0;
698  }
699 
700  if (_strict)
701  {
702  assert(track);
703  assert(particle);
704  }
705  else if (!track || !particle)
706  {
707  ++_errors;
708  return 0;
709  }
710 
711  calc_cluster_contribution(track, particle);
712 
713  std::map<std::pair<SvtxTrack*, PHG4Particle*>, unsigned int>::iterator iter =
714  _cache_get_nwrongclusters_contribution.find(std::make_pair(track, particle));
715  if (iter != _cache_get_nwrongclusters_contribution.end())
716  {
717  return iter->second;
718  }
719 
720  return 0;
721 }
722 
723 // overlap calculations
725 {
726  if (!has_node_pointers())
727  {
728  ++_errors;
729  return;
730  }
731 
732  if (_strict)
733  {
734  assert(track);
735  assert(particle);
736  }
737  else if (!track || !particle)
738  {
739  ++_errors;
740  return;
741  }
742 
743  std::map<std::pair<SvtxTrack*, PHG4Particle*>, unsigned int>::iterator iter =
744  _cache_get_nclusters_contribution.find(std::make_pair(track, particle));
745  std::map<std::pair<SvtxTrack*, PHG4Particle*>, unsigned int>::iterator witer =
746  _cache_get_nwrongclusters_contribution.find(std::make_pair(track, particle));
747 
748  if (iter != _cache_get_nclusters_contribution.end() &&
750  {
751  return;
752  }
753 
754  unsigned int nclusters = 0;
755  unsigned int nwrong = 0;
756  // loop over all clusters
757  std::vector<TrkrDefs::cluskey> cluster_keys = get_track_ckeys(track);
758  for (const auto& cluster_key : cluster_keys)
759  {
760  // if (_strict)
761  // {
762  // assert(cluster_key);
763  // }
764  // else if (!cluster_key)
765  // {
766  // ++_errors;
767  // continue;
768  // }
769  int matched = 0;
770  // loop over all particles
771  std::set<PHG4Particle*> particles = _clustereval.all_truth_particles(cluster_key);
772  for (auto candidate : particles)
773  {
774  if (get_truth_eval()->are_same_particle(candidate, particle))
775  {
776  ++nclusters;
777  matched = 1;
778  }
779  }
780  if (matched == 0)
781  {
782  nwrong++;
783  }
784  }
785 
786  _cache_get_nclusters_contribution.insert(std::make_pair(std::make_pair(track, particle), nclusters));
787  _cache_get_nwrongclusters_contribution.insert(std::make_pair(std::make_pair(track, particle), nwrong));
788 
789  return;
790 }
791 
793 {
794  if (!has_node_pointers())
795  {
796  ++_errors;
797  return 0;
798  }
799 
800  if (_strict)
801  {
802  assert(track);
803  assert(particle);
804  }
805  else if (!track || !particle)
806  {
807  ++_errors;
808  return 0;
809  }
810 
811  if (_do_cache)
812  {
813  std::map<std::pair<SvtxTrack*, PHG4Particle*>, unsigned int>::iterator iter =
814  _cache_get_nclusters_contribution_by_layer.find(std::make_pair(track, particle));
816  {
817  return iter->second;
818  }
819  }
820 
821  unsigned int nclusters_by_layer = 0;
822  int layer_occupied[100];
823  for (int& i : layer_occupied)
824  {
825  i = 0;
826  }
827 
828  // loop over all clusters
829  std::vector<TrkrDefs::cluskey> cluster_keys = get_track_ckeys(track);
830  for (const auto& cluster_key : cluster_keys)
831  {
832  unsigned int cluster_layer = TrkrDefs::getLayer(cluster_key);
833 
834  // if (_strict)
835  // {
836  // assert(cluster_key);
837  // }
838  // else if (!cluster_key)
839  // {
840  // ++_errors;
841  // continue;
842  // }
843 
844  // loop over all particles
845  std::set<PHG4Particle*> particles = _clustereval.all_truth_particles(cluster_key);
846 
847  for (auto candidate : particles)
848  {
849  if (get_truth_eval()->are_same_particle(candidate, particle))
850  {
851  layer_occupied[cluster_layer]++;
852  }
853  }
854  }
855  for (int i : layer_occupied)
856  {
857  if (i > 0)
858  {
859  nclusters_by_layer++;
860  }
861  }
862  if (_do_cache)
863  {
864  _cache_get_nclusters_contribution_by_layer.insert(std::make_pair(std::make_pair(track, particle), nclusters_by_layer));
865  }
866 
867  return nclusters_by_layer;
868 }
869 
870 std::pair<unsigned int, unsigned int> SvtxTrackEval::get_layer_range_contribution(SvtxTrack* track, PHG4Particle* particle, unsigned int start_layer, unsigned int end_layer)
871 {
872  if (!has_node_pointers())
873  {
874  ++_errors;
875  return std::make_pair(0,0);
876  }
877 
878  if (_strict)
879  {
880  assert(track);
881  assert(particle);
882  }
883  else if (!track || !particle)
884  {
885  ++_errors;
886  return std::make_pair(0,0);
887  }
888 
889  unsigned int nmatches = 0;
890  unsigned int nwrong = 0;
891  unsigned int nlayers = end_layer - start_layer;
892 
893  int layers[nlayers];
894  int layers_wrong[nlayers];
895  for (unsigned int i = 0; i < nlayers; i++)
896  {
897  layers[i] = 0;
898  layers_wrong[i] = 0;
899  }
900  // loop over all clusters
901  std::vector<TrkrDefs::cluskey> cluster_keys = get_track_ckeys(track);
902  for (const auto& cluster_key : cluster_keys)
903  {
904  unsigned int cluster_layer = TrkrDefs::getLayer(cluster_key);
905  if (cluster_layer >= end_layer)
906  {
907  continue;
908  }
909  if (cluster_layer < start_layer)
910  {
911  continue;
912  }
913 
914  // if (_strict)
915  // {
916  // assert(cluster_key);
917  // }
918  // else if (!cluster_key)
919  // {
920  // ++_errors;
921  // continue;
922  // }
923 
924  // loop over all particles
925  std::set<PHG4Particle*> particles = _clustereval.all_truth_particles(cluster_key);
926  int matched = 0;
927  for (auto candidate : particles)
928  {
929  if (get_truth_eval()->are_same_particle(candidate, particle))
930  {
931  // nmatches |= (0x3FFFFFFF & (0x1 << cluster_layer));
932  layers[cluster_layer - start_layer] = 1;
933  matched = 1;
934  }
935  }
936  if(matched == 0)
937  {
938  layers_wrong[cluster_layer - start_layer] = 1;
939  }
940  }
941  for (unsigned int i = 0; i < nlayers; i++)
942  {
943  if (layers[i] == 1)
944  {
945  nmatches++;
946  }
947  if(layers_wrong[i] == 1)
948  {
949  nwrong++;
950  }
951  }
952 
953 
954  return std::make_pair(nmatches,nwrong);
955 }
956 
958 {
959  // need things off of the DST...
960  _trackmap = findNode::getClass<SvtxTrackMap>(topNode, m_TrackNodeName);
961 
962  _truthRecoMap = findNode::getClass<PHG4ParticleSvtxMap>(topNode, "PHG4ParticleSvtxMap");
963 
964  _recoTruthMap = findNode::getClass<SvtxPHG4ParticleMap>(topNode, "SvtxPHG4ParticleMap");
965 
966  _truthinfo = findNode::getClass<PHG4TruthInfoContainer>(topNode, "G4TruthInfo");
967 
968  return;
969 }
970 
972 {
973  // need things off of the DST...
974  if (_strict)
975  {
976  assert(_trackmap);
977  }
978  else if (!_trackmap)
979  {
980  return false;
981  }
982  return true;
983 }
984 
985 std::vector<TrkrDefs::cluskey> SvtxTrackEval::get_track_ckeys(SvtxTrack* track)
986 {
987  std::vector<TrkrDefs::cluskey> cluster_keys;
988  TrackSeed* tpcseed = track->get_tpc_seed();
989  TrackSeed* silseed = track->get_silicon_seed();
990  if (silseed)
991  {
992  for (auto iter = silseed->begin_cluster_keys();
993  iter != silseed->end_cluster_keys();
994  ++iter)
995  {
996  cluster_keys.push_back(*iter);
997  }
998  }
999  if (tpcseed)
1000  {
1001  for (auto iter = tpcseed->begin_cluster_keys();
1002  iter != tpcseed->end_cluster_keys();
1003  ++iter)
1004  {
1005  cluster_keys.push_back(*iter);
1006  }
1007  }
1008 
1009  return cluster_keys;
1010 }