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 
18 
20 
22 
26 
29 
38 
39 //new for association map
47 
48 
53 
62 
66 
67 
68 
69 
70 
71 
73 
74  public:
75  // Constructor
77 
79  ~TriggerMatcherToHLTDebug() override;
80 
81  // Operations
82  void produce(edm::Event & event, const edm::EventSetup& eventSetup) override;
83  void beginRun(const edm::Run &run, const edm::EventSetup &eventSetup) override;
84 
85  private:
86  typedef edm::AssociationMap<edm::OneToMany<std::vector<L2MuonTrajectorySeed>, std::vector<L2MuonTrajectorySeed> > > SeedMap;
87 
91 
93 
94  //ForL1Assoc
95  double deltaR_;
96 
97  //ForL1Quality
99 
100  //ForL2Filter
102  int min_N_L2;
103  double max_Eta_L2;
105  double max_Dr_L2;
106  double max_Dz_L2;
107  double min_Pt_L2;
108  double nsigma_Pt_L2;
109 
110  //ForL3Filter
111  int min_N_L3;
112  double max_Eta_L3;
114  double max_Dr_L3;
115  double max_Dz_L3;
116  double min_Pt_L3;
117  double nsigma_Pt_L3;
118 
125 
127  template<typename T>
130  const std::vector<T> & values,
131  const std::string & label) const ;
132 
133 };
134 
135 using namespace std;
136 using namespace edm;
137 using namespace l1extra;
138 using namespace reco;
139 
140 // Constructor
142  tagToken_(consumes<View<reco::Muon> >(pset.getParameter<edm::InputTag>("tags"))),
143  l1Token_(consumes<L1MuonParticleCollection>(pset.getParameter<edm::InputTag>("l1s"))),
144  l1matcher_(pset.getParameter<edm::ParameterSet>("l1matcherConfig")),
145  deltaR_(pset.getParameter<double>("deltaR")),
146  minL1Quality_(pset.getParameter<int32_t>("MinL1Quality")),
147  beamspotToken_(consumes<BeamSpot>(pset.getParameter<edm::InputTag>("BeamSpotTag"))),
148  min_N_L2(pset.getParameter<int> ("MinN_L2")),
149  max_Eta_L2(pset.getParameter<double> ("MaxEta_L2")),
150  min_Nhits_L2(pset.getParameter<int> ("MinNhits_L2")),
151  max_Dr_L2(pset.getParameter<double> ("MaxDr_L2")),
152  max_Dz_L2(pset.getParameter<double> ("MaxDz_L2")),
153  min_Pt_L2(pset.getParameter<double> ("MinPt_L2")),
154  nsigma_Pt_L2(pset.getParameter<double> ("NSigmaPt_L2")),
155  min_N_L3(pset.getParameter<int> ("MinN_L3")),
156  max_Eta_L3(pset.getParameter<double> ("MaxEta_L3")),
157  min_Nhits_L3(pset.getParameter<int> ("MinNhits_L3")),
158  max_Dr_L3(pset.getParameter<double> ("MaxDr_L3")),
159  max_Dz_L3(pset.getParameter<double> ("MaxDz_L3")),
160  min_Pt_L3(pset.getParameter<double> ("MinPt_L3")),
161  nsigma_Pt_L3(pset.getParameter<double> ("NSigmaPt_L3")),
162  seedMapToken_(consumes<SeedMap>(pset.getParameter<edm::InputTag >("SeedMapTag")))
163 {
164 
165 
166  theL2SeedsToken_ = consumes<L2MuonTrajectorySeedCollection>(pset.getParameter<InputTag>("L2Seeds_Collection"));
167  theL2MuonsToken_ = consumes<RecoChargedCandidateCollection>(pset.getParameter<InputTag>("L2Muons_Collection"));
168  theL3SeedsToken_ = consumes<L3MuonTrajectorySeedCollection>(pset.getParameter<InputTag>("L3Seeds_Collection"));
169  theL3TkTracksToken_ = consumes<TrackCollection>(pset.getParameter<InputTag>("L3TkTracks_Collection"));
170  theL3MuonsToken_ = consumes<RecoChargedCandidateCollection>(pset.getParameter<InputTag>("L3Muons_Collection"));
171 
172 
173  metname = "TriggerMatcherToHLTDebug";
174 
175  produces<edm::ValueMap<int> > ("propagatesToM2");
176  produces<edm::ValueMap<int> > ("hasL1Particle");
177  produces<edm::ValueMap<int> > ("hasL1Filtered");
178  produces<edm::ValueMap<int> > ("hasL2Seed");
179  produces<edm::ValueMap<int> > ("hasL2Muon");
180  produces<edm::ValueMap<int> > ("hasL2MuonFiltered");
181  produces<edm::ValueMap<int> > ("hasL3Seed");
182  produces<edm::ValueMap<int> > ("hasL3Track");
183  produces<edm::ValueMap<int> > ("hasL3Muon");
184  produces<edm::ValueMap<int> > ("hasL3MuonFiltered");
185 
186  produces<edm::ValueMap<reco::CandidatePtr> > ("l1Candidate");
187  produces<edm::ValueMap<reco::CandidatePtr> > ("l2Candidate");
188  produces<edm::ValueMap<reco::CandidatePtr> > ("l3Candidate");
189 }
190 
191 
192 
193 // Destructor
195 
196 // Analyzer
198 
200  event.getByToken(tagToken_,muons);
201 
203  event.getByToken(l1Token_,L1Muons);
204 
206  event.getByToken(theL2SeedsToken_,L2Seeds);
207 
209  event.getByToken(theL2MuonsToken_,L2Muons);
210 
212  event.getByToken(theL3SeedsToken_,L3Seeds);
213 
215  event.getByToken(theL3TkTracksToken_,L3TkTracks);
216 
218  event.getByToken(theL3MuonsToken_,L3Muons);
219 
220  //beam spot
222  Handle<BeamSpot> recoBeamSpotHandle;
223  event.getByToken(beamspotToken_,recoBeamSpotHandle);
224  beamSpot = *recoBeamSpotHandle;
225 
226  //new for the MAP!!!!
227  edm::Handle<SeedMap> seedMapHandle;
228  event.getByToken(seedMapToken_, seedMapHandle);
229 
230 
231  size_t nmu = muons->size();
232  std::vector<int> propagatesToM2(nmu), hasL1Particle(nmu), hasL1Filtered(nmu);
233  std::vector<int> hasL2Seed(nmu), hasL2Muon(nmu), hasL2MuonFiltered(nmu);
234  std::vector<int> hasL3Seed(nmu), hasL3Track(nmu), hasL3TrackFiltered(nmu), hasL3Muon(nmu), hasL3MuonFiltered(nmu);
235  std::vector<reco::CandidatePtr> l1ptr(nmu), l2ptr(nmu), l3ptr(nmu);
236 
237  for (size_t i = 0; i < nmu; ++i) {
238  const reco::Muon &mu = (*muons)[i];
239 
240  // Propagate to muon station (using the L1 tool)
242  if (!stateAtMB2.isValid()) continue;
243  propagatesToM2[i] = 1;
244 
245  double etaTk = stateAtMB2.globalPosition().eta();
246  double phiTk = stateAtMB2.globalPosition().phi();
247  l1extra::L1MuonParticleCollection::const_iterator it;
248  L2MuonTrajectorySeedCollection::const_iterator iSeed;
249  L3MuonTrajectorySeedCollection::const_iterator iSeedL3;
250  RecoChargedCandidateCollection::const_iterator iL2Muon;
251  reco::TrackCollection::const_iterator tktrackL3;
252  RecoChargedCandidateCollection::const_iterator iL3Muon;
253 
254  reco::CandidatePtr thisL1, thisL2, thisL3;
255  for(it = L1Muons->begin(); it != L1Muons->end(); ++it) {
256 
257  const L1MuGMTExtendedCand muonCand = (*it).gmtMuonCand();
258  unsigned int quality = muonCand.quality();
259 
260  double L1phi =(*it).phi();
261  double L1eta =(*it).eta();
262  double L1pt =(*it).pt();
263  double dR=deltaR(etaTk,phiTk,L1eta,L1phi);
264 
265  //CONDIZIONE-> CE NE E' UNA ASSOCIATA?
266  if (dR >= deltaR_) continue;
267  thisL1 = reco::CandidatePtr(L1Muons, it - L1Muons->begin());
268  if (!hasL1Particle[i]) l1ptr[i] = thisL1; // if nobody reached L1 before, then we're the best L1 found up to now.
269  hasL1Particle[i]++;
270 
271  if ((quality <= 3) || (L1pt<7)) continue;
272  if (!hasL1Filtered[i]) l1ptr[i] = thisL1; // if nobody reached L1 before, then we're the best L1 found up to now.
273  hasL1Filtered[i]++;
274 
275  if(!L2Seeds.isValid()) continue;
276  //LOOP SULLA COLLEZIONE DEI SEED
277  for( iSeed = L2Seeds->begin(); iSeed != L2Seeds->end(); ++iSeed) {
278 
279  l1extra::L1MuonParticleRef l1FromSeed = iSeed->l1Particle();
280  if (l1FromSeed.id() != L1Muons.id()) throw cms::Exception("CorruptData") << "You're using a different L1 collection than the one used by L2 seeds.\n";
281  if (l1FromSeed.key() != thisL1.key()) continue;
282  if (!hasL2Seed[i]) l1ptr[i] = thisL1; // if nobody reached here before, we're the best L1
283  hasL2Seed[i]++;
284 
285  if(!L2Muons.isValid()) continue;
286  //LOOP SULLA COLLEZIONE L2MUON
287  for( iL2Muon = L2Muons->begin(); iL2Muon != L2Muons->end(); ++iL2Muon) {
288 
289 
290  //MI FACCIO DARE REF E GUARDO SE E' UGUALE AL L2SEED ASSOCIATO
291  //BEFORE THE ASSOCIATION MAP!!!!!
292  //edm::Ref<L2MuonTrajectorySeedCollection> l2seedRef = iL2Muon->track()->seedRef().castTo<edm::Ref<L2MuonTrajectorySeedCollection> >();
293  //l1extra::L1MuonParticleRef l1FromL2 = l2seedRef->l1Particle();
294 
295  //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";
296  //if (l1FromL2 != l1FromSeed) continue;
297 
298  //AFTER THE ASSOCIATION MAP
299  const edm::RefVector<L2MuonTrajectorySeedCollection>& seeds = (*seedMapHandle)[iL2Muon->track()->seedRef().castTo<edm::Ref<L2MuonTrajectorySeedCollection> >()];
300  // bool isTriggered = false;
301  for(size_t jjj=0; jjj<seeds.size(); jjj++){
302 
303  if(seeds[jjj]->l1Particle()!= l1FromSeed) continue;
304 
305  }
306 
307 
308  thisL2 = reco::CandidatePtr(L2Muons, iL2Muon - L2Muons->begin()) ;
309  if (!hasL2Muon[i]) { l1ptr[i] = thisL1; l2ptr[i] = thisL2; } // if nobody reached here before, we're the best L1 and L2)
310  hasL2Muon[i]++;
311 
312  LogTrace(metname) <<"L2MUON TROVATO!"<<endl;
313  const reco::Track & L2Track = *iL2Muon->track();
314  double Eta_L2= L2Track.eta();
315  double Pt_L2= L2Track.pt();
316  int nValidHits_L2= L2Track.numberOfValidHits();
317  double BSPos_L2 = L2Track.dxy(beamSpot.position());
318  double dz_L2 =L2Track.dz();
319  double err0_L2 = L2Track.error(0);
320  double abspar0_L2 = fabs(L2Track.parameter(0));
321  double ptLx_L2 = Pt_L2;
322  if (abspar0_L2>0) ptLx_L2 += nsigma_Pt_L2*err0_L2/abspar0_L2*Pt_L2;
323 
324  //GUARDO SE L2MUON ASSOCIATO AVREBBE PASSATO IL FILTRO
325  bool passFilter = (((fabs(Eta_L2))<=max_Eta_L2)&&(nValidHits_L2>=min_Nhits_L2)&&((fabs(BSPos_L2))<=max_Dr_L2)&&((fabs(dz_L2))<=max_Dz_L2)&&(ptLx_L2>=min_Pt_L2));
326  if (!passFilter) continue;
327  if (!hasL2MuonFiltered[i]) { l1ptr[i] = thisL1; l2ptr[i] = thisL2; } // if nobody reached here before, we're the best L1 and L2)
328  hasL2MuonFiltered[i]++;
329 
330  const reco::TrackRef L2FilteredRef = iL2Muon->track();
331 
332  //########L3 PART##############
333  if (!L3Seeds.isValid()) continue;
334  for (iSeedL3 = L3Seeds->begin(); iSeedL3!= L3Seeds->end(); ++iSeedL3){
335 
336  TrackRef staTrack = iSeedL3->l2Track();
337  if (staTrack!=L2FilteredRef) continue;
338  if (!hasL3Seed[i]) { l1ptr[i] = thisL1; l2ptr[i] = thisL2; } // if nobody reached here before, we're the best L1 and L2)
339  hasL3Seed[i]++;
340 
341  if (!L3TkTracks.isValid()) continue;
342  for (tktrackL3 = L3TkTracks->begin(); tktrackL3!= L3TkTracks->end(); ++tktrackL3){
343 
345  TrackRef staTrack2 = l3seedRef->l2Track();
346 
347  if (staTrack2!=L2FilteredRef) continue;
348  if (!hasL3Track[i]) { l1ptr[i] = thisL1; l2ptr[i] = thisL2; } // if nobody reached here before, we're the best L1 and L2)
349  hasL3Track[i]++;
350 
351  if (!L3Muons.isValid()) continue;
352  for (iL3Muon = L3Muons->begin(); iL3Muon != L3Muons->end(); ++iL3Muon) {
353 
354  edm::Ref<L3MuonTrajectorySeedCollection> l3seedRef2 = iL3Muon->track()->seedRef().castTo<edm::Ref<L3MuonTrajectorySeedCollection> >();
355  TrackRef staTrack3 = l3seedRef2->l2Track();
356 
357  if (staTrack3!=L2FilteredRef) continue;
358  thisL3 = reco::CandidatePtr(L3Muons, iL3Muon - L3Muons->begin());
359 
360  if (!hasL3Muon[i]) { l1ptr[i] = thisL1; l2ptr[i] = thisL2; l3ptr[i] = thisL3; } // if nobody reached here before, we're the best L1, L2, L3
361  hasL3Muon[i]++;
362 
363  const reco::Track &L3Track = *iL3Muon->track();
364  double Eta_L3= L3Track.eta();
365  double Pt_L3= L3Track.pt();
366  int nValidHits_L3= L3Track.numberOfValidHits();
367  double BSPos_L3 = L3Track.dxy(beamSpot.position());
368  double dz_L3 =L3Track.dz();
369  double err0_L3 = L3Track.error(0);
370  double abspar0_L3 = fabs(L3Track.parameter(0));
371  double ptLx_L3 = Pt_L3;
372 
373  if (abspar0_L3>0) ptLx_L3 += nsigma_Pt_L3*err0_L3/abspar0_L3*Pt_L3;
374 
375  if(((fabs(Eta_L3))<=max_Eta_L3)&&(nValidHits_L3>=min_Nhits_L3)&&((fabs(BSPos_L3))<=max_Dr_L3)&&((fabs(dz_L3))<=max_Dz_L3)&&(ptLx_L3>=min_Pt_L3)){
376 
377  if (!hasL3MuonFiltered[i]) { l1ptr[i] = thisL1; l2ptr[i] = thisL2; l3ptr[i] = thisL3; } // if nobody reached here before, we're the best L1, L2, L3
378  hasL3MuonFiltered[i]++;
379 
380  }//L3MUON FILTERED ASSOCIATO TROVATO
381  }//L3MUON LOOP
382  }// L3 TRACKS
383  }// L3 SEEDS
384  }//T L2 MUONS
385  }// L2 SEEDS
386  }//L1 MUONS
387  } // RECO MUONS
388  storeValueMap<int>(event, muons, propagatesToM2, "propagatesToM2");
389  storeValueMap<int>(event, muons, hasL1Particle, "hasL1Particle");
390  storeValueMap<int>(event, muons, hasL1Filtered, "hasL1Filtered");
391  storeValueMap<int>(event, muons, hasL2Seed, "hasL2Seed");
392  storeValueMap<int>(event, muons, hasL2Muon, "hasL2Muon");
393  storeValueMap<int>(event, muons, hasL2MuonFiltered, "hasL2MuonFiltered");
394  storeValueMap<int>(event, muons, hasL3Seed, "hasL3Seed");
395  storeValueMap<int>(event, muons, hasL3Track, "hasL3Track");
396  storeValueMap<int>(event, muons, hasL3Muon, "hasL3Muon");
397  storeValueMap<int>(event, muons, hasL3MuonFiltered, "hasL3MuonFiltered");
398  storeValueMap<reco::CandidatePtr>(event, muons, l1ptr, "l1Candidate");
399  storeValueMap<reco::CandidatePtr>(event, muons, l2ptr, "l2Candidate");
400  storeValueMap<reco::CandidatePtr>(event, muons, l3ptr, "l3Candidate");
401 } // METHOD
402 
403 void
405  l1matcher_.init(iSetup);
406 }
407 
408 template<typename T>
409 void
412  const std::vector<T> & values,
413  const std::string & label) const {
414  using namespace edm; using namespace std;
415  unique_ptr<ValueMap<T> > valMap(new ValueMap<T>());
416  typename edm::ValueMap<T>::Filler filler(*valMap);
417  filler.insert(handle, values.begin(), values.end());
418  filler.fill();
419  iEvent.put(std::move(valMap), label);
420 }
421 
422 
423 
424 
T getParameter(std::string const &) const
TrajectoryStateOnSurface extrapolate(const reco::Track &tk) const
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:125
~TriggerMatcherToHLTDebug() override
Destructor.
key_type key() const
Definition: Ptr.h:185
ProductID id() const
Definition: HandleBase.cc:15
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.
edm::EDGetTokenT< l1extra::L1MuonParticleCollection > l1Token_
Geom::Phi< T > phi() const
Definition: PV3DBase.h:69
void insert(const H &h, I begin, I end)
Definition: ValueMap.h:53
edm::EDGetTokenT< L3MuonTrajectorySeedCollection > theL3SeedsToken_
edm::EDGetTokenT< L2MuonTrajectorySeedCollection > theL2SeedsToken_
edm::EDGetTokenT< reco::RecoChargedCandidateCollection > theL2MuonsToken_
GlobalPoint globalPosition() const
key_type key() const
Accessor for product key.
Definition: Ref.h:263
edm::AssociationMap< edm::OneToMany< std::vector< L2MuonTrajectorySeed >, std::vector< L2MuonTrajectorySeed > > > SeedMap
edm::EDGetTokenT< reco::RecoChargedCandidateCollection > theL3MuonsToken_
ProductID id() const
Accessor for product ID.
Definition: Ref.h:257
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
char const * label
int iEvent
Definition: GenABIO.cc:224
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
Propagate an object (usually a track) to the second muon station. Support for other muon stations wil...
double eta() const
pseudorapidity of momentum vector
Definition: TrackBase.h:690
Definition: Muon.py:1
TriggerMatcherToHLTDebug(const edm::ParameterSet &pset)
double pt() const
track transverse momentum
Definition: TrackBase.h:660
double error(int i) const
error on specified element
Definition: TrackBase.h:802
edm::EDGetTokenT< SeedMap > seedMapToken_
unsigned short numberOfValidHits() const
number of valid hits found
Definition: TrackBase.h:901
const int mu
Definition: Constants.h:22
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger but the state exists so we define the behavior If all triggers are the negative crieriion will lead to accepting the event(this again matches the behavior of"!*"before the partial wildcard feature was incorporated).The per-event"cost"of each negative criterion with multiple relevant triggers is about the same as!*was in the past
bool isValid() const
Definition: HandleBase.h:74
#define LogTrace(id)
double parameter(int i) const
i-th parameter ( i = 0, ... 4 )
Definition: TrackBase.h:790
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:648
edm::EDGetTokenT< edm::View< reco::Muon > > tagToken_
unsigned int quality() const
get quality
Definition: L1MuGMTCand.h:93
edm::Ptr< Candidate > CandidatePtr
persistent reference to an object in a collection of Candidate objects
Definition: CandidateFwd.h:25
void init(const edm::EventSetup &iSetup)
void beginRun(const edm::Run &run, const edm::EventSetup &eventSetup) override
void produce(edm::Event &event, const edm::EventSetup &eventSetup) override
T eta() const
Definition: PV3DBase.h:76
fixed size matrix
HLT enums.
edm::EDGetTokenT< reco::BeamSpot > beamspotToken_
edm::EDGetTokenT< reco::TrackCollection > theL3TkTracksToken_
size_type size() const
Size of the RefVector.
Definition: RefVector.h:107
const Point & position() const
position
Definition: BeamSpot.h:62
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:630
def move(src, dest)
Definition: eostools.py:511
Definition: event.py:1
Definition: Run.h:45