CMS 3D CMS Logo

HLTMuonTrimuonL3Filter.cc
Go to the documentation of this file.
1 
11 
14 
16 
21 #include "HLTMuonTrimuonL3Filter.h"
26 
34 
36 
37 using namespace edm;
38 using namespace std;
39 using namespace reco;
40 using namespace trigger;
41 
42 //
43 // constructors and destructor
44 //
46  beamspotTag_ (iConfig.getParameter< edm::InputTag > ("BeamSpotTag")),
47  beamspotToken_(consumes<reco::BeamSpot>(beamspotTag_)),
48  candTag_ (iConfig.getParameter< edm::InputTag > ("CandTag")),
49  candToken_ (consumes<reco::RecoChargedCandidateCollection>(candTag_)),
50  previousCandTag_ (iConfig.getParameter<InputTag > ("PreviousCandTag")),
51  previousCandToken_ (consumes<trigger::TriggerFilterObjectWithRefs>(previousCandTag_)),
52  fast_Accept_ (iConfig.getParameter<bool> ("FastAccept")),
53  max_Eta_ (iConfig.getParameter<double> ("MaxEta")),
54  min_Nhits_ (iConfig.getParameter<int> ("MinNhits")),
55  max_Dr_ (iConfig.getParameter<double> ("MaxDr")),
56  max_Dz_ (iConfig.getParameter<double> ("MaxDz")),
57  chargeOpt_ (iConfig.getParameter<int> ("ChargeOpt")),
58  min_PtTriplet_ (iConfig.getParameter<double> ("MinPtTriplet")),
59  min_PtMax_ (iConfig.getParameter<double> ("MinPtMax")),
60  min_PtMin_ (iConfig.getParameter<double> ("MinPtMin")),
61  min_InvMass_ (iConfig.getParameter<double> ("MinInvMass")),
62  max_InvMass_ (iConfig.getParameter<double> ("MaxInvMass")),
63  min_Acop_ (iConfig.getParameter<double> ("MinAcop")),
64  max_Acop_ (iConfig.getParameter<double> ("MaxAcop")),
65  min_PtBalance_ (iConfig.getParameter<double> ("MinPtBalance")),
66  max_PtBalance_ (iConfig.getParameter<double> ("MaxPtBalance")),
67  nsigma_Pt_ (iConfig.getParameter<double> ("NSigmaPt")),
68  max_DCAMuMu_ (iConfig.getParameter<double>("MaxDCAMuMu")),
69  max_YTriplet_ (iConfig.getParameter<double>("MaxRapidityTriplet")),
70  theL3LinksLabel (iConfig.getParameter<InputTag>("InputLinks")),
71  linkToken_ (consumes<reco::MuonTrackLinksCollection>(theL3LinksLabel))
72 {
73 
74  LogDebug("HLTMuonTrimuonL3Filter")
75  << " CandTag/MinN/MaxEta/MinNhits/MaxDr/MaxDz/MinPt1/MinPt2/MinInvMass/MaxInvMass/MinAcop/MaxAcop/MinPtBalance/MaxPtBalance/NSigmaPt/MaxDzMuMu/MaxRapidityTriplet : "
76  << candTag_.encode()
77  << " " << fast_Accept_
78  << " " << max_Eta_
79  << " " << min_Nhits_
80  << " " << max_Dr_
81  << " " << max_Dz_
82  << " " << chargeOpt_ << " " << min_PtTriplet_
83  << " " << min_PtMax_ << " " << min_PtMin_
84  << " " << min_InvMass_ << " " << max_InvMass_
85  << " " << min_Acop_ << " " << max_Acop_
86  << " " << min_PtBalance_ << " " << max_PtBalance_
87  << " " << nsigma_Pt_
88  << " " << max_DCAMuMu_
89  << " " << max_YTriplet_;
90 }
91 
93 
94 void
98  desc.add<edm::InputTag>("BeamSpotTag",edm::InputTag("hltOfflineBeamSpot"));
99  desc.add<edm::InputTag>("CandTag",edm::InputTag("hltL3MuonCandidates"));
100  desc.add<edm::InputTag>("PreviousCandTag",edm::InputTag(""));
101  desc.add<bool>("FastAccept",false);
102  desc.add<double>("MaxEta",2.5);
103  desc.add<int>("MinNhits",0);
104  desc.add<double>("MaxDr",2.0);
105  desc.add<double>("MaxDz",9999.0);
106  desc.add<int>("ChargeOpt",0);
107  desc.add<double>("MinPtTriplet",0.0);
108  desc.add<double>("MinPtMax",3.0);
109  desc.add<double>("MinPtMin",3.0);
110  desc.add<double>("MinInvMass",2.8);
111  desc.add<double>("MaxInvMass",3.4);
112  desc.add<double>("MinAcop",-1.0);
113  desc.add<double>("MaxAcop",3.15);
114  desc.add<double>("MinPtBalance",-1.0);
115  desc.add<double>("MaxPtBalance",999999.0);
116  desc.add<double>("NSigmaPt",0.0);
117  desc.add<double>("MaxDCAMuMu",99999.9);
118  desc.add<double>("MaxRapidityTriplet",999999.0);
119  desc.add<edm::InputTag>("InputLinks",edm::InputTag(""));
120  descriptions.add("hltMuonTrimuonL3Filter",desc);
121 }
122 
123 //
124 // member functions
125 //
126 
127 // ------------ method called to produce the data ------------
128 bool
130 {
131 
132  double const MuMass = 0.106;
133  double const MuMass2 = MuMass*MuMass;
134  // All HLT filters must create and fill an HLT filter object,
135  // recording any reconstructed physics objects satisfying (or not)
136  // this HLT filter, and place it in the Event.
137 
138  // get hold of trks
140  if (saveTags()) filterproduct.addCollectionTag(candTag_);
141  iEvent.getByToken(candToken_,mucands);
142 
143  // Test to see if we can use L3MuonTrajectorySeeds:
144  if (mucands->empty()) return false;
145  auto const &tk = (*mucands)[0].track();
146  bool useL3MTS=false;
147 
148  if (tk->seedRef().isNonnull()){
149  auto a = dynamic_cast<const L3MuonTrajectorySeed*>(tk->seedRef().get());
150  useL3MTS = a != nullptr;
151  }
152 
153  // sort them by L2Track
154  std::map<reco::TrackRef, std::vector<RecoChargedCandidateRef> > L2toL3s;
155 
156  // If we can use L3MuonTrajectory seeds run the older code:
157  if (useL3MTS){
158  unsigned int maxI = mucands->size();
159  for (unsigned int i=0;i!=maxI;i++){
160  const TrackRef &tk = (*mucands)[i].track();
162  TrackRef staTrack = l3seedRef->l2Track();
163  L2toL3s[staTrack].push_back(RecoChargedCandidateRef(mucands,i));
164  }
165  }
166  // Using normal TrajectorySeeds:
167  else{
168  // Read Links collection:
170  iEvent.getByToken(linkToken_, links);
171 
172  // Loop over RecoChargedCandidates:
173  for(unsigned int i(0); i < mucands->size(); ++i){
174  RecoChargedCandidateRef cand(mucands,i);
175  for(auto const & link : *links){
176  TrackRef tk = cand->track();
177 
178  // Using the same method that was used to create the links between L3 and L2
179  // ToDo: there should be a better way than dR,dPt matching
180  const reco::Track& globalTrack = *link.globalTrack();
181  float dR2 = deltaR2(tk->eta(),tk->phi(),globalTrack.eta(),globalTrack.phi());
182  float dPt = std::abs(tk->pt() - globalTrack.pt())/tk->pt();
183  const TrackRef staTrack = link.standAloneTrack();
184  if (dR2 < 0.02*0.02 and dPt < 0.001) {
185  L2toL3s[staTrack].push_back(RecoChargedCandidateRef(cand));
186  }
187  } //MTL loop
188  } //RCC loop
189  } //end of using normal TrajectorySeeds
190 
191  Handle<TriggerFilterObjectWithRefs> previousLevelCands;
192  iEvent.getByToken(previousCandToken_,previousLevelCands);
194  Handle<BeamSpot> recoBeamSpotHandle;
195  iEvent.getByToken(beamspotToken_,recoBeamSpotHandle);
196  beamSpot = *recoBeamSpotHandle;
197 
198  // Needed for DCA calculation
199  ESHandle<MagneticField> bFieldHandle;
200  iSetup.get<IdealMagneticFieldRecord>().get(bFieldHandle);
201 
202  // needed to compare to L2
203  vector<RecoChargedCandidateRef> vl2cands;
204  previousLevelCands->getObjects(TriggerMuon,vl2cands);
205 
206  // look at all mucands, check cuts and add to filter object
207  int n = 0;
208  double e1,e2,e3;
210 
211  auto L2toL3s_it1 = L2toL3s.begin();
212  auto L2toL3s_end = L2toL3s.end();
213  bool atLeastOneTriplet=false;
214  for (; L2toL3s_it1!=L2toL3s_end; ++L2toL3s_it1){
215 
216  if (!triggeredByLevel2(L2toL3s_it1->first,vl2cands)) continue;
217 
218  //loop over the L3Tk reconstructed for this L2.
219  unsigned int iTk1=0;
220  unsigned int maxItk1=L2toL3s_it1->second.size();
221  for (; iTk1!=maxItk1; iTk1++){
222  bool thisL3Index1isDone=false;
223  RecoChargedCandidateRef & cand1=L2toL3s_it1->second[iTk1];
224  TrackRef tk1 = cand1->get<TrackRef>();
225  // eta cut
226  LogDebug("HLTMuonTrimuonL3Filter") << " 1st muon in loop: q*pt= "
227  << tk1->charge()*tk1->pt() << " (" << cand1->charge()*cand1->pt()<< ") " << ", eta= " << tk1->eta() << " (" << cand1->eta() << ") " << ", hits= " << tk1->numberOfValidHits();
228 
229  if (fabs(cand1->eta())>max_Eta_) continue;
230 
231  // cut on number of hits
232  if (tk1->numberOfValidHits()<min_Nhits_) continue;
233 
234  //dr cut
235  // if (fabs(tk1->d0())>max_Dr_) continue;
236  if (fabs( (- (cand1->vx()-beamSpot.x0()) * cand1->py() + (cand1->vy()-beamSpot.y0()) * cand1->px() ) / cand1->pt() ) >max_Dr_) continue;
237 
238  //dz cut
239  if (fabs((cand1->vz()-beamSpot.z0()) - ((cand1->vx()-beamSpot.x0())*cand1->px()+(cand1->vy()-beamSpot.y0())*cand1->py())/cand1->pt() * cand1->pz()/cand1->pt())>max_Dz_) continue;
240 
241  // Pt threshold cut
242  double pt1 = cand1->pt();
243  // double err1 = tk1->error(0);
244  // double abspar1 = fabs(tk1->parameter(0));
245  double ptLx1 = pt1;
246  // Don't convert to 90% efficiency threshold
247  LogDebug("HLTMuonTrimuonL3Filter") << " ... 1st muon in loop, pt1= "
248  << pt1 << ", ptLx1= " << ptLx1;
249  auto L2toL3s_it2 = L2toL3s_it1;
250  L2toL3s_it2++;
251  for (; L2toL3s_it2!=L2toL3s_end; ++L2toL3s_it2){
252  if (!triggeredByLevel2(L2toL3s_it2->first,vl2cands)) continue;
253 
254  //loop over the L3Tk reconstructed for this L2.
255  unsigned int iTk2=0;
256  unsigned int maxItk2=L2toL3s_it2->second.size();
257  for (; iTk2!=maxItk2; iTk2++){
258  RecoChargedCandidateRef & cand2=L2toL3s_it2->second[iTk2];
259  TrackRef tk2 = cand2->get<TrackRef>();
260 
261  // eta cut
262  LogDebug("HLTMuonTrimuonL3Filter") << " 2nd muon in loop: q*pt= " << tk2->charge()*tk2->pt() << " (" << cand2->charge()*cand2->pt() << ") " << ", eta= " << tk2->eta() << " (" << cand2->eta() << ") " << ", hits= " << tk2->numberOfValidHits() << ", d0= " << tk2->d0() ;
263  if (fabs(cand2->eta())>max_Eta_) continue;
264 
265  // cut on number of hits
266  if (tk2->numberOfValidHits()<min_Nhits_) continue;
267 
268  //dr cut
269  // if (fabs(tk2->d0())>max_Dr_) continue;
270  if (fabs( (- (cand2->vx()-beamSpot.x0()) * cand2->py() + (cand2->vy()-beamSpot.y0()) * cand2->px() ) / cand2->pt() ) >max_Dr_) continue;
271 
272  //dz cut
273  if (fabs((cand2->vz()-beamSpot.z0()) - ((cand2->vx()-beamSpot.x0())*cand2->px()+(cand2->vy()-beamSpot.y0())*cand2->py())/cand2->pt() * cand2->pz()/cand2->pt())>max_Dz_) continue;
274 
275  // Pt threshold cut
276  double pt2 = cand2->pt();
277  // double err2 = tk2->error(0);
278  // double abspar2 = fabs(tk2->parameter(0));
279  double ptLx2 = pt2;
280  // Don't convert to 90% efficiency threshold
281  LogDebug("HLTMuonTrimuonL3Filter") << " ... 2nd muon in loop, pt2= "
282  << pt2 << ", ptLx2= " << ptLx2;
283 
284  auto L2toL3s_it3 = L2toL3s_it2;
285  L2toL3s_it3++;
286  for (; L2toL3s_it3!=L2toL3s_end; ++L2toL3s_it3){
287 
288  if (!triggeredByLevel2(L2toL3s_it3->first,vl2cands)) continue;
289 
290  //loop over the L3Tk reconstructed for this L2.
291  unsigned int iTk3=0;
292  unsigned int maxItk3=L2toL3s_it3->second.size();
293  for (; iTk3!=maxItk3; iTk3++){
294  RecoChargedCandidateRef & cand3=L2toL3s_it3->second[iTk3];
295  TrackRef tk3 = cand3->get<TrackRef>();
296  // eta cut
297  LogDebug("HLTMuonTrimuonL3Filter") << " 3rd muon in loop: q*pt= "
298  << tk3->charge()*tk3->pt() << " (" << cand3->charge()*cand3->pt()<< ") " << ", eta= " << tk3->eta() << " (" << cand3->eta() << ") " << ", hits= " << tk3->numberOfValidHits();
299 
300  if (fabs(cand3->eta())>max_Eta_) continue;
301 
302  // cut on number of hits
303  if (tk3->numberOfValidHits()<min_Nhits_) continue;
304 
305  //dr cut
306  // if (fabs(tk1->d0())>max_Dr_) continue;
307  if (fabs( (- (cand3->vx()-beamSpot.x0()) * cand3->py() + (cand3->vy()-beamSpot.y0()) * cand3->px() ) / cand3->pt() ) >max_Dr_) continue;
308 
309  //dz cut
310  if (fabs((cand3->vz()-beamSpot.z0()) - ((cand3->vx()-beamSpot.x0())*cand3->px()+(cand3->vy()-beamSpot.y0())*cand3->py())/cand3->pt() * cand3->pz()/cand3->pt())>max_Dz_) continue;
311 
312  // Pt threshold cut
313  double pt3 = cand3->pt();
314  // double err3 = tk3->error(0);
315  // double abspar3 = fabs(tk3->parameter(0));
316  double ptLx3 = pt3;
317  // Don't convert to 90% efficiency threshold
318  LogDebug("HLTMuonTrimuonL3Filter") << " ... 3rd muon in loop, pt3= "
319  << pt3 << ", ptLx3= " << ptLx3;
320 
321  if (ptLx1>ptLx2 && ptLx1>ptLx3 && ptLx1<min_PtMax_) continue;
322  else if (ptLx2>ptLx1 && ptLx2>ptLx3 && ptLx2<min_PtMax_) continue;
323  else if (ptLx3<ptLx2 && ptLx3>ptLx1 && ptLx3<min_PtMax_) continue;
324 
325  if (ptLx1<ptLx2 && ptLx1<ptLx3 && ptLx1<min_PtMin_) continue;
326  else if (ptLx2<ptLx1 && ptLx2<ptLx3 && ptLx2<min_PtMin_) continue;
327  else if (ptLx3<ptLx2 && ptLx3<ptLx1 && ptLx3<min_PtMin_) continue;
328 
329  if (chargeOpt_>0) {
330  if (abs (cand1->charge()+cand2->charge()+cand3->charge()) != chargeOpt_) continue;
331  }
332 
333  // Acoplanarity
334  double acop = fabs(cand1->phi()-cand2->phi());
335  if (acop>M_PI) acop = 2*M_PI - acop;
336  acop = M_PI - acop;
337  LogDebug("HLTMuonTrimuonL3Filter") << " ... 1-2 acop= " << acop;
338  if (acop<min_Acop_) continue;
339  if (acop>max_Acop_) continue;
340 
341  acop = fabs(cand1->phi()-cand3->phi());
342  if (acop>M_PI) acop = 2*M_PI - acop;
343  acop = M_PI - acop;
344  LogDebug("HLTMuonTrimuonL3Filter") << " ... 1-3 acop= " << acop;
345  if (acop<min_Acop_) continue;
346  if (acop>max_Acop_) continue;
347 
348  acop = fabs(cand3->phi()-cand2->phi());
349  if (acop>M_PI) acop = 2*M_PI - acop;
350  acop = M_PI - acop;
351  LogDebug("HLTMuonTrimuonL3Filter") << " ... 3-2 acop= " << acop;
352  if (acop<min_Acop_) continue;
353  if (acop>max_Acop_) continue;
354 
355  // Pt balance
356  double ptbalance = fabs(cand1->pt()-cand2->pt());
357  if (ptbalance<min_PtBalance_) continue;
358  if (ptbalance>max_PtBalance_) continue;
359  ptbalance = fabs(cand1->pt()-cand3->pt());
360  if (ptbalance<min_PtBalance_) continue;
361  if (ptbalance>max_PtBalance_) continue;
362  ptbalance = fabs(cand3->pt()-cand2->pt());
363  if (ptbalance<min_PtBalance_) continue;
364  if (ptbalance>max_PtBalance_) continue;
365 
366  // Combined trimuon system
367  e1 = sqrt(cand1->momentum().Mag2()+MuMass2);
368  e2 = sqrt(cand2->momentum().Mag2()+MuMass2);
369  e3 = sqrt(cand3->momentum().Mag2()+MuMass2);
370  p1 = Particle::LorentzVector(cand1->px(),cand1->py(),cand1->pz(),e1);
371  p2 = Particle::LorentzVector(cand2->px(),cand2->py(),cand2->pz(),e2);
372  p3 = Particle::LorentzVector(cand3->px(),cand3->py(),cand3->pz(),e3);
373  p = p1+p2+p3;
374 
375  double pt123 = p.pt();
376  LogDebug("HLTMuonTrimuonL3Filter") << " ... 1-2 pt123= " << pt123;
377  if (pt123<min_PtTriplet_) continue;
378 
379  double invmass = abs(p.mass());
380  // if (invmass>0) invmass = sqrt(invmass); else invmass = 0;
381  LogDebug("HLTMuonTrimuonL3Filter") << " ... 1-2 invmass= " << invmass;
382  if (invmass<min_InvMass_) continue;
383  if (invmass>max_InvMass_) continue;
384 
385  // Delta Z between the two muons
386  //double DeltaZMuMu = fabs(tk2->dz(beamSpot.position())-tk1->dz(beamSpot.position()));
387  //if ( DeltaZMuMu > max_DzMuMu_) continue;
388 
389  // DCA between the three muons
390  TransientTrack mu1TT(*tk1, &(*bFieldHandle));
391  TransientTrack mu2TT(*tk2, &(*bFieldHandle));
392  TransientTrack mu3TT(*tk3, &(*bFieldHandle));
396  if (mu1TS.isValid() && mu2TS.isValid() && mu3TS.isValid()) {
398  cApp.calculate(mu1TS.theState(), mu2TS.theState());
399  if (!cApp.status()
400  || cApp.distance() > max_DCAMuMu_) continue;
401  cApp.calculate(mu1TS.theState(), mu3TS.theState());
402  if (!cApp.status()
403  || cApp.distance() > max_DCAMuMu_) continue;
404  cApp.calculate(mu3TS.theState(), mu2TS.theState());
405  if (!cApp.status()
406  || cApp.distance() > max_DCAMuMu_) continue;
407  }
408 
409  // Max dimuon |rapidity|
410  double rapidity = fabs(p.Rapidity());
411  if ( rapidity > max_YTriplet_) continue;
412 
413  // Add this triplet
414  n++;
415  LogDebug("HLTMuonTrimuonL3Filter") << " Track1 passing filter: pt= " << cand1->pt() << ", eta: " << cand1->eta();
416  LogDebug("HLTMuonTrimuonL3Filter") << " Track2 passing filter: pt= " << cand2->pt() << ", eta: " << cand2->eta();
417  LogDebug("HLTMuonTrimuonL3Filter") << " Track2 passing filter: pt= " << cand3->pt() << ", eta: " << cand3->eta();
418  LogDebug("HLTMuonTrimuonL3Filter") << " Invmass= " << invmass;
419 
420  bool i1done = false;
421  bool i2done = false;
422  bool i3done = false;
423  vector<RecoChargedCandidateRef> vref;
424  filterproduct.getObjects(TriggerMuon,vref);
425  for (auto & i : vref) {
427  TrackRef tktmp = candref->get<TrackRef>();
428  if (tktmp==tk1) {
429  i1done = true;
430  } else if (tktmp==tk2) {
431  i2done = true;
432  } else if (tktmp==tk3) {
433  i3done = true;
434  }
435  if (i1done && i2done && i3done) break;
436  }
437 
438  if (!i1done) {
439  filterproduct.addObject(TriggerMuon,cand1);
440  }
441  if (!i2done) {
442  filterproduct.addObject(TriggerMuon,cand2);
443  }
444  if (!i3done) {
445  filterproduct.addObject(TriggerMuon,cand3);
446  }
447 
448  //break anyway since a L3 track triplet has been found matching the criteria
449  thisL3Index1isDone=true;
450  atLeastOneTriplet=true;
451  break;
452  }//loop on the track of the third L2
453  //break the loop if fast accept.
454  if (atLeastOneTriplet && fast_Accept_) break;
455  }//loop on the third L2
456  }//loop on the track of the second L2
457  //break the loop if fast accept.
458  if (atLeastOneTriplet && fast_Accept_) break;
459  }//loop on the second L2
460 
461 
462  //break the loop if fast accept.
463  if (atLeastOneTriplet && fast_Accept_) break;
464  if (thisL3Index1isDone) break;
465  }//loop on tracks for first L2
466  //break the loop if fast accept.
467  if (atLeastOneTriplet && fast_Accept_) break;
468  }//loop on the first L2
469 
470  // filter decision
471  const bool accept (n >= 1);
472 
473  LogDebug("HLTMuonTrimuonL3Filter") << " >>>>> Result of HLTMuonTrimuonL3Filter is "<< accept << ", number of muon triplets passing thresholds= " << n;
474 
475  return accept;
476 }
477 
478 
479 bool
480 HLTMuonTrimuonL3Filter::triggeredByLevel2(const TrackRef& staTrack,vector<RecoChargedCandidateRef>& vcands)
481 {
482  bool ok=false;
483  for (auto & vcand : vcands) {
484  if ( vcand->get<TrackRef>() == staTrack ) {
485  ok=true;
486  LogDebug("HLTMuonL3PreFilter") << "The L2 track triggered";
487  break;
488  }
489  }
490  return ok;
491 }
492 
493 // declare this class as a framework plugin
#define LogDebug(id)
double z0() const
z coordinate
Definition: BeamSpot.h:68
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
HLTMuonTrimuonL3Filter(const edm::ParameterSet &)
float distance() const override
void getObjects(Vids &ids, VRphoton &refs) const
various physics-level getters:
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:517
TrajectoryStateClosestToPoint impactPointTSCP() const
const FreeTrajectoryState & theState() const
static bool triggeredByLevel2(const reco::TrackRef &track, std::vector< reco::RecoChargedCandidateRef > &vcands)
edm::Ref< RecoChargedCandidateCollection > RecoChargedCandidateRef
reference to an object in a collection of RecoChargedCandidate objects
double phi() const
azimuthal angle of momentum vector
Definition: TrackBase.h:684
bool accept(const edm::Event &event, const edm::TriggerResults &triggerTable, const std::string &triggerPath)
Definition: TopDQMHelpers.h:30
std::string encode() const
Definition: InputTag.cc:159
std::vector< MuonTrackLinks > MuonTrackLinksCollection
collection of MuonTrackLinks
Definition: MuonFwd.h:22
void addObject(int id, const reco::RecoEcalCandidateRef &ref)
setters for L3 collections: (id=physics type, and Ref<C>)
edm::EDGetTokenT< reco::BeamSpot > beamspotToken_
int iEvent
Definition: GenABIO.cc:224
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
double eta() const
pseudorapidity of momentum vector
Definition: TrackBase.h:690
bool status() const override
bool calculate(const TrajectoryStateOnSurface &sta, const TrajectoryStateOnSurface &stb) override
T sqrt(T t)
Definition: SSEVec.h:18
double pt() const
track transverse momentum
Definition: TrackBase.h:660
~HLTMuonTrimuonL3Filter() override
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
T const * get() const
Returns C++ pointer to the item.
Definition: Ref.h:243
ParameterDescriptionBase * add(U const &iLabel, T const &value)
double p2[4]
Definition: TauolaWrapper.h:90
#define M_PI
const edm::EDGetTokenT< reco::MuonTrackLinksCollection > linkToken_
std::vector< RecoChargedCandidate > RecoChargedCandidateCollection
collectin of RecoChargedCandidate objects
edm::EDGetTokenT< trigger::TriggerFilterObjectWithRefs > previousCandToken_
constexpr auto deltaR2(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
Definition: deltaR.h:16
static void makeHLTFilterDescription(edm::ParameterSetDescription &desc)
Definition: HLTFilter.cc:29
bool hltFilter(edm::Event &, const edm::EventSetup &, trigger::TriggerFilterObjectWithRefs &filterproduct) const override
void addCollectionTag(const edm::InputTag &collectionTag)
collectionTags
void add(std::string const &label, ParameterSetDescription const &psetDescription)
fixed size matrix
bool saveTags() const
Definition: HLTFilter.h:45
HLT enums.
double p1[4]
Definition: TauolaWrapper.h:89
double a
Definition: hdecay.h:121
T get() const
Definition: EventSetup.h:71
double y0() const
y coordinate
Definition: BeamSpot.h:66
edm::EDGetTokenT< reco::RecoChargedCandidateCollection > candToken_
math::PtEtaPhiELorentzVectorF LorentzVector
double p3[4]
Definition: TauolaWrapper.h:91
double x0() const
x coordinate
Definition: BeamSpot.h:64