CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
HLTMuonL2PreFilter.cc
Go to the documentation of this file.
1 
22 
23 //
24 // constructors and destructor
25 //
26 
28  beamSpotTag_( iConfig.getParameter<edm::InputTag>("BeamSpotTag") ),
29  beamSpotToken_(consumes<reco::BeamSpot>(beamSpotTag_)),
30  candTag_( iConfig.getParameter<edm::InputTag >("CandTag") ),
31  candToken_(consumes<reco::RecoChargedCandidateCollection>(candTag_)),
32  previousCandTag_( iConfig.getParameter<edm::InputTag >("PreviousCandTag") ),
33  previousCandToken_(consumes<trigger::TriggerFilterObjectWithRefs>(previousCandTag_)),
34  seedMapTag_( iConfig.getParameter<edm::InputTag >("SeedMapTag") ),
35  seedMapToken_(consumes<SeedMap>(seedMapTag_)),
36  minN_( iConfig.getParameter<int>("MinN") ),
37  maxEta_( iConfig.getParameter<double>("MaxEta") ),
38  absetaBins_( iConfig.getParameter<std::vector<double> >("AbsEtaBins") ),
39  minNstations_( iConfig.getParameter<std::vector<int> >("MinNstations") ),
40  minNhits_( iConfig.getParameter<std::vector<int> >("MinNhits") ),
41  cutOnChambers_( iConfig.getParameter<bool>("CutOnChambers") ),
42  minNchambers_( iConfig.getParameter<std::vector<int> >("MinNchambers") ),
43  maxDr_( iConfig.getParameter<double>("MaxDr") ),
44  minDr_( iConfig.getParameter<double>("MinDr") ),
45  maxDz_( iConfig.getParameter<double>("MaxDz") ),
46  min_DxySig_(iConfig.getParameter<double> ("MinDxySig")),
47  minPt_( iConfig.getParameter<double>("MinPt") ),
48  nSigmaPt_( iConfig.getParameter<double>("NSigmaPt") )
49 {
50  using namespace std;
51 
52  // check that number of eta bins matches number of nStation cuts
53  if( minNstations_.size()!=absetaBins_.size() ||
54  minNhits_.size()!=absetaBins_.size() ||
55  ( cutOnChambers_ && minNchambers_.size()!=absetaBins_.size() ) ) {
56  throw cms::Exception("Configuration") << "Number of MinNstations, MinNhits, or MinNchambers cuts "
57  << "does not match number of eta bins." << endl;
58  }
59 
60  if(absetaBins_.size()>1) {
61  for(unsigned int i=0; i<absetaBins_.size()-1; ++i) {
62  if(absetaBins_[i+1]<=absetaBins_[i])
63  throw cms::Exception("Configuration") << "Absolute eta bins must be in increasing order." << endl;
64  }
65  }
66 
67  // dump parameters for debugging
68  if(edm::isDebugEnabled()){
69  ostringstream ss;
70  ss<<"Constructed with parameters:"<<endl;
71  ss<<" BeamSpotTag = "<<beamSpotTag_.encode()<<endl;
72  ss<<" CandTag = "<<candTag_.encode()<<endl;
73  ss<<" PreviousCandTag = "<<previousCandTag_.encode()<<endl;
74  ss<<" SeedMapTag = "<<seedMapTag_.encode()<<endl;
75  ss<<" MinN = "<<minN_<<endl;
76  ss<<" MaxEta = "<<maxEta_<<endl;
77  ss<<" MinNstations = ";
78  for(unsigned int j=0; j<absetaBins_.size(); ++j) {
79  ss<<minNstations_[j]<<" (|eta|<"<<absetaBins_[j]<<"), ";
80  }
81  ss<<endl;
82  ss<<" MinNhits = ";
83  for(unsigned int j=0; j<absetaBins_.size(); ++j) {
84  ss<<minNhits_[j]<<" (|eta|<"<<absetaBins_[j]<<"), ";
85  }
86  ss<<endl;
87  ss<<" CutOnChambers = " <<cutOnChambers_<<endl;
88  if ( cutOnChambers_ ) {
89  ss<<" MinNchambers = ";
90  for(unsigned int j=0; j<absetaBins_.size(); ++j) {
91  ss<<minNchambers_[j]<<" (|eta|<"<<absetaBins_[j]<<"), ";
92  }
93  }
94  ss<<endl;
95  ss<<" MaxDr = "<<maxDr_<<endl;
96  ss<<" MinDr = "<<minDr_<<endl;
97  ss<<" MaxDz = "<<maxDz_<<endl;
98  ss<<" MinDxySig = "<<min_DxySig_<<endl;
99  ss<<" MinPt = "<<minPt_<<endl;
100  ss<<" NSigmaPt = "<<nSigmaPt_<<endl;
101  ss<<" saveTags= "<<saveTags();
102  LogDebug("HLTMuonL2PreFilter")<<ss.str();
103  }
104 }
105 
107 {
108 }
109 
110 void
114  desc.add<edm::InputTag>("BeamSpotTag",edm::InputTag("hltOfflineBeamSpot"));
115  desc.add<edm::InputTag>("CandTag",edm::InputTag("hltL2MuonCandidates"));
116  desc.add<edm::InputTag>("PreviousCandTag",edm::InputTag(""));
117  desc.add<edm::InputTag>("SeedMapTag",edm::InputTag("hltL2Muons"));
118  desc.add<int>("MinN",1);
119  desc.add<double>("MaxEta",2.5);
120  desc.add<std::vector<double> >("AbsEtaBins", std::vector<double>(1, 9999.));
121  desc.add<std::vector<int> >("MinNstations", std::vector<int>(1, 1));
122  desc.add<std::vector<int> >("MinNhits", std::vector<int>(1, 0));
123  desc.add<bool> ("CutOnChambers", 0);
124  desc.add<std::vector<int> >("MinNchambers", std::vector<int>(1, 0));
125  desc.add<double>("MaxDr",9999.0);
126  desc.add<double>("MinDr",-1.0);
127  desc.add<double>("MaxDz",9999.0);
128  desc.add<double>("MinDxySig",-1.0);
129  desc.add<double>("MinPt",0.0);
130  desc.add<double>("NSigmaPt",0.0);
131  descriptions.add("hltMuonL2PreFilter",desc);
132 }
133 
134 //
135 // member functions
136 //
137 
138 // ------------ method called to produce the data ------------
140 {
141  // All HLT filters must create and fill an HLT filter object,
142  // recording any reconstructed physics objects satisfying (or not)
143  // this HLT filter, and place it in the Event.
144 
145  using namespace std;
146  using namespace edm;
147  using namespace reco;
148  using namespace trigger;
149  using namespace l1extra;
150 
151  // save Tag
152  if (saveTags()) filterproduct.addCollectionTag(candTag_);
153 
154  // get hold of all muon candidates available at this level
156  iEvent.getByToken(candToken_, allMuons);
157 
158  // get hold of the beam spot
159  Handle<BeamSpot> beamSpotHandle;
160  iEvent.getByToken(beamSpotToken_, beamSpotHandle);
161  BeamSpot::Point beamSpot = beamSpotHandle->position();
162 
163  // get the L2 to L1 map object for this event
165 
166  // number of eta bins for cut on number of stations
167  const std::vector<double>::size_type nAbsetaBins = absetaBins_.size();
168 
169  // look at all allMuons, check cuts and add to filter object
170  int n = 0;
171  for(RecoChargedCandidateCollection::const_iterator cand=allMuons->begin(); cand!=allMuons->end(); cand++){
172  TrackRef mu = cand->get<TrackRef>();
173 
174  // check if this muon passed previous level
175  if(!mapL2ToL1.isTriggeredByL1(mu)) continue;
176 
177  // eta cut
178  if(std::abs(mu->eta()) > maxEta_) continue;
179 
180  // cut on number of stations
181  bool failNstations(false), failNhits(false), failNchambers(false);
182  for(unsigned int i=0; i<nAbsetaBins; ++i) {
183  if( std::abs(mu->eta())<absetaBins_[i] ) {
184  if(mu->hitPattern().muonStationsWithAnyHits() < minNstations_[i]) {
185  failNstations=true;
186  }
187  if(mu->numberOfValidHits() < minNhits_[i]) {
188  failNhits=true;
189  }
190  if( cutOnChambers_ &&
191  ( mu->hitPattern().dtStationsWithAnyHits() +
192  mu->hitPattern().cscStationsWithAnyHits() < minNchambers_[i]) ) {
193  failNchambers=true;
194  }
195  break;
196  }
197  }
198  if(failNstations || failNhits || failNchambers) continue;
199 
200  //dr cut
201  if(std::abs(mu->dxy(beamSpot)) > maxDr_) continue;
202 
203  //dr cut
204  if(std::abs(mu->dxy(beamSpot)) < minDr_) continue;
205 
206  //dz cut
207  if(std::abs(mu->dz(beamSpot)) > maxDz_) continue;
208 
209  // dxy significance cut (safeguard against bizarre values)
210  if (min_DxySig_ > 0 && (mu->dxyError() <= 0 || std::abs(mu->dxy(beamSpot)/mu->dxyError()) < min_DxySig_)) continue;
211 
212  // Pt threshold cut
213  double pt = mu->pt();
214  double abspar0 = std::abs(mu->parameter(0));
215  double ptLx = pt;
216  // convert 50% efficiency threshold to 90% efficiency threshold
217  if(abspar0 > 0) ptLx += nSigmaPt_*mu->error(0)/abspar0*pt;
218  if(ptLx < minPt_) continue;
219 
220  // add the good candidate to the filter object
222 
223  n++;
224  }
225 
226  // filter decision
227  const bool accept (n >= minN_);
228 
229  // dump event for debugging
230  if(edm::isDebugEnabled()){
231  ostringstream ss;
232  ss<<"L2mu#"
233  <<'\t'<<"q*pt"<<'\t' //scientific is too wide
234  <<'\t'<<"q*ptLx"<<'\t' //scientific is too wide
235  <<'\t'<<"eta"
236  <<'\t'<<"phi"
237  <<'\t'<<"nStations"
238  <<'\t'<<"nHits"
239  <<'\t'<<"dr"<<'\t' //scientific is too wide
240  <<'\t'<<"dz"<<'\t' //scientific is too wide
241  <<'\t'<<"L1seed#"
242  <<'\t'<<"isPrev"
243  <<'\t'<<"isFired"
244  <<endl;
245  ss<<"-----------------------------------------------------------------------------------------------------------------------"<<endl;
246  for (RecoChargedCandidateCollection::const_iterator cand = allMuons->begin(); cand != allMuons->end(); cand++) {
247  TrackRef mu = cand->get<TrackRef>();
248  ss<<setprecision(2)
249  <<cand-allMuons->begin()
250  <<'\t'<<scientific<<mu->charge()*mu->pt()
251  <<'\t'<<scientific<<mu->charge()*mu->pt()*(1. + ((mu->parameter(0) != 0) ? nSigmaPt_*mu->error(0)/std::abs(mu->parameter(0)) : 0.))
252  <<'\t'<<fixed<<mu->eta()
253  <<'\t'<<fixed<<mu->phi()
254  <<'\t'<<mu->hitPattern().muonStationsWithAnyHits()
255  <<'\t'<<mu->numberOfValidHits()
256  <<'\t'<<scientific<<mu->d0()
257  <<'\t'<<scientific<<mu->dz()
258  <<'\t'<<mapL2ToL1.getL1Keys(mu)
259  <<'\t'<<mapL2ToL1.isTriggeredByL1(mu);
260  vector<RecoChargedCandidateRef> firedMuons;
261  filterproduct.getObjects(TriggerMuon, firedMuons);
262  ss<<'\t'<<(find(firedMuons.begin(), firedMuons.end(), RecoChargedCandidateRef(Ref<RecoChargedCandidateCollection>(allMuons, cand-allMuons->begin()))) != firedMuons.end())
263  <<endl;
264  }
265  ss<<"-----------------------------------------------------------------------------------------------------------------------"<<endl;
266  ss<<"Decision of filter is "<<accept<<", number of muons passing = "<<filterproduct.muonSize();
267  LogDebug("HLTMuonL2PreFilter")<<ss.str();
268  }
269 
270  return accept;
271 }
272 
#define LogDebug(id)
std::vector< double > absetaBins_
bool isDebugEnabled()
int i
Definition: DBlmapReader.cc:9
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
std::vector< int > minNstations_
minimum number of muon stations used
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:464
double maxDz_
cut on dz wrt to the beam spot
double nSigmaPt_
pt uncertainty margin (in number of sigmas)
edm::Ref< RecoChargedCandidateCollection > RecoChargedCandidateRef
reference to an object in a collection of RecoChargedCandidate objects
math::XYZPoint Point
point in the space
Definition: BeamSpot.h:29
std::vector< int > minNchambers_
minimum number of valid chambers
edm::InputTag candTag_
input tag of L2 muons
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:7
bool accept(const edm::Event &event, const edm::TriggerResults &triggerTable, const std::string &triggerPath)
Definition: TopDQMHelpers.h:24
uint16_t size_type
std::string encode() const
Definition: InputTag.cc:164
HLTMuonL2PreFilter(const edm::ParameterSet &)
virtual bool hltFilter(edm::Event &, const edm::EventSetup &, trigger::TriggerFilterObjectWithRefs &filterproduct) const override
edm::InputTag previousCandTag_
input tag of the preceeding L1 filter in the path
void addObject(int id, const reco::RecoEcalCandidateRef &ref)
setters for L3 collections: (id=physics type, and Ref&lt;C&gt;)
double min_DxySig_
dxy significance cut
edm::EDGetTokenT< reco::BeamSpot > beamSpotToken_
edm::InputTag seedMapTag_
input tag of the map from the L2 seed to the sister L2 seeds of cleaned tracks
int iEvent
Definition: GenABIO.cc:230
int minN_
minimum number of muons to fire the trigger
edm::EDGetTokenT< SeedMap > seedMapToken_
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
int j
Definition: DBlmapReader.cc:9
tuple allMuons
Definition: allMuons_cfi.py:3
const int mu
Definition: Constants.h:22
ParameterDescriptionBase * add(U const &iLabel, T const &value)
std::vector< int > minNhits_
minimum number of valid muon hits
std::vector< RecoChargedCandidate > RecoChargedCandidateCollection
collectin of RecoChargedCandidate objects
static void makeHLTFilterDescription(edm::ParameterSetDescription &desc)
Definition: HLTFilter.cc:29
edm::EDGetTokenT< trigger::TriggerFilterObjectWithRefs > previousCandToken_
edm::InputTag beamSpotTag_
input tag of the beam spot
void addCollectionTag(const edm::InputTag &collectionTag)
collectionTags
void add(std::string const &label, ParameterSetDescription const &psetDescription)
bool saveTags() const
Definition: HLTFilter.h:45
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
bool cutOnChambers_
choose whether to apply cut on number of chambers (DT+CSC)
double minDr_
cut on impact parameter wrt to the beam spot
double minPt_
pt threshold in GeV
std::string getL1Keys(reco::TrackRef &l2muon)
returns the indices of L1 seeds
edm::EDGetTokenT< reco::RecoChargedCandidateCollection > candToken_
double maxDr_
cut on impact parameter wrt to the beam spot
double maxEta_
maxEta cut