37 beamspotTag_ (iConfig.getParameter<
edm::
InputTag > (
"BeamSpotTag")),
39 candTag_ (iConfig.getParameter<
InputTag > (
"CandTag")),
41 previousCandTag_ (iConfig.getParameter<
InputTag > (
"PreviousCandTag")),
43 l1CandTag_ (iConfig.getParameter<
InputTag > (
"L1CandTag")),
45 recoMuTag_ (iConfig.getParameter<
InputTag > (
"inputMuonCollection")),
47 min_N_ (iConfig.getParameter<
int> (
"MinN")),
48 max_Eta_ (iConfig.getParameter<double> (
"MaxEta")),
49 min_Nhits_ (iConfig.getParameter<
int> (
"MinNhits")),
50 max_Dr_ (iConfig.getParameter<double> (
"MaxDr")),
51 min_Dr_ (iConfig.getParameter<double> (
"MinDr")),
52 max_Dz_ (iConfig.getParameter<double> (
"MaxDz")),
53 min_DxySig_(iConfig.getParameter<double> (
"MinDxySig")),
54 min_Pt_ (iConfig.getParameter<double> (
"MinPt")),
55 nsigma_Pt_ (iConfig.getParameter<double> (
"NSigmaPt")),
56 max_NormalizedChi2_ (iConfig.getParameter<double> (
"MaxNormalizedChi2")),
57 max_DXYBeamSpot_ (iConfig.getParameter<double> (
"MaxDXYBeamSpot")),
58 min_DXYBeamSpot_ (iConfig.getParameter<double> (
"MinDXYBeamSpot")),
59 min_NmuonHits_ (iConfig.getParameter<
int> (
"MinNmuonHits")),
60 max_PtDifference_ (iConfig.getParameter<double> (
"MaxPtDifference")),
61 min_TrackPt_ (iConfig.getParameter<double> (
"MinTrackPt")),
62 min_MuonStations_L3fromL1_ (iConfig.getParameter<
int>(
"minMuonStations")),
63 allowedTypeMask_L3fromL1_ (iConfig.getParameter<unsigned
int>(
"allowedTypeMask")),
64 requiredTypeMask_L3fromL1_ (iConfig.getParameter<unsigned
int>(
"requiredTypeMask")),
65 maxNormalizedChi2_L3fromL1_(iConfig.getParameter<double>(
"MaxNormalizedChi2_L3FromL1")),
67 L1MatchingdR_ (iConfig.getParameter<double> (
"L1MatchingdR")),
68 matchPreviousCand_( iConfig.getParameter<
bool>(
"MatchToPreviousCand") ),
71 theL3LinksLabel (iConfig.getParameter<
InputTag>(
"InputLinks")),
75 <<
" CandTag/MinN/MaxEta/MinNhits/MaxDr/MinDr/MaxDz/MinDxySig/MinPt/NSigmaPt : " 100 desc.
add<
int>(
"MinN",1);
101 desc.
add<
double>(
"MaxEta",2.5);
102 desc.
add<
int>(
"MinNhits",0);
103 desc.
add<
double>(
"MaxDr",2.0);
104 desc.
add<
double>(
"MinDr",-1.0);
105 desc.
add<
double>(
"MaxDz",9999.0);
106 desc.
add<
double>(
"MinDxySig",-1.0);
107 desc.
add<
double>(
"MinPt",3.0);
108 desc.
add<
double>(
"NSigmaPt",0.0);
109 desc.
add<
double>(
"MaxNormalizedChi2",9999.0);
110 desc.
add<
double>(
"MaxDXYBeamSpot",9999.0);
111 desc.
add<
double>(
"MinDXYBeamSpot",-1.0);
112 desc.
add<
int>(
"MinNmuonHits",0);
113 desc.
add<
double>(
"MaxPtDifference",9999.0);
114 desc.
add<
double>(
"MinTrackPt",0.0);
115 desc.
add<
int>(
"minMuonStations",-1);
116 desc.
add<
int>(
"minTrkHits",-1);
117 desc.
add<
int>(
"minMuonHits",-1);
118 desc.
add<
unsigned int>(
"allowedTypeMask",255);
119 desc.
add<
unsigned int>(
"requiredTypeMask",0);
120 desc.
add<
double>(
"MaxNormalizedChi2_L3FromL1",9999.);
121 desc.
add<
unsigned int>(
"trkMuonId",0);
122 desc.
add<
double>(
"L1MatchingdR",0.3);
123 desc.
add<
bool>(
"MatchToPreviousCand",
true);
125 descriptions.
add(
"hltMuonL3PreFilter",desc);
148 vector<RecoChargedCandidateRef> vl2cands;
160 std::map<reco::TrackRef, std::vector<RecoChargedCandidateRef> > L2toL3s;
162 std::map<unsigned int, RecoChargedCandidateRef > MuonToL3s;
165 if (mucands->empty())
return false;
166 auto const &tk = (*mucands)[0].track();
169 if (tk->seedRef().isNonnull()){
171 useL3MTS =
a !=
nullptr;
176 LogDebug(
"HLTMuonL3PreFilter") <<
"HLTMuonL3PreFilter::hltFilter is in mode: useL3MTS";
178 unsigned int maxI = mucands->size();
179 for (
unsigned int i=0;
i!=
maxI;++
i){
180 const TrackRef &tk = (*mucands)[
i].track();
182 TrackRef staTrack = l3seedRef->l2Track();
190 LogDebug(
"HLTMuonL3PreFilter") <<
"HLTMuonL3PreFilter::hltFilter is in mode: not useL3MTS";
197 std::vector<l1t::MuonRef> vl1cands;
199 bool check_l1match =
true;
202 for(
unsigned int i(0);
i < mucands->size(); ++
i){
211 check_l1match =
true;
213 for(
auto const & link : *links){
218 const reco::Track& trackerTrack = *link.trackerTrack();
220 float dR2 =
deltaR2(tk->eta(),tk->phi(),trackerTrack.
eta(),trackerTrack.
phi());
221 float dPt =
std::abs(tk->pt() - trackerTrack.
pt());
222 if (tk->pt() != 0) dPt = dPt/tk->pt();
224 if (dR2 < 0.02*0.02 and dPt < 0.001) {
225 const TrackRef staTrack = link.standAloneTrack();
227 check_l1match =
false;
235 const unsigned int nL1Muons(vl1cands.size());
236 for (
unsigned int il1=0; il1!=nL1Muons; ++il1) {
237 if (
deltaR(cand->eta(), cand->phi(), vl1cands[il1]->eta(), vl1cands[il1]->phi()) <
L1MatchingdR_) {
247 LogDebug(
"HLTMuonL3PreFilter")<<
"looking at: "<<L2toL3s.size()<<
" L2->L3s from: "<<mucands->size();
248 for (
const auto& L2toL3s_it : L2toL3s ) {
254 unsigned int maxItk=L2toL3s_it.second.size();
255 for (; iTk!=maxItk; iTk++){
270 for (
const auto& MuonToL3s_it : MuonToL3s ) {
278 if ( !
muon.globalTrack().isNull() ){
293 vector<RecoChargedCandidateRef> vref;
295 for (
auto &
i : vref) {
299 <<
" Track passing filter: trackRef pt= " << tk->pt() <<
" (" << candref->pt() <<
") " <<
", eta: " << tk->eta() <<
" (" << candref->eta() <<
") ";
305 LogDebug(
"HLTMuonL3PreFilter") <<
" >>>>> Result of HLTMuonL3PreFilter is " << accept <<
", number of muons passing thresholds= " <<
n;
315 for (
auto & vcand : vcands) {
316 if ( vcand->get<
TrackRef>() == staTrack ) {
318 LogDebug(
"HLTMuonL3PreFilter") <<
"The L2 track triggered";
332 LogDebug(
"HLTMuonL3PreFilter") <<
" Muon in loop, q*pt= " << tk->charge()*tk->pt() <<
" (" << cand->charge()*cand->pt() <<
") " <<
", eta= " << tk->eta() <<
" (" << cand->eta() <<
") " <<
", hits= " << tk->numberOfValidHits() <<
", d0= " << tk->d0() <<
", dz= " << tk->dz();
335 if (tk->numberOfValidHits()<
min_Nhits_)
return false;
338 auto dr =
std::abs( (- (cand->vx()-beamSpot.
x0()) * cand->py() + (cand->vy()-beamSpot.
y0()) * cand->px() ) / cand->pt() );
345 if (
std::abs((cand->vz()-beamSpot.
z0()) - ((cand->vx()-beamSpot.
x0())*cand->px()+(cand->vy()-beamSpot.
y0())*cand->py())/cand->pt() * cand->pz()/cand->pt())>
max_Dz_)
return false;
362 double candPt = cand->pt();
371 double pt = cand->pt();
372 double err0 = tk->error(0);
373 double abspar0 =
std::abs(tk->parameter(0));
377 LogTrace(
"HLTMuonL3PreFilter") <<
" ...Muon in loop, trackkRef pt= " 378 << tk->pt() <<
", ptLx= " << ptLx
379 <<
" cand pT " << cand->pt();
380 if (ptLx<
min_Pt_)
return false;
const edm::InputTag l1CandTag_
double z0() const
z coordinate
const edm::InputTag candTag_
void getObjects(Vids &ids, VRphoton &refs) const
various physics-level getters:
const edm::EDGetTokenT< trigger::TriggerFilterObjectWithRefs > previousCandToken_
const double min_DXYBeamSpot_
bool getByToken(EDGetToken token, Handle< PROD > &result) const
enum start value shifted to 81 so as to avoid clashes with PDG codes
const int min_MuonStations_L3fromL1_
edm::Ref< RecoChargedCandidateCollection > RecoChargedCandidateRef
reference to an object in a collection of RecoChargedCandidate objects
double phi() const
azimuthal angle of momentum vector
const edm::EDGetTokenT< reco::BeamSpot > beamspotToken_
key_type key() const
Accessor for product key.
bool accept(const edm::Event &event, const edm::TriggerResults &triggerTable, const std::string &triggerPath)
bool applySelection(const reco::RecoChargedCandidateRef &, const reco::BeamSpot &) const
ProductID id() const
Accessor for product ID.
std::vector< Muon > MuonCollection
collection of Muon objects
std::vector< MuonTrackLinks > MuonTrackLinksCollection
collection of MuonTrackLinks
SelectionType
Selector type.
const edm::EDGetTokenT< reco::MuonTrackLinksCollection > linkToken_
void addObject(int id, const reco::RecoEcalCandidateRef &ref)
setters for L3 collections: (id=physics type, and Ref<C>)
HLTMuonL3PreFilter(const edm::ParameterSet &)
#define DEFINE_FWK_MODULE(type)
double eta() const
pseudorapidity of momentum vector
const unsigned int allowedTypeMask_L3fromL1_
const unsigned int requiredTypeMask_L3fromL1_
double pt() const
track transverse momentum
Abs< T >::type abs(const T &t)
T const * get() const
Returns C++ pointer to the item.
ParameterDescriptionBase * add(U const &iLabel, T const &value)
const std::string * moduleLabel() const
const double min_TrackPt_
const double L1MatchingdR_
bool isGoodMuon(const reco::Muon &muon, SelectionType type, reco::Muon::ArbitrationType arbitrationType=reco::Muon::SegmentAndTrackArbitration)
main GoodMuon wrapper call
const double max_PtDifference_
const edm::EDGetTokenT< reco::MuonCollection > recoMuToken_
std::vector< RecoChargedCandidate > RecoChargedCandidateCollection
collectin of RecoChargedCandidate objects
constexpr auto deltaR2(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
static void makeHLTFilterDescription(edm::ParameterSetDescription &desc)
const bool matchPreviousCand_
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
double maxNormalizedChi2_L3fromL1_
bool triggeredByLevel2(const reco::TrackRef &track, std::vector< reco::RecoChargedCandidateRef > &vcands) const
void addCollectionTag(const edm::InputTag &collectionTag)
collectionTags
const edm::EDGetTokenT< trigger::TriggerFilterObjectWithRefs > l1CandToken_
void add(std::string const &label, ParameterSetDescription const &psetDescription)
const double max_DXYBeamSpot_
const edm::EDGetTokenT< reco::RecoChargedCandidateCollection > candToken_
double y0() const
y coordinate
const double max_NormalizedChi2_
const Point & position() const
position
muon::SelectionType trkMuonId_
int numberOfValidMuonHits() const
Provenance getProvenance(BranchID const &theID) const
bool hltFilter(edm::Event &, const edm::EventSetup &, trigger::TriggerFilterObjectWithRefs &filterproduct) const override
~HLTMuonL3PreFilter() override
double x0() const
x coordinate