CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
HLTMuonDimuonL2Filter.cc
Go to the documentation of this file.
1 
11 
14 
16 
25 
29 
31 
32 using namespace edm;
33 using namespace std;
34 using namespace reco;
35 using namespace trigger;
36 using namespace l1extra;
37 //
38 // constructors and destructor
39 //
41  beamspotTag_ (iConfig.getParameter< edm::InputTag > ("BeamSpotTag")),
42  beamspotToken_ (consumes<reco::BeamSpot>(beamspotTag_)),
43  candTag_ (iConfig.getParameter< edm::InputTag > ("CandTag")),
44  candToken_ (consumes<reco::RecoChargedCandidateCollection>(candTag_)),
45  previousCandTag_ (iConfig.getParameter<InputTag > ("PreviousCandTag")),
46  previousCandToken_ (consumes<trigger::TriggerFilterObjectWithRefs>(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"))
69 {
70 
71  LogDebug("HLTMuonDimuonL2Filter")
72  << " CandTag/MinN/MaxEta/MinNhits/MinNstations/MinNchambers/MaxDr/MaxDz/MinPt1/MinPt2/MinInvMass/MaxInvMass/MinAcop/MaxAcop/MinAngle/MaxAngle/MinPtBalance/MaxPtBalance/NSigmaPt : "
73  << candTag_.encode()
74  << " " << fast_Accept_
75  << " " << max_Eta_
76  << " " << min_Nhits_
77  << " " << min_Nstations_
78  << " " << min_Nchambers_
79  << " " << max_Dr_
80  << " " << max_Dz_
81  << " " << chargeOpt_ << " " << min_PtPair_
82  << " " << min_PtMax_ << " " << min_PtMin_
83  << " " << min_InvMass_ << " " << max_InvMass_
84  << " " << min_Acop_ << " " << max_Acop_
85  << " " << min_Angle_ << " " << max_Angle_
86  << " " << min_PtBalance_ << " " << max_PtBalance_
87  << " " << nsigma_Pt_;
88 }
89 
91 {
92 }
93 
94 
95 //
96 // member functions
97 //
98 
99 void
103  desc.add<edm::InputTag>("BeamSpotTag",edm::InputTag("hltOfflineBeamSpot"));
104  desc.add<edm::InputTag>("CandTag",edm::InputTag("hltL2MuonCandidates"));
105  desc.add<edm::InputTag>("PreviousCandTag",edm::InputTag(""));
106  desc.add<edm::InputTag>("SeedMapTag",edm::InputTag("hltL2Muons"));
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);
128 }
129 
130 // ------------ method called to produce the data ------------
131 bool
133 {
134 
135  double const MuMass = 0.106;
136  double const MuMass2 = MuMass*MuMass;
137  // All HLT filters must create and fill an HLT filter object,
138  // recording any reconstructed physics objects satisfying (or not)
139  // this HLT filter, and place it in the Event.
140 
141  // Ref to Candidate object to be recorded in filter object
144 
145  // get hold of trks
147  iEvent.getByToken(candToken_,mucands);
148  if (saveTags()) filterproduct.addCollectionTag(candTag_);
149 
151  Handle<BeamSpot> recoBeamSpotHandle;
152  iEvent.getByToken(beamspotToken_,recoBeamSpotHandle);
153  beamSpot = *recoBeamSpotHandle;
154 
155  // get the L2 to L1 map object for this event
157 
158  // look at all mucands, check cuts and add to filter object
159  int n = 0;
160  double e1,e2;
162 
163  RecoChargedCandidateCollection::const_iterator cand1;
164  RecoChargedCandidateCollection::const_iterator cand2;
165  for (cand1=mucands->begin(); cand1!=mucands->end(); cand1++) {
166  TrackRef tk1 = cand1->get<TrackRef>();
167  // eta cut
168  LogDebug("HLTMuonDimuonL2Filter") << " 1st muon in loop: q*pt= "
169  << tk1->charge()*tk1->pt() << ", eta= " << tk1->eta() << ", hits= " << tk1->numberOfValidHits();
170  // find the L1 Particle corresponding to the L2 Track
171  if (!mapL2ToL1.isTriggeredByL1(tk1)) continue;
172 
173  if (fabs(tk1->eta())>max_Eta_) continue;
174 
175  // cut on number of hits
176  if (tk1->numberOfValidHits()<min_Nhits_) continue;
177 
178  // number of stations
179  if (tk1->hitPattern().muonStationsWithAnyHits() < min_Nstations_) continue;
180 
181  // number of chambers
182  if(tk1->hitPattern().dtStationsWithAnyHits() +
183  tk1->hitPattern().cscStationsWithAnyHits() < min_Nchambers_) continue;
184 
185  //dr cut
186  //if (fabs(tk1->d0())>max_Dr_) continue;
187  if (fabs(tk1->dxy(beamSpot.position()))>max_Dr_) continue;
188 
189  //dz cut
190  if (fabs(tk1->dz())>max_Dz_) continue;
191 
192  // Pt threshold cut
193  double pt1 = tk1->pt();
194  double err1 = tk1->error(0);
195  double abspar1 = fabs(tk1->parameter(0));
196  double ptLx1 = pt1;
197  // convert 50% efficiency threshold to 90% efficiency threshold
198  if (abspar1>0) ptLx1 += nsigma_Pt_*err1/abspar1*pt1;
199  LogDebug("HLTMuonDimuonL2Filter") << " ... 1st muon in loop, pt1= "
200  << pt1 << ", ptLx1= " << ptLx1;
201 
202  cand2 = cand1; cand2++;
203  for (; cand2!=mucands->end(); cand2++) {
204  TrackRef tk2 = cand2->get<TrackRef>();
205 
206  // eta cut
207  LogDebug("HLTMuonDimuonL2Filter") << " 2nd muon in loop: q*pt= " << tk2->charge()*tk2->pt() << ", eta= " << tk2->eta() << ", hits= " << tk2->numberOfValidHits() << ", d0= " << tk2->d0();
208  if (!mapL2ToL1.isTriggeredByL1(tk2)) continue;
209 
210  if (fabs(tk2->eta())>max_Eta_) continue;
211 
212  // cut on number of hits
213  if (tk2->numberOfValidHits()<min_Nhits_) continue;
214 
215  // number of stations
216  if (tk2->hitPattern().muonStationsWithAnyHits() < min_Nstations_) continue;
217 
218  // number of chambers
219  if(tk2->hitPattern().dtStationsWithAnyHits() +
220  tk2->hitPattern().cscStationsWithAnyHits() < min_Nchambers_) continue;
221 
222  //dr cut
223  //if (fabs(tk2->d0())>max_Dr_) continue;
224  if (fabs(tk2->dxy(beamSpot.position()))>max_Dr_) continue;
225 
226  //dz cut
227  if (fabs(tk2->dz())>max_Dz_) continue;
228 
229  // Pt threshold cut
230  double pt2 = tk2->pt();
231  double err2 = tk2->error(0);
232  double abspar2 = fabs(tk2->parameter(0));
233  double ptLx2 = pt2;
234  // convert 50% efficiency threshold to 90% efficiency threshold
235  if (abspar2>0) ptLx2 += nsigma_Pt_*err2/abspar2*pt2;
236  LogDebug("HLTMuonDimuonL2Filter") << " ... 2nd muon in loop, pt2= "
237  << pt2 << ", ptLx2= " << ptLx2;
238 
239  if (ptLx1>ptLx2) {
240  if (ptLx1<min_PtMax_) continue;
241  if (ptLx2<min_PtMin_) continue;
242  } else {
243  if (ptLx2<min_PtMax_) continue;
244  if (ptLx1<min_PtMin_) continue;
245  }
246 
247  if (chargeOpt_<0) {
248  if (tk1->charge()*tk2->charge()>0) continue;
249  } else if (chargeOpt_>0) {
250  if (tk1->charge()*tk2->charge()<0) continue;
251  }
252 
253  // Acoplanarity
254  double acop = fabs(tk1->phi()-tk2->phi());
255  if (acop>M_PI) acop = 2*M_PI - acop;
256  acop = M_PI - acop;
257  LogDebug("HLTMuonDimuonL2Filter") << " ... 1-2 acop= " << acop;
258  if (acop<min_Acop_) continue;
259  if (acop>max_Acop_) continue;
260 
261  // 3D angle
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;
264  if (angle < min_Angle_) continue;
265  if (angle > max_Angle_) continue;
266 
267  // Pt balance
268  double ptbalance = fabs(tk1->pt()-tk2->pt());
269  if (ptbalance<min_PtBalance_) continue;
270  if (ptbalance>max_PtBalance_) continue;
271 
272  // Combined dimuon system
273  e1 = sqrt(tk1->momentum().Mag2()+MuMass2);
274  e2 = sqrt(tk2->momentum().Mag2()+MuMass2);
275  p1 = Particle::LorentzVector(tk1->px(),tk1->py(),tk1->pz(),e1);
276  p2 = Particle::LorentzVector(tk2->px(),tk2->py(),tk2->pz(),e2);
277  p = p1+p2;
278 
279  double pt12 = p.pt();
280  LogDebug("HLTMuonDimuonL2Filter") << " ... 1-2 pt12= " << pt12;
281  if (pt12<min_PtPair_) continue;
282 
283  double invmass = abs(p.mass());
284  // if (invmass>0) invmass = sqrt(invmass); else invmass = 0;
285  LogDebug("HLTMuonDimuonL2Filter") << " ... 1-2 invmass= " << invmass;
286  if (invmass<min_InvMass_) continue;
287  if (invmass>max_InvMass_) continue;
288 
289  // Add this pair
290  n++;
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;
294 
295  bool i1done = false;
296  bool i2done = false;
297  vector<RecoChargedCandidateRef> vref;
298  filterproduct.getObjects(TriggerMuon,vref);
299  for (unsigned int i=0; i<vref.size(); i++) {
301  TrackRef tktmp = candref->get<TrackRef>();
302  if (tktmp==tk1) {
303  i1done = true;
304  } else if (tktmp==tk2) {
305  i2done = true;
306  }
307  if (i1done && i2done) break;
308  }
309 
310  if (!i1done) {
311  ref1=RecoChargedCandidateRef( Ref<RecoChargedCandidateCollection> (mucands,distance(mucands->begin(), cand1)));
312  filterproduct.addObject(TriggerMuon,ref1);
313  }
314  if (!i2done) {
315  ref2=RecoChargedCandidateRef( Ref<RecoChargedCandidateCollection> (mucands,distance(mucands->begin(),cand2 )));
316  filterproduct.addObject(TriggerMuon,ref2);
317  }
318 
319  if (fast_Accept_) break;
320  }
321 
322  }
323 
324  // filter decision
325  const bool accept (n >= 1);
326 
327  LogDebug("HLTMuonDimuonL2Filter") << " >>>>> Result of HLTMuonDimuonL2Filter is "<< accept << ", number of muon pairs passing thresholds= " << n;
328 
329  return accept;
330 }
331 
#define LogDebug(id)
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
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:464
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)
Definition: TopDQMHelpers.h:24
std::string encode() const
Definition: InputTag.cc:164
void addObject(int id, const reco::RecoEcalCandidateRef &ref)
setters for L3 collections: (id=physics type, and Ref&lt;C&gt;)
int iEvent
Definition: GenABIO.cc:230
T sqrt(T t)
Definition: SSEVec.h:48
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
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.
Definition: Ref.h:244
edm::EDGetTokenT< SeedMap > seedMapToken_
ParameterDescriptionBase * add(U const &iLabel, T const &value)
double p2[4]
Definition: TauolaWrapper.h:90
#define M_PI
edm::EDGetTokenT< reco::RecoChargedCandidateCollection > candToken_
std::vector< RecoChargedCandidate > RecoChargedCandidateCollection
collectin of RecoChargedCandidate objects
static void makeHLTFilterDescription(edm::ParameterSetDescription &desc)
Definition: HLTFilter.cc:29
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 &)
bool saveTags() const
Definition: HLTFilter.h:45
double p1[4]
Definition: TauolaWrapper.h:89
const Point & position() const
position
Definition: BeamSpot.h:62
math::PtEtaPhiELorentzVectorF LorentzVector
T angle(T x1, T y1, T z1, T x2, T y2, T z2)
Definition: angle.h:11