37 #include <boost/regex.hpp>
56 muIsoExtractorCalo_(0),muIsoExtractorTrack_(0),muIsoExtractorJet_(0)
58 produces<reco::MuonCollection>();
59 produces<reco::CaloMuonCollection>();
60 produces<reco::MuonTimeExtraMap>(
"combined");
61 produces<reco::MuonTimeExtraMap>(
"dt");
62 produces<reco::MuonTimeExtraMap>(
"csc");
83 if (fillGlobalTrackQuality_) fillTrackerKink_ = iConfig.
getParameter<
bool>(
"fillTrackerKink");
100 if (fillCaloCompatibility_){
120 if (fillIsolation_ && writeIsoDeposits_){
136 throw cms::Exception(
"ConfigurationError") <<
"Number of input collection labels is different from number of types. " <<
137 "For each collection label there should be exactly one collection type specified.";
139 throw cms::Exception(
"ConfigurationError") <<
"Number of input collections should be from 1 to 7.";
143 <<
"========================================================================\n"
144 <<
"Debugging mode with truth matching is turned on!!! Make sure you understand what you are doing!\n"
145 <<
"========================================================================\n";
146 if (fillGlobalTrackQuality_){
150 if (fillTrackerKink_) {
159 rpcHitToken_ = consumes<RPCRecHitCollection>(rpcHitTag);
165 if ( inputCollectionTypes_[
i] ==
"inner tracks" ) {
169 if ( inputCollectionTypes_[
i] ==
"outer tracks" ) {
173 if ( inputCollectionTypes_[
i] ==
"links" ) {
177 if ( inputCollectionTypes_[
i] ==
"muons" ) {
181 if ( fillGlobalTrackRefits_ && inputCollectionTypes_[
i] ==
"tev firstHit" ) {
186 if ( fillGlobalTrackRefits_ && inputCollectionTypes_[
i] ==
"tev picky" ) {
191 if ( fillGlobalTrackRefits_ && inputCollectionTypes_[
i] ==
"tev dyt" ) {
195 throw cms::Exception(
"FatalError") <<
"Unknown input collection type: " << inputCollectionTypes_[
i];
295 LogTrace(
"MuonIdentification") <<
"Creating a muon from a track " << track.
get()->pt() <<
296 " Pt (GeV), eta: " << track.
get()->eta();
300 aMuon.setBestTrack(type);
301 aMuon.setTunePBestTrack(type);
320 LogTrace(
"MuonIdentification") <<
"Creating a muon from a link to tracks object";
326 bool useSigmaSwitch =
false;
334 if (tpfmsRef.
isNull() && pickyRef.isNull()){
335 edm::LogWarning(
"MakeMuonWithTEV")<<
"Failed to get TEV refits, fall back to sigma switch.";
336 useSigmaSwitch =
true;
339 useSigmaSwitch =
true;
351 aMuon =
makeMuon(*chosenTrack.first);
380 LogTrace(
"MuonIdentification") <<
"Skipped low momentum track (Pt,P): " << track.
pt() <<
381 ", " << track.
p() <<
" GeV";
387 LogTrace(
"MuonIdentification") <<
"Skipped track with large pseudo rapidity (Eta: " << track.
eta() <<
" )";
395 switch (
id.det() ) {
397 switch (
id.subdetId() ) {
401 return detId.
rawId();
422 int numberOfCommonDetIds = 0;
425 track.
extra()->recHits().
isNull() )
return numberOfCommonDetIds;
426 const std::vector<reco::MuonChamberMatch>& matches( muon.
matches() );
427 for ( std::vector<reco::MuonChamberMatch>::const_iterator
match = matches.begin();
430 if (
match->segmentMatches.empty() )
continue;
431 bool foundCommonDetId =
false;
441 foundCommonDetId =
true;
445 if ( foundCommonDetId ) {
446 numberOfCommonDetIds++;
450 return numberOfCommonDetIds;
466 badMuon.
globalTrack()->hitPattern().numberOfValidMuonHits()) > 10 ){
473 if ( goodMuon.
globalTrack()->hitPattern().numberOfValidMuonHits() <
474 badMuon.
globalTrack()->hitPattern().numberOfValidMuonHits() )
return false;
486 init(iEvent, iSetup);
512 outputMuons->push_back(*
muon);
517 if ( goodmuons.size()>1 ){
532 goodmuons[
j] =
false;
534 goodmuons[
i] =
false;
540 if ( !goodmuons[
i] )
continue;
543 if ( !goodmuons[
j] )
continue;
550 goodmuons[
j] =
false;
552 goodmuons[
i] =
false;
558 if ( !goodmuons[
i] )
continue;
563 for ( reco::MuonCollection::const_iterator
muon = outputMuons->begin();
564 muon != outputMuons->end(); ++
muon )
570 outputMuons->push_back(
makeMuon( *links ) );
578 LogTrace(
"MuonIdentification") <<
"Creating tracker muons";
583 bool splitTrack =
false;
586 std::vector<TrackDetectorAssociator::Direction>
directions;
593 for ( std::vector<TrackDetectorAssociator::Direction>::const_iterator direction = directions.begin();
594 direction != directions.end(); ++direction )
600 fillMuonId(iEvent, iSetup, trackerMuon, *direction);
615 for ( reco::MuonCollection::iterator
muon = outputMuons->begin();
616 muon != outputMuons->end(); ++
muon )
628 LogTrace(
"MuonIdentification") <<
"Found a corresponding global muon. Set energy, matches and move on";
633 if ( goodTrackerMuon ){
634 outputMuons->push_back( trackerMuon );
636 LogTrace(
"MuonIdentification") <<
"track failed minimal number of muon matches requirement";
639 caloMuons->push_back( caloMuon );
648 LogTrace(
"MuonIdentification") <<
"Looking for new muons among stand alone muon tracks";
653 for ( reco::MuonCollection::iterator
muon = outputMuons->begin();
654 muon != outputMuons->end(); ++
muon )
656 if ( !
muon->standAloneMuon().isNull() ) {
671 LogTrace(
"MuonIdentification") <<
"Found associated tracker muon. Set a reference and move on";
680 LogTrace(
"MuonIdentification") <<
"No associated stand alone track is found. Making a muon";
681 outputMuons->push_back(
makeMuon(iEvent, iSetup,
688 LogTrace(
"MuonIdentification") <<
"Dress up muons if it's necessary";
690 int nMuons=outputMuons->size();
692 std::vector<reco::MuonTimeExtra> dtTimeColl(nMuons);
693 std::vector<reco::MuonTimeExtra> cscTimeColl(nMuons);
694 std::vector<reco::MuonTimeExtra> combinedTimeColl(nMuons);
695 std::vector<reco::IsoDeposit> trackDepColl(nMuons);
696 std::vector<reco::IsoDeposit> ecalDepColl(nMuons);
697 std::vector<reco::IsoDeposit> hcalDepColl(nMuons);
698 std::vector<reco::IsoDeposit> hoDepColl(nMuons);
699 std::vector<reco::IsoDeposit> jetDepColl(nMuons);
703 for ( reco::MuonCollection::iterator
muon = outputMuons->begin();
muon != outputMuons->end(); ++
muon )
712 if (
muon->isStandAloneMuon() ) {
718 LogTrace(
"MuonIdentification") <<
"THIS SHOULD NEVER HAPPEN";
739 trackDepColl[i], ecalDepColl[i], hcalDepColl[i], hoDepColl[i], jetDepColl[i]);
756 muon->setTime( muonTime);
757 dtTimeColl[
i] = dtTime;
758 cscTimeColl[
i] = cscTime;
759 combinedTimeColl[
i] = combinedTime;
765 LogTrace(
"MuonIdentification") <<
"number of muons produced: " << outputMuons->size();
771 filler.
insert(muonHandle, combinedTimeColl.begin(), combinedTimeColl.end());
773 fillerDT.
insert(muonHandle, dtTimeColl.begin(), dtTimeColl.end());
775 fillerCSC.
insert(muonHandle, cscTimeColl.begin(), cscTimeColl.end());
778 iEvent.
put(muonTimeMap,
"combined");
779 iEvent.
put(muonTimeMapDT,
"dt");
780 iEvent.
put(muonTimeMapCSC,
"csc");
783 trackDepFiller.
insert(muonHandle, trackDepColl.begin(), trackDepColl.end());
784 trackDepFiller.
fill();
786 ecalDepFiller.
insert(muonHandle, ecalDepColl.begin(), ecalDepColl.end());
787 ecalDepFiller.
fill();
789 hcalDepFiller.
insert(muonHandle, hcalDepColl.begin(), hcalDepColl.end());
790 hcalDepFiller.
fill();
792 hoDepFiller.
insert(muonHandle, hoDepColl.begin(), hoDepColl.end());
795 jetDepFiller.
insert(muonHandle, jetDepColl.begin(), jetDepColl.end());
800 iEvent.
put(caloMuons);
808 muon.
pt()<5 && fabs(muon.
eta())<1.5 &&
817 muon.
pt()<5 && fabs(muon.
eta())<1.5 &&
835 throw cms::Exception(
"FatalError") <<
"Failed to fill muon id information for a muon with undefined references to tracks";
857 for(std::vector<const EcalRecHit*>::const_iterator
hit=info.
ecalRecHits.begin();
859 if ((*hit)->id() != emMaxId)
continue;
860 muonEnergy.
emMax = (*hit)->energy();
864 for(std::vector<const HBHERecHit*>::const_iterator
hit=info.
hcalRecHits.begin();
866 if ((*hit)->id() != hadMaxId)
continue;
867 muonEnergy.
hadMax = (*hit)->energy();
878 std::vector<reco::MuonChamberMatch> muonChamberMatches;
879 unsigned int nubmerOfMatchesAccordingToTrackAssociator = 0;
880 for( std::vector<TAMuonChamberMatch>::const_iterator chamber=info.
chambers.begin();
881 chamber!=info.
chambers.end(); chamber++ )
883 if (chamber->id.subdetId() == 3 && rpcRecHits.
isValid() )
continue;
886 LocalError localError = chamber->tState.localError().positionError();
887 matchedChamber.
x = chamber->tState.localPosition().x();
888 matchedChamber.
y = chamber->tState.localPosition().y();
889 matchedChamber.
xErr =
sqrt( localError.
xx() );
890 matchedChamber.
yErr =
sqrt( localError.
yy() );
892 matchedChamber.
dXdZ = chamber->tState.localDirection().z()!=0?chamber->tState.localDirection().x()/chamber->tState.localDirection().z():9999;
893 matchedChamber.
dYdZ = chamber->tState.localDirection().z()!=0?chamber->tState.localDirection().y()/chamber->tState.localDirection().z():9999;
896 matchedChamber.
dXdZErr = trajectoryCovMatrix(1,1)>0?
sqrt(trajectoryCovMatrix(1,1)):0;
897 matchedChamber.
dYdZErr = trajectoryCovMatrix(2,2)>0?
sqrt(trajectoryCovMatrix(2,2)):0;
899 matchedChamber.
edgeX = chamber->localDistanceX;
900 matchedChamber.
edgeY = chamber->localDistanceY;
902 matchedChamber.
id = chamber->id;
903 if ( ! chamber->segments.empty() ) ++nubmerOfMatchesAccordingToTrackAssociator;
906 for( std::vector<TAMuonSegmentMatch>::const_iterator segment = chamber->segments.begin();
907 segment != chamber->segments.end(); segment++ )
910 matchedSegment.
x = segment->segmentLocalPosition.x();
911 matchedSegment.
y = segment->segmentLocalPosition.y();
912 matchedSegment.
dXdZ = segment->segmentLocalDirection.z()?segment->segmentLocalDirection.x()/segment->segmentLocalDirection.z():0;
913 matchedSegment.
dYdZ = segment->segmentLocalDirection.z()?segment->segmentLocalDirection.y()/segment->segmentLocalDirection.z():0;
914 matchedSegment.
xErr = segment->segmentLocalErrorXX>0?
sqrt(segment->segmentLocalErrorXX):0;
915 matchedSegment.
yErr = segment->segmentLocalErrorYY>0?
sqrt(segment->segmentLocalErrorYY):0;
916 matchedSegment.
dXdZErr = segment->segmentLocalErrorDxDz>0?
sqrt(segment->segmentLocalErrorDxDz):0;
917 matchedSegment.
dYdZErr = segment->segmentLocalErrorDyDz>0?
sqrt(segment->segmentLocalErrorDyDz):0;
918 matchedSegment.
t0 = segment->t0;
919 matchedSegment.
mask = 0;
922 matchedSegment.
hasZed_ = segment->hasZed;
923 matchedSegment.
hasPhi_ = segment->hasPhi;
925 bool matchedX =
false;
926 bool matchedY =
false;
927 LogTrace(
"MuonIdentification") <<
" matching local x, segment x: " << matchedSegment.
x <<
928 ", chamber x: " << matchedChamber.
x <<
", max: " <<
maxAbsDx_;
929 LogTrace(
"MuonIdentification") <<
" matching local y, segment y: " << matchedSegment.
y <<
930 ", chamber y: " << matchedChamber.
y <<
", max: " <<
maxAbsDy_;
931 if (matchedSegment.
xErr>0 && matchedChamber.
xErr>0 )
932 LogTrace(
"MuonIdentification") <<
" xpull: " <<
933 fabs(matchedSegment.
x - matchedChamber.
x)/
sqrt(
pow(matchedSegment.
xErr,2) +
pow(matchedChamber.
xErr,2));
934 if (matchedSegment.
yErr>0 && matchedChamber.
yErr>0 )
935 LogTrace(
"MuonIdentification") <<
" ypull: " <<
936 fabs(matchedSegment.
y - matchedChamber.
y)/
sqrt(
pow(matchedSegment.
yErr,2) +
pow(matchedChamber.
yErr,2));
938 if (fabs(matchedSegment.
x - matchedChamber.
x) <
maxAbsDx_) matchedX =
true;
939 if (fabs(matchedSegment.
y - matchedChamber.
y) <
maxAbsDy_) matchedY =
true;
940 if (matchedSegment.
xErr>0 && matchedChamber.
xErr>0 &&
942 if (matchedSegment.
yErr>0 && matchedChamber.
yErr>0 &&
944 if (matchedX && matchedY) matchedChamber.
segmentMatches.push_back(matchedSegment);
946 muonChamberMatches.push_back(matchedChamber);
953 for( std::vector<TAMuonChamberMatch>::const_iterator chamber=info.
chambers.begin();
954 chamber!=info.
chambers.end(); chamber++ )
957 if ( chamber->id.subdetId() != 3 )
continue;
961 LocalError localError = chamber->tState.localError().positionError();
962 matchedChamber.
x = chamber->tState.localPosition().x();
963 matchedChamber.
y = chamber->tState.localPosition().y();
964 matchedChamber.
xErr =
sqrt( localError.
xx() );
965 matchedChamber.
yErr =
sqrt( localError.
yy() );
967 matchedChamber.
dXdZ = chamber->tState.localDirection().z()!=0?chamber->tState.localDirection().x()/chamber->tState.localDirection().z():9999;
968 matchedChamber.
dYdZ = chamber->tState.localDirection().z()!=0?chamber->tState.localDirection().y()/chamber->tState.localDirection().z():9999;
971 matchedChamber.
dXdZErr = trajectoryCovMatrix(1,1)>0?
sqrt(trajectoryCovMatrix(1,1)):0;
972 matchedChamber.
dYdZErr = trajectoryCovMatrix(2,2)>0?
sqrt(trajectoryCovMatrix(2,2)):0;
974 matchedChamber.
edgeX = chamber->localDistanceX;
975 matchedChamber.
edgeY = chamber->localDistanceY;
977 matchedChamber.
id = chamber->id;
980 rpcRecHit != rpcRecHits->end(); ++rpcRecHit )
984 if ( rpcRecHit->rawId() != chamber->id.rawId() )
continue;
986 rpcHitMatch.
x = rpcRecHit->localPosition().x();
987 rpcHitMatch.
mask = 0;
988 rpcHitMatch.
bx = rpcRecHit->BunchX();
990 const double AbsDx = fabs(rpcRecHit->localPosition().x()-chamber->tState.localPosition().x());
991 if( AbsDx <= 20
or AbsDx/
sqrt(localError.
xx()) <= 4 ) matchedChamber.
rpcMatches.push_back(rpcHitMatch);
994 muonChamberMatches.push_back(matchedChamber);
1000 LogTrace(
"MuonIdentification") <<
"number of muon chambers: " << aMuon.
matches().size() <<
"\n"
1001 <<
"number of chambers with segments according to the associator requirements: " <<
1002 nubmerOfMatchesAccordingToTrackAssociator;
1003 LogTrace(
"MuonIdentification") <<
"number of segment matches with the producer requirements: " <<
1014 std::vector<std::pair<reco::MuonChamberMatch*,reco::MuonSegmentMatch*> > chamberPairs;
1015 std::vector<std::pair<reco::MuonChamberMatch*,reco::MuonSegmentMatch*> > stationPairs;
1016 std::vector<std::pair<reco::MuonChamberMatch*,reco::MuonSegmentMatch*> > arbitrationPairs;
1019 for(
unsigned int muonIndex1 = 0; muonIndex1 < pOutputMuons->size(); ++muonIndex1 )
1022 for( std::vector<reco::MuonChamberMatch>::iterator chamberIter1 = pOutputMuons->at(muonIndex1).matches().begin();
1023 chamberIter1 != pOutputMuons->at(muonIndex1).matches().end(); ++chamberIter1 )
1025 if(chamberIter1->segmentMatches.empty())
continue;
1026 chamberPairs.clear();
1029 for( std::vector<reco::MuonSegmentMatch>::iterator segmentIter1 = chamberIter1->segmentMatches.begin();
1030 segmentIter1 != chamberIter1->segmentMatches.end(); ++segmentIter1 )
1032 chamberPairs.push_back(std::make_pair(&(*chamberIter1), &(*segmentIter1)));
1033 if(!segmentIter1->isMask())
1035 arbitrationPairs.clear();
1036 arbitrationPairs.push_back(std::make_pair(&(*chamberIter1), &(*segmentIter1)));
1042 if (pOutputMuons->at(muonIndex1).isTrackerMuon()) {
1044 for(
unsigned int muonIndex2 = muonIndex1+1; muonIndex2 < pOutputMuons->size(); ++muonIndex2 )
1047 if (! pOutputMuons->at(muonIndex2).isTrackerMuon())
continue;
1049 for( std::vector<reco::MuonChamberMatch>::iterator chamberIter2 = pOutputMuons->at(muonIndex2).matches().begin();
1050 chamberIter2 != pOutputMuons->at(muonIndex2).matches().end(); ++chamberIter2 )
1053 for( std::vector<reco::MuonSegmentMatch>::iterator segmentIter2 = chamberIter2->segmentMatches.begin();
1054 segmentIter2 != chamberIter2->segmentMatches.end(); ++segmentIter2 )
1056 if(segmentIter2->isMask())
continue;
1057 if(fabs(segmentIter2->x - segmentIter1->x ) < 1E-3 &&
1058 fabs(segmentIter2->y - segmentIter1->y ) < 1E-3 &&
1059 fabs(segmentIter2->dXdZ - segmentIter1->dXdZ ) < 1E-3 &&
1060 fabs(segmentIter2->dYdZ - segmentIter1->dYdZ ) < 1E-3 &&
1061 fabs(segmentIter2->xErr - segmentIter1->xErr ) < 1E-3 &&
1062 fabs(segmentIter2->yErr - segmentIter1->yErr ) < 1E-3 &&
1063 fabs(segmentIter2->dXdZErr - segmentIter1->dXdZErr) < 1E-3 &&
1064 fabs(segmentIter2->dYdZErr - segmentIter1->dYdZErr) < 1E-3)
1065 arbitrationPairs.push_back(std::make_pair(&(*chamberIter2), &(*segmentIter2)));
1072 if(arbitrationPairs.empty())
continue;
1073 if(arbitrationPairs.size()==1) {
1088 for(
unsigned int it = 0; it < arbitrationPairs.size(); ++it )
1096 if(cscid.
ring() == 4)
1097 for( std::vector<reco::MuonSegmentMatch>::iterator segmentIter2 = chamberIter1->segmentMatches.begin();
1098 segmentIter2 != chamberIter1->segmentMatches.end(); ++segmentIter2 ) {
1099 if( segmentIter1->cscSegmentRef.isNonnull() && segmentIter2->cscSegmentRef.isNonnull() )
1101 (segmentIter2->mask & 0x1e0000) &&
1102 (segmentIter1->mask & 0x1e0000) )
1111 if(chamberPairs.empty())
continue;
1112 if(chamberPairs.size()==1) {
1131 for(
int detectorIndex = 1; detectorIndex < 4; ++detectorIndex )
1133 stationPairs.clear();
1136 for( std::vector<reco::MuonChamberMatch>::iterator chamberIter = pOutputMuons->at(muonIndex1).matches().begin();
1137 chamberIter != pOutputMuons->at(muonIndex1).matches().end(); ++chamberIter )
1139 if(!(chamberIter->station()==
stationIndex && chamberIter->detector()==detectorIndex))
continue;
1140 if(chamberIter->segmentMatches.empty())
continue;
1142 for( std::vector<reco::MuonSegmentMatch>::iterator segmentIter = chamberIter->segmentMatches.begin();
1143 segmentIter != chamberIter->segmentMatches.end(); ++segmentIter )
1144 stationPairs.push_back(std::make_pair(&(*chamberIter), &(*segmentIter)));
1147 if(stationPairs.empty())
continue;
1148 if(stationPairs.size()==1) {
1187 throw cms::Exception(
"FatalError") <<
"Failed to compute muon isolation information for a muon with undefined references to tracks";
1195 if(caloDeps.size()!=3) {
1196 LogTrace(
"MuonIdentification") <<
"Failed to fill vector of calorimeter isolation deposits!";
1240 double energy =
sqrt(track.
p() * track.
p() + 0.011163691);
1253 if ( muonId.
sector() <= 12 )
1255 if ( muonId.
sector() == 13 ) phi = 3/6.*
M_PI;
1256 if ( muonId.
sector() == 14 ) phi = 9/6.*
M_PI;
1270 if ( muon.
matches().empty() ){
1273 return muon.
innerTrack()->outerPosition().phi();
1308 if (trackBAD || staBAD || glbBAD )
1310 edm::LogWarning(
"muonIDbadLinks") <<
"Global muon links to constituent tracks are invalid: trkBad "
1311 <<trackBAD <<
" standaloneBad "<<staBAD<<
" globalBad "<<glbBAD
1312 <<
". There should be no such object. Muon is skipped.";
std::string hoDepositName_
double p() const
momentum vector magnitude
T getParameter(std::string const &) const
static const unsigned int BelongsToTrackByME1aClean
std::string jetDepositName_
double candEnergy() const
Get energy or pT attached to cand trajectory.
bool isGoodRPCMuon(const reco::Muon &muon)
edm::EDGetTokenT< reco::TrackCollection > innerTrackCollectionToken_
reco::Muon makeMuon(edm::Event &iEvent, const edm::EventSetup &iSetup, const reco::TrackRef &track, TrackType type)
static const unsigned int GlobalMuon
void fillMuonIsolation(edm::Event &, const edm::EventSetup &, reco::Muon &aMuon, reco::IsoDeposit &trackDep, reco::IsoDeposit &ecalDep, reco::IsoDeposit &hcalDep, reco::IsoDeposit &hoDep, reco::IsoDeposit &jetDep)
edm::EDGetTokenT< edm::ValueMap< reco::MuonQuality > > glbQualToken_
static void truthMatchMuon(const edm::Event &iEvent, const edm::EventSetup &iSetup, reco::Muon &aMuon)
DTRecSegment4DRef dtSegmentRef
reco::TrackRef trackerTrack() const
get the tracker's track which match with the stand alone muon tracks
void runMesh(std::vector< reco::Muon > *p)
static bool crossedIP(const reco::Track &track)
float sumPt
sum-pt of tracks
virtual void setOuterTrack(const TrackRef &t)
set reference to Track
void setType(unsigned int type)
virtual float pt() const
transverse momentum
TrackDetectorAssociator trackAssociator_
CSCSegmentRef cscSegmentRef
const TrackExtraRef & extra() const
reference to "extra" object
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e< void, edm::EventIDconst &, edm::Timestampconst & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
static const unsigned int Arbitrated
segment mask flags
void fillMuonId(edm::Event &, const edm::EventSetup &, reco::Muon &, TrackDetectorAssociator::Direction direction=TrackDetectorAssociator::InsideOut)
friend struct const_iterator
reco::isodeposit::IsoDepositExtractor * muIsoExtractorCalo_
virtual TrackRef innerTrack() const
bool getByToken(EDGetToken token, Handle< PROD > &result) const
edm::Handle< reco::MuonTrackLinksCollection > linkCollectionHandle_
edm::EDGetTokenT< RPCRecHitCollection > rpcHitToken_
virtual float phi() const
momentum azimuthal angle
bool isTrackerMuon() const
int overlap(const reco::Muon &muon, const reco::Track &track)
reco::TrackRef standAloneTrack() const
get the track built with the muon spectrometer alone
bool fillCaloCompatibility_
std::vector< const EcalRecHit * > ecalRecHits
hits in the cone
virtual void setInnerTrack(const TrackRef &t)
set reference to Track
std::vector< DetId > crossedEcalIds
std::string trackDepositName_
bool muonId(HWW &, unsigned int index, SelectionType type)
void insert(const H &h, I begin, I end)
int numberOfMatchedRPCLayers(ArbitrationType type=RPCHitAndTrackArbitration) const
double phiOfMuonIneteractionRegion(const reco::Muon &muon) const
std::vector< CaloMuon > CaloMuonCollection
collection of Muon objects
void loadParameters(const edm::ParameterSet &, edm::ConsumesCollector &)
DetId findMaxDeposition(EnergyType)
Find detector elements with highest energy deposition.
virtual void produce(edm::Event &, const edm::EventSetup &) override
float hadVetoEt
hcal sum-et in the veto region in r-phi
virtual TrackRef track() const
reference to a Track
bool isGlobalMuon() const
float emS9
energy deposited in 3x3 ECAL crystal shape around central crystal
std::vector< std::string > inputCollectionTypes_
double evaluate(const reco::Muon &)
MuonCaloCompatibility muonCaloCompatibility_
static const unsigned int BestInStationByDRSlope
bool isMatchesValid() const
void setIsolation(const MuonIsolation &isoR03, const MuonIsolation &isoR05)
ROOT::Math::SMatrix< double, 5, 5, ROOT::Math::MatRepSym< double, 5 > > AlgebraicSymMatrix55
edm::EDGetTokenT< reco::TrackToTrackMap > pickyCollectionToken_
double px() const
x coordinate of momentum vector
static const unsigned int BelongsToTrackByDXSlope
bool isStandAloneMuon() const
void setCalEnergy(const MuonEnergy &calEnergy)
set energy deposition information
void fillGlbQuality(edm::Event &, const edm::EventSetup &, reco::Muon &aMuon)
std::vector< DetId > crossedHcalIds
float trkRelChi2
chi2 value for the inner track stub with respect to the global track
std::auto_ptr< MuonKinkFinder > trackerKinkFinder_
double nXnEnergy(const DetId &, EnergyType, int gridSize=1)
get energy of the NxN shape (N = 2*gridSize + 1) around given detector element
float towerS9
total energy in 3x3 tower shape
static const unsigned int BestInStationByDR
MuonTime time() const
get timing information
std::vector< Muon > MuonCollection
collection of Muon objects
math::XYZPoint trkGlobPosAtHcal
float ecal_time
Calorimeter timing.
float ho
energy deposited in crossed HO towers
virtual void setTunePBestTrack(MuonTrackType muonType)
double depositWithin(double coneSize, const Vetos &vetos=Vetos(), bool skipDepositVeto=false) const
Get deposit.
uint32_t rawId() const
get the raw id
void setCSCGeometry(const CSCGeometry *pg)
XYZTLorentzVectorD XYZTLorentzVector
Lorentz vector with cylindrical internal representation using pseudorapidity.
void init(edm::Event &, const edm::EventSetup &)
DetId hcal_id
DetId of the central HCAL tower with smallest depth.
reco::Muon::MuonTrackTypePair tevOptimized(const reco::TrackRef &combinedTrack, const reco::TrackRef &trackerTrack, const reco::TrackRef &tpfmsTrack, const reco::TrackRef &pickyTrack, const double ptThreshold=200., const double tune1=17., const double tune2=40., const double dptcut=0.25)
edm::EDGetTokenT< reco::TrackToTrackMap > tpfmsCollectionToken_
bool isNull() const
Checks for null.
double ptThresholdToFillCandidateP4WithGlobalFit_
double eta() const
pseudorapidity of momentum vector
reco::Muon::MuonTrackTypePair sigmaSwitch(const reco::TrackRef &combinedTrack, const reco::TrackRef &trackerTrack, const double nSigma=2., const double ptThreshold=200.)
TrackAssociatorParameters parameters_
bool isCaloCompatibilityValid() const
void fillArbitrationInfo(reco::MuonCollection *)
void fillTrackerKink(reco::Muon &aMuon)
void setPropagator(const Propagator *)
use a user configured propagator
float emS25
energy deposited in 5x5 ECAL crystal shape around central crystal
double p() const
momentum vector magnitude
OrphanHandle< PROD > put(std::auto_ptr< PROD > product)
Put a new product.
virtual float eta() const
momentum pseudorapidity
ConsumesCollector consumesCollector()
Use a ConsumesCollector to gather consumes information from helper functions.
bool isGoodTrackerMuon(const reco::Muon &muon)
double pt() const
track transverse momentum
bool checkLinks(const reco::MuonTrackLinks *) const
Cos< T >::type cos(const T &t)
std::vector< TAMuonChamberMatch > chambers
int nJets
number of jets in the cone
std::vector< const HBHERecHit * > hcalRecHits
static const unsigned int BestInChamberByDX
std::string ecalDepositName_
MuonQuality combinedQuality() const
get energy deposition information
float timeAtIpOutIn
b) particle is moving from outside in
int nDof
number of muon stations used
CSCDetId chamberId() const
edm::EDGetTokenT< reco::MuonCollection > muonCollectionToken_
edm::EDGetTokenT< reco::TrackCollection > outerTrackCollectionToken_
float hoS9
energy deposited in 3x3 HO tower shape around central tower
std::vector< reco::MuonRPCHitMatch > rpcMatches
static const unsigned int BestInChamberByDR
bool isQualityValid() const
edm::Handle< reco::TrackToTrackMap > dytCollectionHandle_
edm::Handle< reco::TrackCollection > outerTrackCollectionHandle_
edm::EDGetTokenT< reco::MuonTrackLinksCollection > linkCollectionToken_
void setMuonTrack(const MuonTrackType &, const TrackRef &)
double crossedEnergy(EnergyType)
energy in detector elements crossed by the track by types
static const unsigned int BestInStationByDXSlope
math::XYZPointF hcal_position
bool fillGlobalTrackRefits_
static double sectorPhi(const DetId &id)
bool isEnergyValid() const
float hoVetoEt
ho sum-et in the veto region in r-phi
int numberOfMatches(ArbitrationType type=SegmentAndTrackArbitration) const
get number of chambers with matched segments
double pz() const
z coordinate of momentum vector
MuonEnergy calEnergy() const
get energy deposition information
reco::CaloMuon makeCaloMuon(const reco::Muon &)
virtual ~MuonIdProducer()
int nTracks
number of tracks in the cone (excluding veto region)
static const unsigned int BestInChamberByDXSlope
float emMax
maximal energy of ECAL crystal in the 5x5 shape
reco::isodeposit::IsoDepositExtractor * muIsoExtractorTrack_
const Point & vertex() const
reference point on the track. This method is DEPRECATED, please use referencePoint() instead ...
void setCaloCompatibility(float input)
static const unsigned int RPCMuon
virtual TrackRef combinedMuon() const
reference to a stand-alone muon Track
static const unsigned int TrackerMuon
float emVetoEt
ecal sum-et in the veto region in r-phi
void configure(const edm::ParameterSet &)
reco::isodeposit::IsoDepositExtractor * muIsoExtractorJet_
bool isDuplicateOf(const CSCSegmentRef &lhs, const CSCSegmentRef &rhs) const
MuonTimingFiller * theTimingFiller_
float hadMax
maximal energy of HCAL tower in the 3x3 shape
static const unsigned int BelongsToTrackByDRSlope
virtual void setInnerTrack(const TrackRef &t)
set reference to Track
T const * product() const
void setCombinedQuality(const MuonQuality &combinedQuality)
set energy deposition information
std::vector< edm::InputTag > inputCollectionLabels_
std::vector< MuonChamberMatch > & matches()
get muon matching information
void setCalEnergy(const MuonEnergy &calEnergy)
set energy deposition information
int triggerSector() const
MuonIdProducer(const edm::ParameterSet &)
std::vector< reco::MuonSegmentMatch > segmentMatches
bool fillGlobalTrackQuality_
DetId ecal_id
DetId of the central ECAL crystal.
static const unsigned int BelongsToTrackByDR
std::string hcalDepositName_
unsigned int chamberId(const DetId &)
reco::TrackRef getTevRefitTrack(const reco::TrackRef &combinedTrack, const reco::TrackToTrackMap &map)
static const unsigned int BelongsToTrackByDX
virtual void setBestTrack(MuonTrackType muonType)
functor predicate for standard library sort algorithm
std::pair< double, int > depositAndCountWithin(double coneSize, const Vetos &vetos=Vetos(), double threshold=-1e+36, bool skipDepositVeto=false) const
Get deposit.
edm::Handle< reco::TrackToTrackMap > tpfmsCollectionHandle_
static const unsigned int BestInStationByDX
TrackDetMatchInfo associate(const edm::Event &, const edm::EventSetup &, const FreeTrajectoryState &, const AssociatorParameters &)
edm::Handle< reco::TrackCollection > innerTrackCollectionHandle_
math::XYZPoint trkGlobPosAtEcal
Track position at different parts of the calorimeter.
int charge() const
track electric charge
bool isGoodTrack(const reco::Track &track)
std::pair< typename Association::data_type::first_type, double > match(Reference key, Association association, bool bestMatchByMaxValue)
Generic matching function.
MuonTrackType
map for Global Muon refitters
double sigmaThresholdToFillCandidateP4WithGlobalFit_
static const unsigned int StandAloneMuon
std::pair< TrackRef, Muon::MuonTrackType > MuonTrackTypePair
void setMatches(const std::vector< MuonChamberMatch > &matches)
set muon matching information
T const * get() const
Returns C++ pointer to the item.
virtual void setGlobalTrack(const TrackRef &t)
set reference to Track
void fillTiming(const reco::Muon &muon, reco::MuonTimeExtra &dtTime, reco::MuonTimeExtra &cscTime, reco::MuonTimeExtra &combinedTime, edm::Event &iEvent, const edm::EventSetup &iSetup)
math::XYZPointF ecal_position
Trajectory position at the calorimeter.
static const unsigned int BestInChamberByDRSlope
float caloCompatibility() const
bool validateGlobalMuonPair(const reco::MuonTrackLinks &goodMuon, const reco::MuonTrackLinks &badMuon)
bool debugWithTruthMatching_
Power< A, B >::type pow(const A &a, const B &b)
float trackerVetoPt
(sum-)pt inside the veto region in r-phi
float hadS9
energy deposited in 3x3 HCAL tower shape around central tower
T get(const Candidate &c)
edm::InputTag globalTrackQualityInputTag_
edm::Handle< reco::MuonCollection > muonCollectionHandle_
double py() const
y coordinate of momentum vector
virtual void beginRun(const edm::Run &, const edm::EventSetup &) override
reco::TrackRef globalTrack() const
get the combined track
edm::Handle< reco::TrackToTrackMap > pickyCollectionHandle_
edm::EDGetTokenT< reco::TrackToTrackMap > dytCollectionToken_
virtual TrackRef standAloneMuon() const
reference to a stand-alone muon Track