CMS 3D CMS Logo

List of all members | Public Member Functions | Static Public Member Functions | Static Private Member Functions | Private Attributes
HLTMuonTrimuonL3Filter Class Reference

#include <HLTMuonTrimuonL3Filter.h>

Inheritance diagram for HLTMuonTrimuonL3Filter:
HLTFilter edm::global::EDFilter<> edm::global::EDFilterBase edm::ProducerBase edm::EDConsumerBase edm::ProductRegistryHelper

Public Member Functions

bool hltFilter (edm::Event &, const edm::EventSetup &, trigger::TriggerFilterObjectWithRefs &filterproduct) const override
 
 HLTMuonTrimuonL3Filter (const edm::ParameterSet &)
 
 ~HLTMuonTrimuonL3Filter () override
 
- Public Member Functions inherited from HLTFilter
 HLTFilter (const edm::ParameterSet &config)
 
int module (edm::Event const &) const
 
const std::string * moduleLabel () const
 
int path (edm::Event const &) const
 
const std::string * pathName (edm::Event const &) const
 
std::pair< int, int > pmid (edm::Event const &) const
 
bool saveTags () const
 
 ~HLTFilter () override
 
- Public Member Functions inherited from edm::global::EDFilter<>
 EDFilter ()=default
 
bool hasAbilityToProduceInLumis () const final
 
bool hasAbilityToProduceInRuns () const final
 
bool wantsGlobalLuminosityBlocks () const final
 
bool wantsGlobalRuns () const final
 
bool wantsStreamLuminosityBlocks () const final
 
bool wantsStreamRuns () const final
 
- Public Member Functions inherited from edm::global::EDFilterBase
 EDFilterBase ()
 
ModuleDescription const & moduleDescription () const
 
 ~EDFilterBase () override
 
- Public Member Functions inherited from edm::ProducerBase
void callWhenNewProductsRegistered (std::function< void(BranchDescription const &)> const &func)
 
std::vector< edm::ProductResolverIndex > const & indiciesForPutProducts (BranchType iBranchType) const
 
 ProducerBase ()
 
std::vector< edm::ProductResolverIndex > const & putTokenIndexToProductResolverIndex () const
 
void registerProducts (ProducerBase *, ProductRegistry *, ModuleDescription const &)
 
std::function< void(BranchDescription const &)> registrationCallback () const
 used by the fwk to register list of products More...
 
void resolvePutIndicies (BranchType iBranchType, ModuleToResolverIndicies const &iIndicies, std::string const &moduleLabel)
 
 ~ProducerBase () noexcept(false) override
 
- Public Member Functions inherited from edm::EDConsumerBase
std::vector< ConsumesInfoconsumesInfo () const
 
void convertCurrentProcessAlias (std::string const &processName)
 Convert "@currentProcess" in InputTag process names to the actual current process name. More...
 
 EDConsumerBase ()
 
 EDConsumerBase (EDConsumerBase const &)=delete
 
 EDConsumerBase (EDConsumerBase &&)=default
 
ESProxyIndex const * esGetTokenIndices (edm::Transition iTrans) const
 
ProductResolverIndexAndSkipBit indexFrom (EDGetToken, BranchType, TypeID const &) const
 
void itemsMayGet (BranchType, std::vector< ProductResolverIndexAndSkipBit > &) const
 
void itemsToGet (BranchType, std::vector< ProductResolverIndexAndSkipBit > &) const
 
std::vector< ProductResolverIndexAndSkipBit > const & itemsToGetFrom (BranchType iType) const
 
void labelsForToken (EDGetToken iToken, Labels &oLabels) const
 
void modulesWhoseProductsAreConsumed (std::vector< ModuleDescription const * > &modules, ProductRegistry const &preg, std::map< std::string, ModuleDescription const * > const &labelsToDesc, std::string const &processName) const
 
EDConsumerBase const & operator= (EDConsumerBase const &)=delete
 
EDConsumerBaseoperator= (EDConsumerBase &&)=default
 
bool registeredToConsume (ProductResolverIndex, bool, BranchType) const
 
bool registeredToConsumeMany (TypeID const &, BranchType) const
 
ProductResolverIndexAndSkipBit uncheckedIndexFrom (EDGetToken) const
 
void updateLookup (BranchType iBranchType, ProductResolverIndexHelper const &, bool iPrefetchMayGet)
 
void updateLookup (eventsetup::ESRecordsToProxyIndices const &)
 
virtual ~EDConsumerBase () noexcept(false)
 

Static Public Member Functions

static void fillDescriptions (edm::ConfigurationDescriptions &descriptions)
 
- Static Public Member Functions inherited from HLTFilter
static void makeHLTFilterDescription (edm::ParameterSetDescription &desc)
 
- Static Public Member Functions inherited from edm::global::EDFilterBase
static const std::string & baseType ()
 
static void fillDescriptions (ConfigurationDescriptions &descriptions)
 
static void prevalidate (ConfigurationDescriptions &descriptions)
 

Static Private Member Functions

static bool triggeredByLevel2 (const reco::TrackRef &track, std::vector< reco::RecoChargedCandidateRef > &vcands)
 

Private Attributes

edm::InputTag beamspotTag_
 
edm::EDGetTokenT< reco::BeamSpotbeamspotToken_
 
edm::InputTag candTag_
 
edm::EDGetTokenT< reco::RecoChargedCandidateCollectioncandToken_
 
int chargeOpt_
 
bool fast_Accept_
 
const edm::EDGetTokenT< reco::MuonTrackLinksCollectionlinkToken_
 
double max_Acop_
 
double max_DCAMuMu_
 
double max_Dr_
 
double max_Dz_
 
double max_Eta_
 
double max_InvMass_
 
double max_PtBalance_
 
double max_YTriplet_
 
double min_Acop_
 
double min_InvMass_
 
int min_Nhits_
 
double min_PtBalance_
 
double min_PtMax_
 
double min_PtMin_
 
double min_PtTriplet_
 
double nsigma_Pt_
 
edm::InputTag previousCandTag_
 
edm::EDGetTokenT< trigger::TriggerFilterObjectWithRefspreviousCandToken_
 
const edm::InputTag theL3LinksLabel
 

Additional Inherited Members

- Public Types inherited from edm::global::EDFilterBase
typedef EDFilterBase ModuleType
 
- Public Types inherited from edm::ProducerBase
using ModuleToResolverIndicies = std::unordered_multimap< std::string, std::tuple< edm::TypeID const *, const char *, edm::ProductResolverIndex >>
 
typedef ProductRegistryHelper::TypeLabelList TypeLabelList
 
- Public Types inherited from edm::EDConsumerBase
typedef ProductLabels Labels
 
- Protected Member Functions inherited from edm::EDConsumerBase
template<typename ProductType , BranchType B = InEvent>
EDGetTokenT< ProductType > consumes (edm::InputTag const &tag)
 
EDGetToken consumes (const TypeToGet &id, edm::InputTag const &tag)
 
template<BranchType B>
EDGetToken consumes (TypeToGet const &id, edm::InputTag const &tag)
 
ConsumesCollector consumesCollector ()
 Use a ConsumesCollector to gather consumes information from helper functions. More...
 
template<typename ProductType , BranchType B = InEvent>
void consumesMany ()
 
void consumesMany (const TypeToGet &id)
 
template<BranchType B>
void consumesMany (const TypeToGet &id)
 
template<typename ESProduct , typename ESRecord , Transition Tr = Transition::Event>
auto esConsumes ()
 
template<typename ESProduct , typename ESRecord , Transition Tr = Transition::Event>
auto esConsumes (ESInputTag const &tag)
 
template<typename ProductType , BranchType B = InEvent>
EDGetTokenT< ProductType > mayConsume (edm::InputTag const &tag)
 
EDGetToken mayConsume (const TypeToGet &id, edm::InputTag const &tag)
 
template<BranchType B>
EDGetToken mayConsume (const TypeToGet &id, edm::InputTag const &tag)
 

Detailed Description

See header file for documentation

Author
J. Alcaraz, P. Garcia

This class is an HLTFilter (-> EDFilter) implementing a muon triplet filter for HLT muons

Author
J. Alcaraz

Definition at line 25 of file HLTMuonTrimuonL3Filter.h.

Constructor & Destructor Documentation

HLTMuonTrimuonL3Filter::HLTMuonTrimuonL3Filter ( const edm::ParameterSet iConfig)
explicit

Definition at line 45 of file HLTMuonTrimuonL3Filter.cc.

References candTag_, chargeOpt_, edm::InputTag::encode(), fast_Accept_, LogDebug, max_Acop_, max_DCAMuMu_, max_Dr_, max_Dz_, max_Eta_, max_InvMass_, max_PtBalance_, max_YTriplet_, min_Acop_, min_InvMass_, min_Nhits_, min_PtBalance_, min_PtMax_, min_PtMin_, min_PtTriplet_, nsigma_Pt_, and ~HLTMuonTrimuonL3Filter().

45  : HLTFilter(iConfig),
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 }
#define LogDebug(id)
T getParameter(std::string const &) const
const edm::InputTag theL3LinksLabel
std::string encode() const
Definition: InputTag.cc:159
edm::EDGetTokenT< reco::BeamSpot > beamspotToken_
const edm::EDGetTokenT< reco::MuonTrackLinksCollection > linkToken_
HLTFilter(const edm::ParameterSet &config)
Definition: HLTFilter.cc:20
edm::EDGetTokenT< trigger::TriggerFilterObjectWithRefs > previousCandToken_
edm::EDGetTokenT< reco::RecoChargedCandidateCollection > candToken_
HLTMuonTrimuonL3Filter::~HLTMuonTrimuonL3Filter ( )
overridedefault

Referenced by HLTMuonTrimuonL3Filter().

Member Function Documentation

void HLTMuonTrimuonL3Filter::fillDescriptions ( edm::ConfigurationDescriptions descriptions)
static

Definition at line 95 of file HLTMuonTrimuonL3Filter.cc.

References edm::ConfigurationDescriptions::add(), edm::ParameterSetDescription::add(), and HLTFilter::makeHLTFilterDescription().

95  {
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 }
ParameterDescriptionBase * add(U const &iLabel, T const &value)
static void makeHLTFilterDescription(edm::ParameterSetDescription &desc)
Definition: HLTFilter.cc:29
void add(std::string const &label, ParameterSetDescription const &psetDescription)
bool HLTMuonTrimuonL3Filter::hltFilter ( edm::Event iEvent,
const edm::EventSetup iSetup,
trigger::TriggerFilterObjectWithRefs filterproduct 
) const
overridevirtual

Implements HLTFilter.

Definition at line 129 of file HLTMuonTrimuonL3Filter.cc.

References a, funct::abs(), accept(), trigger::TriggerFilterObjectWithRefs::addCollectionTag(), trigger::TriggerRefsCollections::addObject(), ecalDrivenElectronSeedsParameters_cff::beamSpot, beamspotToken_, ClosestApproachInRPhi::calculate(), candTag_, candToken_, chargeOpt_, reco::deltaR2(), ClosestApproachInRPhi::distance(), SiPixelPhase1TrackClustersV_cfi::e3, reco::TrackBase::eta(), fast_Accept_, edm::EventSetup::get(), edm::Ref< C, T, F >::get(), edm::Event::getByToken(), trigger::TriggerRefsCollections::getObjects(), cutBasedMuonId_MuonPOG_V0_cff::globalTrack, mps_fire::i, reco::TransientTrack::impactPointTSCP(), TrajectoryStateClosestToPoint::isValid(), linkToken_, LogDebug, M_PI, max_Acop_, max_DCAMuMu_, max_Dr_, max_Dz_, max_Eta_, max_InvMass_, max_PtBalance_, max_YTriplet_, findQualityFiles::maxI, min_Acop_, min_InvMass_, min_Nhits_, min_PtBalance_, min_PtMax_, min_PtMin_, min_PtTriplet_, gen::n, AlCaHLTBitMon_ParallelJobs::p, p1, p2, p3, reco::TrackBase::phi(), previousCandToken_, reco::TrackBase::pt(), hiDetachedQuadStep_cff::pt1, hiDetachedQuadStep_cff::pt2, HLTFilter::saveTags(), mathSSE::sqrt(), ClosestApproachInRPhi::status(), TrajectoryStateClosestToPoint::theState(), triggeredByLevel2(), trigger::TriggerMuon, reco::BeamSpot::x0(), reco::BeamSpot::y0(), and reco::BeamSpot::z0().

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));
393  TrajectoryStateClosestToPoint mu1TS = mu1TT.impactPointTSCP();
394  TrajectoryStateClosestToPoint mu2TS = mu2TT.impactPointTSCP();
395  TrajectoryStateClosestToPoint mu3TS = mu3TT.impactPointTSCP();
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 }
#define LogDebug(id)
double z0() const
z coordinate
Definition: BeamSpot.h:68
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
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
void addObject(int id, const reco::RecoEcalCandidateRef &ref)
setters for L3 collections: (id=physics type, and Ref<C>)
edm::EDGetTokenT< reco::BeamSpot > beamspotToken_
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
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
double p2[4]
Definition: TauolaWrapper.h:90
#define M_PI
const edm::EDGetTokenT< reco::MuonTrackLinksCollection > linkToken_
edm::EDGetTokenT< trigger::TriggerFilterObjectWithRefs > previousCandToken_
constexpr auto deltaR2(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
Definition: deltaR.h:16
void addCollectionTag(const edm::InputTag &collectionTag)
collectionTags
bool saveTags() const
Definition: HLTFilter.h:45
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
bool HLTMuonTrimuonL3Filter::triggeredByLevel2 ( const reco::TrackRef track,
std::vector< reco::RecoChargedCandidateRef > &  vcands 
)
staticprivate

Definition at line 480 of file HLTMuonTrimuonL3Filter.cc.

References DEFINE_FWK_MODULE, LogDebug, and convertSQLiteXML::ok.

Referenced by hltFilter().

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 }
#define LogDebug(id)

Member Data Documentation

edm::InputTag HLTMuonTrimuonL3Filter::beamspotTag_
private

Definition at line 36 of file HLTMuonTrimuonL3Filter.h.

edm::EDGetTokenT<reco::BeamSpot> HLTMuonTrimuonL3Filter::beamspotToken_
private

Definition at line 37 of file HLTMuonTrimuonL3Filter.h.

Referenced by hltFilter().

edm::InputTag HLTMuonTrimuonL3Filter::candTag_
private

Definition at line 38 of file HLTMuonTrimuonL3Filter.h.

Referenced by hltFilter(), and HLTMuonTrimuonL3Filter().

edm::EDGetTokenT<reco::RecoChargedCandidateCollection> HLTMuonTrimuonL3Filter::candToken_
private

Definition at line 39 of file HLTMuonTrimuonL3Filter.h.

Referenced by hltFilter().

int HLTMuonTrimuonL3Filter::chargeOpt_
private

Definition at line 48 of file HLTMuonTrimuonL3Filter.h.

Referenced by hltFilter(), and HLTMuonTrimuonL3Filter().

bool HLTMuonTrimuonL3Filter::fast_Accept_
private

Definition at line 43 of file HLTMuonTrimuonL3Filter.h.

Referenced by hltFilter(), and HLTMuonTrimuonL3Filter().

const edm::EDGetTokenT<reco::MuonTrackLinksCollection> HLTMuonTrimuonL3Filter::linkToken_
private

Definition at line 62 of file HLTMuonTrimuonL3Filter.h.

Referenced by hltFilter().

double HLTMuonTrimuonL3Filter::max_Acop_
private

Definition at line 55 of file HLTMuonTrimuonL3Filter.h.

Referenced by hltFilter(), and HLTMuonTrimuonL3Filter().

double HLTMuonTrimuonL3Filter::max_DCAMuMu_
private

Definition at line 59 of file HLTMuonTrimuonL3Filter.h.

Referenced by hltFilter(), and HLTMuonTrimuonL3Filter().

double HLTMuonTrimuonL3Filter::max_Dr_
private

Definition at line 46 of file HLTMuonTrimuonL3Filter.h.

Referenced by hltFilter(), and HLTMuonTrimuonL3Filter().

double HLTMuonTrimuonL3Filter::max_Dz_
private

Definition at line 47 of file HLTMuonTrimuonL3Filter.h.

Referenced by hltFilter(), and HLTMuonTrimuonL3Filter().

double HLTMuonTrimuonL3Filter::max_Eta_
private

Definition at line 44 of file HLTMuonTrimuonL3Filter.h.

Referenced by hltFilter(), and HLTMuonTrimuonL3Filter().

double HLTMuonTrimuonL3Filter::max_InvMass_
private

Definition at line 53 of file HLTMuonTrimuonL3Filter.h.

Referenced by hltFilter(), and HLTMuonTrimuonL3Filter().

double HLTMuonTrimuonL3Filter::max_PtBalance_
private

Definition at line 57 of file HLTMuonTrimuonL3Filter.h.

Referenced by hltFilter(), and HLTMuonTrimuonL3Filter().

double HLTMuonTrimuonL3Filter::max_YTriplet_
private

Definition at line 60 of file HLTMuonTrimuonL3Filter.h.

Referenced by hltFilter(), and HLTMuonTrimuonL3Filter().

double HLTMuonTrimuonL3Filter::min_Acop_
private

Definition at line 54 of file HLTMuonTrimuonL3Filter.h.

Referenced by hltFilter(), and HLTMuonTrimuonL3Filter().

double HLTMuonTrimuonL3Filter::min_InvMass_
private

Definition at line 52 of file HLTMuonTrimuonL3Filter.h.

Referenced by hltFilter(), and HLTMuonTrimuonL3Filter().

int HLTMuonTrimuonL3Filter::min_Nhits_
private

Definition at line 45 of file HLTMuonTrimuonL3Filter.h.

Referenced by hltFilter(), and HLTMuonTrimuonL3Filter().

double HLTMuonTrimuonL3Filter::min_PtBalance_
private

Definition at line 56 of file HLTMuonTrimuonL3Filter.h.

Referenced by hltFilter(), and HLTMuonTrimuonL3Filter().

double HLTMuonTrimuonL3Filter::min_PtMax_
private

Definition at line 50 of file HLTMuonTrimuonL3Filter.h.

Referenced by hltFilter(), and HLTMuonTrimuonL3Filter().

double HLTMuonTrimuonL3Filter::min_PtMin_
private

Definition at line 51 of file HLTMuonTrimuonL3Filter.h.

Referenced by hltFilter(), and HLTMuonTrimuonL3Filter().

double HLTMuonTrimuonL3Filter::min_PtTriplet_
private

Definition at line 49 of file HLTMuonTrimuonL3Filter.h.

Referenced by hltFilter(), and HLTMuonTrimuonL3Filter().

double HLTMuonTrimuonL3Filter::nsigma_Pt_
private

Definition at line 58 of file HLTMuonTrimuonL3Filter.h.

Referenced by HLTMuonTrimuonL3Filter().

edm::InputTag HLTMuonTrimuonL3Filter::previousCandTag_
private

Definition at line 40 of file HLTMuonTrimuonL3Filter.h.

edm::EDGetTokenT<trigger::TriggerFilterObjectWithRefs> HLTMuonTrimuonL3Filter::previousCandToken_
private

Definition at line 41 of file HLTMuonTrimuonL3Filter.h.

Referenced by hltFilter().

const edm::InputTag HLTMuonTrimuonL3Filter::theL3LinksLabel
private

Definition at line 61 of file HLTMuonTrimuonL3Filter.h.