** Warning **
Issuing rollback() due to DESTROY without explicit disconnect() of DBD::mysql::db handle dbname=lxr at /lxr/lib/LXR/Common.pm line 1113.
Last-Modified: Wed, 1 Jul 2025 00:07:54 GMT
Content-Type: text/html; charset=utf-8
/CMSSW_15_1_X_2025-06-30-2300/RecoMuon/CosmicMuonProducer/plugins/CosmicMuonLinksProducer.cc
File indexing completed on 2025-01-09 23:33:51
0001 #include "RecoMuon /CosmicMuonProducer /plugins /CosmicMuonLinksProducer.h "
0002
0003
0004
0005
0006
0007
0008
0009
0010 #include <memory>
0011
0012
0013 #include "FWCore /Framework /interface /ConsumesCollector.h "
0014 #include "FWCore /Framework /interface /Frameworkfwd.h "
0015
0016 #include "FWCore /Framework /interface /Event.h "
0017 #include "FWCore /Framework /interface /MakerMacros.h "
0018
0019 #include "FWCore /ParameterSet /interface /ParameterSet.h "
0020
0021 #include "FWCore /Framework /interface /EventSetup.h "
0022 #include "FWCore /Framework /interface /ESHandle.h "
0023 #include "FWCore /MessageLogger /interface /MessageLogger.h "
0024
0025 #include "DataFormats /TrackReco /interface /Track.h "
0026 #include "DataFormats /TrackReco /interface /TrackExtra.h "
0027 #include "RecoMuon /TrackingTools /interface /MuonServiceProxy.h "
0028
0029 using namespace edm ;
0030 using namespace std ;
0031 using namespace reco ;
0032
0033
0034
0035
0036 CosmicMuonLinksProducer ::CosmicMuonLinksProducer (const ParameterSet & iConfig ) {
0037 category_ = "Muon|RecoMuon|CosmicMuon|CosmicMuonLinksProducer" ;
0038
0039 ParameterSet serviceParameters = iConfig .getParameter <ParameterSet >("ServiceParameters" );
0040
0041 theService = new MuonServiceProxy (serviceParameters , consumesCollector ());
0042
0043 std ::vector <edm ::ParameterSet > theMapPSets = iConfig .getParameter <std ::vector <edm ::ParameterSet > >("Maps" );
0044 for (std ::vector <edm ::ParameterSet >::const_iterator iMPS = theMapPSets .begin (); iMPS != theMapPSets .end (); iMPS++) {
0045 edm ::InputTag sTag = (*iMPS).getParameter <edm ::InputTag >("subTrack" );
0046 edm ::InputTag pTag = (*iMPS).getParameter <edm ::InputTag >("parentTrack" );
0047
0048 edm ::EDGetTokenT <reco ::TrackCollection > subTrackTag = consumes <reco ::TrackCollection >(sTag );
0049 edm ::EDGetTokenT <reco ::TrackCollection > parentTrackTag = consumes <reco ::TrackCollection >(pTag );
0050 theTrackLinks .push_back (make_pair (subTrackTag , parentTrackTag ));
0051 theTrackLinkNames .push_back (make_pair (sTag .label (), pTag .label ()));
0052
0053 LogDebug (category_ ) << "preparing map between " << sTag << " & " << pTag ;
0054 std ::string mapname = sTag .label () + "To" + pTag .label ();
0055 produces <reco ::TrackToTrackMap >(mapname );
0056 }
0057 }
0058
0059 CosmicMuonLinksProducer ::~CosmicMuonLinksProducer () {
0060 if (theService )
0061 delete theService ;
0062 }
0063
0064
0065 void CosmicMuonLinksProducer ::produce (Event & iEvent , const EventSetup & iSetup ) {
0066 LogInfo (category_ ) << "Processing event number: " << iEvent .id ();
0067
0068 theService ->update (iSetup );
0069
0070 unsigned int counter =
0071 0;
0072 for (std ::vector <std ::pair <edm ::EDGetTokenT <reco ::TrackCollection >,
0073 edm ::EDGetTokenT <reco ::TrackCollection > > >::const_iterator iLink = theTrackLinks .begin ();
0074 iLink != theTrackLinks .end ();
0075 iLink ++) {
0076 #ifdef EDM_ML_DEBUG
0077 edm ::EDConsumerBase ::Labels labels_first ;
0078 edm ::EDConsumerBase ::Labels labels_second ;
0079 labelsForToken (iLink ->first , labels_first );
0080 labelsForToken (iLink ->second , labels_second );
0081 LogDebug (category_ ) << "making map between " << labels_first .module << " and " << labels_second .module ;
0082 #endif
0083 std ::string mapname = theTrackLinkNames [counter ].first + "To" + theTrackLinkNames [counter ].second ;
0084 reco ::TrackToTrackMap ttmap ;
0085
0086 Handle <reco ::TrackCollection > subTracks ;
0087 Handle <reco ::TrackCollection > parentTracks ;
0088
0089 iEvent .getByToken ((*iLink ).first , subTracks );
0090 iEvent .getByToken ((*iLink ).second , parentTracks );
0091
0092 ttmap = mapTracks (subTracks , parentTracks );
0093 LogTrace (category_ ) << "Mapped: " << theTrackLinkNames [counter ].first << " " << subTracks ->size () << " and "
0094 << theTrackLinkNames [counter ].second << " " << parentTracks ->size ()
0095 << ", results: " << ttmap .size () << endl ;
0096
0097 iEvent .put (std ::make_unique <reco ::TrackToTrackMap >(ttmap ), mapname );
0098
0099 counter ++;
0100 }
0101 }
0102
0103 reco ::TrackToTrackMap CosmicMuonLinksProducer ::mapTracks (const Handle <reco ::TrackCollection >& subTracks ,
0104 const Handle <reco ::TrackCollection >& parentTracks ) const {
0105 reco ::TrackToTrackMap map (subTracks , parentTracks );
0106 for (unsigned int position1 = 0; position1 != subTracks ->size (); ++position1 ) {
0107 TrackRef track1 (subTracks , position1 );
0108 for (unsigned int position2 = 0; position2 != parentTracks ->size (); ++position2 ) {
0109 TrackRef track2 (parentTracks , position2 );
0110 int shared = sharedHits (*track1 , *track2 );
0111 LogTrace (category_ ) << "sharedHits " << shared << " track1 " << track1 ->found () << " track2 " << track2 ->found ()
0112 << endl ;
0113
0114 if (shared > (track1 ->found ()) / 2)
0115 map .insert (track1 , track2 );
0116 }
0117 }
0118
0119 return map ;
0120 }
0121
0122 int CosmicMuonLinksProducer ::sharedHits (const reco ::Track & track1 , const reco ::Track & track2 ) const {
0123 int match = 0;
0124
0125 for (trackingRecHit_iterator hit1 = track1 .recHitsBegin (); hit1 != track1 .recHitsEnd (); ++hit1 ) {
0126 if (!(*hit1 )->isValid ())
0127 continue ;
0128 DetId id1 = (*hit1 )->geographicalId ();
0129 if (id1 .det () != DetId ::Muon )
0130 continue ;
0131 LogTrace (category_ ) << "first ID " << id1 .rawId () << " " << (*hit1 )->localPosition () << endl ;
0132 GlobalPoint pos1 = theService ->trackingGeometry ()->idToDet (id1 )->surface ().toGlobal ((*hit1 )->localPosition ());
0133
0134 for (trackingRecHit_iterator hit2 = track2 .recHitsBegin (); hit2 != track2 .recHitsEnd (); ++hit2 ) {
0135 if (!(*hit2 )->isValid ())
0136 continue ;
0137
0138 DetId id2 = (*hit2 )->geographicalId ();
0139 if (id2 .det () != DetId ::Muon )
0140 continue ;
0141
0142
0143
0144 if (id2 .rawId () != id1 .rawId ())
0145 continue ;
0146
0147 GlobalPoint pos2 = theService ->trackingGeometry ()->idToDet (id2 )->surface ().toGlobal ((*hit2 )->localPosition ());
0148 if ((pos1 - pos2 ).mag () < 10e -5)
0149 match ++;
0150 }
0151 }
0152
0153 return match ;
0154 }
0155
0156 #include "FWCore /Framework /interface /MakerMacros.h "
0157 DEFINE_FWK_MODULE (CosmicMuonLinksProducer );