diff --git a/HLTrigger/Muon/plugins/HLTMuonDimuonL3Filter.cc b/HLTrigger/Muon/plugins/HLTMuonDimuonL3Filter.cc index 874914426e16f..5c969da1e8b4c 100644 --- a/HLTrigger/Muon/plugins/HLTMuonDimuonL3Filter.cc +++ b/HLTrigger/Muon/plugins/HLTMuonDimuonL3Filter.cc @@ -75,6 +75,9 @@ HLTMuonDimuonL3Filter::HLTMuonDimuonL3Filter(const edm::ParameterSet& iConfig) max_PtMin_(iConfig.getParameter >("MaxPtMin")), min_InvMass_(iConfig.getParameter >("MinInvMass")), max_InvMass_(iConfig.getParameter >("MaxInvMass")), + applyMinDiMuonDeltaR2Cut_(iConfig.getParameter("MinDiMuonDeltaR") > 0.), + min_DiMuonDeltaR2_(iConfig.getParameter("MinDiMuonDeltaR") * + iConfig.getParameter("MinDiMuonDeltaR")), min_Acop_(iConfig.getParameter("MinAcop")), max_Acop_(iConfig.getParameter("MaxAcop")), min_PtBalance_(iConfig.getParameter("MinPtBalance")), @@ -88,14 +91,42 @@ HLTMuonDimuonL3Filter::HLTMuonDimuonL3Filter(const edm::ParameterSet& iConfig) L1MatchingdR_(iConfig.getParameter("L1MatchingdR")), matchPreviousCand_(iConfig.getParameter("MatchToPreviousCand")), MuMass2_(0.106 * 0.106) { - LogDebug("HLTMuonDimuonL3Filter") << " CandTag/MinN/MaxEta/MinNhits/MaxDr/MaxDz/MinPt1/MinPt2/MinInvMass/MaxInvMass/" + // check consistency of parameters for mass-window cuts + if (min_InvMass_.size() != min_PtPair_.size()) { + throw cms::Exception("Configuration") << "size of \"MinInvMass\" (" << min_InvMass_.size() + << ") and \"MinPtPair\" (" << min_PtPair_.size() << ") differ"; + } + if (min_InvMass_.size() != max_PtPair_.size()) { + throw cms::Exception("Configuration") << "size of \"MinInvMass\" (" << min_InvMass_.size() + << ") and \"MaxPtPair\" (" << max_PtPair_.size() << ") differ"; + } + if (min_InvMass_.size() != min_PtMax_.size()) { + throw cms::Exception("Configuration") << "size of \"MinInvMass\" (" << min_InvMass_.size() << ") and \"MinPtMax\" (" + << min_PtMax_.size() << ") differ"; + } + if (min_InvMass_.size() != min_PtMin_.size()) { + throw cms::Exception("Configuration") << "size of \"MinInvMass\" (" << min_InvMass_.size() << ") and \"MinPtMin\" (" + << min_PtMin_.size() << ") differ"; + } + if (min_InvMass_.size() != max_PtMin_.size()) { + throw cms::Exception("Configuration") << "size of \"MinInvMass\" (" << min_InvMass_.size() << ") and \"MaxPtMin\" (" + << max_PtMin_.size() << ") differ"; + } + if (min_InvMass_.size() != max_InvMass_.size()) { + throw cms::Exception("Configuration") << "size of \"MinInvMass\" (" << min_InvMass_.size() + << ") and \"MaxInvMass\" (" << max_InvMass_.size() << ") differ"; + } + + LogDebug("HLTMuonDimuonL3Filter") << " CandTag/FastAccept/MinN/MaxEta/MinNhits/MaxDr/MaxDz/MinPt1/MinPt2/MinInvMass/" + "MaxInvMass/applyMinDiMuonDeltaRCut/MinDiMuonDeltaR" "MinAcop/MaxAcop/MinPtBalance/MaxPtBalance/NSigmaPt/MaxDzMuMu/MaxRapidityPair : " << candTag_.encode() << " " << fast_Accept_ << " " << min_N_ << " " << max_Eta_ << " " << min_Nhits_ << " " << max_Dr_ << " " << max_Dz_ << " " << chargeOpt_ << " " << Out(min_PtPair_) << " " << Out(min_PtMax_) << " " << Out(min_PtMin_) << " " - << Out(min_InvMass_) << " " << Out(max_InvMass_) << " " << min_Acop_ << " " - << max_Acop_ << " " << min_PtBalance_ << " " << max_PtBalance_ << " " << nsigma_Pt_ - << " " << max_DCAMuMu_ << " " << max_YPair_; + << Out(min_InvMass_) << " " << Out(max_InvMass_) << " " << applyMinDiMuonDeltaR2Cut_ + << " " << sqrt(min_DiMuonDeltaR2_) << " " << min_Acop_ << " " << max_Acop_ << " " + << min_PtBalance_ << " " << max_PtBalance_ << " " << nsigma_Pt_ << " " + << max_DCAMuMu_ << " " << max_YPair_; } HLTMuonDimuonL3Filter::~HLTMuonDimuonL3Filter() = default; @@ -138,6 +169,7 @@ void HLTMuonDimuonL3Filter::fillDescriptions(edm::ConfigurationDescriptions& des desc.add >("MaxPtMin", v5); desc.add >("MinInvMass", v6); desc.add >("MaxInvMass", v7); + desc.add("MinDiMuonDeltaR", -1.); desc.add("MinAcop", -1.0); desc.add("MaxAcop", 3.15); desc.add("MinPtBalance", -1.0); @@ -160,31 +192,6 @@ void HLTMuonDimuonL3Filter::fillDescriptions(edm::ConfigurationDescriptions& des bool HLTMuonDimuonL3Filter::hltFilter(edm::Event& iEvent, const edm::EventSetup& iSetup, trigger::TriggerFilterObjectWithRefs& filterproduct) const { - if (min_InvMass_.size() != min_PtPair_.size()) { - cout << "ERROR!!! Vector sizes don't match!" << endl; - return false; - } - if (min_InvMass_.size() != max_PtPair_.size()) { - cout << "ERROR!!! Vector sizes don't match!" << endl; - return false; - } - if (min_InvMass_.size() != min_PtMax_.size()) { - cout << "ERROR!!! Vector sizes don't match!" << endl; - return false; - } - if (min_InvMass_.size() != min_PtMin_.size()) { - cout << "ERROR!!! Vector sizes don't match!" << endl; - return false; - } - if (min_InvMass_.size() != max_PtMin_.size()) { - cout << "ERROR!!! Vector sizes don't match!" << endl; - return false; - } - if (min_InvMass_.size() != max_InvMass_.size()) { - cout << "ERROR!!! Vector sizes don't match!" << endl; - return false; - } - // All HLT filters must create and fill an HLT filter object, // recording any reconstructed physics objects satisfying (or not) // this HLT filter, and place it in the Event. @@ -595,6 +602,10 @@ bool HLTMuonDimuonL3Filter::applyDiMuonSelection(const RecoChargedCandidateRef& double pt12 = p.pt(); LogDebug("HLTMuonDimuonL3Filter") << " ... 1-2 pt12= " << pt12; + // Angle between the muons + if (applyMinDiMuonDeltaR2Cut_ and reco::deltaR2(p1, p2) < min_DiMuonDeltaR2_) + return false; + double ptLx1 = cand1->pt(); double ptLx2 = cand2->pt(); double invmass = abs(p.mass()); diff --git a/HLTrigger/Muon/plugins/HLTMuonDimuonL3Filter.h b/HLTrigger/Muon/plugins/HLTMuonDimuonL3Filter.h index a84b54119c1b8..a3d5a421b0a42 100644 --- a/HLTrigger/Muon/plugins/HLTMuonDimuonL3Filter.h +++ b/HLTrigger/Muon/plugins/HLTMuonDimuonL3Filter.h @@ -59,29 +59,31 @@ class HLTMuonDimuonL3Filter : public HLTFilter { const edm::InputTag recoMuTag_; // input tag identifying reco muons const edm::EDGetTokenT recoMuToken_; // token identifying product contains reco muons bool previousCandIsL2_; - bool fast_Accept_; // flag to save time: stop processing after identification of the first valid pair - int min_N_; // minimum number of muons to fire the trigger - double max_Eta_; // Eta cut - int min_Nhits_; // threshold on number of hits on muon - double max_Dr_; // impact parameter cut - double max_Dz_; // dz cut - int chargeOpt_; // Charge option (0:nothing; +1:same charge, -1:opposite charge) - std::vector min_PtPair_; // minimum Pt for the dimuon system - std::vector max_PtPair_; // miaximum Pt for the dimuon system - std::vector min_PtMax_; // minimum Pt for muon with max Pt in pair - std::vector min_PtMin_; // minimum Pt for muon with min Pt in pair - std::vector max_PtMin_; // maximum Pt for muon with min Pt in pair - std::vector min_InvMass_; // minimum invariant mass of pair - std::vector max_InvMass_; // maximum invariant mass of pair - double min_Acop_; // minimum acoplanarity - double max_Acop_; // maximum acoplanarity - double min_PtBalance_; // minimum Pt difference - double max_PtBalance_; // maximum Pt difference - double nsigma_Pt_; // pt uncertainty margin (in number of sigmas) - double max_DCAMuMu_; // DCA between the two muons - double max_YPair_; // |rapidity| of pair - bool cutCowboys_; ///< if true, reject muon-track pairs that bend towards each other - const edm::InputTag theL3LinksLabel; //Needed to iterL3 + const bool fast_Accept_; // flag to save time: stop processing after identification of the first valid pair + const int min_N_; // minimum number of muons to fire the trigger + const double max_Eta_; // Eta cut + const int min_Nhits_; // threshold on number of hits on muon + const double max_Dr_; // impact parameter cut + const double max_Dz_; // dz cut + const int chargeOpt_; // Charge option (0:nothing; +1:same charge, -1:opposite charge) + const std::vector min_PtPair_; // minimum Pt for the dimuon system + const std::vector max_PtPair_; // miaximum Pt for the dimuon system + const std::vector min_PtMax_; // minimum Pt for muon with max Pt in pair + const std::vector min_PtMin_; // minimum Pt for muon with min Pt in pair + const std::vector max_PtMin_; // maximum Pt for muon with min Pt in pair + const std::vector min_InvMass_; // minimum invariant mass of pair + const std::vector max_InvMass_; // maximum invariant mass of pair + const bool applyMinDiMuonDeltaR2Cut_; // apply cut on minimum Delta-R^2 distance between the muons + const double min_DiMuonDeltaR2_; // minimum Delta-R^2 distance between the muons + const double min_Acop_; // minimum acoplanarity + const double max_Acop_; // maximum acoplanarity + const double min_PtBalance_; // minimum Pt difference + const double max_PtBalance_; // maximum Pt difference + const double nsigma_Pt_; // pt uncertainty margin (in number of sigmas) + const double max_DCAMuMu_; // DCA between the two muons + const double max_YPair_; // |rapidity| of pair + const bool cutCowboys_; ///< if true, reject muon-track pairs that bend towards each other + const edm::InputTag theL3LinksLabel; //Needed to iterL3 const edm::EDGetTokenT linkToken_; //Needed to iterL3 const double L1MatchingdR_; const bool matchPreviousCand_;