37 muIsoExtractorCalo_(0),muIsoExtractorTrack_(0),muIsoExtractorJet_(0)
40 LogTrace(
"MuonIdentification") <<
"RecoMuon/MuonIdProducer :: Constructor called";
42 produces<reco::MuonCollection>();
43 produces<reco::CaloMuonCollection>();
44 produces<reco::MuonTimeExtraMap>(
"combined");
45 produces<reco::MuonTimeExtraMap>(
"dt");
46 produces<reco::MuonTimeExtraMap>(
"csc");
68 if (fillGlobalTrackQuality_) fillTrackerKink_ = iConfig.
getParameter<
bool>(
"fillTrackerKink");
85 if (fillCaloCompatibility_){
105 if (fillIsolation_ && writeIsoDeposits_){
120 if (inputCollectionLabels_.size() != inputCollectionTypes.size())
121 throw cms::Exception(
"ConfigurationError") <<
"Number of input collection labels is different from number of types. " <<
122 "For each collection label there should be exactly one collection type specified.";
123 if (inputCollectionLabels_.size()>7 ||inputCollectionLabels_.empty())
124 throw cms::Exception(
"ConfigurationError") <<
"Number of input collections should be from 1 to 7.";
128 <<
"========================================================================\n" 129 <<
"Debugging mode with truth matching is turned on!!! Make sure you understand what you are doing!\n" 130 <<
"========================================================================\n";
131 if (fillGlobalTrackQuality_){
133 glbQualToken_ = consumes<edm::ValueMap<reco::MuonQuality> >(glbQualTag);
136 if (fillTrackerKink_) {
145 rpcHitToken_ = consumes<RPCRecHitCollection>(rpcHitTag);
150 for (
unsigned int i = 0;
i < inputCollectionLabels_.size(); ++
i ) {
266 LogTrace(
"MuonIdentification") <<
"Creating a muon from a track " << track.
get()->pt() <<
267 " Pt (GeV), eta: " << track.
get()->eta();
270 LogTrace(
"MuonIdentification") <<
"Muon created from a track ";
272 aMuon.setMuonTrack(type,track);
273 aMuon.setBestTrack(type);
274 aMuon.setTunePBestTrack(type);
276 LogTrace(
"MuonIdentification") <<
"Muon created from a track and setMuonBestTrack, setBestTrack and setTunePBestTrack called";
284 LogTrace(
"MuonIdentification") <<
"Creating a CaloMuon from a Muon";
298 LogTrace(
"MuonIdentification") <<
"Creating a muon from a link to tracks object";
305 bool useSigmaSwitch =
false;
314 if (tpfmsRef.
isNull() && pickyRef.isNull() && dytRef.isNull()){
315 edm::LogWarning(
"MakeMuonWithTEV")<<
"Failed to get TEV refits, fall back to sigma switch.";
316 useSigmaSwitch =
true;
319 useSigmaSwitch =
true;
328 tpfmsRef, pickyRef, dytRef,
331 aMuon =
makeMuon(*chosenTrack.first);
335 aMuon.setBestTrack(chosenTrack.second);
336 aMuon.setTunePBestTrack(chosenTrack.second);
359 const double p = track.
p();
360 const double pt = track.
pt();
362 LogTrace(
"MuonIdentification") <<
"Skipped low momentum track (Pt,P): " << pt
363 <<
", " << track.
p() <<
" GeV";
368 const double eta = track.
eta();
369 const double absEta =
std::abs(eta);
371 LogTrace(
"MuonIdentification") <<
"Skipped track with large pseudo rapidity (Eta: " << track.
eta() <<
" )";
382 const auto subdetId =
id.subdetId();
398 track.
extra()->recHitsSize()==0 )
return 0;
400 int numberOfCommonDetIds = 0;
401 const std::vector<reco::MuonChamberMatch>&
matches( muon.
matches() );
404 if (
match.segmentMatches.empty() )
continue;
406 bool foundCommonDetId =
false;
407 for (
auto hit = track.
extra()->recHitsBegin();
415 foundCommonDetId =
true;
419 if ( foundCommonDetId ) {
420 ++numberOfCommonDetIds;
424 return numberOfCommonDetIds;
439 const int nHitsGood = goodMuon.
globalTrack()->hitPattern().numberOfValidMuonHits();
440 const int nHitsBad = badMuon.
globalTrack()->hitPattern().numberOfValidMuonHits();
441 if (
std::min(nHitsGood, nHitsBad) > 10 ) {
442 const double chi2Good = goodMuon.
globalTrack()->normalizedChi2();
443 const double chi2Bad = badMuon.
globalTrack()->normalizedChi2();
444 return ( chi2Good <= chi2Bad );
447 return (nHitsGood >= nHitsBad);
453 auto outputMuons = std::make_unique<reco::MuonCollection>();
454 auto caloMuons = std::make_unique<reco::CaloMuonCollection>();
456 init(iEvent, iSetup);
463 outputMuons->push_back(
muon);
470 std::vector<bool> goodmuons(nLink,
true);
473 for (
unsigned int i=0;
i<nLink-1; ++
i ) {
475 if ( iLink.trackerTrack().isNull() || !
checkLinks(&iLink) )
continue;
476 for (
unsigned int j=
i+1; j<nLink; ++j ){
479 if ( iLink.trackerTrack() == jLink.trackerTrack() ) {
485 else goodmuons[
i] =
false;
490 for (
unsigned int i=0;
i<nLink-1; ++
i ) {
491 if ( !goodmuons[
i] )
continue;
493 if ( iLink.standAloneTrack().isNull() || !
checkLinks(&iLink))
continue;
494 for (
unsigned int j=i+1; j<nLink; ++j ) {
495 if ( !goodmuons[j] )
continue;
498 if ( iLink.standAloneTrack() == jLink.standAloneTrack() ) {
500 else goodmuons[
i] =
false;
505 for (
unsigned int i=0;
i<nLink; ++
i ) {
506 if ( !goodmuons[
i] )
continue;
511 for (
auto muon : *outputMuons ) {
512 if (
muon.track() == iLink.trackerTrack() &&
513 muon.standAloneMuon() == iLink.standAloneTrack() &&
514 muon.combinedMuon() == iLink.globalTrack() ) {
520 outputMuons->push_back(
makeMuon(iLink) );
528 LogTrace(
"MuonIdentification") <<
"Creating tracker muons";
529 std::vector<TrackDetectorAssociator::Direction> directions1, directions2;
539 bool splitTrack =
false;
542 const auto&
directions = splitTrack ? directions1 : directions2;
546 fillMuonId(iEvent, iSetup, trackerMuon, direction);
567 for (
auto&
muon : *outputMuons )
580 LogTrace(
"MuonIdentification") <<
"Found a corresponding global muon. Set energy, matches and move on";
585 if ( goodTrackerMuon || goodRPCMuon || goodGEMMuon || goodME0Muon){
586 outputMuons->push_back( trackerMuon );
588 LogTrace(
"MuonIdentification") <<
"track failed minimal number of muon matches requirement";
599 LogTrace(
"MuonIdentification") <<
"Looking for new muons among stand alone muon tracks";
606 for (
auto&
muon : *outputMuons )
608 if ( !
muon.standAloneMuon().isNull() ) {
610 if (
muon.standAloneMuon().get() == &outerTrack ) {
623 LogTrace(
"MuonIdentification") <<
"Found associated tracker muon. Set a reference and move on";
632 LogTrace(
"MuonIdentification") <<
"No associated stand alone track is found. Making a muon";
633 outputMuons->push_back(
makeMuon(iEvent, iSetup,
645 LogTrace(
"MuonIdentification") <<
"Dress up muons if it's necessary";
647 const int nMuons=outputMuons->size();
649 std::vector<reco::MuonTimeExtra> dtTimeColl(nMuons);
650 std::vector<reco::MuonTimeExtra> cscTimeColl(nMuons);
651 std::vector<reco::MuonTimeExtra> combinedTimeColl(nMuons);
652 std::vector<reco::IsoDeposit> trackDepColl(nMuons);
653 std::vector<reco::IsoDeposit> ecalDepColl(nMuons);
654 std::vector<reco::IsoDeposit> hcalDepColl(nMuons);
655 std::vector<reco::IsoDeposit> hoDepColl(nMuons);
656 std::vector<reco::IsoDeposit> jetDepColl(nMuons);
659 for (
unsigned int i=0;
i<outputMuons->size(); ++
i )
661 auto&
muon = outputMuons->at(
i);
669 if (
muon.isStandAloneMuon() ) {
676 LogTrace(
"MuonIdentification") <<
"THIS SHOULD NEVER HAPPEN";
695 trackDepColl[
i], ecalDepColl[i], hcalDepColl[i], hoDepColl[i], jetDepColl[i]);
713 muon.setTime(muonTime);
714 muon.setRPCTime(rpcTime);
715 dtTimeColl[
i] = dtTime;
716 cscTimeColl[
i] = cscTime;
717 combinedTimeColl[
i] = combinedTime;
720 LogTrace(
"MuonIdentification") <<
"number of muons produced: " << outputMuons->size();
730 auto oMap = std::make_unique<MapType>();
732 typename MapType::Filler
filler(*oMap);
733 filler.insert(refH, vec.begin(), vec.end());
739 fillMap(muonHandle, combinedTimeColl, iEvent,
"combined");
740 fillMap(muonHandle, dtTimeColl, iEvent,
"dt");
741 fillMap(muonHandle, cscTimeColl, iEvent,
"csc");
797 LogTrace(
"MuonIdentification") <<
"RecoMuon/MuonIdProducer :: fillMuonId";
803 else throw cms::Exception(
"FatalError") <<
"Failed to fill muon id information for a muon with undefined references to tracks";
808 LogTrace(
"MuonIdentification") <<
"RecoMuon/MuonIdProducer :: fillMuonId :: fillEnergy = "<<
fillEnergy_;
829 if (
hit->
id() != emMaxId)
continue;
835 if (
hit->
id() != hadMaxId)
continue;
844 LogTrace(
"MuonIdentification") <<
"RecoMuon/MuonIdProducer :: fillMuonId :: fill muon match info ";
845 std::vector<reco::MuonChamberMatch> muonChamberMatches;
846 unsigned int nubmerOfMatchesAccordingToTrackAssociator = 0;
852 const auto& lErr =
chamber.tState.localError();
853 const auto& lPos =
chamber.tState.localPosition();
854 const auto& lDir =
chamber.tState.localDirection();
856 const auto& localError = lErr.positionError();
857 matchedChamber.
x = lPos.x();
858 matchedChamber.
y = lPos.y();
859 matchedChamber.
xErr =
sqrt( localError.xx() );
860 matchedChamber.
yErr =
sqrt( localError.yy() );
862 matchedChamber.
dXdZ = lDir.z()!=0?lDir.x()/lDir.z():9999;
863 matchedChamber.
dYdZ = lDir.z()!=0?lDir.y()/lDir.z():9999;
866 matchedChamber.
dXdZErr = trajectoryCovMatrix(1,1)>0?
sqrt(trajectoryCovMatrix(1,1)):0;
867 matchedChamber.
dYdZErr = trajectoryCovMatrix(2,2)>0?
sqrt(trajectoryCovMatrix(2,2)):0;
873 if ( !
chamber.segments.empty() ) ++nubmerOfMatchesAccordingToTrackAssociator;
876 for (
const auto& segment :
chamber.segments )
879 matchedSegment.
x = segment.segmentLocalPosition.x();
880 matchedSegment.
y = segment.segmentLocalPosition.y();
881 matchedSegment.
dXdZ = segment.segmentLocalDirection.z()?segment.segmentLocalDirection.x()/segment.segmentLocalDirection.z():0;
882 matchedSegment.
dYdZ = segment.segmentLocalDirection.z()?segment.segmentLocalDirection.y()/segment.segmentLocalDirection.z():0;
883 matchedSegment.
xErr = segment.segmentLocalErrorXX>0?
sqrt(segment.segmentLocalErrorXX):0;
884 matchedSegment.
yErr = segment.segmentLocalErrorYY>0?
sqrt(segment.segmentLocalErrorYY):0;
885 matchedSegment.
dXdZErr = segment.segmentLocalErrorDxDz>0?
sqrt(segment.segmentLocalErrorDxDz):0;
886 matchedSegment.
dYdZErr = segment.segmentLocalErrorDyDz>0?
sqrt(segment.segmentLocalErrorDyDz):0;
887 matchedSegment.
t0 = segment.t0;
888 matchedSegment.
mask = 0;
893 matchedSegment.
hasZed_ = segment.hasZed;
894 matchedSegment.
hasPhi_ = segment.hasPhi;
896 bool matchedX =
false;
897 bool matchedY =
false;
898 LogTrace(
"MuonIdentification") <<
" matching local x, segment x: " << matchedSegment.
x <<
899 ", chamber x: " << matchedChamber.
x <<
", max: " <<
maxAbsDx_;
900 LogTrace(
"MuonIdentification") <<
" matching local y, segment y: " << matchedSegment.
y <<
901 ", chamber y: " << matchedChamber.
y <<
", max: " <<
maxAbsDy_;
902 const double matchedSegChDx =
std::abs(matchedSegment.
x - matchedChamber.
x);
903 const double matchedSegChDy =
std::abs(matchedSegment.
y - matchedChamber.
y);
904 const double matchedSegChPullX = matchedSegChDx/std::hypot(matchedSegment.
xErr, matchedChamber.
xErr);
905 const double matchedSegChPullY = matchedSegChDy/std::hypot(matchedSegment.
yErr, matchedChamber.
yErr);
906 if (matchedSegment.
xErr>0 && matchedChamber.
xErr>0 )
907 LogTrace(
"MuonIdentification") <<
" xpull: " << matchedSegChPullX;
908 if (matchedSegment.
yErr>0 && matchedChamber.
yErr>0 )
909 LogTrace(
"MuonIdentification") <<
" ypull: " << matchedSegChPullY;
911 if (matchedSegChDx <
maxAbsDx_) matchedX =
true;
912 if (matchedSegChDy <
maxAbsDy_) matchedY =
true;
913 if (matchedSegment.
xErr>0 && matchedChamber.
xErr>0 && matchedSegChPullX <
maxAbsPullX_) matchedX =
true;
914 if (matchedSegment.
yErr>0 && matchedChamber.
yErr>0 && matchedSegChPullY <
maxAbsPullY_) matchedY =
true;
915 if (matchedX && matchedY){
917 matchedChamber.
me0Matches.push_back(matchedSegment);
919 matchedChamber.
gemMatches.push_back(matchedSegment);
923 muonChamberMatches.push_back(matchedChamber);
927 LogTrace(
"MuonIdentification") <<
"RecoMuon/MuonIdProducer :: fillMuonId :: fill RPC info";
932 if (
chamber.id.subdetId() != 3 )
continue;
933 const auto& lErr =
chamber.tState.localError();
934 const auto& lPos =
chamber.tState.localPosition();
935 const auto& lDir =
chamber.tState.localDirection();
940 matchedChamber.
x = lPos.x();
941 matchedChamber.
y = lPos.y();
942 matchedChamber.
xErr =
sqrt( localError.
xx() );
943 matchedChamber.
yErr =
sqrt( localError.
yy() );
945 matchedChamber.
dXdZ = lDir.z()!=0?lDir.x()/lDir.z():9999;
946 matchedChamber.
dYdZ = lDir.z()!=0?lDir.y()/lDir.z():9999;
949 matchedChamber.
dXdZErr = trajectoryCovMatrix(1,1)>0?
sqrt(trajectoryCovMatrix(1,1)):0;
950 matchedChamber.
dYdZErr = trajectoryCovMatrix(2,2)>0?
sqrt(trajectoryCovMatrix(2,2)):0;
961 if ( rpcRecHit.rawId() !=
chamber.id.rawId() )
continue;
963 rpcHitMatch.
x = rpcRecHit.localPosition().x();
964 rpcHitMatch.
mask = 0;
965 rpcHitMatch.
bx = rpcRecHit.BunchX();
967 const double absDx =
std::abs(rpcRecHit.localPosition().x()-
chamber.tState.localPosition().x());
968 if( absDx <= 20
or absDx/
sqrt(localError.
xx()) <= 4 ) matchedChamber.
rpcMatches.push_back(rpcHitMatch);
971 muonChamberMatches.push_back(matchedChamber);
977 LogTrace(
"MuonIdentification") <<
"number of muon chambers: " << aMuon.
matches().size() <<
"\n" 978 <<
"number of chambers with segments according to the associator requirements: " <<
979 nubmerOfMatchesAccordingToTrackAssociator;
980 LogTrace(
"MuonIdentification") <<
"number of segment matches with the producer requirements: " <<
991 for (reco::MuonCollection::iterator
muon=muons->begin();
muon!=muons->end();){
992 if (
muon->isTrackerMuon()){
998 if ((
muon->type() & (~mask))==0){
1004 muon->setType(
muon->type()&(~
reco::Muon::TrackerMuon));
1017 std::vector<std::pair<reco::MuonChamberMatch*,reco::MuonSegmentMatch*> > chamberPairs;
1018 std::vector<std::pair<reco::MuonChamberMatch*,reco::MuonSegmentMatch*> > stationPairs;
1019 std::vector<std::pair<reco::MuonChamberMatch*,reco::MuonSegmentMatch*> > arbitrationPairs;
1022 for(
unsigned int muonIndex1 = 0; muonIndex1 < pOutputMuons->size(); ++muonIndex1 )
1024 auto& muon1 = pOutputMuons->at(muonIndex1);
1026 for (
auto& chamber1 : muon1.matches() )
1029 std::vector<reco::MuonSegmentMatch> * segmentMatches1 =
getSegmentMatches(chamber1, muonType);
1031 if(segmentMatches1->empty())
continue;
1032 chamberPairs.clear();
1034 for (
auto& segment1 : *segmentMatches1 )
1036 chamberPairs.push_back(std::make_pair(&chamber1, &segment1));
1037 if(!segment1.isMask())
1039 arbitrationPairs.clear();
1040 arbitrationPairs.push_back(std::make_pair(&chamber1, &segment1));
1044 if (muon1.type() & muonType) {
1046 for(
unsigned int muonIndex2 = muonIndex1+1; muonIndex2 < pOutputMuons->size(); ++muonIndex2 )
1048 auto& muon2 = pOutputMuons->at(muonIndex2);
1050 if ( !(muon2.type() & muonType) )
continue;
1052 for (
auto& chamber2 : muon2.matches() )
1055 std::vector<reco::MuonSegmentMatch> * segmentMatches2 =
getSegmentMatches(chamber2, muonType);
1056 for (
auto& segment2 : *segmentMatches2 )
1058 if(segment2.isMask())
continue;
1065 approxEqual(segment2.dXdZErr, segment1.dXdZErr) &&
1068 arbitrationPairs.push_back(std::make_pair(&chamber2, &segment2));
1076 if(arbitrationPairs.empty())
continue;
1077 if(arbitrationPairs.size()==1) {
1092 for (
auto& ap : arbitrationPairs ) {
1101 for (
auto& segment2 : chamber1.segmentMatches ) {
1102 if( segment1.cscSegmentRef.isNull() || segment2.cscSegmentRef.isNull() )
continue;
1104 (segment2.mask & 0x1e0000) &&
1105 (segment1.mask & 0x1e0000) ) {
1115 if(chamberPairs.empty())
continue;
1116 if(chamberPairs.size()==1) {
1136 for(
int detectorIndex = 1; detectorIndex <= 5; ++detectorIndex )
1138 stationPairs.clear();
1141 for (
auto&
chamber : muon1.matches() )
1145 if (segmentMatches->empty())
continue;
1147 for (
auto& segment : *segmentMatches ) {
1148 stationPairs.push_back(std::make_pair(&
chamber, &segment));
1152 if(stationPairs.empty())
continue;
1153 if(stationPairs.size()==1) {
1187 else throw cms::Exception(
"FatalError") <<
"Failed to compute muon isolation information for a muon with undefined references to tracks";
1196 if(caloDeps.size()!=3) {
1197 LogTrace(
"MuonIdentification") <<
"Failed to fill vector of calorimeter isolation deposits!";
1243 const double energy = hypot(track.
p(), 0.105658369);
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();
1305 if (trackBAD || staBAD || glbBAD )
1307 edm::LogWarning(
"muonIDbadLinks") <<
"Global muon links to constituent tracks are invalid: trkBad " 1308 <<trackBAD <<
" standaloneBad "<<staBAD<<
" globalBad "<<glbBAD
1309 <<
". There should be no such object. Muon is skipped.";
1319 desc.
add<
bool>(
"arbitrateTrackerMuons",
false);
1324 descTrkAsoPar.add<
bool>(
"useGEM",
false);
1325 descTrkAsoPar.add<
bool>(
"useME0",
false);
1326 descTrkAsoPar.setAllowAnything();
std::string hoDepositName_
double p() const
momentum vector magnitude
T getParameter(std::string const &) const
virtual double pt() const final
transverse momentum
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)
int numberOfMatchedRPCLayers(ArbitrationType type=RPCHitAndTrackArbitration) const
edm::EDGetTokenT< reco::TrackCollection > innerTrackCollectionToken_
reco::Muon makeMuon(edm::Event &iEvent, const edm::EventSetup &iSetup, const reco::TrackRef &track, TrackType type)
GEMSegmentRef gemSegmentRef
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
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
bool isNonnull() const
Checks for non-null.
reco::TrackRef trackerTrack() const
get the tracker's track which match with the stand alone muon tracks
void runMesh(std::vector< reco::Muon > *p)
std::vector< reco::MuonSegmentMatch > gemMatches
static bool crossedIP(const reco::Track &track)
float sumPt
sum-pt of tracks
void setType(unsigned int type)
TrackDetectorAssociator trackAssociator_
CSCSegmentRef cscSegmentRef
std::unique_ptr< MuonKinkFinder > trackerKinkFinder_
const TrackExtraRef & extra() const
reference to "extra" object
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
const_iterator end() const
last iterator over the map (read only)
reco::isodeposit::IsoDepositExtractor * muIsoExtractorCalo_
virtual double eta() const final
momentum pseudorapidity
virtual TrackRef innerTrack() const
bool getByToken(EDGetToken token, Handle< PROD > &result) const
void setAllowAnything()
allow any parameter label/value pairs
edm::Handle< reco::MuonTrackLinksCollection > linkCollectionHandle_
edm::EDGetTokenT< RPCRecHitCollection > rpcHitToken_
bool isTrackerMuon() const
bool isGoodGEMMuon(const reco::Muon &muon)
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
std::vector< DetId > crossedEcalIds
std::string trackDepositName_
void fillArbitrationInfo(reco::MuonCollection *, unsigned int muonType=reco::Muon::TrackerMuon)
const_iterator find(const key_type &k) const
find element with specified reference key
void fillTiming(const reco::Muon &muon, reco::MuonTimeExtra &dtTime, reco::MuonTimeExtra &cscTime, reco::MuonTime &rpcTime, reco::MuonTimeExtra &combinedTime, edm::Event &iEvent, const edm::EventSetup &iSetup)
double phiOfMuonIneteractionRegion(const reco::Muon &muon) const
std::vector< CaloMuon > CaloMuonCollection
collection of Muon objects
void loadParameters(const edm::ParameterSet &, edm::ConsumesCollector &)
std::vector< reco::MuonSegmentMatch > * getSegmentMatches(reco::MuonChamberMatch &chamber, unsigned int muonType) const
get the segment matches of the appropriate type
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
double evaluate(const reco::Muon &)
MuonCaloCompatibility muonCaloCompatibility_
static const unsigned int BestInStationByDRSlope
bool isMatchesValid() const
ROOT::Math::SMatrix< double, 5, 5, ROOT::Math::MatRepSym< double, 5 > > AlgebraicSymMatrix55
edm::EDGetTokenT< reco::TrackToTrackMap > pickyCollectionToken_
static std::string toStr(const ICTypeKey k)
double px() const
x coordinate of momentum vector
bool arbitrateTrackerMuons_
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
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 DT/CSC combined 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
double depositWithin(double coneSize, const Vetos &vetos=Vetos(), bool skipDepositVeto=false) const
Get deposit.
bool approxEqual(const double a, const double b, const double tol=1E-3) const
uint32_t rawId() const
get the raw id
virtual double phi() const final
momentum azimuthal angle
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.
edm::EDGetTokenT< reco::TrackToTrackMap > tpfmsCollectionToken_
const Point & vertex() const
reference point on the track. This method is DEPRECATED, please use referencePoint() instead ...
std::vector< reco::MuonSegmentMatch > me0Matches
double ptThresholdToFillCandidateP4WithGlobalFit_
double eta() const
pseudorapidity of momentum vector
void addDefault(ParameterSetDescription const &psetDescription)
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
bool isGoodME0Muon(const reco::Muon &muon)
reco::Muon::MuonTrackTypePair tevOptimized(const reco::TrackRef &combinedTrack, const reco::TrackRef &trackerTrack, const reco::TrackRef &tpfmsTrack, const reco::TrackRef &pickyTrack, const reco::TrackRef &dytTrack, const double ptThreshold=200., const double tune1=17., const double tune2=40., const double dptcut=0.25)
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
static const unsigned int ME0Muon
ConsumesCollector consumesCollector()
Use a ConsumesCollector to gather consumes information from helper functions.
ArbitrationType
define arbitration schemes
bool isGoodTrackerMuon(const reco::Muon &muon)
double pt() const
track transverse momentum
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::EventID const &, edm::Timestamp const & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
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
Abs< T >::type abs(const T &t)
CSCDetId chamberId() const
edm::EDGetTokenT< reco::MuonCollection > muonCollectionToken_
edm::EDGetTokenT< reco::TrackCollection > outerTrackCollectionToken_
edm::Handle< RPCRecHitCollection > rpcHitHandle_
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.
ME0SegmentRef me0SegmentRef
bool isQualityValid() const
ParameterDescriptionBase * add(U const &iLabel, T const &value)
edm::Handle< reco::TrackToTrackMap > dytCollectionHandle_
int subdetId() const
get the contents of the subdetector field (not cast into any detector's numbering enum) ...
edm::Handle< reco::TrackCollection > outerTrackCollectionHandle_
edm::EDGetTokenT< reco::MuonTrackLinksCollection > linkCollectionToken_
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
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_
void setCaloCompatibility(float input)
static const unsigned int RPCMuon
static ICTypeKey toKey(const std::string &s)
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 &)
size_type size() const
map size
reco::isodeposit::IsoDepositExtractor * muIsoExtractorJet_
bool isDuplicateOf(const CSCSegmentRef &lhs, const CSCSegmentRef &rhs) const
MuonTimingFiller * theTimingFiller_
std::vector< ICTypes::ICTypeKey > inputCollectionTypes_
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
edm::Ref< TrackCollection > TrackRef
persistent reference to a Track
void setCombinedQuality(const MuonQuality &combinedQuality)
set energy deposition information
std::vector< edm::InputTag > inputCollectionLabels_
static const unsigned int PFMuon
std::vector< MuonChamberMatch > & matches()
get muon matching information
void setCalEnergy(const MuonEnergy &calEnergy)
set energy deposition information
int triggerSector() const
MuonIdProducer(const edm::ParameterSet &)
void arbitrateMuons(reco::MuonCollection *, reco::CaloMuonCollection *)
std::vector< reco::MuonSegmentMatch > segmentMatches
bool fillGlobalTrackQuality_
int numberOfMatches(ArbitrationType type=SegmentAndTrackArbitration) const
get number of chambers with matched segments
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
void setIsolation(const MuonIsolation &isoR03, const MuonIsolation &isoR05)
functor predicate for standard library sort algorithm
static const unsigned int GEMMuon
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
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)
T const * product() const
bool debugWithTruthMatching_
bool isGoodCaloMuon(const reco::CaloMuon &muon)
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
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::Handle< reco::MuonCollection > muonCollectionHandle_
double py() const
y coordinate of momentum vector
edm::Handle< edm::ValueMap< reco::MuonQuality > > glbQualHandle_
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