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) {
440 edm::LogError(
"TrackAssociator") <<
">>> RecHit does not have an associated cluster!" <<
" file: " << __FILE__ <<
" line: " << __LINE__;
444 const std::type_info &tid =
typeid(*rhit);
448 edm::LogError(
"TrackAssociator") <<
">>> RecHit does not have an associated cluster!" <<
" file: " << __FILE__ <<
" line: " << __LINE__;
455 edm::LogError(
"TrackAssociator") <<
">>> RecHit does not have an associated cluster!" <<
" file: " << __FILE__ <<
" line: " << __LINE__;
461 edm::LogError(
"TrackAssociator") <<
">>> RecHit does not have an associated cluster!" <<
" file: " << __FILE__ <<
" line: " << __LINE__;
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());
ClusterRef cluster() 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.
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
OmniClusterRef const & stereoClusterRef() 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_
bool isNonnull() const
Checks for non-null.
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)
ClusterRef cluster() const
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) ...
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
std::vector< SimTrack >::const_iterator g4t_iterator
OmniClusterRef const & omniClusterRef() const
std::pair< uint32_t, EncodedEventId > SimHitIdpr
SiStripRecHit2D stereoHit() const
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_
ClusterRef cluster() const
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 ...
SiStripRecHit2D monoHit() const
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.