33 candTag_( iConfig.getParameter<
edm::InputTag>(
"CandTag") ),
35 previousCandTag_( iConfig.getParameter<
edm::InputTag>(
"PreviousCandTag") ),
36 previousCandToken_( consumes<
trigger::TriggerFilterObjectWithRefs>(previousCandTag_)),
37 maxEta_( iConfig.getParameter<double>(
"MaxEta") ),
38 minPt_( iConfig.getParameter<double>(
"MinPt") ),
39 minN_( iConfig.getParameter<
int>(
"MinN") ),
40 excludeSingleSegmentCSC_( iConfig.getParameter<
bool>(
"ExcludeSingleSegmentCSC") ),
41 csctfTag_( iConfig.getParameter<
edm::InputTag>(
"CSCTFtag") ),
48 vector<int> selectQualities = iConfig.getParameter<vector<int> >(
"SelectQualities");
49 for(
int selectQualitie : selectQualities){
50 if(selectQualitie > 7){
59 ss<<
"Constructed with parameters:"<<endl;
62 ss<<
" MaxEta = "<<
maxEta_<<endl;
63 ss<<
" MinPt = "<<
minPt_<<endl;
64 ss<<
" SelectQualities =";
65 for(
size_t i=0;
i<8;
i++){
69 ss<<
" MinN = "<<
minN_<<endl;
73 LogDebug(
"HLTMuonL1Filter")<<ss.str();
86 desc.
add<
double>(
"MaxEta",2.5);
87 desc.
add<
double>(
"MinPt",0.0);
88 desc.
add<
int>(
"MinN",1);
89 desc.
add<
bool>(
"ExcludeSingleSegmentCSC",
false);
93 std::vector<int> temp1;
95 desc.
add<std::vector<int> >(
"SelectQualities",temp1);
97 descriptions.
add(
"hltMuonL1Filter",desc);
127 csctfTracks = csctfTracksHandle.
product();
132 l1MuTriggerScales = scales.
product();
138 vector<L1MuonParticleRef> prevMuons;
143 for(
size_t i = 0;
i < allMuons->size();
i++){
147 if(
find(prevMuons.begin(), prevMuons.end(),
muon) == prevMuons.end())
continue;
150 if(fabs(muon->eta()) >
maxEta_)
continue;
153 if(muon->pt() <
minPt_)
continue;
157 int quality = muon->gmtMuonCand().empty() ? 0 : (1 << muon->gmtMuonCand().quality());
178 ss<<
"L1mu#"<<
'\t'<<
"q*pt"<<
'\t'<<
'\t'<<
"eta"<<
'\t'<<
"phi"<<
'\t'<<
"quality"<<
'\t'<<
"isPrev"<<
'\t'<<
"isFired"<<
'\t'<<
"isSingleCSC"<<endl;
179 ss<<
"--------------------------------------------------------------------------"<<endl;
181 vector<L1MuonParticleRef> firedMuons;
183 for(
size_t i=0;
i<allMuons->size();
i++){
185 int quality = mu->gmtMuonCand().empty() ? 0 : mu->gmtMuonCand().quality();
186 bool isPrev =
find(prevMuons.begin(), prevMuons.end(),
mu) != prevMuons.end();
187 bool isFired =
find(firedMuons.begin(), firedMuons.end(),
mu) != firedMuons.end();
189 ss<<
i<<
'\t'<<scientific<<mu->charge()*mu->pt()<<
'\t'<<
fixed<<mu->eta()<<
'\t'<<mu->phi()<<
'\t'<<quality<<
'\t'<<isPrev<<
'\t'<<isFired<<
'\t'<<isSingleCSC<<endl;
191 ss<<
"--------------------------------------------------------------------------"<<endl;
192 LogDebug(
"HLTMuonL1Filter")<<ss.str()<<
"Decision of filter is "<<accept<<
", number of muons passing = "<<filterproduct.
l1muonSize();
207 int csctfMode = -999;
210 for(
auto trk = csctfTracks.begin(); trk < csctfTracks.end(); trk++){
212 int trEndcap = (trk->first.endcap()==2 ? trk->first.endcap()-3 : trk->first.endcap());
213 int trSector = 6*(trk->first.endcap()-1)+trk->first.sector();
220 double trEta = trEtaScale * trEndcap;
222 if(trEta<-2.4) trEta=-2.375;
227 float trPhi02PI = fmod(trPhiScale +
243 if ( fabs (trEta-muon->eta()) < 0.03 &&
244 fabs (trPhi-muon->phi()) < 0.001 ) {
247 ptadd thePtAddress(trk->first.ptLUTAddress());
248 csctfMode = thePtAddress.track_mode;
261 return csctfMode==11;
double minPt_
pT threshold
void getObjects(Vids &ids, VRphoton &refs) const
various physics-level getters:
int minN_
required number of passing candidates to pass the filter
bool getByToken(EDGetToken token, Handle< PROD > &result) const
enum start value shifted to 81 so as to avoid clashes with PDG codes
bool hltFilter(edm::Event &, const edm::EventSetup &, trigger::TriggerFilterObjectWithRefs &filterproduct) const override
size_type l1muonSize() const
edm::InputTag previousCandTag_
input tag identifying the product containing refs to muons passing the previous level ...
virtual float getCenter(unsigned packed) const =0
get the center of bin represented by packed
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
bool accept(const edm::Event &event, const edm::TriggerResults &triggerTable, const std::string &triggerPath)
std::vector< L1CSCTrack > L1CSCTrackCollection
HLTMuonL1Filter(const edm::ParameterSet &)
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
void addObject(int id, const reco::RecoEcalCandidateRef &ref)
setters for L3 collections: (id=physics type, and Ref<C>)
double maxEta_
max Eta cut
edm::EDGetTokenT< L1CSCTrackCollection > csctfToken_
#define DEFINE_FWK_MODULE(type)
bool excludeSingleSegmentCSC_
should we exclude single-segment CSC trigger objects from our counting?
const L1MuScale * getPhiScale() const
get the phi scale
edm::InputTag candTag_
input tag identifying the product containing muons
ParameterDescriptionBase * add(U const &iLabel, T const &value)
edm::EDGetTokenT< l1extra::L1MuonParticleCollection > candToken_
static void makeHLTFilterDescription(edm::ParameterSetDescription &desc)
T const * product() const
void addCollectionTag(const edm::InputTag &collectionTag)
collectionTags
void add(std::string const &label, ParameterSetDescription const &psetDescription)
const L1MuScale * getRegionalEtaScale(int isys) const
get the regioanl muon trigger eta scale, isys = 0(DT), 1(bRPC), 2(CSC), 3(fwdRPC) ...
bool isSingleSegmentCSC(const l1extra::L1MuonParticleRef &muon, L1CSCTrackCollection const &csctfTracks, L1MuTriggerScales const &scales) const
checks if the passed L1MuExtraParticle is a single segment CSC
virtual float getLowEdge(unsigned packed) const =0
get the low edge of bin represented by packed
~HLTMuonL1Filter() override
T const * product() const
edm::InputTag csctfTag_
input tag identifying the product containing CSCTF tracks
edm::EDGetTokenT< trigger::TriggerFilterObjectWithRefs > previousCandToken_