36 #include <boost/regex.hpp>
55 muIsoExtractorCalo_(0),muIsoExtractorTrack_(0),muIsoExtractorJet_(0)
57 produces<reco::MuonCollection>();
58 produces<reco::CaloMuonCollection>();
59 produces<reco::MuonTimeExtraMap>(
"combined");
60 produces<reco::MuonTimeExtraMap>(
"dt");
61 produces<reco::MuonTimeExtraMap>(
"csc");
82 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];
289 LogTrace(
"MuonIdentification") <<
"Creating a muon from a track " << track.
get()->pt() <<
290 " Pt (GeV), eta: " << track.
get()->eta();
294 aMuon.setBestTrack(type);
295 aMuon.setTunePBestTrack(type);
314 LogTrace(
"MuonIdentification") <<
"Creating a muon from a link to tracks object";
320 bool useSigmaSwitch =
false;
328 if (tpfmsRef.
isNull() && pickyRef.isNull()){
329 edm::LogWarning(
"MakeMuonWithTEV")<<
"Failed to get TEV refits, fall back to sigma switch.";
330 useSigmaSwitch =
true;
333 useSigmaSwitch =
true;
345 aMuon =
makeMuon(*chosenTrack.first);
374 LogTrace(
"MuonIdentification") <<
"Skipped low momentum track (Pt,P): " << track.
pt() <<
375 ", " << track.
p() <<
" GeV";
381 LogTrace(
"MuonIdentification") <<
"Skipped track with large pseudo rapidity (Eta: " << track.
eta() <<
" )";
389 switch (
id.det() ) {
391 switch (
id.subdetId() ) {
395 return detId.
rawId();
416 int numberOfCommonDetIds = 0;
419 track.
extra()->recHits().
isNull() )
return numberOfCommonDetIds;
420 const std::vector<reco::MuonChamberMatch>& matches( muon.
matches() );
421 for ( std::vector<reco::MuonChamberMatch>::const_iterator
match = matches.begin();
424 if (
match->segmentMatches.empty() )
continue;
425 bool foundCommonDetId =
false;
435 foundCommonDetId =
true;
439 if ( foundCommonDetId ) {
440 numberOfCommonDetIds++;
444 return numberOfCommonDetIds;
460 badMuon.
globalTrack()->hitPattern().numberOfValidMuonHits()) > 10 ){
467 if ( goodMuon.
globalTrack()->hitPattern().numberOfValidMuonHits() <
468 badMuon.
globalTrack()->hitPattern().numberOfValidMuonHits() )
return false;
478 init(iEvent, iSetup);
504 outputMuons->push_back(*
muon);
509 if ( goodmuons.size()>1 ){
524 goodmuons[
j] =
false;
526 goodmuons[
i] =
false;
532 if ( !goodmuons[
i] )
continue;
535 if ( !goodmuons[
j] )
continue;
542 goodmuons[
j] =
false;
544 goodmuons[
i] =
false;
550 if ( !goodmuons[
i] )
continue;
555 for ( reco::MuonCollection::const_iterator
muon = outputMuons->begin();
556 muon != outputMuons->end(); ++
muon )
562 outputMuons->push_back(
makeMuon( *links ) );
570 LogTrace(
"MuonIdentification") <<
"Creating tracker muons";
575 bool splitTrack =
false;
578 std::vector<TrackDetectorAssociator::Direction>
directions;
585 for ( std::vector<TrackDetectorAssociator::Direction>::const_iterator direction = directions.begin();
586 direction != directions.end(); ++direction )
590 fillMuonId(iEvent, iSetup, trackerMuon, *direction);
606 for ( reco::MuonCollection::iterator
muon = outputMuons->begin();
607 muon != outputMuons->end(); ++
muon )
619 LogTrace(
"MuonIdentification") <<
"Found a corresponding global muon. Set energy, matches and move on";
624 if ( goodTrackerMuon || goodRPCMuon ){
625 outputMuons->push_back( trackerMuon );
627 LogTrace(
"MuonIdentification") <<
"track failed minimal number of muon matches requirement";
630 caloMuons->push_back( caloMuon );
639 LogTrace(
"MuonIdentification") <<
"Looking for new muons among stand alone muon tracks";
644 for ( reco::MuonCollection::iterator
muon = outputMuons->begin();
645 muon != outputMuons->end(); ++
muon )
647 if ( !
muon->standAloneMuon().isNull() ) {
662 LogTrace(
"MuonIdentification") <<
"Found associated tracker muon. Set a reference and move on";
671 LogTrace(
"MuonIdentification") <<
"No associated stand alone track is found. Making a muon";
672 outputMuons->push_back(
makeMuon(iEvent, iSetup,
679 LogTrace(
"MuonIdentification") <<
"Dress up muons if it's necessary";
681 int nMuons=outputMuons->size();
683 std::vector<reco::MuonTimeExtra> dtTimeColl(nMuons);
684 std::vector<reco::MuonTimeExtra> cscTimeColl(nMuons);
685 std::vector<reco::MuonTimeExtra> combinedTimeColl(nMuons);
686 std::vector<reco::IsoDeposit> trackDepColl(nMuons);
687 std::vector<reco::IsoDeposit> ecalDepColl(nMuons);
688 std::vector<reco::IsoDeposit> hcalDepColl(nMuons);
689 std::vector<reco::IsoDeposit> hoDepColl(nMuons);
690 std::vector<reco::IsoDeposit> jetDepColl(nMuons);
694 for ( reco::MuonCollection::iterator
muon = outputMuons->begin();
muon != outputMuons->end(); ++
muon )
702 if (
muon->isStandAloneMuon() ) {
708 LogTrace(
"MuonIdentification") <<
"THIS SHOULD NEVER HAPPEN";
726 trackDepColl[i], ecalDepColl[i], hcalDepColl[i], hoDepColl[i], jetDepColl[i]);
742 muon->setTime( muonTime);
743 dtTimeColl[
i] = dtTime;
744 cscTimeColl[
i] = cscTime;
745 combinedTimeColl[
i] = combinedTime;
751 LogTrace(
"MuonIdentification") <<
"number of muons produced: " << outputMuons->size();
755 filler.
insert(muonHandle, combinedTimeColl.begin(), combinedTimeColl.end());
757 fillerDT.
insert(muonHandle, dtTimeColl.begin(), dtTimeColl.end());
759 fillerCSC.
insert(muonHandle, cscTimeColl.begin(), cscTimeColl.end());
762 iEvent.
put(muonTimeMap,
"combined");
763 iEvent.
put(muonTimeMapDT,
"dt");
764 iEvent.
put(muonTimeMapCSC,
"csc");
767 trackDepFiller.
insert(muonHandle, trackDepColl.begin(), trackDepColl.end());
768 trackDepFiller.
fill();
770 ecalDepFiller.
insert(muonHandle, ecalDepColl.begin(), ecalDepColl.end());
771 ecalDepFiller.
fill();
773 hcalDepFiller.
insert(muonHandle, hcalDepColl.begin(), hcalDepColl.end());
774 hcalDepFiller.
fill();
776 hoDepFiller.
insert(muonHandle, hoDepColl.begin(), hoDepColl.end());
779 jetDepFiller.
insert(muonHandle, jetDepColl.begin(), jetDepColl.end());
784 iEvent.
put(caloMuons);
792 muon.
pt()<5 && fabs(muon.
eta())<1.5 &&
801 muon.
pt()<5 && fabs(muon.
eta())<1.5 &&
819 throw cms::Exception(
"FatalError") <<
"Failed to fill muon id information for a muon with undefined references to tracks";
841 for(std::vector<const EcalRecHit*>::const_iterator
hit=info.
ecalRecHits.begin();
843 if ((*hit)->id() != emMaxId)
continue;
844 muonEnergy.
emMax = (*hit)->energy();
848 for(std::vector<const HBHERecHit*>::const_iterator
hit=info.
hcalRecHits.begin();
850 if ((*hit)->id() != hadMaxId)
continue;
851 muonEnergy.
hadMax = (*hit)->energy();
862 std::vector<reco::MuonChamberMatch> muonChamberMatches;
863 unsigned int nubmerOfMatchesAccordingToTrackAssociator = 0;
864 for( std::vector<TAMuonChamberMatch>::const_iterator chamber=info.
chambers.begin();
865 chamber!=info.
chambers.end(); chamber++ )
867 if (chamber->id.subdetId() == 3 && rpcRecHits.
isValid() )
continue;
870 LocalError localError = chamber->tState.localError().positionError();
871 matchedChamber.
x = chamber->tState.localPosition().x();
872 matchedChamber.
y = chamber->tState.localPosition().y();
873 matchedChamber.
xErr =
sqrt( localError.
xx() );
874 matchedChamber.
yErr =
sqrt( localError.
yy() );
876 matchedChamber.
dXdZ = chamber->tState.localDirection().z()!=0?chamber->tState.localDirection().x()/chamber->tState.localDirection().z():9999;
877 matchedChamber.
dYdZ = chamber->tState.localDirection().z()!=0?chamber->tState.localDirection().y()/chamber->tState.localDirection().z():9999;
880 matchedChamber.
dXdZErr = trajectoryCovMatrix(1,1)>0?
sqrt(trajectoryCovMatrix(1,1)):0;
881 matchedChamber.
dYdZErr = trajectoryCovMatrix(2,2)>0?
sqrt(trajectoryCovMatrix(2,2)):0;
883 matchedChamber.
edgeX = chamber->localDistanceX;
884 matchedChamber.
edgeY = chamber->localDistanceY;
886 matchedChamber.
id = chamber->id;
887 if ( ! chamber->segments.empty() ) ++nubmerOfMatchesAccordingToTrackAssociator;
890 for( std::vector<TAMuonSegmentMatch>::const_iterator segment = chamber->segments.begin();
891 segment != chamber->segments.end(); segment++ )
894 matchedSegment.
x = segment->segmentLocalPosition.x();
895 matchedSegment.
y = segment->segmentLocalPosition.y();
896 matchedSegment.
dXdZ = segment->segmentLocalDirection.z()?segment->segmentLocalDirection.x()/segment->segmentLocalDirection.z():0;
897 matchedSegment.
dYdZ = segment->segmentLocalDirection.z()?segment->segmentLocalDirection.y()/segment->segmentLocalDirection.z():0;
898 matchedSegment.
xErr = segment->segmentLocalErrorXX>0?
sqrt(segment->segmentLocalErrorXX):0;
899 matchedSegment.
yErr = segment->segmentLocalErrorYY>0?
sqrt(segment->segmentLocalErrorYY):0;
900 matchedSegment.
dXdZErr = segment->segmentLocalErrorDxDz>0?
sqrt(segment->segmentLocalErrorDxDz):0;
901 matchedSegment.
dYdZErr = segment->segmentLocalErrorDyDz>0?
sqrt(segment->segmentLocalErrorDyDz):0;
902 matchedSegment.
t0 = segment->t0;
903 matchedSegment.
mask = 0;
906 matchedSegment.
hasZed_ = segment->hasZed;
907 matchedSegment.
hasPhi_ = segment->hasPhi;
909 bool matchedX =
false;
910 bool matchedY =
false;
911 LogTrace(
"MuonIdentification") <<
" matching local x, segment x: " << matchedSegment.
x <<
912 ", chamber x: " << matchedChamber.
x <<
", max: " <<
maxAbsDx_;
913 LogTrace(
"MuonIdentification") <<
" matching local y, segment y: " << matchedSegment.
y <<
914 ", chamber y: " << matchedChamber.
y <<
", max: " <<
maxAbsDy_;
915 if (matchedSegment.
xErr>0 && matchedChamber.
xErr>0 )
916 LogTrace(
"MuonIdentification") <<
" xpull: " <<
917 fabs(matchedSegment.
x - matchedChamber.
x)/
sqrt(
pow(matchedSegment.
xErr,2) +
pow(matchedChamber.
xErr,2));
918 if (matchedSegment.
yErr>0 && matchedChamber.
yErr>0 )
919 LogTrace(
"MuonIdentification") <<
" ypull: " <<
920 fabs(matchedSegment.
y - matchedChamber.
y)/
sqrt(
pow(matchedSegment.
yErr,2) +
pow(matchedChamber.
yErr,2));
922 if (fabs(matchedSegment.
x - matchedChamber.
x) <
maxAbsDx_) matchedX =
true;
923 if (fabs(matchedSegment.
y - matchedChamber.
y) <
maxAbsDy_) matchedY =
true;
924 if (matchedSegment.
xErr>0 && matchedChamber.
xErr>0 &&
926 if (matchedSegment.
yErr>0 && matchedChamber.
yErr>0 &&
928 if (matchedX && matchedY) matchedChamber.
segmentMatches.push_back(matchedSegment);
930 muonChamberMatches.push_back(matchedChamber);
937 for( std::vector<TAMuonChamberMatch>::const_iterator chamber=info.
chambers.begin();
938 chamber!=info.
chambers.end(); chamber++ )
941 if ( chamber->id.subdetId() != 3 )
continue;
945 LocalError localError = chamber->tState.localError().positionError();
946 matchedChamber.
x = chamber->tState.localPosition().x();
947 matchedChamber.
y = chamber->tState.localPosition().y();
948 matchedChamber.
xErr =
sqrt( localError.
xx() );
949 matchedChamber.
yErr =
sqrt( localError.
yy() );
951 matchedChamber.
dXdZ = chamber->tState.localDirection().z()!=0?chamber->tState.localDirection().x()/chamber->tState.localDirection().z():9999;
952 matchedChamber.
dYdZ = chamber->tState.localDirection().z()!=0?chamber->tState.localDirection().y()/chamber->tState.localDirection().z():9999;
955 matchedChamber.
dXdZErr = trajectoryCovMatrix(1,1)>0?
sqrt(trajectoryCovMatrix(1,1)):0;
956 matchedChamber.
dYdZErr = trajectoryCovMatrix(2,2)>0?
sqrt(trajectoryCovMatrix(2,2)):0;
958 matchedChamber.
edgeX = chamber->localDistanceX;
959 matchedChamber.
edgeY = chamber->localDistanceY;
961 matchedChamber.
id = chamber->id;
964 rpcRecHit != rpcRecHits->end(); ++rpcRecHit )
968 if ( rpcRecHit->rawId() != chamber->id.rawId() )
continue;
970 rpcHitMatch.
x = rpcRecHit->localPosition().x();
971 rpcHitMatch.
mask = 0;
972 rpcHitMatch.
bx = rpcRecHit->BunchX();
974 const double AbsDx = fabs(rpcRecHit->localPosition().x()-chamber->tState.localPosition().x());
975 if( AbsDx <= 20
or AbsDx/
sqrt(localError.
xx()) <= 4 ) matchedChamber.
rpcMatches.push_back(rpcHitMatch);
978 muonChamberMatches.push_back(matchedChamber);
984 LogTrace(
"MuonIdentification") <<
"number of muon chambers: " << aMuon.
matches().size() <<
"\n"
985 <<
"number of chambers with segments according to the associator requirements: " <<
986 nubmerOfMatchesAccordingToTrackAssociator;
987 LogTrace(
"MuonIdentification") <<
"number of segment matches with the producer requirements: " <<
998 std::vector<std::pair<reco::MuonChamberMatch*,reco::MuonSegmentMatch*> > chamberPairs;
999 std::vector<std::pair<reco::MuonChamberMatch*,reco::MuonSegmentMatch*> > stationPairs;
1000 std::vector<std::pair<reco::MuonChamberMatch*,reco::MuonSegmentMatch*> > arbitrationPairs;
1003 for(
unsigned int muonIndex1 = 0; muonIndex1 < pOutputMuons->size(); ++muonIndex1 )
1006 for( std::vector<reco::MuonChamberMatch>::iterator chamberIter1 = pOutputMuons->at(muonIndex1).matches().begin();
1007 chamberIter1 != pOutputMuons->at(muonIndex1).matches().end(); ++chamberIter1 )
1009 if(chamberIter1->segmentMatches.empty())
continue;
1010 chamberPairs.clear();
1013 for( std::vector<reco::MuonSegmentMatch>::iterator segmentIter1 = chamberIter1->segmentMatches.begin();
1014 segmentIter1 != chamberIter1->segmentMatches.end(); ++segmentIter1 )
1016 chamberPairs.push_back(std::make_pair(&(*chamberIter1), &(*segmentIter1)));
1017 if(!segmentIter1->isMask())
1019 arbitrationPairs.clear();
1020 arbitrationPairs.push_back(std::make_pair(&(*chamberIter1), &(*segmentIter1)));
1026 if (pOutputMuons->at(muonIndex1).isTrackerMuon()) {
1028 for(
unsigned int muonIndex2 = muonIndex1+1; muonIndex2 < pOutputMuons->size(); ++muonIndex2 )
1031 if (! pOutputMuons->at(muonIndex2).isTrackerMuon())
continue;
1033 for( std::vector<reco::MuonChamberMatch>::iterator chamberIter2 = pOutputMuons->at(muonIndex2).matches().begin();
1034 chamberIter2 != pOutputMuons->at(muonIndex2).matches().end(); ++chamberIter2 )
1037 for( std::vector<reco::MuonSegmentMatch>::iterator segmentIter2 = chamberIter2->segmentMatches.begin();
1038 segmentIter2 != chamberIter2->segmentMatches.end(); ++segmentIter2 )
1040 if(segmentIter2->isMask())
continue;
1041 if(fabs(segmentIter2->x - segmentIter1->x ) < 1E-3 &&
1042 fabs(segmentIter2->y - segmentIter1->y ) < 1E-3 &&
1043 fabs(segmentIter2->dXdZ - segmentIter1->dXdZ ) < 1E-3 &&
1044 fabs(segmentIter2->dYdZ - segmentIter1->dYdZ ) < 1E-3 &&
1045 fabs(segmentIter2->xErr - segmentIter1->xErr ) < 1E-3 &&
1046 fabs(segmentIter2->yErr - segmentIter1->yErr ) < 1E-3 &&
1047 fabs(segmentIter2->dXdZErr - segmentIter1->dXdZErr) < 1E-3 &&
1048 fabs(segmentIter2->dYdZErr - segmentIter1->dYdZErr) < 1E-3)
1049 arbitrationPairs.push_back(std::make_pair(&(*chamberIter2), &(*segmentIter2)));
1056 if(arbitrationPairs.empty())
continue;
1057 if(arbitrationPairs.size()==1) {
1072 for(
unsigned int it = 0; it < arbitrationPairs.size(); ++it )
1080 if(cscid.
ring() == 4)
1081 for( std::vector<reco::MuonSegmentMatch>::iterator segmentIter2 = chamberIter1->segmentMatches.begin();
1082 segmentIter2 != chamberIter1->segmentMatches.end(); ++segmentIter2 ) {
1083 if( segmentIter1->cscSegmentRef.isNonnull() && segmentIter2->cscSegmentRef.isNonnull() )
1085 (segmentIter2->mask & 0x1e0000) &&
1086 (segmentIter1->mask & 0x1e0000) )
1095 if(chamberPairs.empty())
continue;
1096 if(chamberPairs.size()==1) {
1115 for(
int detectorIndex = 1; detectorIndex < 4; ++detectorIndex )
1117 stationPairs.clear();
1120 for( std::vector<reco::MuonChamberMatch>::iterator chamberIter = pOutputMuons->at(muonIndex1).matches().begin();
1121 chamberIter != pOutputMuons->at(muonIndex1).matches().end(); ++chamberIter )
1123 if(!(chamberIter->station()==
stationIndex && chamberIter->detector()==detectorIndex))
continue;
1124 if(chamberIter->segmentMatches.empty())
continue;
1126 for( std::vector<reco::MuonSegmentMatch>::iterator segmentIter = chamberIter->segmentMatches.begin();
1127 segmentIter != chamberIter->segmentMatches.end(); ++segmentIter )
1128 stationPairs.push_back(std::make_pair(&(*chamberIter), &(*segmentIter)));
1131 if(stationPairs.empty())
continue;
1132 if(stationPairs.size()==1) {
1171 throw cms::Exception(
"FatalError") <<
"Failed to compute muon isolation information for a muon with undefined references to tracks";
1179 if(caloDeps.size()!=3) {
1180 LogTrace(
"MuonIdentification") <<
"Failed to fill vector of calorimeter isolation deposits!";
1224 double energy =
sqrt(track.
p() * track.
p() + 0.011163691);
1237 if ( muonId.
sector() <= 12 )
1239 if ( muonId.
sector() == 13 ) phi = 3/6.*
M_PI;
1240 if ( muonId.
sector() == 14 ) phi = 9/6.*
M_PI;
1254 if ( muon.
matches().empty() ){
1257 return muon.
innerTrack()->outerPosition().phi();
1292 if (trackBAD || staBAD || glbBAD )
1294 edm::LogWarning(
"muonIDbadLinks") <<
"Global muon links to constituent tracks are invalid: trkBad "
1295 <<trackBAD <<
" standaloneBad "<<staBAD<<
" globalBad "<<glbBAD
1296 <<
". 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_
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_
virtual float phi() const GCC11_FINAL
momentum azimuthal angle
const Point & vertex() const
reference point on the track. This method is DEPRECATED, please use referencePoint() instead ...
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
T const * get() const
Returns C++ pointer to the item.
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
bool isNull() const
Checks for null.
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_
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_
unsigned int type() const
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
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_
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