CMS 3D CMS Logo

HLTDiMuonGlbTrkFilter.cc
Go to the documentation of this file.
2 
5 
7 
12 #include "HLTDiMuonGlbTrkFilter.h"
16 
25 
27 
29  m_muonsTag = iConfig.getParameter<edm::InputTag>("inputMuonCollection");
30  m_muonsToken = consumes<reco::MuonCollection>(m_muonsTag);
31  m_candsTag = iConfig.getParameter<edm::InputTag>("inputCandCollection");
32  m_candsToken = consumes<reco::RecoChargedCandidateCollection>(m_candsTag);
33  m_minTrkHits = iConfig.getParameter<int>("minTrkHits");
34  m_minMuonHits = iConfig.getParameter<int>("minMuonHits");
35  m_maxNormalizedChi2 = iConfig.getParameter<double>("maxNormalizedChi2");
36  m_minDR = iConfig.getParameter<double>("minDR");
37  m_allowedTypeMask = iConfig.getParameter<unsigned int>("allowedTypeMask");
38  m_requiredTypeMask = iConfig.getParameter<unsigned int>("requiredTypeMask");
39  m_trkMuonId = muon::SelectionType(iConfig.getParameter<unsigned int>("trkMuonId"));
40  m_minPtMuon1 = iConfig.getParameter<double>("minPtMuon1");
41  m_minPtMuon2 = iConfig.getParameter<double>("minPtMuon2");
42  m_maxEtaMuon = iConfig.getParameter<double>("maxEtaMuon");
43  m_maxYDimuon = iConfig.getParameter<double>("maxYDimuon");
44  m_minMass = iConfig.getParameter<double>("minMass");
45  m_maxMass = iConfig.getParameter<double>("maxMass");
46  m_chargeOpt = iConfig.getParameter<int> ("ChargeOpt");
47  m_maxDCAMuMu = iConfig.getParameter<double>("maxDCAMuMu");
48  m_maxdEtaMuMu = iConfig.getParameter<double>("maxdEtaMuMu");
49 }
50 
51 void
55  desc.add<edm::InputTag>("inputMuonCollection",edm::InputTag(""));
56  desc.add<edm::InputTag>("inputCandCollection",edm::InputTag(""));
57  desc.add<int>("minTrkHits",-1);
58  desc.add<int>("minMuonHits",-1);
59  desc.add<double>("maxNormalizedChi2",1e99);
60  desc.add<double>("minDR",0.1);
61  desc.add<unsigned int>("allowedTypeMask",255);
62  desc.add<unsigned int>("requiredTypeMask",0);
63  desc.add<unsigned int>("trkMuonId",0);
64  desc.add<double>("minPtMuon1",17);
65  desc.add<double>("minPtMuon2",8);
66  desc.add<double>("maxEtaMuon",1e99);
67  desc.add<double>("maxYDimuon",1e99);
68  desc.add<double>("minMass",1);
69  desc.add<double>("maxMass",1e99);
70  desc.add<int>("ChargeOpt",0);
71  desc.add<double>("maxDCAMuMu",1e99);
72  desc.add<double>("maxdEtaMuMu",1e99);
73  descriptions.add("hltDiMuonGlbTrkFilter",desc);
74 }
75 
76 bool
78 {
80  iEvent.getByToken(m_muonsToken,muons);
82  iEvent.getByToken(m_candsToken,cands);
83  if ( saveTags() ) filterproduct.addCollectionTag(m_candsTag);
84  if ( cands->size() != muons->size() )
85  throw edm::Exception(edm::errors::Configuration) << "Both input collection must be aligned and represent same physical muon objects";
86  std::vector<unsigned int> filteredMuons;
87  for ( unsigned int i=0; i<muons->size(); ++i ){
88  const reco::Muon& muon(muons->at(i));
89  if ( (muon.type() & m_allowedTypeMask) == 0 ) continue;
90  if ( (muon.type() & m_requiredTypeMask) != m_requiredTypeMask ) continue;
91  if ( !muon.innerTrack().isNull() ){
92  if (muon.innerTrack()->numberOfValidHits()<m_minTrkHits) continue;
93  }
94  if ( !muon.globalTrack().isNull() ){
95  if (muon.globalTrack()->normalizedChi2()>m_maxNormalizedChi2) continue;
96  if (muon.globalTrack()->hitPattern().numberOfValidMuonHits()<m_minMuonHits) continue;
97  }
98  if ( muon.isTrackerMuon() && !muon::isGoodMuon(muon,m_trkMuonId) ) continue;
99  if ( muon.pt() < std::min(m_minPtMuon1,m_minPtMuon2) ) continue;
100  if ( std::abs(muon.eta()) > m_maxEtaMuon ) continue;
101  filteredMuons.push_back(i);
102  }
103 
104  unsigned int npassed(0);
105  std::set<unsigned int> mus;
106  if ( filteredMuons.size()>1 ){
107  // Needed for DCA calculation
108  edm::ESHandle<MagneticField> bFieldHandle;
109  if (m_maxDCAMuMu < 100.) iSetup.get<IdealMagneticFieldRecord>().get(bFieldHandle);
110  for ( unsigned int i=0; i < filteredMuons.size()-1; ++i )
111  for ( unsigned int j=i+1; j < filteredMuons.size(); ++j ){
112  const reco::Muon& mu1(muons->at(filteredMuons.at(i)));
113  const reco::Muon& mu2(muons->at(filteredMuons.at(j)));
114  if ( std::max( mu1.pt(), mu2.pt()) > std::max(m_minPtMuon1,m_minPtMuon2) &&
115  std::abs(mu2.eta() - mu1.eta()) < m_maxdEtaMuMu &&
116  deltaR(mu1,mu2)>m_minDR && (mu1.p4() + mu2.p4()).mass() > m_minMass &&
117  (mu1.p4() + mu2.p4()).mass() < m_maxMass && std::abs((mu1.p4() + mu2.p4()).Rapidity()) < m_maxYDimuon ) {
118  if (m_chargeOpt<0) {
119  if (mu1.charge()*mu2.charge()>0) continue;
120  }
121  else if (m_chargeOpt>0) {
122  if (mu1.charge()*mu2.charge()<0) continue;
123  }
124  if (m_maxDCAMuMu < 100.) {
125  reco::TrackRef tk1 = mu1.get<reco::TrackRef>();
126  reco::TrackRef tk2 = mu2.get<reco::TrackRef>();
127  reco::TransientTrack mu1TT(*tk1, &(*bFieldHandle));
128  reco::TransientTrack mu2TT(*tk2, &(*bFieldHandle));
129  TrajectoryStateClosestToPoint mu1TS = mu1TT.impactPointTSCP();
131  if (mu1TS.isValid() && mu2TS.isValid()) {
133  cApp.calculate(mu1TS.theState(), mu2TS.theState());
134  if (!cApp.status() || cApp.distance() > m_maxDCAMuMu) continue;
135  }
136  }
137  mus.insert(filteredMuons.at(i));
138  mus.insert(filteredMuons.at(j));
139  npassed++;
140  }
141  }
142  }
143 
144  for (unsigned int mu : mus)
146 
147  return npassed>0;
148 }
149 
150 // declare this class as a framework plugin
T getParameter(std::string const &) const
edm::EDGetTokenT< reco::RecoChargedCandidateCollection > m_candsToken
float distance() const override
double eta() const final
momentum pseudorapidity
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:517
TrajectoryStateClosestToPoint impactPointTSCP() const
const FreeTrajectoryState & theState() const
double pt() const final
transverse momentum
int charge() const final
electric charge
Definition: LeafCandidate.h:91
SelectionType
Selector type.
Definition: MuonSelectors.h:17
void addObject(int id, const reco::RecoEcalCandidateRef &ref)
setters for L3 collections: (id=physics type, and Ref<C>)
int iEvent
Definition: GenABIO.cc:224
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
bool status() const override
bool calculate(const TrajectoryStateOnSurface &sta, const TrajectoryStateOnSurface &stb) override
T get() const
get a component
bool hltFilter(edm::Event &, const edm::EventSetup &, trigger::TriggerFilterObjectWithRefs &filterproduct) const override
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
const LorentzVector & p4() const final
four-momentum Lorentz vector
Definition: LeafCandidate.h:99
const int mu
Definition: Constants.h:22
T min(T a, T b)
Definition: MathUtil.h:58
ParameterDescriptionBase * add(U const &iLabel, T const &value)
bool isGoodMuon(const reco::Muon &muon, SelectionType type, reco::Muon::ArbitrationType arbitrationType=reco::Muon::SegmentAndTrackArbitration)
main GoodMuon wrapper call
static void makeHLTFilterDescription(edm::ParameterSetDescription &desc)
Definition: HLTFilter.cc:29
void addCollectionTag(const edm::InputTag &collectionTag)
collectionTags
void add(std::string const &label, ParameterSetDescription const &psetDescription)
bool saveTags() const
Definition: HLTFilter.h:45
HLTDiMuonGlbTrkFilter(const edm::ParameterSet &)
T get() const
Definition: EventSetup.h:71
edm::EDGetTokenT< reco::MuonCollection > m_muonsToken
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
muon::SelectionType m_trkMuonId