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");
99 if (fillCaloCompatibility_){
119 if (fillIsolation_ && writeIsoDeposits_){
135 throw cms::Exception(
"ConfigurationError") <<
"Number of input collection labels is different from number of types. " <<
136 "For each collection label there should be exactly one collection type specified.";
138 throw cms::Exception(
"ConfigurationError") <<
"Number of input collections should be from 1 to 7.";
142 <<
"========================================================================\n"
143 <<
"Debugging mode with truth matching is turned on!!! Make sure you understand what you are doing!\n"
144 <<
"========================================================================\n";
145 if (fillGlobalTrackQuality_){
149 if (fillTrackerKink_) {
158 rpcHitToken_ = consumes<RPCRecHitCollection>(rpcHitTag);
164 if ( inputCollectionTypes_[
i] ==
"inner tracks" ) {
168 if ( inputCollectionTypes_[
i] ==
"outer tracks" ) {
172 if ( inputCollectionTypes_[
i] ==
"links" ) {
176 if ( inputCollectionTypes_[
i] ==
"muons" ) {
180 if ( fillGlobalTrackRefits_ && inputCollectionTypes_[
i] ==
"tev firstHit" ) {
185 if ( fillGlobalTrackRefits_ && inputCollectionTypes_[
i] ==
"tev picky" ) {
190 if ( fillGlobalTrackRefits_ && inputCollectionTypes_[
i] ==
"tev dyt" ) {
194 throw cms::Exception(
"FatalError") <<
"Unknown input collection type: " << inputCollectionTypes_[
i];
294 LogTrace(
"MuonIdentification") <<
"Creating a muon from a track " << track.
get()->pt() <<
295 " Pt (GeV), eta: " << track.
get()->eta();
299 aMuon.setBestTrack(type);
300 aMuon.setTunePBestTrack(type);
319 LogTrace(
"MuonIdentification") <<
"Creating a muon from a link to tracks object";
325 bool useSigmaSwitch =
false;
333 if (tpfmsRef.
isNull() && pickyRef.isNull()){
334 edm::LogWarning(
"MakeMuonWithTEV")<<
"Failed to get TEV refits, fall back to sigma switch.";
335 useSigmaSwitch =
true;
338 useSigmaSwitch =
true;
350 aMuon =
makeMuon(*chosenTrack.first);
379 LogTrace(
"MuonIdentification") <<
"Skipped low momentum track (Pt,P): " << track.
pt() <<
380 ", " << track.
p() <<
" GeV";
386 LogTrace(
"MuonIdentification") <<
"Skipped track with large pseudo rapidity (Eta: " << track.
eta() <<
" )";
394 switch (
id.det() ) {
396 switch (
id.subdetId() ) {
400 return detId.
rawId();
421 int numberOfCommonDetIds = 0;
424 track.
extra()->recHits().
isNull() )
return numberOfCommonDetIds;
425 const std::vector<reco::MuonChamberMatch>& matches( muon.
matches() );
426 for ( std::vector<reco::MuonChamberMatch>::const_iterator
match = matches.begin();
429 if (
match->segmentMatches.empty() )
continue;
430 bool foundCommonDetId =
false;
440 foundCommonDetId =
true;
444 if ( foundCommonDetId ) {
445 numberOfCommonDetIds++;
449 return numberOfCommonDetIds;
465 badMuon.
globalTrack()->hitPattern().numberOfValidMuonHits()) > 10 ){
472 if ( goodMuon.
globalTrack()->hitPattern().numberOfValidMuonHits() <
473 badMuon.
globalTrack()->hitPattern().numberOfValidMuonHits() )
return false;
485 init(iEvent, iSetup);
511 outputMuons->push_back(*
muon);
516 if ( goodmuons.size()>1 ){
531 goodmuons[
j] =
false;
533 goodmuons[
i] =
false;
539 if ( !goodmuons[
i] )
continue;
542 if ( !goodmuons[
j] )
continue;
549 goodmuons[
j] =
false;
551 goodmuons[
i] =
false;
557 if ( !goodmuons[
i] )
continue;
562 for ( reco::MuonCollection::const_iterator
muon = outputMuons->begin();
563 muon != outputMuons->end(); ++
muon )
569 outputMuons->push_back(
makeMuon( *links ) );
577 LogTrace(
"MuonIdentification") <<
"Creating tracker muons";
582 bool splitTrack =
false;
585 std::vector<TrackDetectorAssociator::Direction>
directions;
592 for ( std::vector<TrackDetectorAssociator::Direction>::const_iterator direction = directions.begin();
593 direction != directions.end(); ++direction )
599 fillMuonId(iEvent, iSetup, trackerMuon, *direction);
614 for ( reco::MuonCollection::iterator
muon = outputMuons->begin();
615 muon != outputMuons->end(); ++
muon )
627 LogTrace(
"MuonIdentification") <<
"Found a corresponding global muon. Set energy, matches and move on";
632 if ( goodTrackerMuon ){
633 outputMuons->push_back( trackerMuon );
635 LogTrace(
"MuonIdentification") <<
"track failed minimal number of muon matches requirement";
638 caloMuons->push_back( caloMuon );
647 LogTrace(
"MuonIdentification") <<
"Looking for new muons among stand alone muon tracks";
652 for ( reco::MuonCollection::iterator
muon = outputMuons->begin();
653 muon != outputMuons->end(); ++
muon )
655 if ( !
muon->standAloneMuon().isNull() ) {
670 LogTrace(
"MuonIdentification") <<
"Found associated tracker muon. Set a reference and move on";
679 LogTrace(
"MuonIdentification") <<
"No associated stand alone track is found. Making a muon";
680 outputMuons->push_back(
makeMuon(iEvent, iSetup,
687 LogTrace(
"MuonIdentification") <<
"Dress up muons if it's necessary";
689 int nMuons=outputMuons->size();
691 std::vector<reco::MuonTimeExtra> dtTimeColl(nMuons);
692 std::vector<reco::MuonTimeExtra> cscTimeColl(nMuons);
693 std::vector<reco::MuonTimeExtra> combinedTimeColl(nMuons);
694 std::vector<reco::IsoDeposit> trackDepColl(nMuons);
695 std::vector<reco::IsoDeposit> ecalDepColl(nMuons);
696 std::vector<reco::IsoDeposit> hcalDepColl(nMuons);
697 std::vector<reco::IsoDeposit> hoDepColl(nMuons);
698 std::vector<reco::IsoDeposit> jetDepColl(nMuons);
702 for ( reco::MuonCollection::iterator
muon = outputMuons->begin();
muon != outputMuons->end(); ++
muon )
711 if (
muon->isStandAloneMuon() ) {
717 LogTrace(
"MuonIdentification") <<
"THIS SHOULD NEVER HAPPEN";
738 trackDepColl[i], ecalDepColl[i], hcalDepColl[i], hoDepColl[i], jetDepColl[i]);
755 muon->setTime( muonTime);
756 dtTimeColl[
i] = dtTime;
757 cscTimeColl[
i] = cscTime;
758 combinedTimeColl[
i] = combinedTime;
764 LogTrace(
"MuonIdentification") <<
"number of muons produced: " << outputMuons->size();
770 filler.
insert(muonHandle, combinedTimeColl.begin(), combinedTimeColl.end());
772 fillerDT.
insert(muonHandle, dtTimeColl.begin(), dtTimeColl.end());
774 fillerCSC.
insert(muonHandle, cscTimeColl.begin(), cscTimeColl.end());
777 iEvent.
put(muonTimeMap,
"combined");
778 iEvent.
put(muonTimeMapDT,
"dt");
779 iEvent.
put(muonTimeMapCSC,
"csc");
782 trackDepFiller.
insert(muonHandle, trackDepColl.begin(), trackDepColl.end());
783 trackDepFiller.
fill();
785 ecalDepFiller.
insert(muonHandle, ecalDepColl.begin(), ecalDepColl.end());
786 ecalDepFiller.
fill();
788 hcalDepFiller.
insert(muonHandle, hcalDepColl.begin(), hcalDepColl.end());
789 hcalDepFiller.
fill();
791 hoDepFiller.
insert(muonHandle, hoDepColl.begin(), hoDepColl.end());
794 jetDepFiller.
insert(muonHandle, jetDepColl.begin(), jetDepColl.end());
799 iEvent.
put(caloMuons);
807 muon.
pt()<5 && fabs(muon.
eta())<1.5 &&
816 muon.
pt()<5 && fabs(muon.
eta())<1.5 &&
834 throw cms::Exception(
"FatalError") <<
"Failed to fill muon id information for a muon with undefined references to tracks";
856 for(std::vector<const EcalRecHit*>::const_iterator
hit=info.
ecalRecHits.begin();
858 if ((*hit)->id() != emMaxId)
continue;
859 muonEnergy.
emMax = (*hit)->energy();
863 for(std::vector<const HBHERecHit*>::const_iterator
hit=info.
hcalRecHits.begin();
865 if ((*hit)->id() != hadMaxId)
continue;
866 muonEnergy.
hadMax = (*hit)->energy();
877 std::vector<reco::MuonChamberMatch> muonChamberMatches;
878 unsigned int nubmerOfMatchesAccordingToTrackAssociator = 0;
879 for( std::vector<TAMuonChamberMatch>::const_iterator chamber=info.
chambers.begin();
880 chamber!=info.
chambers.end(); chamber++ )
882 if (chamber->id.subdetId() == 3 && rpcRecHits.
isValid() )
continue;
885 LocalError localError = chamber->tState.localError().positionError();
886 matchedChamber.
x = chamber->tState.localPosition().x();
887 matchedChamber.
y = chamber->tState.localPosition().y();
888 matchedChamber.
xErr =
sqrt( localError.
xx() );
889 matchedChamber.
yErr =
sqrt( localError.
yy() );
891 matchedChamber.
dXdZ = chamber->tState.localDirection().z()!=0?chamber->tState.localDirection().x()/chamber->tState.localDirection().z():9999;
892 matchedChamber.
dYdZ = chamber->tState.localDirection().z()!=0?chamber->tState.localDirection().y()/chamber->tState.localDirection().z():9999;
895 matchedChamber.
dXdZErr = trajectoryCovMatrix(1,1)>0?
sqrt(trajectoryCovMatrix(1,1)):0;
896 matchedChamber.
dYdZErr = trajectoryCovMatrix(2,2)>0?
sqrt(trajectoryCovMatrix(2,2)):0;
898 matchedChamber.
edgeX = chamber->localDistanceX;
899 matchedChamber.
edgeY = chamber->localDistanceY;
901 matchedChamber.
id = chamber->id;
902 if ( ! chamber->segments.empty() ) ++nubmerOfMatchesAccordingToTrackAssociator;
905 for( std::vector<TAMuonSegmentMatch>::const_iterator segment = chamber->segments.begin();
906 segment != chamber->segments.end(); segment++ )
909 matchedSegment.
x = segment->segmentLocalPosition.x();
910 matchedSegment.
y = segment->segmentLocalPosition.y();
911 matchedSegment.
dXdZ = segment->segmentLocalDirection.z()?segment->segmentLocalDirection.x()/segment->segmentLocalDirection.z():0;
912 matchedSegment.
dYdZ = segment->segmentLocalDirection.z()?segment->segmentLocalDirection.y()/segment->segmentLocalDirection.z():0;
913 matchedSegment.
xErr = segment->segmentLocalErrorXX>0?
sqrt(segment->segmentLocalErrorXX):0;
914 matchedSegment.
yErr = segment->segmentLocalErrorYY>0?
sqrt(segment->segmentLocalErrorYY):0;
915 matchedSegment.
dXdZErr = segment->segmentLocalErrorDxDz>0?
sqrt(segment->segmentLocalErrorDxDz):0;
916 matchedSegment.
dYdZErr = segment->segmentLocalErrorDyDz>0?
sqrt(segment->segmentLocalErrorDyDz):0;
917 matchedSegment.
t0 = segment->t0;
918 matchedSegment.
mask = 0;
921 matchedSegment.
hasZed_ = segment->hasZed;
922 matchedSegment.
hasPhi_ = segment->hasPhi;
924 bool matchedX =
false;
925 bool matchedY =
false;
926 LogTrace(
"MuonIdentification") <<
" matching local x, segment x: " << matchedSegment.
x <<
927 ", chamber x: " << matchedChamber.
x <<
", max: " <<
maxAbsDx_;
928 LogTrace(
"MuonIdentification") <<
" matching local y, segment y: " << matchedSegment.
y <<
929 ", chamber y: " << matchedChamber.
y <<
", max: " <<
maxAbsDy_;
930 if (matchedSegment.
xErr>0 && matchedChamber.
xErr>0 )
931 LogTrace(
"MuonIdentification") <<
" xpull: " <<
932 fabs(matchedSegment.
x - matchedChamber.
x)/
sqrt(
pow(matchedSegment.
xErr,2) +
pow(matchedChamber.
xErr,2));
933 if (matchedSegment.
yErr>0 && matchedChamber.
yErr>0 )
934 LogTrace(
"MuonIdentification") <<
" ypull: " <<
935 fabs(matchedSegment.
y - matchedChamber.
y)/
sqrt(
pow(matchedSegment.
yErr,2) +
pow(matchedChamber.
yErr,2));
937 if (fabs(matchedSegment.
x - matchedChamber.
x) <
maxAbsDx_) matchedX =
true;
938 if (fabs(matchedSegment.
y - matchedChamber.
y) <
maxAbsDy_) matchedY =
true;
939 if (matchedSegment.
xErr>0 && matchedChamber.
xErr>0 &&
941 if (matchedSegment.
yErr>0 && matchedChamber.
yErr>0 &&
943 if (matchedX && matchedY) matchedChamber.
segmentMatches.push_back(matchedSegment);
945 muonChamberMatches.push_back(matchedChamber);
952 for( std::vector<TAMuonChamberMatch>::const_iterator chamber=info.
chambers.begin();
953 chamber!=info.
chambers.end(); chamber++ )
956 if ( chamber->id.subdetId() != 3 )
continue;
960 LocalError localError = chamber->tState.localError().positionError();
961 matchedChamber.
x = chamber->tState.localPosition().x();
962 matchedChamber.
y = chamber->tState.localPosition().y();
963 matchedChamber.
xErr =
sqrt( localError.
xx() );
964 matchedChamber.
yErr =
sqrt( localError.
yy() );
966 matchedChamber.
dXdZ = chamber->tState.localDirection().z()!=0?chamber->tState.localDirection().x()/chamber->tState.localDirection().z():9999;
967 matchedChamber.
dYdZ = chamber->tState.localDirection().z()!=0?chamber->tState.localDirection().y()/chamber->tState.localDirection().z():9999;
970 matchedChamber.
dXdZErr = trajectoryCovMatrix(1,1)>0?
sqrt(trajectoryCovMatrix(1,1)):0;
971 matchedChamber.
dYdZErr = trajectoryCovMatrix(2,2)>0?
sqrt(trajectoryCovMatrix(2,2)):0;
973 matchedChamber.
edgeX = chamber->localDistanceX;
974 matchedChamber.
edgeY = chamber->localDistanceY;
976 matchedChamber.
id = chamber->id;
979 rpcRecHit != rpcRecHits->end(); ++rpcRecHit )
983 if ( rpcRecHit->rawId() != chamber->id.rawId() )
continue;
985 rpcHitMatch.
x = rpcRecHit->localPosition().x();
986 rpcHitMatch.
mask = 0;
987 rpcHitMatch.
bx = rpcRecHit->BunchX();
989 const double AbsDx = fabs(rpcRecHit->localPosition().x()-chamber->tState.localPosition().x());
990 if( AbsDx <= 20
or AbsDx/
sqrt(localError.
xx()) <= 4 ) matchedChamber.
rpcMatches.push_back(rpcHitMatch);
993 muonChamberMatches.push_back(matchedChamber);
999 LogTrace(
"MuonIdentification") <<
"number of muon chambers: " << aMuon.
matches().size() <<
"\n"
1000 <<
"number of chambers with segments according to the associator requirements: " <<
1001 nubmerOfMatchesAccordingToTrackAssociator;
1002 LogTrace(
"MuonIdentification") <<
"number of segment matches with the producer requirements: " <<
1013 std::vector<std::pair<reco::MuonChamberMatch*,reco::MuonSegmentMatch*> > chamberPairs;
1014 std::vector<std::pair<reco::MuonChamberMatch*,reco::MuonSegmentMatch*> > stationPairs;
1015 std::vector<std::pair<reco::MuonChamberMatch*,reco::MuonSegmentMatch*> > arbitrationPairs;
1018 for(
unsigned int muonIndex1 = 0; muonIndex1 < pOutputMuons->size(); ++muonIndex1 )
1021 for( std::vector<reco::MuonChamberMatch>::iterator chamberIter1 = pOutputMuons->at(muonIndex1).matches().begin();
1022 chamberIter1 != pOutputMuons->at(muonIndex1).matches().end(); ++chamberIter1 )
1024 if(chamberIter1->segmentMatches.empty())
continue;
1025 chamberPairs.clear();
1028 for( std::vector<reco::MuonSegmentMatch>::iterator segmentIter1 = chamberIter1->segmentMatches.begin();
1029 segmentIter1 != chamberIter1->segmentMatches.end(); ++segmentIter1 )
1031 chamberPairs.push_back(std::make_pair(&(*chamberIter1), &(*segmentIter1)));
1032 if(!segmentIter1->isMask())
1034 arbitrationPairs.clear();
1035 arbitrationPairs.push_back(std::make_pair(&(*chamberIter1), &(*segmentIter1)));
1041 if (pOutputMuons->at(muonIndex1).isTrackerMuon()) {
1043 for(
unsigned int muonIndex2 = muonIndex1+1; muonIndex2 < pOutputMuons->size(); ++muonIndex2 )
1046 if (! pOutputMuons->at(muonIndex2).isTrackerMuon())
continue;
1048 for( std::vector<reco::MuonChamberMatch>::iterator chamberIter2 = pOutputMuons->at(muonIndex2).matches().begin();
1049 chamberIter2 != pOutputMuons->at(muonIndex2).matches().end(); ++chamberIter2 )
1052 for( std::vector<reco::MuonSegmentMatch>::iterator segmentIter2 = chamberIter2->segmentMatches.begin();
1053 segmentIter2 != chamberIter2->segmentMatches.end(); ++segmentIter2 )
1055 if(segmentIter2->isMask())
continue;
1056 if(fabs(segmentIter2->x - segmentIter1->x ) < 1E-3 &&
1057 fabs(segmentIter2->y - segmentIter1->y ) < 1E-3 &&
1058 fabs(segmentIter2->dXdZ - segmentIter1->dXdZ ) < 1E-3 &&
1059 fabs(segmentIter2->dYdZ - segmentIter1->dYdZ ) < 1E-3 &&
1060 fabs(segmentIter2->xErr - segmentIter1->xErr ) < 1E-3 &&
1061 fabs(segmentIter2->yErr - segmentIter1->yErr ) < 1E-3 &&
1062 fabs(segmentIter2->dXdZErr - segmentIter1->dXdZErr) < 1E-3 &&
1063 fabs(segmentIter2->dYdZErr - segmentIter1->dYdZErr) < 1E-3)
1064 arbitrationPairs.push_back(std::make_pair(&(*chamberIter2), &(*segmentIter2)));
1071 if(arbitrationPairs.empty())
continue;
1072 if(arbitrationPairs.size()==1) {
1087 for(
unsigned int it = 0; it < arbitrationPairs.size(); ++it )
1095 if(cscid.
ring() == 4)
1096 for( std::vector<reco::MuonSegmentMatch>::iterator segmentIter2 = chamberIter1->segmentMatches.begin();
1097 segmentIter2 != chamberIter1->segmentMatches.end(); ++segmentIter2 ) {
1098 if( segmentIter1->cscSegmentRef.isNonnull() && segmentIter2->cscSegmentRef.isNonnull() )
1100 (segmentIter2->mask & 0x1e0000) &&
1101 (segmentIter1->mask & 0x1e0000) )
1110 if(chamberPairs.empty())
continue;
1111 if(chamberPairs.size()==1) {
1130 for(
int detectorIndex = 1; detectorIndex < 4; ++detectorIndex )
1132 stationPairs.clear();
1135 for( std::vector<reco::MuonChamberMatch>::iterator chamberIter = pOutputMuons->at(muonIndex1).matches().begin();
1136 chamberIter != pOutputMuons->at(muonIndex1).matches().end(); ++chamberIter )
1138 if(!(chamberIter->station()==
stationIndex && chamberIter->detector()==detectorIndex))
continue;
1139 if(chamberIter->segmentMatches.empty())
continue;
1141 for( std::vector<reco::MuonSegmentMatch>::iterator segmentIter = chamberIter->segmentMatches.begin();
1142 segmentIter != chamberIter->segmentMatches.end(); ++segmentIter )
1143 stationPairs.push_back(std::make_pair(&(*chamberIter), &(*segmentIter)));
1146 if(stationPairs.empty())
continue;
1147 if(stationPairs.size()==1) {
1186 throw cms::Exception(
"FatalError") <<
"Failed to compute muon isolation information for a muon with undefined references to tracks";
1194 if(caloDeps.size()!=3) {
1195 LogTrace(
"MuonIdentification") <<
"Failed to fill vector of calorimeter isolation deposits!";
1239 double energy =
sqrt(track.
p() * track.
p() + 0.011163691);
1252 if ( muonId.
sector() <= 12 )
1254 if ( muonId.
sector() == 13 ) phi = 3/6.*
M_PI;
1255 if ( muonId.
sector() == 14 ) phi = 9/6.*
M_PI;
1269 if ( muon.
matches().empty() ){
1272 return muon.
innerTrack()->outerPosition().phi();
1307 if (trackBAD || staBAD || glbBAD )
1309 edm::LogWarning(
"muonIDbadLinks") <<
"Global muon links to constituent tracks are invalid: trkBad "
1310 <<trackBAD <<
" standaloneBad "<<staBAD<<
" globalBad "<<glbBAD
1311 <<
". 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)
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_
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_
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
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_
virtual float phi() const GCC11_FINAL
momentum azimuthal angle
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.
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
virtual float eta() const GCC11_FINAL
momentum pseudorapidity
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 float pt() const GCC11_FINAL
transverse momentum
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_
void loadParameters(const edm::ParameterSet &)
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