28 template<
class T_element>
31 return collection.
size();
34 template<
class T_element>
37 return hCollection->size();
40 template<
class T_element>
43 return collection.
size();
48 return &*trackCollection[
index];
53 return &(*pTrackCollection.product())[index];
58 return &(*pCollection.
product())[index];
63 return &*collection[
index];
68 return trackCollection[
index];
83 return collection[
index];
89 std::unique_ptr<const TrackerHitAssociator> hitAssoc,
92 bool absoluteNumberOfHits,
93 double qualitySimToReco,
94 double puritySimToReco,
96 bool threeHitTracksAreSpecial,
98 productGetter_(&productGetter),
99 hitAssociator_(std::
move(hitAssoc)),
100 clusterToTPMap_(clusterToTPMap),
101 qualitySimToReco_(qualitySimToReco),
102 puritySimToReco_(puritySimToReco),
103 cutRecoToSim_(cutRecoToSim),
104 simToRecoDenominator_(simToRecoDenominator) ,
105 threeHitTracksAreSpecial_(threeHitTracksAreSpecial),
106 absoluteNumberOfHits_(absoluteNumberOfHits)
143 template<
class T_TrackCollection,
class T_TrackingParticleCollection,
class T_hitOrClusterAssociator>
148 size_t collectionSize=::collectionSize(trackCollection);
150 for(
size_t i=0;
i < collectionSize; ++
i )
152 const reco::Track* pTrack=::getTrackAt(trackCollection,
i);
155 std::vector < std::pair<edm::Ref<TrackingParticleCollection>,
size_t> > trackingParticleQualityPairs=
associateTrack( hitOrClusterAssociator, trackingParticleCollection, pTrack->
recHitsBegin(), pTrack->
recHitsEnd() );
159 trackingParticleQualityPairs.begin(); iTrackingParticleQualityPair != trackingParticleQualityPairs.end();
160 ++iTrackingParticleQualityPair )
163 size_t numberOfSharedHits=iTrackingParticleQualityPair->second;
164 size_t numberOfValidTrackHits=pTrack->
found();
166 if( numberOfSharedHits == 0 )
continue;
169 if(
abs( trackingParticleRef->pdgId() ) == 11 && (trackingParticleRef->g4Track_end() - trackingParticleRef->g4Track_begin()) > 1 )
176 else if( numberOfValidTrackHits != 0 ) quality=
177 (
static_cast<double>( numberOfSharedHits ) / static_cast<double>( numberOfValidTrackHits ));
182 returnValue.
insert( ::getRefToTrackAt(trackCollection,
i), std::make_pair( trackingParticleRef, quality ) );
190 template<
class T_TrackCollection,
class T_TrackingParticleCollection,
class T_hitOrClusterAssociator>
195 size_t collectionSize=::collectionSize(trackCollection);
197 for(
size_t i=0;
i<collectionSize; ++
i )
199 const reco::Track* pTrack=::getTrackAt(trackCollection,
i);
202 std::vector < std::pair<edm::Ref<TrackingParticleCollection>,
size_t> > trackingParticleQualityPairs=
associateTrack( hitOrClusterAssociator, trackingParticleCollection, pTrack->
recHitsBegin(), pTrack->
recHitsEnd() );
206 iTrackingParticleQualityPair!=trackingParticleQualityPairs.end(); ++iTrackingParticleQualityPair )
209 size_t numberOfSharedHits=iTrackingParticleQualityPair->second;
210 size_t numberOfValidTrackHits=pTrack->
found();
211 size_t numberOfSimulatedHits=0;
213 if( numberOfSharedHits==0 )
continue;
221 numberOfSimulatedHits=trackingParticleRef->numberOfTrackerHits();
225 if (
abs(trackingParticleRef->pdgId())==11 && (trackingParticleRef->g4Track_end() - trackingParticleRef->g4Track_begin()) > 1 )
230 double purity=
static_cast<double>(numberOfSharedHits)/static_cast<double>(numberOfValidTrackHits);
233 else if(
simToRecoDenominator_==
denomsim && numberOfSimulatedHits != 0 ) quality=
static_cast<double>(numberOfSharedHits)/static_cast<double>(numberOfSimulatedHits);
240 returnValue.
insert( trackingParticleRef, std::make_pair( ::getRefToTrackAt(trackCollection,
i), quality ) );
252 std::vector< std::pair<edm::Ref<TrackingParticleCollection>,
size_t> > returnValue;
257 std::vector< std::pair<SimTrackIdentifiers,size_t> > hitIdentifiers=
getAllSimTrackIdentifiers( hitAssociator, begin, end );
260 size_t collectionSize=::collectionSize(trackingParticles);
262 for(
size_t i=0;
i<collectionSize; ++
i )
264 const TrackingParticle* pTrackingParticle=getTrackingParticleAt( trackingParticles,
i );
269 size_t numberOfAssociatedHits=0;
272 for( std::vector< std::pair<SimTrackIdentifiers,size_t> >::const_iterator iIdentifierCountPair=hitIdentifiers.begin(); iIdentifierCountPair!=hitIdentifiers.end(); ++iIdentifierCountPair )
277 if( numberOfAssociatedHits>0 )
279 returnValue.push_back( std::make_pair( getRefToTrackingParticleAt(trackingParticles,
i), numberOfAssociatedHits ) );
293 std::vector < std::pair<edm::Ref<TrackingParticleCollection>,
size_t> > returnValue;
294 if( clusterToTPMap.empty() )
return returnValue;
302 std::map < TrackingParticleRef, size_t > lmap;
303 for( std::vector<OmniClusterRef>::const_iterator it=oClusters.begin(); it != oClusters.end(); ++it )
306 std::pair < OmniClusterRef, TrackingParticleRef > clusterTPpairWithDummyTP( *it,
TrackingParticleRef() );
308 if( range.first != range.second )
310 for(
auto ip=range.first; ip != range.second; ++ip )
316 if( trackingParticle->numberOfHits() == 0 )
continue;
331 auto jpos=lmap.find( trackingParticle );
332 if( jpos != lmap.end() ) ++jpos->second;
333 else lmap.insert( std::make_pair( trackingParticle, 1 ) );
338 for(
auto ip=lmap.begin(); ip != lmap.end(); ++ip )
340 returnValue.push_back( std::make_pair( ip->first, ip->second ) );
347 std::vector<OmniClusterRef> returnValue;
348 for (iter iRecHit = begin; iRecHit !=
end; ++iRecHit) {
355 edm::LogError(
"TrackAssociator") <<
">>> RecHit does not have an associated cluster!" <<
" file: " << __FILE__ <<
" line: " << __LINE__;
359 const std::type_info &tid =
typeid(*rhit);
363 edm::LogError(
"TrackAssociator") <<
">>> RecHit does not have an associated cluster!" <<
" file: " << __FILE__ <<
" line: " << __LINE__;
370 edm::LogError(
"TrackAssociator") <<
">>> RecHit does not have an associated cluster!" <<
" file: " << __FILE__ <<
" line: " << __LINE__;
376 edm::LogError(
"TrackAssociator") <<
">>> RecHit does not have an associated cluster!" <<
" file: " << __FILE__ <<
" line: " << __LINE__;
381 if ( thit.isProjected() ) {
383 edm::LogError(
"TrackAssociator") <<
">>> getMatchedClusters: TrackingRecHit not associated to any SiStripCluster! subdetid = " << subdetid;
388 edm::LogError(
"TrackAssociator") <<
">>> getMatchedClusters: TrackingRecHit not associated to any cluster! subdetid = " << subdetid;
398 std::vector < std::pair<SimTrackIdentifiers,size_t> > returnValue;
400 std::vector<SimTrackIdentifiers> simTrackIdentifiers;
403 for( iter iRecHit=begin; iRecHit !=
end; ++iRecHit )
407 simTrackIdentifiers.clear();
413 for( std::vector<SimTrackIdentifiers>::const_iterator iIdentifier=simTrackIdentifiers.begin(); iIdentifier != simTrackIdentifiers.end();
416 std::vector<std::pair<SimTrackIdentifiers,size_t> >::iterator iIdentifierCountPair;
417 for( iIdentifierCountPair=returnValue.begin(); iIdentifierCountPair != returnValue.end(); ++iIdentifierCountPair )
419 if( iIdentifierCountPair->first.first == iIdentifier->first && iIdentifierCountPair->first.second == iIdentifier->second )
422 ++iIdentifierCountPair->second;
426 if( iIdentifierCountPair == returnValue.end() ) returnValue.push_back( std::make_pair( *iIdentifier, 1 ) );
437 for( std::vector<SimTrack>::const_iterator iSimTrack=pTrackingParticle->
g4Track_begin(); iSimTrack != pTrackingParticle->
g4Track_end();
441 if( iSimTrack->eventId() == identifier.second && iSimTrack->trackId() == identifier.first )
458 std::vector < SimHitIdpr > SimTrackIdsDC;
460 for( iter iHit=startIterator; iHit != endIterator; iHit++ )
464 SimTrackIdsDC.clear();
466 if( SimTrackIdsDC.size() > 1 )
471 if(
find( SimTrackIdsDC.begin(), SimTrackIdsDC.end(),
SimHitIdpr( ( *g4T).trackId(), SimTrackIdsDC.begin()->second ) )
472 != SimTrackIdsDC.end() )
478 if( idcount > 1 ) doubleCount+=(idcount - 1);
490 std::vector < SimHitIdpr > SimTrackIdsDC;
492 for( iter iHit=startIterator; iHit != endIterator; iHit++ )
497 for( std::vector<OmniClusterRef>::const_iterator it=oClusters.begin(); it != oClusters.end(); ++it )
499 std::pair<OmniClusterRef,TrackingParticleRef> clusterTPpairWithDummyTP( *it,
TrackingParticleRef() );
501 if( range.first != range.second )
503 for(
auto ip=range.first; ip != range.second; ++ip )
506 if( associatedTrackingParticle == trackingParticle )
514 if( idcount > 1 ) doubleCount+=(idcount - 1);
524 edm::LogVerbatim(
"TrackAssociator" ) <<
"Starting TrackAssociatorByHitsImpl::associateRecoToSim - #seeds=" << pSeedCollectionHandle_->size()
525 <<
" #TPs=" << trackingParticleCollectionHandle->size();
529 size_t collectionSize=pSeedCollectionHandle_->size();
531 for(
size_t i=0;
i < collectionSize; ++
i )
536 std::vector < std::pair<edm::Ref<TrackingParticleCollection>,
size_t> > trackingParticleQualityPairs=
539 trackingParticleQualityPairs.begin(); iTrackingParticleQualityPair != trackingParticleQualityPairs.end();
540 ++iTrackingParticleQualityPair )
543 size_t numberOfSharedHits=iTrackingParticleQualityPair->second;
544 size_t numberOfValidTrackHits=pSeed->
recHits().second - pSeed->
recHits().first;
546 if( numberOfSharedHits == 0 )
continue;
549 if(
abs( trackingParticleRef->pdgId() ) == 11 && (trackingParticleRef->g4Track_end() - trackingParticleRef->g4Track_begin()) > 1 )
557 else if( numberOfValidTrackHits != 0 ) quality=
558 (
static_cast<double>( numberOfSharedHits ) / static_cast<double>( numberOfValidTrackHits ));
568 LogTrace(
"TrackAssociator" ) <<
"% of Assoc Seeds=" << ((double)returnValue.
size()) / ((
double)pSeedCollectionHandle_->size());
578 edm::LogVerbatim(
"TrackAssociator" ) <<
"Starting TrackAssociatorByHitsImpl::associateSimToReco - #seeds=" << pSeedCollectionHandle_->size()
579 <<
" #TPs=" << trackingParticleCollectionHandle->size();
583 size_t collectionSize=pSeedCollectionHandle_->size();
585 for(
size_t i=0;
i < collectionSize; ++
i )
590 std::vector < std::pair<edm::Ref<TrackingParticleCollection>,
size_t> > trackingParticleQualityPairs=
593 trackingParticleQualityPairs.begin(); iTrackingParticleQualityPair != trackingParticleQualityPairs.end();
594 ++iTrackingParticleQualityPair )
597 size_t numberOfSharedHits=iTrackingParticleQualityPair->second;
598 size_t numberOfValidTrackHits=pSeed->
recHits().second - pSeed->
recHits().first;
599 size_t numberOfSimulatedHits=0;
601 if( numberOfSharedHits == 0 )
continue;
604 if(
abs( trackingParticleRef->pdgId() ) == 11 && (trackingParticleRef->g4Track_end() - trackingParticleRef->g4Track_begin()) > 1 )
616 numberOfSimulatedHits=trackingParticleRef->numberOfTrackerHits();
619 double purity=
static_cast<double>( numberOfSharedHits ) / static_cast<double>( numberOfValidTrackHits );
623 / static_cast<double>( numberOfSimulatedHits );
635 LogTrace(
"TrackAssociator") <<
"% of Assoc TPs=" << ((double)returnValue.
size())/((
double)trackingParticleCollectionHandle->size());
ClusterRef cluster() const
bool isNonnull() const
Checks for non-null.
virtual reco::RecoToSimCollection associateRecoToSim(const edm::Handle< edm::View< reco::Track > > &trackCollectionHandle, const edm::Handle< TrackingParticleCollection > &trackingParticleCollectionHandle) const override
compare reco to sim the handle of reco::Track and TrackingParticle collections
bool clusterTPAssociationListGreater(std::pair< OmniClusterRef, TrackingParticleRef > i, std::pair< OmniClusterRef, TrackingParticleRef > j)
g4t_iterator g4Track_begin() const
OmniClusterRef const & stereoClusterRef() const
bool threeHitTracksAreSpecial_
edm::EDProductGetter const * productGetter_
creates either a ClusterTPAssociationList OR a TrackerHitAssociator and stores it in the provided uni...
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
EDProductGetter const * productGetter(std::atomic< void const * > const &iCache)
QuickTrackAssociatorByHitsImpl(edm::EDProductGetter const &productGetter, std::unique_ptr< const TrackerHitAssociator > hitAssoc, const ClusterTPAssociationList *clusterToTPMap, bool absoluteNumberOfHits, double qualitySimToReco, double puritySimToReco, double cutRecoToSim, bool threeHitTracksAreSpecial, SimToRecoDenomType simToRecoDenominator)
virtual reco::SimToRecoCollection associateSimToReco(const edm::Handle< edm::View< reco::Track > > &trackCollectionHandle, const edm::Handle< TrackingParticleCollection > &trackingParticleCollectionHandle) const override
compare reco to sim the handle of reco::Track and TrackingParticle collections
reco::RecoToSimCollection associateRecoToSimImplementation(T_TrackCollection trackCollection, T_TrackingParticleCollection trackingParticleCollection, T_hitOrClusterAssociator hitOrClusterAssociator) const
The method that does the work for both overloads of associateRecoToSim.
const TrackingRecHit * getHitFromIter(trackingRecHit_iterator iter) const
std::vector< std::pair< SimTrackIdentifiers, size_t > > getAllSimTrackIdentifiers(const TrackerHitAssociator &hitAssociator, iter begin, iter end) const
Returns a vector of pairs where first is a SimTrackIdentifiers (see typedef above) and second is the ...
void post_insert()
post insert action
Abs< T >::type abs(const T &t)
ClusterRef cluster() const
SimToRecoDenomType simToRecoDenominator_
trackingRecHit_iterator recHitsBegin() const
Iterator to first hit on the track.
OmniClusterRef const & monoClusterRef() const
int subdetId() const
get the contents of the subdetector field (not cast into any detector's numbering enum) ...
std::vector< SimTrack >::const_iterator g4t_iterator
OmniClusterRef const & omniClusterRef() const
std::vector< std::pair< OmniClusterRef, TrackingParticleRef > > ClusterTPAssociationList
std::pair< uint32_t, EncodedEventId > SimTrackIdentifiers
This is enough information to uniquely identify a sim track.
std::pair< uint32_t, EncodedEventId > SimHitIdpr
SiStripRecHit2D stereoHit() const
std::vector< std::pair< edm::Ref< TrackingParticleCollection >, size_t > > associateTrack(const TrackerHitAssociator &hitAssociator, T_TPCollection trackingParticles, iter begin, iter end) const
Returns the TrackingParticle that has the most associated hits to the given track.
int getDoubleCount(const TrackerHitAssociator &hitAssociator, iter begin, iter end, TrackingParticleRef associatedTrackingParticle) const
This method was copied almost verbatim from the standard TrackAssociatorByHits.
size_type size() const
map size
T const * product() const
void insert(const key_type &k, const data_type &v)
insert an association
ClusterRef cluster() const
int numberOfHits() const
Gives the total number of hits, including muon hits. Hits on overlaps in the same layer count separat...
const ClusterTPAssociationList * clusterToTPMap_
SiStripRecHit2D monoHit() const
bool absoluteNumberOfHits_
std::vector< SimHitIdpr > associateHitId(const TrackingRecHit &thit) const
reco::SimToRecoCollection associateSimToRecoImplementation(T_TrackCollection trackCollection, T_TrackingParticleCollection trackingParticleCollection, T_hitOrClusterAssociator hitOrClusterAssociator) const
The method that does the work for both overloads of associateSimToReco.
unsigned short found() const
Number of valid hits on track.
size_type size() const
Size of the RefVector.
Monte Carlo truth information used for tracking validation.
DetId geographicalId() const
g4t_iterator g4Track_end() const
edm::Ref< TrackingParticleCollection > TrackingParticleRef
bool trackingParticleContainsIdentifier(const TrackingParticle *pTrackingParticle, const SimTrackIdentifiers &identifier) const
Returns true if the supplied TrackingParticle has the supplied g4 track identifiers.
std::vector< OmniClusterRef > getMatchedClusters(iter begin, iter end) const
std::unique_ptr< const TrackerHitAssociator > hitAssociator_
trackingRecHit_iterator recHitsEnd() const
Iterator to last hit on the track.