35 using namespace trigger;
36 using namespace l1extra;
41 beamspotTag_ (iConfig.getParameter< edm::
InputTag > (
"BeamSpotTag")),
43 candTag_ (iConfig.getParameter< edm::
InputTag > (
"CandTag")),
45 previousCandTag_ (iConfig.getParameter<
InputTag > (
"PreviousCandTag")),
47 seedMapTag_( iConfig.getParameter<
InputTag >(
"SeedMapTag") ),
48 seedMapToken_(consumes<
SeedMap>(seedMapTag_)),
49 fast_Accept_ (iConfig.getParameter<bool> (
"FastAccept")),
50 max_Eta_ (iConfig.getParameter<double> (
"MaxEta")),
51 min_Nhits_ (iConfig.getParameter<int> (
"MinNhits")),
52 min_Nstations_(iConfig.getParameter<int> (
"MinNstations")),
53 min_Nchambers_(iConfig.getParameter<int> (
"MinNchambers")),
54 max_Dr_ (iConfig.getParameter<double> (
"MaxDr")),
55 max_Dz_ (iConfig.getParameter<double> (
"MaxDz")),
56 chargeOpt_ (iConfig.getParameter<int> (
"ChargeOpt")),
57 min_PtPair_ (iConfig.getParameter<double> (
"MinPtPair")),
58 min_PtMax_ (iConfig.getParameter<double> (
"MinPtMax")),
59 min_PtMin_ (iConfig.getParameter<double> (
"MinPtMin")),
60 min_InvMass_ (iConfig.getParameter<double> (
"MinInvMass")),
61 max_InvMass_ (iConfig.getParameter<double> (
"MaxInvMass")),
62 min_Acop_ (iConfig.getParameter<double> (
"MinAcop")),
63 max_Acop_ (iConfig.getParameter<double> (
"MaxAcop")),
64 min_Angle_ (iConfig.getParameter<double> (
"MinAngle")),
65 max_Angle_ (iConfig.getParameter<double> (
"MaxAngle")),
66 min_PtBalance_ (iConfig.getParameter<double> (
"MinPtBalance")),
67 max_PtBalance_ (iConfig.getParameter<double> (
"MaxPtBalance")),
68 nsigma_Pt_ (iConfig.getParameter<double> (
"NSigmaPt"))
72 <<
" CandTag/MinN/MaxEta/MinNhits/MinNstations/MinNchambers/MaxDr/MaxDz/MinPt1/MinPt2/MinInvMass/MaxInvMass/MinAcop/MaxAcop/MinAngle/MaxAngle/MinPtBalance/MaxPtBalance/NSigmaPt : "
107 desc.
add<
bool>(
"FastAccept",
false);
108 desc.
add<
double>(
"MaxEta",2.5);
109 desc.
add<
int>(
"MinNhits",0);
110 desc.
add<
int>(
"MinNstations",0);
111 desc.
add<
int>(
"MinNchambers",2);
112 desc.
add<
double>(
"MaxDr",100.0);
113 desc.
add<
double>(
"MaxDz",9999.0);
114 desc.
add<
int>(
"ChargeOpt",0);
115 desc.
add<
double>(
"MinPtPair",0.0);
116 desc.
add<
double>(
"MinPtMax",3.0);
117 desc.
add<
double>(
"MinPtMin",3.0);
118 desc.
add<
double>(
"MinInvMass",1.6);
119 desc.
add<
double>(
"MaxInvMass",5.6);
120 desc.
add<
double>(
"MinAcop",-1.0);
121 desc.
add<
double>(
"MaxAcop",3.15);
122 desc.
add<
double>(
"MinAngle",-999.0);
123 desc.
add<
double>(
"MaxAngle",2.5);
124 desc.
add<
double>(
"MinPtBalance",-1.0);
125 desc.
add<
double>(
"MaxPtBalance",999999.0);
126 desc.
add<
double>(
"NSigmaPt",0.0);
127 descriptions.
add(
"hltMuonDimuonL2Filter", desc);
135 double const MuMass = 0.106;
136 double const MuMass2 = MuMass*MuMass;
153 beamSpot = *recoBeamSpotHandle;
163 RecoChargedCandidateCollection::const_iterator cand1;
164 RecoChargedCandidateCollection::const_iterator cand2;
165 for (cand1=mucands->begin(); cand1!=mucands->end(); cand1++) {
168 LogDebug(
"HLTMuonDimuonL2Filter") <<
" 1st muon in loop: q*pt= "
169 << tk1->charge()*tk1->pt() <<
", eta= " << tk1->eta() <<
", hits= " << tk1->numberOfValidHits();
173 if (fabs(tk1->eta())>
max_Eta_)
continue;
176 if (tk1->numberOfValidHits()<
min_Nhits_)
continue;
179 if (tk1->hitPattern().muonStationsWithAnyHits() <
min_Nstations_)
continue;
182 if(tk1->hitPattern().dtStationsWithAnyHits() +
183 tk1->hitPattern().cscStationsWithAnyHits() <
min_Nchambers_)
continue;
190 if (fabs(tk1->dz())>
max_Dz_)
continue;
193 double pt1 = tk1->pt();
194 double err1 = tk1->error(0);
195 double abspar1 = fabs(tk1->parameter(0));
198 if (abspar1>0) ptLx1 +=
nsigma_Pt_*err1/abspar1*pt1;
199 LogDebug(
"HLTMuonDimuonL2Filter") <<
" ... 1st muon in loop, pt1= "
200 << pt1 <<
", ptLx1= " << ptLx1;
202 cand2 = cand1; cand2++;
203 for (; cand2!=mucands->end(); cand2++) {
207 LogDebug(
"HLTMuonDimuonL2Filter") <<
" 2nd muon in loop: q*pt= " << tk2->charge()*tk2->pt() <<
", eta= " << tk2->eta() <<
", hits= " << tk2->numberOfValidHits() <<
", d0= " << tk2->d0();
210 if (fabs(tk2->eta())>
max_Eta_)
continue;
213 if (tk2->numberOfValidHits()<
min_Nhits_)
continue;
216 if (tk2->hitPattern().muonStationsWithAnyHits() <
min_Nstations_)
continue;
219 if(tk2->hitPattern().dtStationsWithAnyHits() +
220 tk2->hitPattern().cscStationsWithAnyHits() <
min_Nchambers_)
continue;
227 if (fabs(tk2->dz())>
max_Dz_)
continue;
230 double pt2 = tk2->pt();
231 double err2 = tk2->error(0);
232 double abspar2 = fabs(tk2->parameter(0));
235 if (abspar2>0) ptLx2 +=
nsigma_Pt_*err2/abspar2*pt2;
236 LogDebug(
"HLTMuonDimuonL2Filter") <<
" ... 2nd muon in loop, pt2= "
237 << pt2 <<
", ptLx2= " << ptLx2;
248 if (tk1->charge()*tk2->charge()>0)
continue;
250 if (tk1->charge()*tk2->charge()<0)
continue;
254 double acop = fabs(tk1->phi()-tk2->phi());
255 if (acop>
M_PI) acop = 2*
M_PI - acop;
257 LogDebug(
"HLTMuonDimuonL2Filter") <<
" ... 1-2 acop= " << acop;
262 double angle = acos((tk1->px()*tk2->px() + tk1->py()*tk2->py() + tk1->pz()*tk2->pz())/(tk1->p()*tk2->p()));
263 LogDebug(
"HLTMuonDimuonL2Filter") <<
" ... 1-2 angle= " <<
angle;
268 double ptbalance = fabs(tk1->pt()-tk2->pt());
273 e1 =
sqrt(tk1->momentum().Mag2()+MuMass2);
274 e2 =
sqrt(tk2->momentum().Mag2()+MuMass2);
279 double pt12 = p.pt();
280 LogDebug(
"HLTMuonDimuonL2Filter") <<
" ... 1-2 pt12= " << pt12;
283 double invmass =
abs(p.mass());
285 LogDebug(
"HLTMuonDimuonL2Filter") <<
" ... 1-2 invmass= " << invmass;
291 LogDebug(
"HLTMuonDimuonL2Filter") <<
" Track1 passing filter: pt= " << tk1->pt() <<
", eta: " << tk1->eta();
292 LogDebug(
"HLTMuonDimuonL2Filter") <<
" Track2 passing filter: pt= " << tk2->pt() <<
", eta: " << tk2->eta();
293 LogDebug(
"HLTMuonDimuonL2Filter") <<
" Invmass= " << invmass;
297 vector<RecoChargedCandidateRef> vref;
299 for (
unsigned int i=0;
i<vref.size();
i++) {
304 }
else if (tktmp==tk2) {
307 if (i1done && i2done)
break;
325 const bool accept (n >= 1);
327 LogDebug(
"HLTMuonDimuonL2Filter") <<
" >>>>> Result of HLTMuonDimuonL2Filter is "<< accept <<
", number of muon pairs passing thresholds= " <<
n;
void getObjects(Vids &ids, VRphoton &refs) const
various physics-level getters:
bool isTriggeredByL1(reco::TrackRef &l2muon)
checks if a L2 muon was seeded by a fired L1
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
bool getByToken(EDGetToken token, Handle< PROD > &result) const
edm::Ref< RecoChargedCandidateCollection > RecoChargedCandidateRef
reference to an object in a collection of RecoChargedCandidate objects
bool accept(const edm::Event &event, const edm::TriggerResults &triggerTable, const std::string &triggerPath)
void addObject(int id, const reco::RecoEcalCandidateRef &ref)
setters for L3 collections: (id=physics type, and Ref<C>)
Abs< T >::type abs(const T &t)
edm::EDGetTokenT< reco::BeamSpot > beamspotToken_
virtual bool hltFilter(edm::Event &, const edm::EventSetup &, trigger::TriggerFilterObjectWithRefs &filterproduct) const override
T const * get() const
Returns C++ pointer to the item.
edm::EDGetTokenT< SeedMap > seedMapToken_
ParameterDescriptionBase * add(U const &iLabel, T const &value)
edm::EDGetTokenT< reco::RecoChargedCandidateCollection > candToken_
std::vector< RecoChargedCandidate > RecoChargedCandidateCollection
collectin of RecoChargedCandidate objects
static void makeHLTFilterDescription(edm::ParameterSetDescription &desc)
edm::EDGetTokenT< trigger::TriggerFilterObjectWithRefs > previousCandToken_
void addCollectionTag(const edm::InputTag &collectionTag)
collectionTags
void add(std::string const &label, ParameterSetDescription const &psetDescription)
HLTMuonDimuonL2Filter(const edm::ParameterSet &)
const Point & position() const
position
math::PtEtaPhiELorentzVectorF LorentzVector
T angle(T x1, T y1, T z1, T x2, T y2, T z2)