CMS 3D CMS Logo

Classes | Enumerations | Functions
muon Namespace Reference

Classes

struct  SelectionTypeStringToEnum
 a lightweight "map" for selection type string label and enum value More...
 

Enumerations

enum  AlgorithmType {
  TMLastStation, TM2DCompatibility, TMOneStation, RPCMu,
  ME0Mu, GEMMu
}
 
enum  SelectionType {
  All = 0, AllGlobalMuons = 1, AllStandAloneMuons = 2, AllTrackerMuons = 3,
  TrackerMuonArbitrated = 4, AllArbitrated = 5, GlobalMuonPromptTight = 6, TMLastStationLoose = 7,
  TMLastStationTight = 8, TM2DCompatibilityLoose = 9, TM2DCompatibilityTight = 10, TMOneStationLoose = 11,
  TMOneStationTight = 12, TMLastStationOptimizedLowPtLoose = 13, TMLastStationOptimizedLowPtTight = 14, GMTkChiCompatibility = 15,
  GMStaChiCompatibility = 16, GMTkKinkTight = 17, TMLastStationAngLoose = 18, TMLastStationAngTight = 19,
  TMOneStationAngLoose = 20, TMOneStationAngTight = 21, TMLastStationOptimizedBarrelLowPtLoose = 22, TMLastStationOptimizedBarrelLowPtTight = 23,
  RPCMuLoose = 24, AllME0Muons = 25, ME0MuonArbitrated = 26, AllGEMMuons = 27,
  GEMMuonArbitrated = 28, All = 0, VeryLoose = 1, Loose = 2,
  Tight = 3
}
 Selector type. More...
 
enum  SelectionType {
  All = 0, AllGlobalMuons = 1, AllStandAloneMuons = 2, AllTrackerMuons = 3,
  TrackerMuonArbitrated = 4, AllArbitrated = 5, GlobalMuonPromptTight = 6, TMLastStationLoose = 7,
  TMLastStationTight = 8, TM2DCompatibilityLoose = 9, TM2DCompatibilityTight = 10, TMOneStationLoose = 11,
  TMOneStationTight = 12, TMLastStationOptimizedLowPtLoose = 13, TMLastStationOptimizedLowPtTight = 14, GMTkChiCompatibility = 15,
  GMStaChiCompatibility = 16, GMTkKinkTight = 17, TMLastStationAngLoose = 18, TMLastStationAngTight = 19,
  TMOneStationAngLoose = 20, TMOneStationAngTight = 21, TMLastStationOptimizedBarrelLowPtLoose = 22, TMLastStationOptimizedBarrelLowPtTight = 23,
  RPCMuLoose = 24, AllME0Muons = 25, ME0MuonArbitrated = 26, AllGEMMuons = 27,
  GEMMuonArbitrated = 28, All = 0, VeryLoose = 1, Loose = 2,
  Tight = 3
}
 Selector type. More...
 

Functions

float caloCompatibility (const reco::Muon &muon)
 
reco::TrackRef getTevRefitTrack (const reco::TrackRef &combinedTrack, const reco::TrackToTrackMap &map)
 
bool isGoodMuon (const reco::ME0Muon &me0muon, SelectionType type)
 main GoodMuon wrapper call More...
 
bool isGoodMuon (const reco::ME0Muon &me0muon, double MaxPullX, double MaxDiffX, double MaxPullY, double MaxDiffY, double MaxDiffPhiDir)
 Specialized isGoodMuon function called from main wrapper. More...
 
bool isGoodMuon (const reco::Muon &muon, SelectionType type, reco::Muon::ArbitrationType arbitrationType=reco::Muon::SegmentAndTrackArbitration)
 main GoodMuon wrapper call More...
 
bool isGoodMuon (const reco::Muon &muon, AlgorithmType type, double minCompatibility, reco::Muon::ArbitrationType arbitrationType)
 
bool isGoodMuon (const reco::Muon &muon, AlgorithmType type, int minNumberOfMatches, double maxAbsDx, double maxAbsPullX, double maxAbsDy, double maxAbsPullY, double maxChamberDist, double maxChamberDistPull, reco::Muon::ArbitrationType arbitrationType, bool syncMinNMatchesNRequiredStationsInBarrelOnly=true, bool applyAlsoAngularCuts=false)
 
bool isHighPtMuon (const reco::Muon &, const reco::Vertex &)
 
bool isLooseMuon (const reco::Muon &)
 
bool isMediumMuon (const reco::Muon &)
 
bool isSoftMuon (const reco::Muon &, const reco::Vertex &)
 
bool isTightMuon (const reco::Muon &, const reco::Vertex &)
 
bool overlap (const reco::Muon &muon1, const reco::Muon &muon2, double pullX=1.0, double pullY=1.0, bool checkAdjacentChambers=false)
 
unsigned int RequiredStationMask (const reco::Muon &muon, double maxChamberDist, double maxChamberDistPull, reco::Muon::ArbitrationType arbitrationType)
 
float segmentCompatibility (const reco::Muon &muon, reco::Muon::ArbitrationType arbitrationType=reco::Muon::SegmentAndTrackArbitration)
 
SelectionType selectionTypeFromString (const std::string &label)
 
int sharedSegments (const reco::Muon &muon1, const reco::Muon &muon2, unsigned int segmentArbitrationMask=reco::MuonSegmentMatch::BestInChamberByDR)
 
reco::Muon::MuonTrackTypePair sigmaSwitch (const reco::TrackRef &combinedTrack, const reco::TrackRef &trackerTrack, const double nSigma=2., const double ptThreshold=200.)
 
reco::Muon::MuonTrackTypePair sigmaSwitch (const reco::Muon &muon, const double nSigma=2., const double ptThreshold=200.)
 
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)
 
reco::Muon::MuonTrackTypePair tevOptimized (const reco::Muon &muon, const double ptThreshold=200., const double tune1=17., const double tune2=40., const double dptcut=0.25)
 
reco::Muon::MuonTrackTypePair TMR (const reco::TrackRef &trackerTrack, const reco::TrackRef &fmsTrack, const double tune=4.)
 
double trackProbability (const reco::TrackRef track)
 

Detailed Description

Filter to select me0Muons based on pulls and differences w.r.t. me0Segments

Enumeration Type Documentation

Enumerator
TMLastStation 
TM2DCompatibility 
TMOneStation 
RPCMu 
ME0Mu 
GEMMu 

Definition at line 67 of file MuonSelectors.h.

Selector type.

Enumerator
All 
AllGlobalMuons 
AllStandAloneMuons 
AllTrackerMuons 
TrackerMuonArbitrated 
AllArbitrated 
GlobalMuonPromptTight 
TMLastStationLoose 
TMLastStationTight 
TM2DCompatibilityLoose 
TM2DCompatibilityTight 
TMOneStationLoose 
TMOneStationTight 
TMLastStationOptimizedLowPtLoose 
TMLastStationOptimizedLowPtTight 
GMTkChiCompatibility 
GMStaChiCompatibility 
GMTkKinkTight 
TMLastStationAngLoose 
TMLastStationAngTight 
TMOneStationAngLoose 
TMOneStationAngTight 
TMLastStationOptimizedBarrelLowPtLoose 
TMLastStationOptimizedBarrelLowPtTight 
RPCMuLoose 
AllME0Muons 
ME0MuonArbitrated 
AllGEMMuons 
GEMMuonArbitrated 
All 
VeryLoose 
Loose 
Tight 

Definition at line 16 of file ME0MuonSelector.h.

16  {
17  All = 0, // dummy options - always true
18  VeryLoose = 1, //
19  Loose = 2, //
20  Tight = 3, //
21  };

Selector type.

Enumerator
All 
AllGlobalMuons 
AllStandAloneMuons 
AllTrackerMuons 
TrackerMuonArbitrated 
AllArbitrated 
GlobalMuonPromptTight 
TMLastStationLoose 
TMLastStationTight 
TM2DCompatibilityLoose 
TM2DCompatibilityTight 
TMOneStationLoose 
TMOneStationTight 
TMLastStationOptimizedLowPtLoose 
TMLastStationOptimizedLowPtTight 
GMTkChiCompatibility 
GMStaChiCompatibility 
GMTkKinkTight 
TMLastStationAngLoose 
TMLastStationAngTight 
TMOneStationAngLoose 
TMOneStationAngTight 
TMLastStationOptimizedBarrelLowPtLoose 
TMLastStationOptimizedBarrelLowPtTight 
RPCMuLoose 
AllME0Muons 
ME0MuonArbitrated 
AllGEMMuons 
GEMMuonArbitrated 
All 
VeryLoose 
Loose 
Tight 

Definition at line 17 of file MuonSelectors.h.

17  {
18  All = 0, // dummy options - always true
19  AllGlobalMuons = 1, // checks isGlobalMuon flag
20  AllStandAloneMuons = 2, // checks isStandAloneMuon flag
21  AllTrackerMuons = 3, // checks isTrackerMuon flag
22  TrackerMuonArbitrated = 4, // resolve ambiguity of sharing segments
23  AllArbitrated = 5, // all muons with the tracker muon arbitrated
24  GlobalMuonPromptTight = 6, // global muons with tighter fit requirements
25  TMLastStationLoose = 7, // penetration depth loose selector
26  TMLastStationTight = 8, // penetration depth tight selector
27  TM2DCompatibilityLoose = 9, // likelihood based loose selector
28  TM2DCompatibilityTight = 10, // likelihood based tight selector
29  TMOneStationLoose = 11, // require one well matched segment
30  TMOneStationTight = 12, // require one well matched segment
31  TMLastStationOptimizedLowPtLoose = 13, // combination of TMLastStation and TMOneStation
32  TMLastStationOptimizedLowPtTight = 14, // combination of TMLastStation and TMOneStation
33  GMTkChiCompatibility = 15, // require tk stub have good chi2 relative to glb track
34  GMStaChiCompatibility = 16, // require sta stub have good chi2 compatibility relative to glb track
35  GMTkKinkTight = 17, // require a small kink value in the tracker stub
36  TMLastStationAngLoose = 18, // TMLastStationLoose with additional angular cuts
37  TMLastStationAngTight = 19, // TMLastStationTight with additional angular cuts
38  TMOneStationAngLoose = 20, // TMOneStationLoose with additional angular cuts
39  TMOneStationAngTight = 21, // TMOneStationTight with additional angular cuts
40  // The two algorithms that follow are identical to what were known as
41  // TMLastStationOptimizedLowPt* (sans the Barrel) as late as revision
42  // 1.7 of this file. The names were changed because indeed the low pt
43  // optimization applies only to the barrel region, whereas the sel-
44  // ectors above are more efficient at low pt in the endcaps, which is
45  // what we feel is more suggestive of the algorithm name. This will be
46  // less confusing for future generations of CMS members, I hope...
47  TMLastStationOptimizedBarrelLowPtLoose = 22, // combination of TMLastStation and TMOneStation but with low pT optimization in barrel only
48  TMLastStationOptimizedBarrelLowPtTight = 23, // combination of TMLastStation and TMOneStation but with low pT optimization in barrel only
49  RPCMuLoose = 24, // checks isRPCMuon flag (require two well matched hits in different RPC layers)
50  AllME0Muons = 25,
51  ME0MuonArbitrated = 26,
52  AllGEMMuons = 27,
54  };

Function Documentation

float muon::caloCompatibility ( const reco::Muon muon)

Definition at line 75 of file MuonSelectors.cc.

References reco::Muon::caloCompatibility().

Referenced by CSCEfficiency::filter(), isGoodMuon(), and pat::MuonSelector::muIdSelection_().

75  {
76  return muon.caloCompatibility();
77 }
float caloCompatibility() const
Definition: Muon.h:154
reco::TrackRef muon::getTevRefitTrack ( const reco::TrackRef combinedTrack,
const reco::TrackToTrackMap map 
)

Definition at line 121 of file MuonCocktails.cc.

References edm::AssociationMap< edm::OneToOne< reco::TrackCollection, reco::TrackCollection > >::const_iterator, edm::AssociationMap< Tag >::end(), and edm::AssociationMap< Tag >::find().

Referenced by MuonIdProducer::makeMuon(), and tevOptimized().

122  {
123  reco::TrackToTrackMap::const_iterator it = map.find(combinedTrack);
124  return it == map.end() ? reco::TrackRef() : it->val;
125 }
const_iterator end() const
last iterator over the map (read only)
const_iterator find(const key_type &k) const
find element with specified reference key
edm::Ref< TrackCollection > TrackRef
persistent reference to a Track
Definition: TrackFwd.h:20
bool muon::isGoodMuon ( const reco::ME0Muon me0muon,
SelectionType  type 
)

main GoodMuon wrapper call

Definition at line 41 of file ME0MuonSelector.cc.

References All, isGoodMuon(), Loose, Tight, and VeryLoose.

42 {
43  switch (type)
44  {
45  case muon::All:
46  return true;
47  break;
48  case muon::VeryLoose:
49  return isGoodMuon(me0muon,3,4,20,20,3.14);
50  break;
51  case muon::Loose:
52  return isGoodMuon(me0muon,3,2,3,2,0.5);
53  break;
54  case muon::Tight:
55  return isGoodMuon(me0muon,3,2,3,2,0.15);
56  break;
57  default:
58  return false;
59  }
60 }
type
Definition: HCALResponse.h:21
bool isGoodMuon(const reco::Muon &muon, SelectionType type, reco::Muon::ArbitrationType arbitrationType=reco::Muon::SegmentAndTrackArbitration)
main GoodMuon wrapper call
bool muon::isGoodMuon ( const reco::ME0Muon me0muon,
double  MaxPullX,
double  MaxDiffX,
double  MaxPullY,
double  MaxDiffY,
double  MaxDiffPhiDir 
)

Specialized isGoodMuon function called from main wrapper.

Definition at line 65 of file ME0MuonSelector.cc.

References funct::abs(), PV3DBase< T, PVType, FrameType >::barePhi(), patCaloMETCorrections_cff::C, reco::deltaPhi(), ME0Segment::localDirection(), ME0Segment::localPosition(), ME0Segment::localPositionError(), reco::ME0Muon::localTrackCov(), reco::ME0Muon::localTrackMomAtSurface(), reco::ME0Muon::localTrackPosAtSurface(), reco::ME0Muon::me0segment(), mathSSE::sqrt(), PV3DBase< T, PVType, FrameType >::x(), LocalError::xx(), PV3DBase< T, PVType, FrameType >::y(), and LocalError::yy().

66 {
67  using namespace reco;
68 
69  ME0Segment thisSegment = me0muon.me0segment();
70 
71 
72  LocalPoint r3FinalReco = me0muon.localTrackPosAtSurface();
73 
75  LocalPoint thisPosition(thisSegment.localPosition());
76 
77 
78  double sigmax = sqrt(C[3][3]+thisSegment.localPositionError().xx() );
79  double sigmay = sqrt(C[4][4]+thisSegment.localPositionError().yy() );
80 
81  bool X_MatchFound = false, Y_MatchFound = false, Dir_MatchFound = false;
82 
83 
84  if ( ( (std::abs(thisPosition.x()-r3FinalReco.x())/sigmax ) < MaxPullX ) || (std::abs(thisPosition.x()-r3FinalReco.x()) < MaxDiffX ) ) X_MatchFound = true;
85  if ( ( (std::abs(thisPosition.y()-r3FinalReco.y())/sigmay ) < MaxPullY ) || (std::abs(thisPosition.y()-r3FinalReco.y()) < MaxDiffY ) ) Y_MatchFound = true;
86  if ( std::abs(reco::deltaPhi(me0muon.localTrackMomAtSurface().barePhi(),thisSegment.localDirection().barePhi())) < MaxDiffPhiDir) Dir_MatchFound = true;
87 
88  return (X_MatchFound && Y_MatchFound && Dir_MatchFound);
89 
90 }
LocalPoint localPosition() const
Definition: ME0Segment.h:40
float xx() const
Definition: LocalError.h:24
const LocalPoint & localTrackPosAtSurface() const
Definition: ME0Muon.h:46
T y() const
Definition: PV3DBase.h:63
LocalVector localDirection() const
Local direction.
Definition: ME0Segment.h:43
ROOT::Math::SMatrix< double, 5, 5, ROOT::Math::MatRepSym< double, 5 > > AlgebraicSymMatrix55
const ME0Segment & me0segment() const
Definition: ME0Muon.h:37
T barePhi() const
Definition: PV3DBase.h:68
float yy() const
Definition: LocalError.h:26
LocalError localPositionError() const
Definition: ME0Segment.cc:63
T sqrt(T t)
Definition: SSEVec.h:18
const AlgebraicSymMatrix55 & localTrackCov() const
Definition: ME0Muon.h:51
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
double deltaPhi(double phi1, double phi2)
Definition: deltaPhi.h:22
const LocalVector & localTrackMomAtSurface() const
Definition: ME0Muon.h:47
fixed size matrix
T x() const
Definition: PV3DBase.h:62
bool muon::isGoodMuon ( const reco::Muon muon,
SelectionType  type,
reco::Muon::ArbitrationType  arbitrationType = reco::Muon::SegmentAndTrackArbitration 
)

main GoodMuon wrapper call

Definition at line 647 of file MuonSelectors.cc.

References All, AllArbitrated, AllGEMMuons, AllGlobalMuons, AllME0Muons, AllStandAloneMuons, AllTrackerMuons, reco::Muon::combinedQuality(), reco::LeafCandidate::eta(), GEMMu, GEMMuonArbitrated, GlobalMuonPromptTight, reco::Muon::globalTrack(), GMStaChiCompatibility, GMTkChiCompatibility, GMTkKinkTight, reco::Muon::innerTrack(), reco::Muon::isGEMMuon(), reco::Muon::isGlobalMuon(), reco::Muon::isME0Muon(), reco::Muon::isQualityValid(), reco::Muon::isRPCMuon(), reco::Muon::isStandAloneMuon(), reco::Muon::isTrackerMuon(), ME0Mu, ME0MuonArbitrated, reco::Muon::numberOfMatches(), reco::Muon::outerTrack(), reco::LeafCandidate::pt(), RPCMu, RPCMuLoose, reco::MuonQuality::staRelChi2, TM2DCompatibility, TM2DCompatibilityLoose, TM2DCompatibilityTight, TMLastStation, TMLastStationAngLoose, TMLastStationAngTight, TMLastStationLoose, TMLastStationOptimizedBarrelLowPtLoose, TMLastStationOptimizedBarrelLowPtTight, TMLastStationOptimizedLowPtLoose, TMLastStationOptimizedLowPtTight, TMLastStationTight, TMOneStation, TMOneStationAngLoose, TMOneStationAngTight, TMOneStationLoose, TMOneStationTight, TrackerMuonArbitrated, reco::MuonQuality::trkKink, and reco::MuonQuality::trkRelChi2.

Referenced by BPHSoftMuonSelect::accept(), ExampleMuonAnalyzer::analyze(), BPhysicsOniaDQM::analyze(), TrackEfficiencyMonitor::analyze(), HiggsDQM::analyze(), MuonIdVal::analyze(), MuonCosmicCompatibilityFiller::checkMuonID(), PFRecoTauDiscriminationAgainstMuon::discriminate(), ZtoMMEventSelector::filter(), WMuNuValidator::filter(), WMuNuSelector::filter(), HLTDiMuonGlbTrkFilter::hltFilter(), HLTMuonTrkL1TFilter::hltFilter(), HLTMuonTrkFilter::hltFilter(), HLTMuonL3PreFilter::hltFilter(), PFMuonAlgo::isGlobalLooseMuon(), PFMuonAlgo::isGlobalTightMuon(), isGoodMuon(), isSoftMuon(), isTightMuon(), PFMuonAlgo::isTightMuonPOG(), PFMuonAlgo::isTrackerLooseMuon(), PFMuonAlgo::isTrackerTightMuon(), PFB::match(), JetPlusTrackCorrector::matchMuons(), pat::MuonSelector::muIdSelection_(), MuonSelectorVIDWrapper< selectionType, arbitrationType >::operator()(), reco::operator<<(), MuonBadTrackFilter::printMuonProperties(), PFMuonAlgo::printMuonProperties(), MuonTrackProducer::produce(), MuonRefProducer::produce(), MuonSelectionTypeValueMapProducer::produce(), ME0MuonTrackCollProducer::produce(), SoftLepton::produce(), and MuonSelectorVIDWrapper< selectionType, arbitrationType >::value().

649 {
650  switch (type)
651  {
652  case muon::All:
653  return true;
654  break;
656  return muon.isGlobalMuon();
657  break;
659  return muon.isTrackerMuon();
660  break;
662  return muon.isStandAloneMuon();
663  break;
665  return muon.isTrackerMuon() && muon.numberOfMatches(arbitrationType)>0;
666  break;
667  case muon::AllArbitrated:
668  return ! muon.isTrackerMuon() || muon.numberOfMatches(arbitrationType)>0;
669  break;
671  return muon.isGlobalMuon() && muon.globalTrack()->normalizedChi2()<10. && muon.globalTrack()->hitPattern().numberOfValidMuonHits() >0;
672  break;
673  // For "Loose" algorithms we choose maximum y quantity cuts of 1E9 instead of
674  // 9999 as before. We do this because the muon methods return 999999 (note
675  // there are six 9's) when the requested information is not available. For
676  // example, if a muon fails to traverse the z measuring superlayer in a station
677  // in the DT, then all methods involving segmentY in this station return
678  // 999999 to demonstrate that the information is missing. In order to not
679  // penalize muons for missing y information in Loose algorithms where we do
680  // not care at all about y information, we raise these limits. In the
681  // TMLastStation and TMOneStation algorithms we actually use this huge number
682  // to determine whether to consider y information at all.
684  return muon.isTrackerMuon() && isGoodMuon(muon,TMLastStation,2,3,3,1E9,1E9,-3,-3,arbitrationType,true,false);
685  break;
687  return muon.isTrackerMuon() && isGoodMuon(muon,TMLastStation,2,3,3,3,3,-3,-3,arbitrationType,true,false);
688  break;
690  return muon.isTrackerMuon() && isGoodMuon(muon,TMOneStation,1,3,3,1E9,1E9,1E9,1E9,arbitrationType,false,false);
691  break;
693  return muon.isTrackerMuon() && isGoodMuon(muon,TMOneStation,1,3,3,3,3,1E9,1E9,arbitrationType,false,false);
694  break;
696  if (muon.pt() < 8. && fabs(muon.eta()) < 1.2)
697  return muon.isTrackerMuon() && isGoodMuon(muon,TMOneStation,1,3,3,1E9,1E9,1E9,1E9,arbitrationType,false,false);
698  else
699  return muon.isTrackerMuon() && isGoodMuon(muon,TMLastStation,2,3,3,1E9,1E9,-3,-3,arbitrationType,false,false);
700  break;
702  if (muon.pt() < 8. && fabs(muon.eta()) < 1.2)
703  return muon.isTrackerMuon() && isGoodMuon(muon,TMOneStation,1,3,3,3,3,1E9,1E9,arbitrationType,false,false);
704  else
705  return muon.isTrackerMuon() && isGoodMuon(muon,TMLastStation,2,3,3,3,3,-3,-3,arbitrationType,false,false);
706  break;
707  //compatibility loose
709  return muon.isTrackerMuon() && isGoodMuon(muon,TM2DCompatibility,0.7,arbitrationType);
710  break;
711  //compatibility tight
713  return muon.isTrackerMuon() && isGoodMuon(muon,TM2DCompatibility,1.0,arbitrationType);
714  break;
716  return muon.isGlobalMuon() && muon.isQualityValid() && fabs(muon.combinedQuality().trkRelChi2 - muon.innerTrack()->normalizedChi2()) < 2.0;
717  break;
719  return muon.isGlobalMuon() && muon.isQualityValid() && fabs(muon.combinedQuality().staRelChi2 - muon.outerTrack()->normalizedChi2()) < 2.0;
720  break;
721  case muon::GMTkKinkTight:
722  return muon.isGlobalMuon() && muon.isQualityValid() && muon.combinedQuality().trkKink < 100.0;
723  break;
725  return muon.isTrackerMuon() && isGoodMuon(muon,TMLastStation,2,3,3,1E9,1E9,-3,-3,arbitrationType,false,true);
726  break;
728  return muon.isTrackerMuon() && isGoodMuon(muon,TMLastStation,2,3,3,3,3,-3,-3,arbitrationType,false,true);
729  break;
731  return muon.isTrackerMuon() && isGoodMuon(muon,TMOneStation,1,3,3,1E9,1E9,1E9,1E9,arbitrationType,false,true);
732  break;
734  return muon.isTrackerMuon() && isGoodMuon(muon,TMOneStation,1,3,3,3,3,1E9,1E9,arbitrationType,false,true);
735  break;
737  if (muon.pt() < 8. && fabs(muon.eta()) < 1.2)
738  return muon.isTrackerMuon() && isGoodMuon(muon,TMOneStation,1,3,3,1E9,1E9,1E9,1E9,arbitrationType,false,false);
739  else
740  return muon.isTrackerMuon() && isGoodMuon(muon,TMLastStation,2,3,3,1E9,1E9,-3,-3,arbitrationType,true,false);
741  break;
743  if (muon.pt() < 8. && fabs(muon.eta()) < 1.2)
744  return muon.isTrackerMuon() && isGoodMuon(muon,TMOneStation,1,3,3,3,3,1E9,1E9,arbitrationType,false,false);
745  else
746  return muon.isTrackerMuon() && isGoodMuon(muon,TMLastStation,2,3,3,3,3,-3,-3,arbitrationType,true,false);
747  break;
748  case muon::RPCMuLoose:
749  return muon.isRPCMuon() && isGoodMuon(muon, RPCMu, 2, 20, 4, 1e9, 1e9, 1e9, 1e9, arbitrationType, false, false);
750  break;
751  case muon::AllME0Muons:
752  return muon.isME0Muon();
753  break;
755  return muon.isME0Muon() && isGoodMuon(muon, ME0Mu, 1, 1e9, 1e9, 1e9, 1e9, 1e9, 1e9, arbitrationType, false, false);
756  break;
757  case muon::AllGEMMuons:
758  return muon.isGEMMuon();
759  break;
761  return muon.isGEMMuon() && isGoodMuon(muon, GEMMu, 1, 1e9, 1e9, 1e9, 1e9, 1e9, 1e9, arbitrationType, false, false);
762  break;
763  default:
764  return false;
765  }
766 }
type
Definition: HCALResponse.h:21
virtual double pt() const final
transverse momentum
virtual double eta() const final
momentum pseudorapidity
virtual TrackRef innerTrack() const
Definition: Muon.h:48
bool isTrackerMuon() const
Definition: Muon.h:226
bool isGlobalMuon() const
Definition: Muon.h:225
float trkKink
value of the kink algorithm applied to the inner track stub
Definition: MuonQuality.h:11
bool isStandAloneMuon() const
Definition: Muon.h:227
float trkRelChi2
chi2 value for the inner track stub with respect to the global track
Definition: MuonQuality.h:15
bool isME0Muon() const
Definition: Muon.h:232
bool isRPCMuon() const
Definition: Muon.h:230
MuonQuality combinedQuality() const
get energy deposition information
Definition: Muon.h:121
bool isQualityValid() const
Definition: Muon.h:119
virtual TrackRef outerTrack() const
reference to Track reconstructed in the muon detector only
Definition: Muon.h:51
bool isGoodMuon(const reco::Muon &muon, SelectionType type, reco::Muon::ArbitrationType arbitrationType=reco::Muon::SegmentAndTrackArbitration)
main GoodMuon wrapper call
float staRelChi2
chi2 value for the outer track stub with respect to the global track
Definition: MuonQuality.h:17
bool isGEMMuon() const
Definition: Muon.h:231
int numberOfMatches(ArbitrationType type=SegmentAndTrackArbitration) const
get number of chambers with matched segments
virtual TrackRef globalTrack() const
reference to Track reconstructed in both tracked and muon detector
Definition: Muon.h:54
bool muon::isGoodMuon ( const reco::Muon muon,
AlgorithmType  type,
double  minCompatibility,
reco::Muon::ArbitrationType  arbitrationType 
)

Definition at line 293 of file MuonSelectors.cc.

References caloCompatibility(), reco::Muon::isMatchesValid(), segmentCompatibility(), and TM2DCompatibility.

296  {
297  if (!muon.isMatchesValid()) return false;
298  bool goodMuon = false;
299 
300  switch( type ) {
301  case TM2DCompatibility:
302  // Simplistic first cut in the 2D segment- vs calo-compatibility plane. Will have to be refined!
303  if( ( (0.8*caloCompatibility( muon ))+(1.2*segmentCompatibility( muon, arbitrationType )) ) > minCompatibility ) goodMuon = true;
304  else goodMuon = false;
305  return goodMuon;
306  break;
307  default :
308  // LogTrace("MuonIdentification")<<" // Invalid Algorithm Type called!";
309  goodMuon = false;
310  return goodMuon;
311  break;
312  }
313 }
type
Definition: HCALResponse.h:21
bool isMatchesValid() const
Definition: Muon.h:142
float caloCompatibility(const reco::Muon &muon)
bool muon::isGoodMuon ( const reco::Muon muon,
AlgorithmType  type,
int  minNumberOfMatches,
double  maxAbsDx,
double  maxAbsPullX,
double  maxAbsDy,
double  maxAbsPullY,
double  maxChamberDist,
double  maxChamberDistPull,
reco::Muon::ArbitrationType  arbitrationType,
bool  syncMinNMatchesNRequiredStationsInBarrelOnly = true,
bool  applyAlsoAngularCuts = false 
)

Definition at line 315 of file MuonSelectors.cc.

References gamEcalExtractorBlocks_cff::detector, reco::Muon::dX(), reco::Muon::dY(), fftjetvertexadder_cfi::errX, fftjetvertexadder_cfi::errY, reco::LeafCandidate::eta(), MuonSubdetId::GEM, GEMMu, reco::Muon::isMatchesValid(), reco::Muon::matches(), MuonSubdetId::ME0, ME0Mu, or, reco::Muon::pullDxDz(), reco::Muon::pullDyDz(), reco::Muon::pullX(), reco::Muon::pullY(), RequiredStationMask(), RPCMu, mathSSE::sqrt(), relativeConstraints::station, reco::Muon::stationMask(), TMLastStation, and TMOneStation.

327 {
328  if (!muon.isMatchesValid()) return false;
329  bool goodMuon = false;
330 
331  if (type == TMLastStation) {
332  // To satisfy my own paranoia, if the user specifies that the
333  // minimum number of matches is zero, then return true.
334  if(minNumberOfMatches == 0) return true;
335 
336  unsigned int theStationMask = muon.stationMask(arbitrationType);
337  unsigned int theRequiredStationMask = RequiredStationMask(muon, maxChamberDist, maxChamberDistPull, arbitrationType);
338 
339  // Require that there be at least a minimum number of segments
340  int numSegs = 0;
341  int numRequiredStations = 0;
342  for(int it = 0; it < 8; ++it) {
343  if(theStationMask & 1<<it) ++numSegs;
344  if(theRequiredStationMask & 1<<it) ++numRequiredStations;
345  }
346 
347  // Make sure the minimum number of matches is not greater than
348  // the number of required stations but still greater than zero
349  if (syncMinNMatchesNRequiredStationsInBarrelOnly) {
350  // Note that we only do this in the barrel region!
351  if (fabs(muon.eta()) < 1.2) {
352  if(minNumberOfMatches > numRequiredStations)
353  minNumberOfMatches = numRequiredStations;
354  if(minNumberOfMatches < 1) //SK: this only happens for negative values
355  minNumberOfMatches = 1;
356  }
357  } else {
358  if(minNumberOfMatches > numRequiredStations)
359  minNumberOfMatches = numRequiredStations;
360  if(minNumberOfMatches < 1) //SK: this only happens for negative values
361  minNumberOfMatches = 1;
362  }
363 
364  if(numSegs >= minNumberOfMatches) goodMuon = 1;
365 
366  // Require that last required station have segment
367  // If there are zero required stations keep track
368  // of the last station with a segment so that we may
369  // apply the quality cuts below to it instead
370  int lastSegBit = 0;
371  if(theRequiredStationMask) {
372  for(int stationIdx = 7; stationIdx >= 0; --stationIdx)
373  if(theRequiredStationMask & 1<<stationIdx){
374  if(theStationMask & 1<<stationIdx) {
375  lastSegBit = stationIdx;
376  goodMuon &= 1;
377  break;
378  } else {
379  goodMuon = false;
380  break;
381  }
382  }
383  } else {
384  for(int stationIdx = 7; stationIdx >= 0; --stationIdx)
385  if(theStationMask & 1<<stationIdx) {
386  lastSegBit = stationIdx;
387  break;
388  }
389  }
390 
391  if(!goodMuon) return false;
392 
393  // Impose pull cuts on last segment
394  int station = 0, detector = 0;
395  station = lastSegBit < 4 ? lastSegBit+1 : lastSegBit-3;
396  detector = lastSegBit < 4 ? 1 : 2;
397 
398  // Check x information
399  if(fabs(muon.pullX(station,detector,arbitrationType,1)) > maxAbsPullX &&
400  fabs(muon.dX(station,detector,arbitrationType)) > maxAbsDx)
401  return false;
402 
403  if(applyAlsoAngularCuts && fabs(muon.pullDxDz(station,detector,arbitrationType,1)) > maxAbsPullX)
404  return false;
405 
406  // Is this a tight algorithm, i.e. do we bother to check y information?
407  if (maxAbsDy < 999999) { // really if maxAbsDy < 1E9 as currently defined
408 
409  // Check y information
410  if (detector == 2) { // CSC
411  if(fabs(muon.pullY(station,2,arbitrationType,1)) > maxAbsPullY &&
412  fabs(muon.dY(station,2,arbitrationType)) > maxAbsDy)
413  return false;
414 
415  if(applyAlsoAngularCuts && fabs(muon.pullDyDz(station,2,arbitrationType,1)) > maxAbsPullY)
416  return false;
417  } else {
418  //
419  // In DT, if this is a "Tight" algorithm and the last segment is
420  // missing y information (always the case in station 4!!!), impose
421  // respective cuts on the next station in the stationMask that has
422  // a segment with y information. If there are no segments with y
423  // information then there is nothing to penalize. Should we
424  // penalize in Tight for having zero segments with y information?
425  // That is the fundamental question. Of course I am being uber
426  // paranoid; if this is a good muon then there will probably be at
427  // least one segment with y information but not always. Suppose
428  // somehow a muon only creates segments in station 4, then we
429  // definitely do not want to require that there be at least one
430  // segment with y information because we will lose it completely.
431  //
432 
433  for (int stationIdx = station; stationIdx > 0; --stationIdx) {
434  if(! (theStationMask & 1<<(stationIdx-1))) // don't bother if the station is not in the stationMask
435  continue;
436 
437  if(muon.dY(stationIdx,1,arbitrationType) > 999998) // no y-information
438  continue;
439 
440  if(fabs(muon.pullY(stationIdx,1,arbitrationType,1)) > maxAbsPullY &&
441  fabs(muon.dY(stationIdx,1,arbitrationType)) > maxAbsDy) {
442  return false;
443  }
444 
445  if(applyAlsoAngularCuts && fabs(muon.pullDyDz(stationIdx,1,arbitrationType,1)) > maxAbsPullY)
446  return false;
447 
448  // If we get this far then great this is a good muon
449  return true;
450  }
451  }
452  }
453 
454  return goodMuon;
455  } // TMLastStation
456 
457  // TMOneStation requires only that there be one "good" segment, regardless
458  // of the required stations. We do not penalize if there are absolutely zero
459  // segments with y information in the Tight algorithm. Maybe I'm being
460  // paranoid but so be it. If it's really a good muon then we will probably
461  // find at least one segment with both x and y information but you never
462  // know, and I don't want to deal with a potential inefficiency in the DT
463  // like we did with the original TMLastStation. Incidentally, not penalizing
464  // for total lack of y information in the Tight algorithm is what is done in
465  // the new TMLastStation
466  //
467  if (type == TMOneStation) {
468  unsigned int theStationMask = muon.stationMask(arbitrationType);
469 
470  // Of course there must be at least one segment
471  if (! theStationMask) return false;
472 
473  int station = 0, detector = 0;
474  // Keep track of whether or not there is a DT segment with y information.
475  // In the end, if it turns out there are absolutely zero DT segments with
476  // y information, require only that there was a segment with good x info.
477  // This of course only applies to the Tight algorithms.
478  bool existsGoodDTSegX = false;
479  bool existsDTSegY = false;
480 
481  // Impose cuts on the segments in the station mask until we find a good one
482  // Might as well start with the lowest bit to speed things up.
483  for(int stationIdx = 0; stationIdx <= 7; ++stationIdx)
484  if(theStationMask & 1<<stationIdx) {
485  station = stationIdx < 4 ? stationIdx+1 : stationIdx-3;
486  detector = stationIdx < 4 ? 1 : 2;
487 
488  if((fabs(muon.pullX(station,detector,arbitrationType,1)) > maxAbsPullX &&
489  fabs(muon.dX(station,detector,arbitrationType)) > maxAbsDx) ||
490  (applyAlsoAngularCuts && fabs(muon.pullDxDz(station,detector,arbitrationType,1)) > maxAbsPullX))
491  continue;
492  else if (detector == 1)
493  existsGoodDTSegX = true;
494 
495  // Is this a tight algorithm? If yes, use y information
496  if (maxAbsDy < 999999) {
497  if (detector == 2) { // CSC
498  if((fabs(muon.pullY(station,2,arbitrationType,1)) > maxAbsPullY &&
499  fabs(muon.dY(station,2,arbitrationType)) > maxAbsDy) ||
500  (applyAlsoAngularCuts && fabs(muon.pullDyDz(station,2,arbitrationType,1)) > maxAbsPullY))
501  continue;
502  } else {
503 
504  if(muon.dY(station,1,arbitrationType) > 999998) // no y-information
505  continue;
506  else
507  existsDTSegY = true;
508 
509  if((fabs(muon.pullY(station,1,arbitrationType,1)) > maxAbsPullY &&
510  fabs(muon.dY(station,1,arbitrationType)) > maxAbsDy) ||
511  (applyAlsoAngularCuts && fabs(muon.pullDyDz(station,1,arbitrationType,1)) > maxAbsPullY)) {
512  continue;
513  }
514  }
515  }
516 
517  // If we get this far then great this is a good muon
518  return true;
519  }
520 
521  // If we get this far then for sure there are no "good" CSC segments. For
522  // DT, check if there were any segments with y information. If there
523  // were none, but there was a segment with good x, then we're happy. If
524  // there WERE segments with y information, then they must have been shit
525  // since we are here so fail it. Of course, if this is a Loose algorithm
526  // then fail immediately since if we had good x we would already have
527  // returned true
528  if (maxAbsDy < 999999) {
529  if (existsDTSegY)
530  return false;
531  else if (existsGoodDTSegX)
532  return true;
533  } else
534  return false;
535  } // TMOneStation
536 
537  if ( type == RPCMu )
538  {
539  if ( minNumberOfMatches == 0 ) return true;
540 
541  int nMatch = 0;
542  for ( std::vector<reco::MuonChamberMatch>::const_iterator chamberMatch = muon.matches().begin();
543  chamberMatch != muon.matches().end(); ++chamberMatch )
544  {
545  if ( chamberMatch->detector() != 3 ) continue;
546 
547  const double trkX = chamberMatch->x;
548  const double errX = chamberMatch->xErr;
549 
550  for ( std::vector<reco::MuonRPCHitMatch>::const_iterator rpcMatch = chamberMatch->rpcMatches.begin();
551  rpcMatch != chamberMatch->rpcMatches.end(); ++rpcMatch )
552  {
553  const double rpcX = rpcMatch->x;
554 
555  const double dX = fabs(rpcX-trkX);
556  if ( dX < maxAbsDx or dX/errX < maxAbsPullX )
557  {
558  ++nMatch;
559  break;
560  }
561  }
562  }
563 
564  if ( nMatch >= minNumberOfMatches ) return true;
565  else return false;
566  } // RPCMu
567 
568  if ( type == ME0Mu )
569  {
570  if ( minNumberOfMatches == 0 ) return true;
571 
572  int nMatch = 0;
573  for ( const auto& chamberMatch : muon.matches() )
574  {
575  if ( chamberMatch.detector() != MuonSubdetId::ME0 ) continue;
576 
577  const double trkX = chamberMatch.x;
578  const double errX = chamberMatch.xErr;
579  const double trkY = chamberMatch.y;
580  const double errY = chamberMatch.yErr;
581 
582  for ( const auto& segment : chamberMatch.me0Matches )
583  {
584 
585  const double me0X = segment.x;
586  const double me0ErrX = segment.xErr;
587  const double me0Y = segment.y;
588  const double me0ErrY = segment.yErr;
589 
590  const double dX = fabs(me0X - trkX);
591  const double dY = fabs(me0Y - trkY);
592  const double pullX = dX/std::sqrt(errX + me0ErrX);
593  const double pullY = dY/std::sqrt(errY + me0ErrY);
594 
595  if ( (dX < maxAbsDx or pullX < maxAbsPullX) and (dY < maxAbsDy or pullY < maxAbsPullY) )
596  {
597  ++nMatch;
598  break;
599  }
600  }
601  }
602 
603  return ( nMatch >= minNumberOfMatches );
604  } // ME0Mu
605 
606  if ( type == GEMMu )
607  {
608  if ( minNumberOfMatches == 0 ) return true;
609 
610  int nMatch = 0;
611  for ( const auto& chamberMatch : muon.matches() )
612  {
613  if ( chamberMatch.detector() != MuonSubdetId::GEM ) continue;
614 
615  const double trkX = chamberMatch.x;
616  const double errX = chamberMatch.xErr;
617  const double trkY = chamberMatch.y;
618  const double errY = chamberMatch.yErr;
619 
620  for ( const auto& segment : chamberMatch.gemMatches )
621  {
622 
623  const double gemX = segment.x;
624  const double gemErrX = segment.xErr;
625  const double gemY = segment.y;
626  const double gemErrY = segment.yErr;
627 
628  const double dX = fabs(gemX - trkX);
629  const double dY = fabs(gemY - trkY);
630  const double pullX = dX/std::sqrt(errX + gemErrX);
631  const double pullY = dY/std::sqrt(errY + gemErrY);
632 
633  if ( (dX < maxAbsDx or pullX < maxAbsPullX) and (dY < maxAbsDy or pullY < maxAbsPullY) )
634  {
635  ++nMatch;
636  break;
637  }
638  }
639  }
640 
641  return ( nMatch >= minNumberOfMatches );
642  } // GEMMu
643 
644  return goodMuon;
645 }
type
Definition: HCALResponse.h:21
virtual double eta() const final
momentum pseudorapidity
static const int GEM
Definition: MuonSubdetId.h:15
bool isMatchesValid() const
Definition: Muon.h:142
static const int ME0
Definition: MuonSubdetId.h:16
float dY(int station, int muonSubdetId, ArbitrationType type=SegmentAndTrackArbitration) const
float pullDxDz(int station, int muonSubdetId, ArbitrationType type=SegmentAndTrackArbitration, bool includeSegmentError=true) const
T sqrt(T t)
Definition: SSEVec.h:18
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
Definition: Activities.doc:12
float dX(int station, int muonSubdetId, ArbitrationType type=SegmentAndTrackArbitration) const
float pullY(int station, int muonSubdetId, ArbitrationType type=SegmentAndTrackArbitration, bool includeSegmentError=true) const
unsigned int stationMask(ArbitrationType type=SegmentAndTrackArbitration) const
unsigned int RequiredStationMask(const reco::Muon &muon, double maxChamberDist, double maxChamberDistPull, reco::Muon::ArbitrationType arbitrationType)
std::vector< MuonChamberMatch > & matches()
get muon matching information
Definition: Muon.h:144
float pullDyDz(int station, int muonSubdetId, ArbitrationType type=SegmentAndTrackArbitration, bool includeSegmentError=true) const
float pullX(int station, int muonSubdetId, ArbitrationType type=SegmentAndTrackArbitration, bool includeSegmentError=true) const
bool muon::isHighPtMuon ( const reco::Muon muon,
const reco::Vertex vtx 
)

Definition at line 889 of file MuonSelectors.cc.

References reco::Muon::globalTrack(), hfClusterShapes_cfi::hits, reco::Muon::innerTrack(), reco::Muon::isGlobalMuon(), reco::Muon::numberOfMatchedStations(), reco::Vertex::position(), and reco::Muon::tunePMuonBestTrack().

Referenced by MuonKinVsEtaAnalyzer::analyze(), pat::Muon::isGood(), MuonPOGStandardCut::operator()(), reco::operator<<(), MuonMiniAOD::PassesCut_A(), MuonMiniAOD::PassesCut_B(), and MuonPOGStandardCut::value().

889  {
890  bool muID = muon.isGlobalMuon() && muon.globalTrack()->hitPattern().numberOfValidMuonHits() >0 && (muon.numberOfMatchedStations() > 1);
891  if(!muID) return false;
892 
893  bool hits = muon.innerTrack()->hitPattern().trackerLayersWithMeasurement() > 5 &&
894  muon.innerTrack()->hitPattern().numberOfValidPixelHits() > 0;
895 
896  bool momQuality = muon.tunePMuonBestTrack()->ptError()/muon.tunePMuonBestTrack()->pt() < 0.3;
897 
898  bool ip = fabs(muon.innerTrack()->dxy(vtx.position())) < 0.2 && fabs(muon.innerTrack()->dz(vtx.position())) < 0.5;
899 
900  return muID && hits && momQuality && ip;
901 
902 }
virtual TrackRef innerTrack() const
Definition: Muon.h:48
bool isGlobalMuon() const
Definition: Muon.h:225
const Point & position() const
position
Definition: Vertex.h:109
int numberOfMatchedStations(ArbitrationType type=SegmentAndTrackArbitration) const
virtual TrackRef tunePMuonBestTrack() const
Definition: Muon.h:65
virtual TrackRef globalTrack() const
reference to Track reconstructed in both tracked and muon detector
Definition: Muon.h:54
bool muon::isLooseMuon ( const reco::Muon muon)
bool muon::isMediumMuon ( const reco::Muon muon)

Definition at line 859 of file MuonSelectors.cc.

References reco::MuonQuality::chi2LocalPosition, reco::Muon::combinedQuality(), reco::Muon::globalTrack(), reco::Muon::innerTrack(), reco::Muon::isGlobalMuon(), isLooseMuon(), segmentCompatibility(), and reco::MuonQuality::trkKink.

Referenced by DiMuonHistograms::analyze(), MuonKinVsEtaAnalyzer::analyze(), EfficiencyAnalyzer::analyze(), pat::Muon::isGood(), MuonPOGStandardCut::operator()(), reco::operator<<(), MuonMiniAOD::PassesCut_A(), MuonMiniAOD::PassesCut_B(), ZCounting::passMuonID(), BadGlobalMuonTagger::tighterId(), and MuonPOGStandardCut::value().

859  {
860  if( !( isLooseMuon(muon) && muon.innerTrack()->validFraction() > 0.8 )) return false;
861 
862  bool goodGlb = muon.isGlobalMuon() &&
863  muon.globalTrack()->normalizedChi2() < 3. &&
864  muon.combinedQuality().chi2LocalPosition < 12. &&
865  muon.combinedQuality().trkKink < 20.;
866 
867  return (segmentCompatibility(muon) > (goodGlb ? 0.303 : 0.451));
868 }
float chi2LocalPosition
chi2 value for the STA-TK matching of local position
Definition: MuonQuality.h:19
virtual TrackRef innerTrack() const
Definition: Muon.h:48
bool isGlobalMuon() const
Definition: Muon.h:225
float trkKink
value of the kink algorithm applied to the inner track stub
Definition: MuonQuality.h:11
bool isLooseMuon(const reco::Muon &)
MuonQuality combinedQuality() const
get energy deposition information
Definition: Muon.h:121
virtual TrackRef globalTrack() const
reference to Track reconstructed in both tracked and muon detector
Definition: Muon.h:54
bool muon::isSoftMuon ( const reco::Muon muon,
const reco::Vertex vtx 
)

Definition at line 871 of file MuonSelectors.cc.

References reco::TrackBase::highPurity, reco::Muon::innerTrack(), isGoodMuon(), LayerTriplets::layers(), reco::Vertex::position(), and TMOneStationTight.

Referenced by DiMuonHistograms::analyze(), MuonKinVsEtaAnalyzer::analyze(), pat::Muon::isGood(), MuonPOGStandardCut::operator()(), reco::operator<<(), MuonMiniAOD::PassesCut_A(), MuonMiniAOD::PassesCut_B(), and MuonPOGStandardCut::value().

871  {
872 
873  bool muID = muon::isGoodMuon(muon, TMOneStationTight);
874 
875  if(!muID) return false;
876 
877  bool layers = muon.innerTrack()->hitPattern().trackerLayersWithMeasurement() > 5 &&
878  muon.innerTrack()->hitPattern().pixelLayersWithMeasurement() > 0;
879 
880  bool ishighq = muon.innerTrack()->quality(reco::Track::highPurity);
881 
882  bool ip = fabs(muon.innerTrack()->dxy(vtx.position())) < 0.3 && fabs(muon.innerTrack()->dz(vtx.position())) < 20.;
883 
884  return layers && ip && ishighq;
885 }
std::vector< LayerSetAndLayers > layers(const SeedingLayerSetsHits &sets)
Definition: LayerTriplets.cc:4
virtual TrackRef innerTrack() const
Definition: Muon.h:48
const Point & position() const
position
Definition: Vertex.h:109
bool isGoodMuon(const reco::Muon &muon, SelectionType type, reco::Muon::ArbitrationType arbitrationType=reco::Muon::SegmentAndTrackArbitration)
main GoodMuon wrapper call
bool muon::isTightMuon ( const reco::Muon muon,
const reco::Vertex vtx 
)

Definition at line 837 of file MuonSelectors.cc.

References GlobalMuonPromptTight, hfClusterShapes_cfi::hits, reco::Muon::innerTrack(), reco::Muon::isGlobalMuon(), isGoodMuon(), reco::Muon::isPFMuon(), reco::Muon::muonBestTrack(), reco::Muon::numberOfMatchedStations(), and reco::Vertex::position().

Referenced by DiMuonHistograms::analyze(), RecoMuonValidator::analyze(), MuonKinVsEtaAnalyzer::analyze(), EfficiencyAnalyzer::analyze(), MuonPFAnalyzer::analyze(), MuonRecoOneHLT::analyze(), L1TMuonDQMOffline::getTightMuons(), pat::Muon::isGood(), MuonPOGStandardCut::operator()(), reco::operator<<(), MuonMiniAOD::PassesCut_A(), MuonMiniAOD::PassesCut_B(), ZCounting::passMuonID(), and MuonPOGStandardCut::value().

837  {
838 
839  if(!muon.isPFMuon() || !muon.isGlobalMuon() ) return false;
840 
841  bool muID = isGoodMuon(muon,GlobalMuonPromptTight) && (muon.numberOfMatchedStations() > 1);
842 
843 
844  bool hits = muon.innerTrack()->hitPattern().trackerLayersWithMeasurement() > 5 &&
845  muon.innerTrack()->hitPattern().numberOfValidPixelHits() > 0;
846 
847 
848  bool ip = fabs(muon.muonBestTrack()->dxy(vtx.position())) < 0.2 && fabs(muon.muonBestTrack()->dz(vtx.position())) < 0.5;
849 
850  return muID && hits && ip;
851 }
virtual TrackRef innerTrack() const
Definition: Muon.h:48
bool isGlobalMuon() const
Definition: Muon.h:225
const Point & position() const
position
Definition: Vertex.h:109
virtual TrackRef muonBestTrack() const
Definition: Muon.h:63
bool isGoodMuon(const reco::Muon &muon, SelectionType type, reco::Muon::ArbitrationType arbitrationType=reco::Muon::SegmentAndTrackArbitration)
main GoodMuon wrapper call
int numberOfMatchedStations(ArbitrationType type=SegmentAndTrackArbitration) const
bool isPFMuon() const
Definition: Muon.h:229
bool muon::overlap ( const reco::Muon muon1,
const reco::Muon muon2,
double  pullX = 1.0,
double  pullY = 1.0,
bool  checkAdjacentChambers = false 
)

Definition at line 768 of file MuonSelectors.cc.

References funct::abs(), CSCDetId::chamber(), MuonSubdetId::CSC, CSCDetId::endcap(), reco::Muon::matches(), reco::Muon::numberOfMatches(), reco::LeafCandidate::pt(), CSCDetId::ring(), reco::Muon::SegmentAndTrackArbitration, mathSSE::sqrt(), and CSCDetId::station().

Referenced by TECLayer::addClosest(), MuonTiming::analyze(), TOBRod::computeWindowSize(), Phase2OTBarrelRod::computeWindowSize(), CSCCFEBData::digis(), HcalQIEShape::expand(), HLTOfflineDQMTopDiLepton::MonitorDiLepton::fill(), TopDiLeptonOffline::MonitorEnsemble::fill(), reco::GenParticle::isLastCopyBeforeFSR(), main(), IsolationProducerForTracks::produce(), MatchedProbeMaker< T >::produce(), HLTJetsCleanedFromLeadingLeptons< JetType >::produce(), TECLayer::searchNeighbors(), TOBRod::searchNeighbors(), TBPLayer::searchNeighbors(), Phase2OTBarrelRod::searchNeighbors(), CompositeTECPetal::searchNeighbors(), CSCEventData::selfTest(), and edm::EventSelector::testSelectionOverlap().

770 {
771  unsigned int nMatches1 = muon1.numberOfMatches(reco::Muon::SegmentAndTrackArbitration);
772  unsigned int nMatches2 = muon2.numberOfMatches(reco::Muon::SegmentAndTrackArbitration);
773  unsigned int betterMuon = ( muon1.pt() > muon2.pt() ? 1 : 2 );
774  for ( std::vector<reco::MuonChamberMatch>::const_iterator chamber1 = muon1.matches().begin();
775  chamber1 != muon1.matches().end(); ++chamber1 )
776  for ( std::vector<reco::MuonChamberMatch>::const_iterator chamber2 = muon2.matches().begin();
777  chamber2 != muon2.matches().end(); ++chamber2 )
778  {
779 
780  // if ( (chamber1->segmentMatches.empty() || chamber2->segmentMatches.empty()) ) continue;
781 
782  // handle case where both muons have information about the same chamber
783  // here we know how close they are
784  if ( chamber1->id == chamber2->id ){
785  // found the same chamber
786  if ( fabs(chamber1->x-chamber2->x) <
787  pullX * sqrt(chamber1->xErr*chamber1->xErr+chamber2->xErr*chamber2->xErr) )
788  {
789  if ( betterMuon == 1 )
790  nMatches2--;
791  else
792  nMatches1--;
793  if ( nMatches1==0 || nMatches2==0 ) return true;
794  continue;
795  }
796  if ( fabs(chamber1->y-chamber2->y) <
797  pullY * sqrt(chamber1->yErr*chamber1->yErr+chamber2->yErr*chamber2->yErr) )
798  {
799  if ( betterMuon == 1 )
800  nMatches2--;
801  else
802  nMatches1--;
803  if ( nMatches1==0 || nMatches2==0 ) return true;
804  }
805  } else {
806  if ( ! checkAdjacentChambers ) continue;
807  // check if tracks are pointing into overlaping region of the CSC detector
808  if ( chamber1->id.subdetId() != MuonSubdetId::CSC ||
809  chamber2->id.subdetId() != MuonSubdetId::CSC ) continue;
810  CSCDetId id1(chamber1->id);
811  CSCDetId id2(chamber2->id);
812  if ( id1.endcap() != id2.endcap() ) continue;
813  if ( id1.station() != id2.station() ) continue;
814  if ( id1.ring() != id2.ring() ) continue;
815  if ( abs(id1.chamber() - id2.chamber())>1 ) continue;
816  // FIXME: we don't handle 18->1; 36->1 transitions since
817  // I don't know how to check for sure how many chambers
818  // are there. Probably need to hard code some checks.
819 
820  // Now we have to make sure that both tracks are close to an edge
821  // FIXME: ignored Y coordinate for now
822  if ( fabs(chamber1->edgeX) > chamber1->xErr*pullX ) continue;
823  if ( fabs(chamber2->edgeX) > chamber2->xErr*pullX ) continue;
824  if ( chamber1->x * chamber2->x < 0 ) { // check if the same edge
825  if ( betterMuon == 1 )
826  nMatches2--;
827  else
828  nMatches1--;
829  if ( nMatches1==0 || nMatches2==0 ) return true;
830  }
831  }
832  }
833  return false;
834 }
virtual double pt() const final
transverse momentum
static const int CSC
Definition: MuonSubdetId.h:13
T sqrt(T t)
Definition: SSEVec.h:18
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
std::vector< MuonChamberMatch > & matches()
get muon matching information
Definition: Muon.h:144
int numberOfMatches(ArbitrationType type=SegmentAndTrackArbitration) const
get number of chambers with matched segments
unsigned int muon::RequiredStationMask ( const reco::Muon muon,
double  maxChamberDist,
double  maxChamberDistPull,
reco::Muon::ArbitrationType  arbitrationType 
)

Definition at line 58 of file MuonSelectors.cc.

References reco::Muon::trackDist(), and reco::Muon::trackDistErr().

Referenced by isGoodMuon().

62 {
63  unsigned int theMask = 0;
64 
65  for(int stationIdx = 1; stationIdx < 5; ++stationIdx)
66  for(int detectorIdx = 1; detectorIdx < 3; ++detectorIdx)
67  if(muon.trackDist(stationIdx,detectorIdx,arbitrationType) < maxChamberDist &&
68  muon.trackDist(stationIdx,detectorIdx,arbitrationType)/muon.trackDistErr(stationIdx,detectorIdx,arbitrationType) < maxChamberDistPull)
69  theMask += 1<<((stationIdx-1)+4*(detectorIdx-1));
70 
71  return theMask;
72 }
float trackDistErr(int station, int muonSubdetId, ArbitrationType type=SegmentAndTrackArbitration) const
float trackDist(int station, int muonSubdetId, ArbitrationType type=SegmentAndTrackArbitration) const
float muon::segmentCompatibility ( const reco::Muon muon,
reco::Muon::ArbitrationType  arbitrationType = reco::Muon::SegmentAndTrackArbitration 
)

Definition at line 80 of file MuonSelectors.cc.

References reco::Muon::dX(), reco::Muon::dY(), mps_fire::i, Max(), reco::Muon::pullX(), reco::Muon::pullY(), reco::Muon::segmentX(), and reco::Muon::trackDist().

Referenced by ExampleMuonAnalyzer::analyze(), HiggsDQM::analyze(), MuonIdVal::analyze(), MuonCosmicCompatibilityFiller::checkMuonSegments(), PFRecoTauDiscriminationAgainstMuon::discriminate(), BadParticleFilter::filter(), isGoodMuon(), isMediumMuon(), isMediumMuonCustom(), pat::MuonSelector::muIdSelection_(), MuonSegmentCompatibilityCut::operator()(), reco::operator<<(), and MuonSegmentCompatibilityCut::value().

80  {
81  bool use_weight_regain_at_chamber_boundary = true;
82  bool use_match_dist_penalty = true;
83 
84  int nr_of_stations_crossed = 0;
85  int nr_of_stations_with_segment = 0;
86  std::vector<int> stations_w_track(8);
87  std::vector<int> station_has_segmentmatch(8);
88  std::vector<int> station_was_crossed(8);
89  std::vector<float> stations_w_track_at_boundary(8);
90  std::vector<float> station_weight(8);
91  int position_in_stations = 0;
92  float full_weight = 0.;
93 
94  for(int i = 1; i<=8; ++i) {
95  // ********************************************************;
96  // *** fill local info for this muon (do some counting) ***;
97  // ************** begin ***********************************;
98  if(i<=4) { // this is the section for the DTs
99  if( muon.trackDist(i,1,arbitrationType) < 999999 ) { //current "raw" info that a track is close to a chamber
100  ++nr_of_stations_crossed;
101  station_was_crossed[i-1] = 1;
102  if(muon.trackDist(i,1,arbitrationType) > -10. ) stations_w_track_at_boundary[i-1] = muon.trackDist(i,1,arbitrationType);
103  else stations_w_track_at_boundary[i-1] = 0.;
104  }
105  if( muon.segmentX(i,1,arbitrationType) < 999999 ) { //current "raw" info that a segment is matched to the current track
106  ++nr_of_stations_with_segment;
107  station_has_segmentmatch[i-1] = 1;
108  }
109  }
110  else { // this is the section for the CSCs
111  if( muon.trackDist(i-4,2,arbitrationType) < 999999 ) { //current "raw" info that a track is close to a chamber
112  ++nr_of_stations_crossed;
113  station_was_crossed[i-1] = 1;
114  if(muon.trackDist(i-4,2,arbitrationType) > -10. ) stations_w_track_at_boundary[i-1] = muon.trackDist(i-4,2,arbitrationType);
115  else stations_w_track_at_boundary[i-1] = 0.;
116  }
117  if( muon.segmentX(i-4,2,arbitrationType) < 999999 ) { //current "raw" info that a segment is matched to the current track
118  ++nr_of_stations_with_segment;
119  station_has_segmentmatch[i-1] = 1;
120  }
121  }
122  // rough estimation of chamber border efficiency (should be parametrized better, this is just a quick guess):
123  // TF1 * merf = new TF1("merf","-0.5*(TMath::Erf(x/6.)-1)",-100,100);
124  // use above value to "unpunish" missing segment if close to border, i.e. rather than not adding any weight, add
125  // the one from the function. Only for dist ~> -10 cm, else full punish!.
126 
127  // ********************************************************;
128  // *** fill local info for this muon (do some counting) ***;
129  // ************** end *************************************;
130  }
131 
132  // ********************************************************;
133  // *** calculate weights for each station *****************;
134  // ************** begin ***********************************;
135  // const float slope = 0.5;
136  // const float attenuate_weight_regain = 1.;
137  // if attenuate_weight_regain < 1., additional punishment if track is close to boundary and no segment
138  const float attenuate_weight_regain = 0.5;
139 
140  for(int i = 1; i<=8; ++i) { // loop over all possible stations
141 
142  // first set all weights if a station has been crossed
143  // later penalize if a station did not have a matching segment
144 
145  //old logic if(station_has_segmentmatch[i-1] > 0 ) { // the track has an associated segment at the current station
146  if( station_was_crossed[i-1] > 0 ) { // the track crossed this chamber (or was nearby)
147  // - Apply a weight depending on the "depth" of the muon passage.
148  // - The station_weight is later reduced for stations with badly matched segments.
149  // - Even if there is no segment but the track passes close to a chamber boundary, the
150  // weight is set non zero and can go up to 0.5 of the full weight if the track is quite
151  // far from any station.
152  ++position_in_stations;
153 
154  switch ( nr_of_stations_crossed ) { // define different weights depending on how many stations were crossed
155  case 1 :
156  station_weight[i-1] = 1.;
157  break;
158  case 2 :
159  if ( position_in_stations == 1 ) station_weight[i-1] = 0.33;
160  else station_weight[i-1] = 0.67;
161  break;
162  case 3 :
163  if ( position_in_stations == 1 ) station_weight[i-1] = 0.23;
164  else if( position_in_stations == 2 ) station_weight[i-1] = 0.33;
165  else station_weight[i-1] = 0.44;
166  break;
167  case 4 :
168  if ( position_in_stations == 1 ) station_weight[i-1] = 0.10;
169  else if( position_in_stations == 2 ) station_weight[i-1] = 0.20;
170  else if( position_in_stations == 3 ) station_weight[i-1] = 0.30;
171  else station_weight[i-1] = 0.40;
172  break;
173 
174  default :
175 // LogTrace("MuonIdentification")<<" // Message: A muon candidate track has more than 4 stations with matching segments.";
176 // LogTrace("MuonIdentification")<<" // Did not expect this - please let me know: ibloch@fnal.gov";
177  // for all other cases
178  station_weight[i-1] = 1./nr_of_stations_crossed;
179  }
180 
181  if( use_weight_regain_at_chamber_boundary ) { // reconstitute some weight if there is no match but the segment is close to a boundary:
182  if(station_has_segmentmatch[i-1] <= 0 && stations_w_track_at_boundary[i-1] != 0. ) {
183  // if segment is not present but track in inefficient region, do not count as "missing match" but add some reduced weight.
184  // original "match weight" is currently reduced by at least attenuate_weight_regain, variing with an error function down to 0 if the track is
185  // inside the chamber.
186  station_weight[i-1] = station_weight[i-1]*attenuate_weight_regain*0.5*(TMath::Erf(stations_w_track_at_boundary[i-1]/6.)+1.); // remark: the additional scale of 0.5 normalizes Err to run from 0 to 1 in y
187  }
188  else if(station_has_segmentmatch[i-1] <= 0 && stations_w_track_at_boundary[i-1] == 0.) { // no segment match and track well inside chamber
189  // full penalization
190  station_weight[i-1] = 0.;
191  }
192  }
193  else { // always fully penalize tracks with no matching segment, whether the segment is close to the boundary or not.
194  if(station_has_segmentmatch[i-1] <= 0) station_weight[i-1] = 0.;
195  }
196 
197  if( station_has_segmentmatch[i-1] > 0 && 42 == 42 ) { // if track has matching segment, but the matching is not high quality, penalize
198  if(i<=4) { // we are in the DTs
199  if( muon.dY(i,1,arbitrationType) < 999999 && muon.dX(i,1,arbitrationType) < 999999) { // have both X and Y match
200  if(
201  TMath::Sqrt(TMath::Power(muon.pullX(i,1,arbitrationType),2.)+TMath::Power(muon.pullY(i,1,arbitrationType),2.))> 1. ) {
202  // reduce weight
203  if(use_match_dist_penalty) {
204  // only use pull if 3 sigma is not smaller than 3 cm
205  if(TMath::Sqrt(TMath::Power(muon.dX(i,1,arbitrationType),2.)+TMath::Power(muon.dY(i,1,arbitrationType),2.)) < 3. && TMath::Sqrt(TMath::Power(muon.pullX(i,1,arbitrationType),2.)+TMath::Power(muon.pullY(i,1,arbitrationType),2.)) > 3. ) {
206  station_weight[i-1] *= 1./TMath::Power(
207  TMath::Max((double)TMath::Sqrt(TMath::Power(muon.dX(i,1,arbitrationType),2.)+TMath::Power(muon.dY(i,1,arbitrationType),2.)),(double)1.),.25);
208  }
209  else {
210  station_weight[i-1] *= 1./TMath::Power(
211  TMath::Sqrt(TMath::Power(muon.pullX(i,1,arbitrationType),2.)+TMath::Power(muon.pullY(i,1,arbitrationType),2.)),.25);
212  }
213  }
214  }
215  }
216  else if (muon.dY(i,1,arbitrationType) >= 999999) { // has no match in Y
217  if( muon.pullX(i,1,arbitrationType) > 1. ) { // has a match in X. Pull larger that 1 to avoid increasing the weight (just penalize, don't anti-penalize)
218  // reduce weight
219  if(use_match_dist_penalty) {
220  // only use pull if 3 sigma is not smaller than 3 cm
221  if( muon.dX(i,1,arbitrationType) < 3. && muon.pullX(i,1,arbitrationType) > 3. ) {
222  station_weight[i-1] *= 1./TMath::Power(TMath::Max((double)muon.dX(i,1,arbitrationType),(double)1.),.25);
223  }
224  else {
225  station_weight[i-1] *= 1./TMath::Power(muon.pullX(i,1,arbitrationType),.25);
226  }
227  }
228  }
229  }
230  else { // has no match in X
231  if( muon.pullY(i,1,arbitrationType) > 1. ) { // has a match in Y. Pull larger that 1 to avoid increasing the weight (just penalize, don't anti-penalize)
232  // reduce weight
233  if(use_match_dist_penalty) {
234  // only use pull if 3 sigma is not smaller than 3 cm
235  if( muon.dY(i,1,arbitrationType) < 3. && muon.pullY(i,1,arbitrationType) > 3. ) {
236  station_weight[i-1] *= 1./TMath::Power(TMath::Max((double)muon.dY(i,1,arbitrationType),(double)1.),.25);
237  }
238  else {
239  station_weight[i-1] *= 1./TMath::Power(muon.pullY(i,1,arbitrationType),.25);
240  }
241  }
242  }
243  }
244  }
245  else { // We are in the CSCs
246  if(
247  TMath::Sqrt(TMath::Power(muon.pullX(i-4,2,arbitrationType),2.)+TMath::Power(muon.pullY(i-4,2,arbitrationType),2.)) > 1. ) {
248  // reduce weight
249  if(use_match_dist_penalty) {
250  // only use pull if 3 sigma is not smaller than 3 cm
251  if(TMath::Sqrt(TMath::Power(muon.dX(i-4,2,arbitrationType),2.)+TMath::Power(muon.dY(i-4,2,arbitrationType),2.)) < 3. && TMath::Sqrt(TMath::Power(muon.pullX(i-4,2,arbitrationType),2.)+TMath::Power(muon.pullY(i-4,2,arbitrationType),2.)) > 3. ) {
252  station_weight[i-1] *= 1./TMath::Power(
253  TMath::Max((double)TMath::Sqrt(TMath::Power(muon.dX(i-4,2,arbitrationType),2.)+TMath::Power(muon.dY(i-4,2,arbitrationType),2.)),(double)1.),.25);
254  }
255  else {
256  station_weight[i-1] *= 1./TMath::Power(
257  TMath::Sqrt(TMath::Power(muon.pullX(i-4,2,arbitrationType),2.)+TMath::Power(muon.pullY(i-4,2,arbitrationType),2.)),.25);
258  }
259  }
260  }
261  }
262  }
263 
264  // Thoughts:
265  // - should penalize if the segment has only x OR y info
266  // - should also use the segment direction, as it now works!
267 
268  }
269  else { // track did not pass a chamber in this station - just reset weight
270  station_weight[i-1] = 0.;
271  }
272 
273  //increment final weight for muon:
274  full_weight += station_weight[i-1];
275  }
276 
277  // if we don't expect any matches, we set the compatibility to
278  // 0.5 as the track is as compatible with a muon as it is with
279  // background - we should maybe rather set it to -0.5!
280  if( nr_of_stations_crossed == 0 ) {
281  // full_weight = attenuate_weight_regain*0.5;
282  full_weight = 0.5;
283  }
284 
285  // ********************************************************;
286  // *** calculate weights for each station *****************;
287  // ************** end *************************************;
288 
289  return full_weight;
290 
291 }
float segmentX(int station, int muonSubdetId, ArbitrationType type=SegmentAndTrackArbitration) const
float dY(int station, int muonSubdetId, ArbitrationType type=SegmentAndTrackArbitration) const
float dX(int station, int muonSubdetId, ArbitrationType type=SegmentAndTrackArbitration) const
float pullY(int station, int muonSubdetId, ArbitrationType type=SegmentAndTrackArbitration, bool includeSegmentError=true) const
T Max(T a, T b)
Definition: MathUtil.h:44
float trackDist(int station, int muonSubdetId, ArbitrationType type=SegmentAndTrackArbitration) const
float pullX(int station, int muonSubdetId, ArbitrationType type=SegmentAndTrackArbitration, bool includeSegmentError=true) const
SelectionType muon::selectionTypeFromString ( const std::string &  label)

Definition at line 9 of file MuonSelectors.cc.

References All, AllArbitrated, AllGEMMuons, AllGlobalMuons, AllME0Muons, AllStandAloneMuons, AllTrackerMuons, Exception, runEdmFileComparison::found, GEMMuonArbitrated, GlobalMuonPromptTight, GMStaChiCompatibility, GMTkChiCompatibility, GMTkKinkTight, mps_fire::i, muon::SelectionTypeStringToEnum::label, ME0MuonArbitrated, RPCMuLoose, TM2DCompatibilityLoose, TM2DCompatibilityTight, TMLastStationAngLoose, TMLastStationAngTight, TMLastStationLoose, TMLastStationOptimizedBarrelLowPtLoose, TMLastStationOptimizedBarrelLowPtTight, TMLastStationOptimizedLowPtLoose, TMLastStationOptimizedLowPtTight, TMLastStationTight, TMOneStationAngLoose, TMOneStationAngTight, TMOneStationLoose, TMOneStationTight, TrackerMuonArbitrated, relativeConstraints::value, and muon::SelectionTypeStringToEnum::value.

Referenced by MuonSelectionTypeValueMapProducer::MuonSelectionTypeValueMapProducer(), reco::operator<<(), and MuonTrackProducer::produce().

10 {
11  static const SelectionTypeStringToEnum selectionTypeStringToEnumMap[] = {
12  { "All", All },
13  { "AllGlobalMuons", AllGlobalMuons },
14  { "AllStandAloneMuons", AllStandAloneMuons },
15  { "AllTrackerMuons", AllTrackerMuons },
16  { "TrackerMuonArbitrated", TrackerMuonArbitrated },
17  { "AllArbitrated", AllArbitrated },
18  { "GlobalMuonPromptTight", GlobalMuonPromptTight },
19  { "TMLastStationLoose", TMLastStationLoose },
20  { "TMLastStationTight", TMLastStationTight },
21  { "TM2DCompatibilityLoose", TM2DCompatibilityLoose },
22  { "TM2DCompatibilityTight", TM2DCompatibilityTight },
23  { "TMOneStationLoose", TMOneStationLoose },
24  { "TMOneStationTight", TMOneStationTight },
25  { "TMLastStationOptimizedLowPtLoose", TMLastStationOptimizedLowPtLoose },
26  { "TMLastStationOptimizedLowPtTight", TMLastStationOptimizedLowPtTight },
27  { "GMTkChiCompatibility", GMTkChiCompatibility },
28  { "GMStaChiCompatibility", GMStaChiCompatibility},
29  { "GMTkKinkTight", GMTkKinkTight},
30  { "TMLastStationAngLoose", TMLastStationAngLoose },
31  { "TMLastStationAngTight", TMLastStationAngTight },
32  { "TMOneStationAngLoose", TMOneStationAngLoose },
33  { "TMOneStationAngTight", TMOneStationAngTight },
34  { "TMLastStationOptimizedBarrelLowPtLoose", TMLastStationOptimizedBarrelLowPtLoose },
35  { "TMLastStationOptimizedBarrelLowPtTight", TMLastStationOptimizedBarrelLowPtTight },
36  { "RPCMuLoose", RPCMuLoose },
37  { "AllME0Muons", AllME0Muons },
38  { "ME0MuonArbitrated", ME0MuonArbitrated },
39  { "AllGEMMuons", AllGEMMuons },
40  { "GEMMuonArbitrated", GEMMuonArbitrated },
41  { 0, (SelectionType)-1 }
42  };
43 
45  bool found = false;
46  for(int i = 0; selectionTypeStringToEnumMap[i].label && (! found); ++i)
47  if (! strcmp(label.c_str(), selectionTypeStringToEnumMap[i].label)) {
48  found = true;
49  value = selectionTypeStringToEnumMap[i].value;
50  }
51 
52  // in case of unrecognized selection type
53  if (! found) throw cms::Exception("MuonSelectorError") << label << " is not a recognized SelectionType";
54  return value;
55 }
SelectionType
Selector type.
Definition: MuonSelectors.h:17
Definition: value.py:1
int muon::sharedSegments ( const reco::Muon muon1,
const reco::Muon muon2,
unsigned int  segmentArbitrationMask = reco::MuonSegmentMatch::BestInChamberByDR 
)

Determine the number of shared segments between two muons. Comparison is done using the segment references in the reco::Muon object.

Definition at line 904 of file MuonSelectors.cc.

References reco::Muon::matches().

Referenced by heppy::CMGMuonCleanerBySegmentsAlgo::clean(), BadGlobalMuonTagger::filter(), and modules::MuonCleanerBySegmentsT< T >::produce().

904  {
905  int ret = 0;
906 
907  // Will do with a stupid double loop, since creating and filling a map is probably _more_ inefficient for a single lookup.
908  for(std::vector<reco::MuonChamberMatch>::const_iterator chamberMatch = mu.matches().begin();
909  chamberMatch != mu.matches().end(); ++chamberMatch) {
910  if (chamberMatch->segmentMatches.empty()) continue;
911  for(std::vector<reco::MuonChamberMatch>::const_iterator chamberMatch2 = mu2.matches().begin();
912  chamberMatch2 != mu2.matches().end(); ++chamberMatch2) {
913  if (chamberMatch2->segmentMatches.empty()) continue;
914  if (chamberMatch2->id() != chamberMatch->id()) continue;
915  for(std::vector<reco::MuonSegmentMatch>::const_iterator segmentMatch = chamberMatch->segmentMatches.begin();
916  segmentMatch != chamberMatch->segmentMatches.end(); ++segmentMatch) {
917  if (!segmentMatch->isMask(segmentArbitrationMask)) continue;
918  for(std::vector<reco::MuonSegmentMatch>::const_iterator segmentMatch2 = chamberMatch2->segmentMatches.begin();
919  segmentMatch2 != chamberMatch2->segmentMatches.end(); ++segmentMatch2) {
920  if (!segmentMatch2->isMask(segmentArbitrationMask)) continue;
921  if ((segmentMatch->cscSegmentRef.isNonnull() && segmentMatch->cscSegmentRef == segmentMatch2->cscSegmentRef) ||
922  (segmentMatch-> dtSegmentRef.isNonnull() && segmentMatch-> dtSegmentRef == segmentMatch2-> dtSegmentRef) ) {
923  ++ret;
924  } // is the same
925  } // segment of mu2 in chamber
926  } // segment of mu1 in chamber
927  } // chamber of mu2
928  } // chamber of mu1
929 
930  return ret;
931 }
const int mu
Definition: Constants.h:22
reco::Muon::MuonTrackTypePair muon::sigmaSwitch ( const reco::TrackRef combinedTrack,
const reco::TrackRef trackerTrack,
const double  nSigma = 2.,
const double  ptThreshold = 200. 
)

Definition at line 131 of file MuonCocktails.cc.

References reco::Muon::CombinedTrack, delta, reco::Muon::InnerTrack, refitMuons_cfi::ptThreshold, and electronIdCutBased_cfi::threshold.

Referenced by MuonIdProducer::makeMuon(), sigmaSwitch(), and tevOptimized().

134  {
135  // If either the global or tracker-only fits have pT below threshold
136  // (default 200 GeV), return the tracker-only fit.
137  if (combinedTrack->pt() < ptThreshold || trackerTrack->pt() < ptThreshold)
138  return make_pair(trackerTrack,reco::Muon::InnerTrack);
139 
140  // If both are above the pT threshold, compare the difference in
141  // q/p: if less than two sigma of the tracker-only track, switch to
142  // global. Otherwise, use tracker-only.
143  const double delta = fabs(trackerTrack->qoverp() - combinedTrack->qoverp());
144  const double threshold = nSigma * trackerTrack->qoverpError();
145  return delta > threshold ? make_pair(trackerTrack,reco::Muon::InnerTrack) : make_pair(combinedTrack,reco::Muon::CombinedTrack);
146 }
dbl * delta
Definition: mlp_gen.cc:36
Definition: Muon.py:1
fixed size matrix
reco::Muon::MuonTrackTypePair muon::sigmaSwitch ( const reco::Muon muon,
const double  nSigma = 2.,
const double  ptThreshold = 200. 
)
inline

Definition at line 58 of file MuonCocktails.h.

References reco::Muon::globalTrack(), reco::Muon::innerTrack(), gsfElectronCkfTrackCandidateMaker_cff::nSigma, refitMuons_cfi::ptThreshold, sigmaSwitch(), TMR(), HiIsolationCommonParameters_cff::track, and trackProbability().

60  {
61  return muon::sigmaSwitch(muon.globalTrack(),
62  muon.innerTrack(),
63  nSigma,
64  ptThreshold);
65  }
virtual TrackRef innerTrack() const
Definition: Muon.h:48
reco::Muon::MuonTrackTypePair sigmaSwitch(const reco::TrackRef &combinedTrack, const reco::TrackRef &trackerTrack, const double nSigma=2., const double ptThreshold=200.)
virtual TrackRef globalTrack() const
reference to Track reconstructed in both tracked and muon detector
Definition: Muon.h:54
reco::Muon::MuonTrackTypePair muon::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 
)

Definition at line 9 of file MuonCocktails.cc.

References reco::Muon::CombinedTrack, reco::Muon::DYT, plotBeamSpotDB::first, mps_fire::i, reco::Muon::InnerTrack, reco::Muon::Picky, TtFullHadEvtBuilder_cfi::prob, reco::Muon::TPFMS, and trackProbability().

Referenced by MuonIdProducer::makeMuon(), MuonsFromRefitTracksProducer::produce(), PFMuonAlgo::reconstructMuon(), and tevOptimized().

17  {
18  const unsigned int nAlgo=5;
19 
20  // Array for convenience below.
21  const reco::Muon::MuonTrackTypePair refit[nAlgo] = {
22  make_pair(trackerTrack, reco::Muon::InnerTrack),
23  make_pair(combinedTrack,reco::Muon::CombinedTrack),
24  make_pair(tpfmsTrack, reco::Muon::TPFMS),
25  make_pair(pickyTrack, reco::Muon::Picky),
26  make_pair(dytTrack, reco::Muon::DYT)
27  };
28 
29  // Calculate the log(tail probabilities). If there's a problem,
30  // signify this with prob == 0. The current problems recognized are:
31  // the track being not available, whether the (re)fit failed or it's
32  // just not in the event, or if the (re)fit ended up with no valid
33  // hits.
34  double prob[nAlgo] = {0.,0.,0.,0.,0.};
35  bool valid[nAlgo] = {0,0,0,0,0};
36 
37  double dptmin = 1.;
38 
39  if (dptcut>0) {
40  for (unsigned int i = 0; i < nAlgo; ++i)
41  if (refit[i].first.isNonnull())
42  if (refit[i].first->ptError()/refit[i].first->pt()<dptmin) dptmin = refit[i].first->ptError()/refit[i].first->pt();
43 
44  if (dptmin>dptcut) dptcut = dptmin+0.15;
45  }
46 
47  for (unsigned int i = 0; i < nAlgo; ++i)
48  if (refit[i].first.isNonnull()){
49  valid[i] = true;
50  if (refit[i].first->numberOfValidHits() && (refit[i].first->ptError()/refit[i].first->pt()<dptcut || dptcut<0))
51  prob[i] = muon::trackProbability(refit[i].first);
52  }
53 
54 
55  // Start with picky.
56  int chosen = 3;
57 
58  // If there's a problem with picky, make the default one of the
59  // other tracks. Try TPFMS first, then global, then tracker-only.
60  if (prob[3] == 0.) {
61 
62  // split so that passing dptcut<0 recreates EXACTLY the old tuneP behavior
63  if (dptcut>0) {
64  if (prob[4] > 0.) chosen = 4;
65  else if (prob[0] > 0.) chosen = 0;
66  else if (prob[2] > 0.) chosen = 2;
67  else if (prob[1] > 0.) chosen = 1;
68  } else {
69  if (prob[2] > 0.) chosen = 2;
70  else if (prob[1] > 0.) chosen = 1;
71  else if (prob[0] > 0.) chosen = 0;
72  }
73  }
74 
75  // Now the algorithm: switch from picky to dyt if the difference is lower than a tuned value. Then
76  // switch from picky to tracker-only if the
77  // difference, log(tail prob(picky)) - log(tail prob(tracker-only))
78  // is greater than a tuned value. Then compare the
79  // so-picked track to TPFMS in the same manner using another tuned
80  // value.
81  if (prob[4]>0. && prob[3]>0.) {
82  if(refit[3].first->pt()>0 && refit[4].first->pt()>0 &&
83  (refit[4].first->ptError()/refit[4].first->pt()-refit[3].first->ptError()/refit[3].first->pt())<=0)
84  chosen=4; // dyt
85  }
86 
87  if (prob[0] > 0. && prob[chosen] > 0. && (prob[chosen] - prob[0]) > tune1)
88  chosen = 0;
89  if (prob[2] > 0. && (prob[chosen] - prob[2]) > tune2)
90  chosen = 2;
91 
92  // Sanity checks
93  if (chosen == 4 && !valid[4] ) chosen = 3;
94  if (chosen == 3 && !valid[3] ) chosen = 2;
95  if (chosen == 2 && !valid[2] ) chosen = 1;
96  if (chosen == 1 && !valid[1] ) chosen = 0;
97 
98  // Done. If pT of the chosen track (or pT of the tracker track) is below the threshold value, return the tracker track.
99  if (valid[chosen] && refit[chosen].first->pt() < ptThreshold && prob[0] > 0.) return make_pair(trackerTrack,reco::Muon::InnerTrack);
100  if (trackerTrack->pt() < ptThreshold && prob[0] > 0.) return make_pair(trackerTrack,reco::Muon::InnerTrack);
101 
102  // Return the chosen track (which can be the global track in
103  // very rare cases).
104  return refit[chosen];
105 }
double trackProbability(const reco::TrackRef track)
std::pair< TrackRef, Muon::MuonTrackType > MuonTrackTypePair
Definition: Muon.h:40
reco::Muon::MuonTrackTypePair muon::tevOptimized ( const reco::Muon muon,
const double  ptThreshold = 200.,
const double  tune1 = 17.,
const double  tune2 = 40.,
const double  dptcut = 0.25 
)
inline

Definition at line 31 of file MuonCocktails.h.

References reco::Muon::dytTrack(), getTevRefitTrack(), reco::Muon::globalTrack(), reco::Muon::innerTrack(), genParticles_cff::map, gsfElectronCkfTrackCandidateMaker_cff::nSigma, reco::Muon::pickyTrack(), refitMuons_cfi::ptThreshold, sigmaSwitch(), tevOptimized(), and reco::Muon::tpfmsTrack().

35  {
36  return tevOptimized(muon.globalTrack(),
37  muon.innerTrack(),
38  muon.tpfmsTrack(),
39  muon.pickyTrack(),
40  muon.dytTrack(),
42  tune1,
43  tune2,
44  dptcut);
45  }
virtual TrackRef innerTrack() const
Definition: Muon.h:48
virtual TrackRef tpfmsTrack() const
Definition: Muon.h:57
reco::Muon::MuonTrackTypePair tevOptimized(const reco::Muon &muon, const double ptThreshold=200., const double tune1=17., const double tune2=40., const double dptcut=0.25)
Definition: MuonCocktails.h:31
virtual TrackRef pickyTrack() const
Definition: Muon.h:58
virtual TrackRef dytTrack() const
Definition: Muon.h:59
virtual TrackRef globalTrack() const
reference to Track reconstructed in both tracked and muon detector
Definition: Muon.h:54
reco::Muon::MuonTrackTypePair muon::TMR ( const reco::TrackRef trackerTrack,
const reco::TrackRef fmsTrack,
const double  tune = 4. 
)

Definition at line 151 of file MuonCocktails.cc.

References reco::Muon::InnerTrack, edm::Ref< C, T, F >::isNonnull(), reco::Muon::None, reco::Muon::TPFMS, and trackProbability().

Referenced by sigmaSwitch().

153  {
154  double probTK = 0;
155  double probFMS = 0;
156 
157  if (trackerTrack.isNonnull() && trackerTrack->numberOfValidHits())
158  probTK = muon::trackProbability(trackerTrack);
159  if (fmsTrack.isNonnull() && fmsTrack->numberOfValidHits())
160  probFMS = muon::trackProbability(fmsTrack);
161 
162  bool TKok = probTK > 0;
163  bool FMSok = probFMS > 0;
164 
165  if (TKok && FMSok) {
166  if (probFMS - probTK > tune)
167  return make_pair(trackerTrack,reco::Muon::InnerTrack);
168  else
169  return make_pair(fmsTrack,reco::Muon::TPFMS);
170  }
171  else if (FMSok)
172  return make_pair(fmsTrack,reco::Muon::TPFMS);
173  else if (TKok)
174  return make_pair(trackerTrack,reco::Muon::InnerTrack);
175  else
176  return make_pair(reco::TrackRef(),reco::Muon::None);
177 }
bool isNonnull() const
Checks for non-null.
Definition: Ref.h:252
double trackProbability(const reco::TrackRef track)
double muon::trackProbability ( const reco::TrackRef  track)

Definition at line 110 of file MuonCocktails.cc.

References createfilelist::int, and cmsBatch::log.

Referenced by HistogramProbabilityEstimator::probability(), sigmaSwitch(), tevOptimized(), tevOptimizedTMR(), and TMR().

110  {
111 
112  int nDOF = (int)track->ndof();
113  if ( nDOF > 0 && track->chi2()> 0) {
114  return -log(TMath::Prob(track->chi2(), nDOF));
115  } else {
116  return 0.0;
117  }
118 
119 }