@@ -435,9 +435,8 @@ void SimTrackstersProducer::produce(edm::Event& evt, const edm::EventSetup& es)
435435
436436 makePUTrackster (inputClusterMask, *output_mask, *resultPU, caloParticles_h.id (), 0 );
437437
438- auto simTrackToRecoTrack = [&](UniqueSimTrackId simTkId) -> std::pair<int , float > {
439- int trackIdx = -1 ;
440- float quality = 0 .f ;
438+ auto simTrackToRecoTrack = [&](UniqueSimTrackId simTkId) -> std::vector<int > {
439+ std::vector<int > trackIdx;
441440 auto ipos = simTrackToTPMap.mapping .find (simTkId);
442441 if (ipos != simTrackToTPMap.mapping .end ()) {
443442 auto jpos = TPtoRecoTrackMap.find ((ipos->second ));
@@ -446,41 +445,55 @@ void SimTrackstersProducer::produce(edm::Event& evt, const edm::EventSetup& es)
446445 if (!associatedRecoTracks.empty ()) {
447446 // associated reco tracks are sorted by decreasing quality
448447 if (associatedRecoTracks[0 ].second > qualityCutTrack_) {
449- trackIdx = &(*associatedRecoTracks[0 ].first ) - &recoTracks[0 ];
450- quality = associatedRecoTracks[0 ].second ;
448+ trackIdx.push_back (&(*associatedRecoTracks[0 ].first ) - &recoTracks[0 ]);
449+ }
450+ }
451+ }
452+ const auto & tp = (*ipos->second );
453+ if (!tp.decayVertices ().empty ()) {
454+ const auto & iTV = tp.decayVertices ()[0 ];
455+ for (auto iTP = iTV->daughterTracks_begin (); iTP != iTV->daughterTracks_end (); ++iTP) {
456+ auto kpos = TPtoRecoTrackMap.find ((*iTP));
457+ if (kpos != TPtoRecoTrackMap.end ()) {
458+ auto & associatedRecoTracks = kpos->val ;
459+ if (!associatedRecoTracks.empty ()) {
460+ // associated reco tracks are sorted by decreasing quality
461+ if (associatedRecoTracks[0 ].second > qualityCutTrack_) {
462+ trackIdx.push_back (&(*associatedRecoTracks[0 ].first ) - &recoTracks[0 ]);
463+ }
464+ }
451465 }
452466 }
453467 }
454468 }
455- return { trackIdx, quality} ;
469+ return trackIdx;
456470 };
457471
458- // Creating the map from TrackingParticle to SimTrackstersFromCP
472+ // Set the reco track id to SimTrackstersFromCP
459473 auto & simTrackstersFromCP = *result_fromCP;
460474 for (unsigned int i = 0 ; i < simTrackstersFromCP.size (); ++i) {
461475 if (simTrackstersFromCP[i].vertices ().empty ())
462476 continue ;
463477 const auto & simTrack = caloparticles[simTrackstersFromCP[i].seedIndex ()].g4Tracks ()[0 ];
464478 UniqueSimTrackId simTkIds (simTrack.trackId (), simTrack.eventId ());
465- auto bestAssociatedRecoTrack = simTrackToRecoTrack (simTkIds);
466- if (bestAssociatedRecoTrack. first != - 1 and bestAssociatedRecoTrack. second > qualityCutTrack_ ) {
467- auto trackIndex = bestAssociatedRecoTrack. first ;
468- simTrackstersFromCP[i].setTrackIdx (trackIndex);
479+ auto bestAssociatedRecoTracks = simTrackToRecoTrack (simTkIds);
480+ if (not bestAssociatedRecoTracks. empty () ) {
481+ for ( auto const trackIndex : bestAssociatedRecoTracks)
482+ simTrackstersFromCP[i].addTrackIdx (trackIndex);
469483 }
470484 }
471485
472486 auto & simTracksters = *result;
473- // Creating the map from TrackingParticle to SimTrackster
474- std::unordered_map<unsigned int , std::vector<unsigned int >> TPtoSimTracksterMap;
487+ // Set the reco track id to simTracksters
475488 for (unsigned int i = 0 ; i < simTracksters.size (); ++i) {
476489 const auto & simTrack = (simTracksters[i].seedID () == caloParticles_h.id ())
477490 ? caloparticles[simTracksters[i].seedIndex ()].g4Tracks ()[0 ]
478491 : simclusters[simTracksters[i].seedIndex ()].g4Tracks ()[0 ];
479492 UniqueSimTrackId simTkIds (simTrack.trackId (), simTrack.eventId ());
480- auto bestAssociatedRecoTrack = simTrackToRecoTrack (simTkIds);
481- if (bestAssociatedRecoTrack. first != - 1 and bestAssociatedRecoTrack. second > qualityCutTrack_ ) {
482- auto trackIndex = bestAssociatedRecoTrack. first ;
483- simTracksters[i].setTrackIdx (trackIndex);
493+ auto bestAssociatedRecoTracks = simTrackToRecoTrack (simTkIds);
494+ if (not bestAssociatedRecoTracks. empty () ) {
495+ for ( auto const trackIndex : bestAssociatedRecoTracks)
496+ simTracksters[i].addTrackIdx (trackIndex);
484497 }
485498 }
486499
@@ -502,12 +515,15 @@ void SimTrackstersProducer::produce(edm::Event& evt, const edm::EventSetup& es)
502515 : SimClusterToCaloParticleMap[simTrackster.seedIndex ()];
503516 auto const & tCP = (*result_fromCP)[cp_index];
504517 if (!tCP.vertices ().empty ()) {
505- auto trackIndex = tCP.trackIdx ();
518+ auto trackIndices = tCP.trackIdxs ();
506519
507520 auto & cand = (*result_ticlCandidates)[cp_index];
508521 cand.addTrackster (edm::Ptr<Trackster>(simTracksters_h, i));
509- if (trackIndex != -1 && caloparticles[cp_index].charge () != 0 )
510- cand.setTrackPtr (edm::Ptr<reco::Track>(recoTracks_h, trackIndex));
522+ if (cand.trackPtrs ().empty () and not trackIndices.empty () and caloparticles[cp_index].charge () != 0 ) {
523+ for (const auto trackIndex : trackIndices) {
524+ cand.addTrackPtr (edm::Ptr<reco::Track>(recoTracks_h, trackIndex));
525+ }
526+ }
511527 toKeep.push_back (cp_index);
512528 }
513529 }
0 commit comments