CMS 3D CMS Logo

TriggerMatcherToHLTDebug.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: MuonAnalysis/MuonAssociators
4 // Class: TriggerMatcherToHLTDebug
5 //
13 //
14 // Original Author: Cristina Botta (Torino), Giovanni Petrucciani (UCSD)
15 // Created: Fri 30 Apr 2010
16 //
17 
19 
21 
25 
28 
37 
38 //new for association map
46 
51 
59 
63 
65 public:
66  // Constructor
68 
70  ~TriggerMatcherToHLTDebug() override;
71 
72  // Operations
73  void produce(edm::Event &event, const edm::EventSetup &eventSetup) override;
74 
75 private:
76  typedef edm::AssociationMap<edm::OneToMany<std::vector<L2MuonTrajectorySeed>, std::vector<L2MuonTrajectorySeed> > >
78 
82 
84 
85  //ForL1Assoc
86  double deltaR_;
87 
88  //ForL1Quality
90 
91  //ForL2Filter
93  int min_N_L2;
94  double max_Eta_L2;
96  double max_Dr_L2;
97  double max_Dz_L2;
98  double min_Pt_L2;
99  double nsigma_Pt_L2;
100 
101  //ForL3Filter
102  int min_N_L3;
103  double max_Eta_L3;
105  double max_Dr_L3;
106  double max_Dz_L3;
107  double min_Pt_L3;
108  double nsigma_Pt_L3;
109 
116 
118  template <typename T>
121  const std::vector<T> &values,
122  const std::string &label) const;
123 };
124 
125 using namespace std;
126 using namespace edm;
127 using namespace l1extra;
128 using namespace reco;
129 
130 // Constructor
132  : tagToken_(consumes<View<reco::Muon> >(pset.getParameter<edm::InputTag>("tags"))),
133  l1Token_(consumes<L1MuonParticleCollection>(pset.getParameter<edm::InputTag>("l1s"))),
134  l1matcherSetup_(pset.getParameter<edm::ParameterSet>("l1matcherConfig"), consumesCollector()),
135  deltaR_(pset.getParameter<double>("deltaR")),
136  minL1Quality_(pset.getParameter<int32_t>("MinL1Quality")),
137  beamspotToken_(consumes<BeamSpot>(pset.getParameter<edm::InputTag>("BeamSpotTag"))),
138  min_N_L2(pset.getParameter<int>("MinN_L2")),
139  max_Eta_L2(pset.getParameter<double>("MaxEta_L2")),
140  min_Nhits_L2(pset.getParameter<int>("MinNhits_L2")),
141  max_Dr_L2(pset.getParameter<double>("MaxDr_L2")),
142  max_Dz_L2(pset.getParameter<double>("MaxDz_L2")),
143  min_Pt_L2(pset.getParameter<double>("MinPt_L2")),
144  nsigma_Pt_L2(pset.getParameter<double>("NSigmaPt_L2")),
145  min_N_L3(pset.getParameter<int>("MinN_L3")),
146  max_Eta_L3(pset.getParameter<double>("MaxEta_L3")),
147  min_Nhits_L3(pset.getParameter<int>("MinNhits_L3")),
148  max_Dr_L3(pset.getParameter<double>("MaxDr_L3")),
149  max_Dz_L3(pset.getParameter<double>("MaxDz_L3")),
150  min_Pt_L3(pset.getParameter<double>("MinPt_L3")),
151  nsigma_Pt_L3(pset.getParameter<double>("NSigmaPt_L3")),
152  seedMapToken_(consumes<SeedMap>(pset.getParameter<edm::InputTag>("SeedMapTag"))) {
153  theL2SeedsToken_ = consumes<L2MuonTrajectorySeedCollection>(pset.getParameter<InputTag>("L2Seeds_Collection"));
154  theL2MuonsToken_ = consumes<RecoChargedCandidateCollection>(pset.getParameter<InputTag>("L2Muons_Collection"));
155  theL3SeedsToken_ = consumes<L3MuonTrajectorySeedCollection>(pset.getParameter<InputTag>("L3Seeds_Collection"));
156  theL3TkTracksToken_ = consumes<TrackCollection>(pset.getParameter<InputTag>("L3TkTracks_Collection"));
157  theL3MuonsToken_ = consumes<RecoChargedCandidateCollection>(pset.getParameter<InputTag>("L3Muons_Collection"));
158 
159  metname = "TriggerMatcherToHLTDebug";
160 
161  produces<edm::ValueMap<int> >("propagatesToM2");
162  produces<edm::ValueMap<int> >("hasL1Particle");
163  produces<edm::ValueMap<int> >("hasL1Filtered");
164  produces<edm::ValueMap<int> >("hasL2Seed");
165  produces<edm::ValueMap<int> >("hasL2Muon");
166  produces<edm::ValueMap<int> >("hasL2MuonFiltered");
167  produces<edm::ValueMap<int> >("hasL3Seed");
168  produces<edm::ValueMap<int> >("hasL3Track");
169  produces<edm::ValueMap<int> >("hasL3Muon");
170  produces<edm::ValueMap<int> >("hasL3MuonFiltered");
171 
172  produces<edm::ValueMap<reco::CandidatePtr> >("l1Candidate");
173  produces<edm::ValueMap<reco::CandidatePtr> >("l2Candidate");
174  produces<edm::ValueMap<reco::CandidatePtr> >("l3Candidate");
175 }
176 
177 // Destructor
179 
180 // Analyzer
182  auto const l1matcher = l1matcherSetup_.init(eventSetup);
183 
185  event.getByToken(tagToken_, muons);
186 
188  event.getByToken(l1Token_, L1Muons);
189 
191  event.getByToken(theL2SeedsToken_, L2Seeds);
192 
194  event.getByToken(theL2MuonsToken_, L2Muons);
195 
197  event.getByToken(theL3SeedsToken_, L3Seeds);
198 
200  event.getByToken(theL3TkTracksToken_, L3TkTracks);
201 
203  event.getByToken(theL3MuonsToken_, L3Muons);
204 
205  //beam spot
207  Handle<BeamSpot> recoBeamSpotHandle;
208  event.getByToken(beamspotToken_, recoBeamSpotHandle);
209  beamSpot = *recoBeamSpotHandle;
210 
211  //new for the MAP!!!!
212  edm::Handle<SeedMap> seedMapHandle;
213  event.getByToken(seedMapToken_, seedMapHandle);
214 
215  size_t nmu = muons->size();
216  std::vector<int> propagatesToM2(nmu), hasL1Particle(nmu), hasL1Filtered(nmu);
217  std::vector<int> hasL2Seed(nmu), hasL2Muon(nmu), hasL2MuonFiltered(nmu);
218  std::vector<int> hasL3Seed(nmu), hasL3Track(nmu), hasL3TrackFiltered(nmu), hasL3Muon(nmu), hasL3MuonFiltered(nmu);
219  std::vector<reco::CandidatePtr> l1ptr(nmu), l2ptr(nmu), l3ptr(nmu);
220 
221  for (size_t i = 0; i < nmu; ++i) {
222  const reco::Muon &mu = (*muons)[i];
223 
224  // Propagate to muon station (using the L1 tool)
225  TrajectoryStateOnSurface stateAtMB2 = l1matcher.extrapolate(mu);
226  if (!stateAtMB2.isValid())
227  continue;
228  propagatesToM2[i] = 1;
229 
230  double etaTk = stateAtMB2.globalPosition().eta();
231  double phiTk = stateAtMB2.globalPosition().phi();
232  l1extra::L1MuonParticleCollection::const_iterator it;
233  L2MuonTrajectorySeedCollection::const_iterator iSeed;
234  L3MuonTrajectorySeedCollection::const_iterator iSeedL3;
235  RecoChargedCandidateCollection::const_iterator iL2Muon;
236  reco::TrackCollection::const_iterator tktrackL3;
237  RecoChargedCandidateCollection::const_iterator iL3Muon;
238 
239  reco::CandidatePtr thisL1, thisL2, thisL3;
240  for (it = L1Muons->begin(); it != L1Muons->end(); ++it) {
241  const L1MuGMTExtendedCand muonCand = (*it).gmtMuonCand();
242  unsigned int quality = muonCand.quality();
243 
244  double L1phi = (*it).phi();
245  double L1eta = (*it).eta();
246  double L1pt = (*it).pt();
247  double dR = deltaR(etaTk, phiTk, L1eta, L1phi);
248 
249  //CONDIZIONE-> CE NE E' UNA ASSOCIATA?
250  if (dR >= deltaR_)
251  continue;
252  thisL1 = reco::CandidatePtr(L1Muons, it - L1Muons->begin());
253  if (!hasL1Particle[i])
254  l1ptr[i] = thisL1; // if nobody reached L1 before, then we're the best L1 found up to now.
255  hasL1Particle[i]++;
256 
257  if ((quality <= 3) || (L1pt < 7))
258  continue;
259  if (!hasL1Filtered[i])
260  l1ptr[i] = thisL1; // if nobody reached L1 before, then we're the best L1 found up to now.
261  hasL1Filtered[i]++;
262 
263  if (!L2Seeds.isValid())
264  continue;
265  //LOOP SULLA COLLEZIONE DEI SEED
266  for (iSeed = L2Seeds->begin(); iSeed != L2Seeds->end(); ++iSeed) {
267  l1extra::L1MuonParticleRef l1FromSeed = iSeed->l1Particle();
268  if (l1FromSeed.id() != L1Muons.id())
269  throw cms::Exception("CorruptData")
270  << "You're using a different L1 collection than the one used by L2 seeds.\n";
271  if (l1FromSeed.key() != thisL1.key())
272  continue;
273  if (!hasL2Seed[i])
274  l1ptr[i] = thisL1; // if nobody reached here before, we're the best L1
275  hasL2Seed[i]++;
276 
277  if (!L2Muons.isValid())
278  continue;
279  //LOOP SULLA COLLEZIONE L2MUON
280  for (iL2Muon = L2Muons->begin(); iL2Muon != L2Muons->end(); ++iL2Muon) {
281  //MI FACCIO DARE REF E GUARDO SE E' UGUALE AL L2SEED ASSOCIATO
282  //BEFORE THE ASSOCIATION MAP!!!!!
283  //edm::Ref<L2MuonTrajectorySeedCollection> l2seedRef = iL2Muon->track()->seedRef().castTo<edm::Ref<L2MuonTrajectorySeedCollection> >();
284  //l1extra::L1MuonParticleRef l1FromL2 = l2seedRef->l1Particle();
285 
286  //if (l1FromL2.id() != l1FromSeed.id()) throw cms::Exception("CorruptData") << "You're using L2s with a different L1 collection than the one used by L2 seeds.\n";
287  //if (l1FromL2 != l1FromSeed) continue;
288 
289  //AFTER THE ASSOCIATION MAP
291  (*seedMapHandle)[iL2Muon->track()->seedRef().castTo<edm::Ref<L2MuonTrajectorySeedCollection> >()];
292  // bool isTriggered = false;
293  for (size_t jjj = 0; jjj < seeds.size(); jjj++) {
294  if (seeds[jjj]->l1Particle() != l1FromSeed)
295  continue;
296  }
297 
298  thisL2 = reco::CandidatePtr(L2Muons, iL2Muon - L2Muons->begin());
299  if (!hasL2Muon[i]) {
300  l1ptr[i] = thisL1;
301  l2ptr[i] = thisL2;
302  } // if nobody reached here before, we're the best L1 and L2)
303  hasL2Muon[i]++;
304 
305  LogTrace(metname) << "L2MUON TROVATO!" << endl;
306  const reco::Track &L2Track = *iL2Muon->track();
307  double Eta_L2 = L2Track.eta();
308  double Pt_L2 = L2Track.pt();
309  int nValidHits_L2 = L2Track.numberOfValidHits();
310  double BSPos_L2 = L2Track.dxy(beamSpot.position());
311  double dz_L2 = L2Track.dz();
312  double err0_L2 = L2Track.error(0);
313  double abspar0_L2 = fabs(L2Track.parameter(0));
314  double ptLx_L2 = Pt_L2;
315  if (abspar0_L2 > 0)
316  ptLx_L2 += nsigma_Pt_L2 * err0_L2 / abspar0_L2 * Pt_L2;
317 
318  //GUARDO SE L2MUON ASSOCIATO AVREBBE PASSATO IL FILTRO
319  bool passFilter = (((fabs(Eta_L2)) <= max_Eta_L2) && (nValidHits_L2 >= min_Nhits_L2) &&
320  ((fabs(BSPos_L2)) <= max_Dr_L2) && ((fabs(dz_L2)) <= max_Dz_L2) && (ptLx_L2 >= min_Pt_L2));
321  if (!passFilter)
322  continue;
323  if (!hasL2MuonFiltered[i]) {
324  l1ptr[i] = thisL1;
325  l2ptr[i] = thisL2;
326  } // if nobody reached here before, we're the best L1 and L2)
327  hasL2MuonFiltered[i]++;
328 
329  const reco::TrackRef L2FilteredRef = iL2Muon->track();
330 
331  //########L3 PART##############
332  if (!L3Seeds.isValid())
333  continue;
334  for (iSeedL3 = L3Seeds->begin(); iSeedL3 != L3Seeds->end(); ++iSeedL3) {
335  TrackRef staTrack = iSeedL3->l2Track();
336  if (staTrack != L2FilteredRef)
337  continue;
338  if (!hasL3Seed[i]) {
339  l1ptr[i] = thisL1;
340  l2ptr[i] = thisL2;
341  } // if nobody reached here before, we're the best L1 and L2)
342  hasL3Seed[i]++;
343 
344  if (!L3TkTracks.isValid())
345  continue;
346  for (tktrackL3 = L3TkTracks->begin(); tktrackL3 != L3TkTracks->end(); ++tktrackL3) {
348  tktrackL3->seedRef().castTo<edm::Ref<L3MuonTrajectorySeedCollection> >();
349  TrackRef staTrack2 = l3seedRef->l2Track();
350 
351  if (staTrack2 != L2FilteredRef)
352  continue;
353  if (!hasL3Track[i]) {
354  l1ptr[i] = thisL1;
355  l2ptr[i] = thisL2;
356  } // if nobody reached here before, we're the best L1 and L2)
357  hasL3Track[i]++;
358 
359  if (!L3Muons.isValid())
360  continue;
361  for (iL3Muon = L3Muons->begin(); iL3Muon != L3Muons->end(); ++iL3Muon) {
363  iL3Muon->track()->seedRef().castTo<edm::Ref<L3MuonTrajectorySeedCollection> >();
364  TrackRef staTrack3 = l3seedRef2->l2Track();
365 
366  if (staTrack3 != L2FilteredRef)
367  continue;
368  thisL3 = reco::CandidatePtr(L3Muons, iL3Muon - L3Muons->begin());
369 
370  if (!hasL3Muon[i]) {
371  l1ptr[i] = thisL1;
372  l2ptr[i] = thisL2;
373  l3ptr[i] = thisL3;
374  } // if nobody reached here before, we're the best L1, L2, L3
375  hasL3Muon[i]++;
376 
377  const reco::Track &L3Track = *iL3Muon->track();
378  double Eta_L3 = L3Track.eta();
379  double Pt_L3 = L3Track.pt();
380  int nValidHits_L3 = L3Track.numberOfValidHits();
381  double BSPos_L3 = L3Track.dxy(beamSpot.position());
382  double dz_L3 = L3Track.dz();
383  double err0_L3 = L3Track.error(0);
384  double abspar0_L3 = fabs(L3Track.parameter(0));
385  double ptLx_L3 = Pt_L3;
386 
387  if (abspar0_L3 > 0)
388  ptLx_L3 += nsigma_Pt_L3 * err0_L3 / abspar0_L3 * Pt_L3;
389 
390  if (((fabs(Eta_L3)) <= max_Eta_L3) && (nValidHits_L3 >= min_Nhits_L3) &&
391  ((fabs(BSPos_L3)) <= max_Dr_L3) && ((fabs(dz_L3)) <= max_Dz_L3) && (ptLx_L3 >= min_Pt_L3)) {
392  if (!hasL3MuonFiltered[i]) {
393  l1ptr[i] = thisL1;
394  l2ptr[i] = thisL2;
395  l3ptr[i] = thisL3;
396  } // if nobody reached here before, we're the best L1, L2, L3
397  hasL3MuonFiltered[i]++;
398 
399  } //L3MUON FILTERED ASSOCIATO TROVATO
400  } //L3MUON LOOP
401  } // L3 TRACKS
402  } // L3 SEEDS
403  } //T L2 MUONS
404  } // L2 SEEDS
405  } //L1 MUONS
406  } // RECO MUONS
407  storeValueMap<int>(event, muons, propagatesToM2, "propagatesToM2");
408  storeValueMap<int>(event, muons, hasL1Particle, "hasL1Particle");
409  storeValueMap<int>(event, muons, hasL1Filtered, "hasL1Filtered");
410  storeValueMap<int>(event, muons, hasL2Seed, "hasL2Seed");
411  storeValueMap<int>(event, muons, hasL2Muon, "hasL2Muon");
412  storeValueMap<int>(event, muons, hasL2MuonFiltered, "hasL2MuonFiltered");
413  storeValueMap<int>(event, muons, hasL3Seed, "hasL3Seed");
414  storeValueMap<int>(event, muons, hasL3Track, "hasL3Track");
415  storeValueMap<int>(event, muons, hasL3Muon, "hasL3Muon");
416  storeValueMap<int>(event, muons, hasL3MuonFiltered, "hasL3MuonFiltered");
417  storeValueMap<reco::CandidatePtr>(event, muons, l1ptr, "l1Candidate");
418  storeValueMap<reco::CandidatePtr>(event, muons, l2ptr, "l2Candidate");
419  storeValueMap<reco::CandidatePtr>(event, muons, l3ptr, "l3Candidate");
420 } // METHOD
421 
422 template <typename T>
425  const std::vector<T> &values,
426  const std::string &label) const {
427  using namespace edm;
428  using namespace std;
429  unique_ptr<ValueMap<T> > valMap(new ValueMap<T>());
430  typename edm::ValueMap<T>::Filler filler(*valMap);
431  filler.insert(handle, values.begin(), values.end());
432  filler.fill();
433  iEvent.put(std::move(valMap), label);
434 }
435 
ProductID id() const
Accessor for product ID.
Definition: Ref.h:244
~TriggerMatcherToHLTDebug() override
Destructor.
unsigned short numberOfValidHits() const
number of valid hits found
Definition: TrackBase.h:798
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
edm::EDGetTokenT< l1extra::L1MuonParticleCollection > l1Token_
Propagate an object (usually a track) to the second (default) or first muon station.
Geom::Phi< T > phi() const
Definition: PV3DBase.h:66
T eta() const
Definition: PV3DBase.h:73
edm::EDGetTokenT< L3MuonTrajectorySeedCollection > theL3SeedsToken_
edm::EDGetTokenT< L2MuonTrajectorySeedCollection > theL2SeedsToken_
edm::EDGetTokenT< reco::RecoChargedCandidateCollection > theL2MuonsToken_
edm::AssociationMap< edm::OneToMany< std::vector< L2MuonTrajectorySeed >, std::vector< L2MuonTrajectorySeed > > > SeedMap
double parameter(int i) const
i-th parameter ( i = 0, ... 4 )
Definition: TrackBase.h:723
edm::EDGetTokenT< reco::RecoChargedCandidateCollection > theL3MuonsToken_
key_type key() const
Accessor for product key.
Definition: Ref.h:250
#define LogTrace(id)
unsigned int quality() const
get quality
Definition: L1MuGMTCand.h:90
double pt() const
track transverse momentum
Definition: TrackBase.h:637
char const * label
double dz() const
dz parameter (= dsz/cos(lambda)). This is the track z0 w.r.t (0,0,0) only if the refPoint is close to...
Definition: TrackBase.h:622
int iEvent
Definition: GenABIO.cc:224
GlobalPoint globalPosition() const
PropagateToMuonSetup const l1matcherSetup_
Definition: Muon.py:1
TriggerMatcherToHLTDebug(const edm::ParameterSet &pset)
edm::EDGetTokenT< SeedMap > seedMapToken_
edm::EDGetTokenT< edm::View< reco::Muon > > tagToken_
double error(int i) const
error on specified element
Definition: TrackBase.h:729
double eta() const
pseudorapidity of momentum vector
Definition: TrackBase.h:652
edm::Ptr< Candidate > CandidatePtr
persistent reference to an object in a collection of Candidate objects
Definition: CandidateFwd.h:25
void produce(edm::Event &event, const edm::EventSetup &eventSetup) override
bool isValid() const
Definition: HandleBase.h:70
void storeValueMap(edm::Event &iEvent, const edm::Handle< edm::View< reco::Muon > > &handle, const std::vector< T > &values, const std::string &label) const
Store extra information in a ValueMap.
fixed size matrix
HLT enums.
key_type key() const
Definition: Ptr.h:163
edm::EDGetTokenT< reco::BeamSpot > beamspotToken_
edm::EDGetTokenT< reco::TrackCollection > theL3TkTracksToken_
string quality
def move(src, dest)
Definition: eostools.py:511
Definition: event.py:1
double dxy() const
dxy parameter. (This is the transverse impact parameter w.r.t. to (0,0,0) ONLY if refPoint is close t...
Definition: TrackBase.h:608