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];
90 absoluteNumberOfHits_( config.getParameter<bool>(
"AbsoluteNumberOfHits" ) ),
91 qualitySimToReco_( config.getParameter<double>(
"Quality_SimToReco" ) ),
92 puritySimToReco_( config.getParameter<double>(
"Purity_SimToReco" ) ),
93 cutRecoToSim_( config.getParameter<double>(
"Cut_RecoToSim" ) ),
94 threeHitTracksAreSpecial_( config.getParameter<bool>(
"ThreeHitTracksAreSpecial" ) ),
95 useClusterTPAssociation_( config.getParameter<bool>(
"useClusterTPAssociation" ) ),
96 cluster2TPSrc_( config.getParameter < edm::InputTag > (
"cluster2TPSrc") )
105 else throw cms::Exception(
"QuickTrackAssociatorByHits" ) <<
"SimToRecoDenominator not specified as sim or reco";
121 bool useGrouped, useSplitting;
123 else useGrouped=
true;
125 if( config.
exists(
"UseSplitting") ) useSplitting=config.
getParameter<
bool>(
"UseSplitting");
126 else useSplitting=
true;
130 if( !(useGrouped && useSplitting) )
132 edm::LogWarning(
"QuickTrackAssociatorByHits") <<
"UseGrouped and/or UseSplitting has been set to false, but this associator ignores that setting.";
144 std::unique_ptr<ClusterTPAssociationList> pClusterToTPMap;
145 std::unique_ptr<TrackerHitAssociator> pHitAssociator;
157 std::unique_ptr<ClusterTPAssociationList> pClusterToTPMap;
158 std::unique_ptr<TrackerHitAssociator> pHitAssociator;
170 std::unique_ptr<ClusterTPAssociationList> pClusterToTPMap;
171 std::unique_ptr<TrackerHitAssociator> pHitAssociator;
183 std::unique_ptr<ClusterTPAssociationList> pClusterToTPMap;
184 std::unique_ptr<TrackerHitAssociator> pHitAssociator;
194 template<
class T_TrackCollection,
class T_TrackingParticleCollection,
class T_hitOrClusterAssociator>
199 size_t collectionSize=::collectionSize(trackCollection);
202 for(
size_t i=0;
i < collectionSize; ++
i )
204 const reco::Track* pTrack=::getTrackAt(trackCollection,
i);
208 std::vector < std::pair<edm::Ref<TrackingParticleCollection>,
size_t> > trackingParticleQualityPairs=
associateTrack( hitOrClusterAssociator, trackingParticleCollection, pTrack->
recHitsBegin(), pTrack->
recHitsEnd() );
212 trackingParticleQualityPairs.begin(); iTrackingParticleQualityPair != trackingParticleQualityPairs.end();
213 ++iTrackingParticleQualityPair )
216 size_t numberOfSharedHits=iTrackingParticleQualityPair->second;
217 size_t numberOfValidTrackHits=pTrack->
found();
220 if( numberOfSharedHits == 0 )
continue;
223 if(
abs( trackingParticleRef->pdgId() ) == 11 && (trackingParticleRef->g4Track_end() - trackingParticleRef->g4Track_begin()) > 1 )
230 else if( numberOfValidTrackHits != 0 ) quality=
231 (
static_cast<double>( numberOfSharedHits ) / static_cast<double>( numberOfValidTrackHits ));
236 returnValue.
insert( ::getRefToTrackAt(trackCollection,
i), std::make_pair( trackingParticleRef, quality ) );
243 template<
class T_TrackCollection,
class T_TrackingParticleCollection,
class T_hitOrClusterAssociator>
248 size_t collectionSize=::collectionSize(trackCollection);
250 for(
size_t i=0;
i<collectionSize; ++
i )
252 const reco::Track* pTrack=::getTrackAt(trackCollection,
i);
255 std::vector < std::pair<edm::Ref<TrackingParticleCollection>,
size_t> > trackingParticleQualityPairs=
associateTrack( hitOrClusterAssociator, trackingParticleCollection, pTrack->
recHitsBegin(), pTrack->
recHitsEnd() );
259 iTrackingParticleQualityPair!=trackingParticleQualityPairs.end(); ++iTrackingParticleQualityPair )
262 size_t numberOfSharedHits=iTrackingParticleQualityPair->second;
263 size_t numberOfValidTrackHits=pTrack->
found();
264 size_t numberOfSimulatedHits=0;
267 if( numberOfSharedHits==0 )
continue;
275 numberOfSimulatedHits=trackingParticleRef->numberOfTrackerHits();
279 if (
abs(trackingParticleRef->pdgId())==11 && (trackingParticleRef->g4Track_end() - trackingParticleRef->g4Track_begin()) > 1 )
284 double purity=
static_cast<double>(numberOfSharedHits)/static_cast<double>(numberOfValidTrackHits);
287 else if(
simToRecoDenominator_==
denomsim && numberOfSimulatedHits != 0 ) quality=
static_cast<double>(numberOfSharedHits)/static_cast<double>(numberOfSimulatedHits);
294 returnValue.
insert( trackingParticleRef, std::make_pair( ::getRefToTrackAt(trackCollection,
i), quality ) );
305 std::vector< std::pair<edm::Ref<TrackingParticleCollection>,
size_t> > returnValue;
310 std::vector< std::pair<SimTrackIdentifiers,size_t> > hitIdentifiers=
getAllSimTrackIdentifiers( hitAssociator, begin, end );
313 size_t collectionSize=::collectionSize(trackingParticles);
315 for(
size_t i=0;
i<collectionSize; ++
i )
317 const TrackingParticle* pTrackingParticle=getTrackingParticleAt( trackingParticles,
i );
322 size_t numberOfAssociatedHits=0;
325 for( std::vector< std::pair<SimTrackIdentifiers,size_t> >::const_iterator iIdentifierCountPair=hitIdentifiers.begin(); iIdentifierCountPair!=hitIdentifiers.end(); ++iIdentifierCountPair )
330 if( numberOfAssociatedHits>0 )
332 returnValue.push_back( std::make_pair( getRefToTrackingParticleAt(trackingParticles,
i), numberOfAssociatedHits ) );
345 if( pCluster2TPListH.
isValid() )
351 pHitAssociator.reset();
357 <<
" not found. Using DigiSimLink based associator";
367 pClusterToTPMap.reset();
378 std::vector < std::pair<edm::Ref<TrackingParticleCollection>,
size_t> > returnValue;
379 if( clusterToTPMap.empty() )
return returnValue;
387 std::map < TrackingParticleRef, size_t > lmap;
388 for( std::vector<OmniClusterRef>::const_iterator it=oClusters.begin(); it != oClusters.end(); ++it )
391 std::pair < OmniClusterRef, TrackingParticleRef > clusterTPpairWithDummyTP( *it,
TrackingParticleRef() );
393 if( range.first != range.second )
395 for(
auto ip=range.first; ip != range.second; ++ip )
401 if( trackingParticle->numberOfHits() == 0 )
continue;
416 auto jpos=lmap.find( trackingParticle );
417 if( jpos != lmap.end() ) ++jpos->second;
418 else lmap.insert( std::make_pair( trackingParticle, 1 ) );
423 for(
auto ip=lmap.begin(); ip != lmap.end(); ++ip )
425 returnValue.push_back( std::make_pair( ip->first, ip->second ) );
432 std::vector<OmniClusterRef> returnValue;
433 for (iter iRecHit = begin; iRecHit !=
end; ++iRecHit) {
439 if (!pRHit->cluster().isNonnull())
440 edm::LogError(
"TrackAssociator") <<
">>> RecHit does not have an associated cluster!" <<
" file: " << __FILE__ <<
" line: " << __LINE__;
441 returnValue.push_back(pRHit->omniClusterRef());
444 const std::type_info &tid =
typeid(*rhit);
445 if (tid ==
typeid(SiStripMatchedRecHit2D)) {
446 const SiStripMatchedRecHit2D* sMatchedRHit =
dynamic_cast<const SiStripMatchedRecHit2D*
>(rhit);
447 if (!sMatchedRHit->monoHit().cluster().isNonnull() || !sMatchedRHit->stereoHit().cluster().isNonnull())
448 edm::LogError(
"TrackAssociator") <<
">>> RecHit does not have an associated cluster!" <<
" file: " << __FILE__ <<
" line: " << __LINE__;
449 returnValue.push_back(sMatchedRHit->monoClusterRef());
450 returnValue.push_back(sMatchedRHit->stereoClusterRef());
452 else if (tid ==
typeid(SiStripRecHit2D)) {
453 const SiStripRecHit2D* sRHit =
dynamic_cast<const SiStripRecHit2D*
>(rhit);
454 if (!sRHit->cluster().isNonnull())
455 edm::LogError(
"TrackAssociator") <<
">>> RecHit does not have an associated cluster!" <<
" file: " << __FILE__ <<
" line: " << __LINE__;
456 returnValue.push_back(sRHit->omniClusterRef());
458 else if (tid ==
typeid(SiStripRecHit1D)) {
459 const SiStripRecHit1D* sRHit =
dynamic_cast<const SiStripRecHit1D*
>(rhit);
460 if (!sRHit->cluster().isNonnull())
461 edm::LogError(
"TrackAssociator") <<
">>> RecHit does not have an associated cluster!" <<
" file: " << __FILE__ <<
" line: " << __LINE__;
462 returnValue.push_back(sRHit->omniClusterRef());
465 edm::LogError(
"TrackAssociator") <<
">>> getMatchedClusters: TrackingRecHit not associated to any SiStripCluster! subdetid = " << subdetid;
469 edm::LogError(
"TrackAssociator") <<
">>> getMatchedClusters: TrackingRecHit not associated to any cluster! subdetid = " << subdetid;
479 std::vector < std::pair<SimTrackIdentifiers,size_t> > returnValue;
481 std::vector<SimTrackIdentifiers> simTrackIdentifiers;
484 for( iter iRecHit=begin; iRecHit !=
end; ++iRecHit )
488 simTrackIdentifiers.clear();
494 for( std::vector<SimTrackIdentifiers>::const_iterator iIdentifier=simTrackIdentifiers.begin(); iIdentifier != simTrackIdentifiers.end();
497 std::vector<std::pair<SimTrackIdentifiers,size_t> >::iterator iIdentifierCountPair;
498 for( iIdentifierCountPair=returnValue.begin(); iIdentifierCountPair != returnValue.end(); ++iIdentifierCountPair )
500 if( iIdentifierCountPair->first.first == iIdentifier->first && iIdentifierCountPair->first.second == iIdentifier->second )
503 ++iIdentifierCountPair->second;
507 if( iIdentifierCountPair == returnValue.end() ) returnValue.push_back( std::make_pair( *iIdentifier, 1 ) );
518 for( std::vector<SimTrack>::const_iterator iSimTrack=pTrackingParticle->
g4Track_begin(); iSimTrack != pTrackingParticle->
g4Track_end();
522 if( iSimTrack->eventId() == identifier.second && iSimTrack->trackId() == identifier.first )
539 std::vector < SimHitIdpr > SimTrackIdsDC;
541 for( iter iHit=startIterator; iHit != endIterator; iHit++ )
545 SimTrackIdsDC.clear();
547 if( SimTrackIdsDC.size() > 1 )
552 if(
find( SimTrackIdsDC.begin(), SimTrackIdsDC.end(),
SimHitIdpr( ( *g4T).trackId(), SimTrackIdsDC.begin()->second ) )
553 != SimTrackIdsDC.end() )
559 if( idcount > 1 ) doubleCount+=(idcount - 1);
571 std::vector < SimHitIdpr > SimTrackIdsDC;
573 for( iter iHit=startIterator; iHit != endIterator; iHit++ )
578 for( std::vector<OmniClusterRef>::const_iterator it=oClusters.begin(); it != oClusters.end(); ++it )
580 std::pair<OmniClusterRef,TrackingParticleRef> clusterTPpairWithDummyTP( *it,
TrackingParticleRef() );
582 if( range.first != range.second )
584 for(
auto ip=range.first; ip != range.second; ++ip )
587 if( associatedTrackingParticle == trackingParticle )
595 if( idcount > 1 ) doubleCount+=(idcount - 1);
605 edm::LogVerbatim(
"TrackAssociator" ) <<
"Starting TrackAssociatorByHits::associateRecoToSim - #seeds=" << pSeedCollectionHandle_->size()
606 <<
" #TPs=" << trackingParticleCollectionHandle->size();
613 std::unique_ptr<ClusterTPAssociationList> pClusterToTPList;
614 std::unique_ptr<TrackerHitAssociator> pTrackerHitAssociator;
624 size_t collectionSize=pSeedCollectionHandle_->
size();
626 for(
size_t i=0;
i < collectionSize; ++
i )
631 std::vector < std::pair<edm::Ref<TrackingParticleCollection>,
size_t> > trackingParticleQualityPairs=
634 trackingParticleQualityPairs.begin(); iTrackingParticleQualityPair != trackingParticleQualityPairs.end();
635 ++iTrackingParticleQualityPair )
638 size_t numberOfSharedHits=iTrackingParticleQualityPair->second;
639 size_t numberOfValidTrackHits=pSeed->
recHits().second - pSeed->
recHits().first;
641 if( numberOfSharedHits == 0 )
continue;
644 if(
abs( trackingParticleRef->pdgId() ) == 11 && (trackingParticleRef->g4Track_end() - trackingParticleRef->g4Track_begin()) > 1 )
646 if( pClusterToTPList!=
nullptr ) numberOfSharedHits-=
getDoubleCount( *pClusterToTPList, pSeed->
recHits().first, pSeed->
recHits().second, trackingParticleRef );
647 else numberOfSharedHits-=
getDoubleCount( *pTrackerHitAssociator, pSeed->
recHits().first, pSeed->
recHits().second, trackingParticleRef );
652 else if( numberOfValidTrackHits != 0 ) quality=
653 (
static_cast<double>( numberOfSharedHits ) / static_cast<double>( numberOfValidTrackHits ));
663 LogTrace(
"TrackAssociator" ) <<
"% of Assoc Seeds=" << ((double)returnValue.
size()) / ((
double)pSeedCollectionHandle_->size());
673 edm::LogVerbatim(
"TrackAssociator" ) <<
"Starting TrackAssociatorByHits::associateSimToReco - #seeds=" << pSeedCollectionHandle_->size()
674 <<
" #TPs=" << trackingParticleCollectionHandle->size();
681 std::unique_ptr<ClusterTPAssociationList> pClusterToTPList;
682 std::unique_ptr<TrackerHitAssociator> pTrackerHitAssociator;
692 size_t collectionSize=pSeedCollectionHandle_->
size();
694 for(
size_t i=0;
i < collectionSize; ++
i )
699 std::vector < std::pair<edm::Ref<TrackingParticleCollection>,
size_t> > trackingParticleQualityPairs=
702 trackingParticleQualityPairs.begin(); iTrackingParticleQualityPair != trackingParticleQualityPairs.end();
703 ++iTrackingParticleQualityPair )
706 size_t numberOfSharedHits=iTrackingParticleQualityPair->second;
707 size_t numberOfValidTrackHits=pSeed->
recHits().second - pSeed->
recHits().first;
708 size_t numberOfSimulatedHits=0;
710 if( numberOfSharedHits == 0 )
continue;
713 if(
abs( trackingParticleRef->pdgId() ) == 11 && (trackingParticleRef->g4Track_end() - trackingParticleRef->g4Track_begin()) > 1 )
715 if( pClusterToTPList!=
nullptr ) numberOfSharedHits-=
getDoubleCount( *pClusterToTPList, pSeed->
recHits().first, pSeed->
recHits().second, trackingParticleRef );
716 else numberOfSharedHits-=
getDoubleCount( *pTrackerHitAssociator, pSeed->
recHits().first, pSeed->
recHits().second, trackingParticleRef );
725 numberOfSimulatedHits=trackingParticleRef->numberOfTrackerHits();
728 double purity=
static_cast<double>( numberOfSharedHits ) / static_cast<double>( numberOfValidTrackHits );
732 / static_cast<double>( numberOfSimulatedHits );
745 LogTrace(
"TrackAssociator") <<
"% of Assoc TPs=" << ((double)returnValue.
size())/((
double)trackingParticleCollectionHandle->size());
reco::SimToRecoCollection associateSimToRecoImplementation(T_TrackCollection trackCollection, T_TrackingParticleCollection trackingParticleCollection, T_hitOrClusterAssociator hitOrClusterAssociator) const
The method that does the work for both overloads of associateSimToReco.
T getParameter(std::string const &) const
const TrackingRecHit * getHitFromIter(trackingRecHit_iterator iter) const
static bool clusterTPAssociationListGreater(std::pair< OmniClusterRef, TrackingParticleRef > i, std::pair< OmniClusterRef, TrackingParticleRef > j)
std::vector< TrackingParticle > TrackingParticleCollection
bool trackingParticleContainsIdentifier(const TrackingParticle *pTrackingParticle, const SimTrackIdentifiers &identifier) const
Returns true if the supplied TrackingParticle has the supplied g4 track identifiers.
g4t_iterator g4Track_begin() const
virtual reco::SimToRecoCollection associateSimToReco(edm::Handle< edm::View< reco::Track > > &trackCollectionHandle, edm::Handle< TrackingParticleCollection > &trackingParticleCollectionHandle, const edm::Event *pEvent=0, const edm::EventSetup *pSetup=0) const override
compare reco to sim the handle of reco::Track and TrackingParticle collections
bool exists(std::string const ¶meterName) const
checks if a parameter exists
QuickTrackAssociatorByHits(const edm::ParameterSet &config)
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
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.
std::pair< uint32_t, EncodedEventId > SimTrackIdentifiers
This is enough information to uniquely identify a sim track.
bool absoluteNumberOfHits_
void post_insert()
post insert action
bool threeHitTracksAreSpecial_
void addParameter(std::string const &name, T const &value)
std::vector< std::pair< OmniClusterRef, TrackingParticleRef > > ClusterTPAssociationList
virtual reco::RecoToSimCollection associateRecoToSim(edm::Handle< edm::View< reco::Track > > &trackCollectionHandle, edm::Handle< TrackingParticleCollection > &trackingParticleCollectionHandle, const edm::Event *pEvent=0, const edm::EventSetup *pSetup=0) const override
compare reco to sim the handle of reco::Track and TrackingParticle collections
Abs< T >::type abs(const T &t)
trackingRecHit_iterator recHitsBegin() const
Iterator to first hit on the track.
int subdetId() const
get the contents of the subdetector field (not cast into any detector's numbering enum) ...
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
std::vector< SimTrack >::const_iterator g4t_iterator
std::pair< uint32_t, EncodedEventId > SimHitIdpr
size_type size() const
map size
void insert(const key_type &k, const data_type &v)
insert an association
void prepareEitherHitAssociatorOrClusterToTPMap(const edm::Event *pEvent, std::unique_ptr< ClusterTPAssociationList > &pClusterToTPMap, std::unique_ptr< TrackerHitAssociator > &pHitAssociator) const
creates either a ClusterTPAssociationList OR a TrackerHitAssociator and stores it in the provided uni...
edm::ParameterSet hitAssociatorParameters_
int getDoubleCount(const TrackerHitAssociator &hitAssociator, iter begin, iter end, TrackingParticleRef associatedTrackingParticle) const
This method was copied almost verbatim from the standard TrackAssociatorByHits.
bool useClusterTPAssociation_
int numberOfHits() const
Gives the total number of hits, including muon hits. Hits on overlaps in the same layer count separat...
T const * product() 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 ...
std::vector< SimHitIdpr > associateHitId(const TrackingRecHit &thit) const
std::vector< OmniClusterRef > getMatchedClusters(iter begin, iter end) const
unsigned short found() const
Number of valid hits on track.
size_type size() const
Size of the RefVector.
reco::RecoToSimCollection associateRecoToSimImplementation(T_TrackCollection trackCollection, T_TrackingParticleCollection trackingParticleCollection, T_hitOrClusterAssociator hitOrClusterAssociator) const
The method that does the work for both overloads of associateRecoToSim.
Monte Carlo truth information used for tracking validation.
SimToRecoDenomType simToRecoDenominator_
DetId geographicalId() const
~QuickTrackAssociatorByHits()
g4t_iterator g4Track_end() const
void setup(std::vector< TH2F > &depth, std::string name, std::string units="")
edm::Ref< TrackingParticleCollection > TrackingParticleRef
edm::InputTag cluster2TPSrc_
trackingRecHit_iterator recHitsEnd() const
Iterator to last hit on the track.