CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
PATMuonProducer.cc
Go to the documentation of this file.
1 //
2 //
3 
5 
9 
12 
14 
17 
20 
22 
25 
28 
33 
34 #include "TMath.h"
35 
37 
38 #include <vector>
39 #include <memory>
40 
41 
42 using namespace pat;
43 using namespace std;
44 
45 
46 PATMuonProducer::PATMuonProducer(const edm::ParameterSet & iConfig) : useUserData_(iConfig.exists("userData")),
47  isolator_(iConfig.exists("userIsolation") ? iConfig.getParameter<edm::ParameterSet>("userIsolation") : edm::ParameterSet(), consumesCollector(), false)
48 {
49  // input source
50  muonToken_ = consumes<edm::View<reco::Muon> >(iConfig.getParameter<edm::InputTag>( "muonSource" ));
51  // embedding of tracks
52  embedBestTrack_ = iConfig.getParameter<bool>( "embedMuonBestTrack" );
53  embedTunePBestTrack_ = iConfig.getParameter<bool>( "embedTunePMuonBestTrack" );
54  forceEmbedBestTrack_ = iConfig.getParameter<bool>( "forceBestTrackEmbedding" );
55  embedTrack_ = iConfig.getParameter<bool>( "embedTrack" );
56  embedCombinedMuon_ = iConfig.getParameter<bool>( "embedCombinedMuon" );
57  embedStandAloneMuon_ = iConfig.getParameter<bool>( "embedStandAloneMuon" );
58  // embedding of muon MET correction information
59  embedCaloMETMuonCorrs_ = iConfig.getParameter<bool>("embedCaloMETMuonCorrs" );
60  embedTcMETMuonCorrs_ = iConfig.getParameter<bool>("embedTcMETMuonCorrs" );
61  caloMETMuonCorrsToken_ = mayConsume<edm::ValueMap<reco::MuonMETCorrectionData> >(iConfig.getParameter<edm::InputTag>("caloMETMuonCorrs" ));
62  tcMETMuonCorrsToken_ = mayConsume<edm::ValueMap<reco::MuonMETCorrectionData> >(iConfig.getParameter<edm::InputTag>("tcMETMuonCorrs" ));
63  // pflow specific configurables
64  useParticleFlow_ = iConfig.getParameter<bool>( "useParticleFlow" );
65  embedPFCandidate_ = iConfig.getParameter<bool>( "embedPFCandidate" );
66  pfMuonToken_ = mayConsume<reco::PFCandidateCollection>(iConfig.getParameter<edm::InputTag>( "pfMuonSource" ));
67  // embedding of tracks from TeV refit
68  embedPickyMuon_ = iConfig.getParameter<bool>( "embedPickyMuon" );
69  embedTpfmsMuon_ = iConfig.getParameter<bool>( "embedTpfmsMuon" );
70  embedDytMuon_ = iConfig.getParameter<bool>( "embedDytMuon" );
71  // Monte Carlo matching
72  addGenMatch_ = iConfig.getParameter<bool>( "addGenMatch" );
73  if (addGenMatch_) {
74  embedGenMatch_ = iConfig.getParameter<bool>( "embedGenMatch" );
75  if (iConfig.existsAs<edm::InputTag>("genParticleMatch")) {
77  }
78  else {
79  genMatchTokens_ = edm::vector_transform(iConfig.getParameter<std::vector<edm::InputTag> >( "genParticleMatch" ), [this](edm::InputTag const & tag){return consumes<edm::Association<reco::GenParticleCollection> >(tag);});
80  }
81  }
82  // efficiencies
83  addEfficiencies_ = iConfig.getParameter<bool>("addEfficiencies");
84  if(addEfficiencies_){
85  efficiencyLoader_ = pat::helper::EfficiencyLoader(iConfig.getParameter<edm::ParameterSet>("efficiencies"), consumesCollector());
86  }
87  // resolutions
88  addResolutions_ = iConfig.getParameter<bool>("addResolutions");
89  if (addResolutions_) {
90  resolutionLoader_ = pat::helper::KinResolutionsLoader(iConfig.getParameter<edm::ParameterSet>("resolutions"));
91  }
92  // read isoDeposit labels, for direct embedding
93  readIsolationLabels(iConfig, "isoDeposits", isoDepositLabels_, isoDepositTokens_);
94  // read isolation value labels, for direct embedding
95  readIsolationLabels(iConfig, "isolationValues", isolationValueLabels_, isolationValueTokens_);
96  // check to see if the user wants to add user data
97  if( useUserData_ ){
98  userDataHelper_ = PATUserDataHelper<Muon>(iConfig.getParameter<edm::ParameterSet>("userData"), consumesCollector());
99  }
100  // embed high level selection variables
101  usePV_ = true;
102  embedHighLevelSelection_ = iConfig.getParameter<bool>("embedHighLevelSelection");
103  if ( embedHighLevelSelection_ ) {
104  beamLineToken_ = consumes<reco::BeamSpot>(iConfig.getParameter<edm::InputTag>("beamLineSrc"));
105  usePV_ = iConfig.getParameter<bool>("usePV");
106  pvToken_ = consumes<std::vector<reco::Vertex> >(iConfig.getParameter<edm::InputTag>("pvSrc"));
107  }
108  // produces vector of muons
109  produces<std::vector<Muon> >();
110 }
111 
112 
113 PATMuonProducer::~PATMuonProducer()
114 {
115 }
116 
118 {
119  // switch off embedding (in unschedules mode)
120  if (iEvent.isRealData()){
121  addGenMatch_ = false;
122  embedGenMatch_ = false;
123  }
124 
126  iEvent.getByToken(muonToken_, muons);
127 
128  // get the ESHandle for the transient track builder,
129  // if needed for high level selection embedding
131 
132  if(isolator_.enabled()) isolator_.beginEvent(iEvent,iSetup);
134  if(resolutionLoader_.enabled()) resolutionLoader_.newEvent(iEvent, iSetup);
135 
136  IsoDepositMaps deposits(isoDepositTokens_.size());
137  for (size_t j = 0; j<isoDepositTokens_.size(); ++j) {
138  iEvent.getByToken(isoDepositTokens_[j], deposits[j]);
139  }
140 
141  IsolationValueMaps isolationValues(isolationValueTokens_.size());
142  for (size_t j = 0; j<isolationValueTokens_.size(); ++j) {
143  iEvent.getByToken(isolationValueTokens_[j], isolationValues[j]);
144  }
145 
146  // prepare the MC genMatchTokens_
147  GenAssociations genMatches(genMatchTokens_.size());
148  if (addGenMatch_) {
149  for (size_t j = 0, nd = genMatchTokens_.size(); j < nd; ++j) {
150  iEvent.getByToken(genMatchTokens_[j], genMatches[j]);
151  }
152  }
153 
154  // prepare the high level selection: needs beamline
155  // OR primary vertex, depending on user selection
156  reco::TrackBase::Point beamPoint(0,0,0);
159  bool beamSpotIsValid = false;
160  bool primaryVertexIsValid = false;
161  if ( embedHighLevelSelection_ ) {
162  // get the beamspot
163  edm::Handle<reco::BeamSpot> beamSpotHandle;
164  iEvent.getByToken(beamLineToken_, beamSpotHandle);
165 
166  // get the primary vertex
168  iEvent.getByToken( pvToken_, pvHandle );
169 
170  if( beamSpotHandle.isValid() ){
171  beamSpot = *beamSpotHandle;
172  beamSpotIsValid = true;
173  } else{
174  edm::LogError("DataNotAvailable")
175  << "No beam spot available from EventSetup, not adding high level selection \n";
176  }
177  beamPoint = reco::TrackBase::Point ( beamSpot.x0(), beamSpot.y0(), beamSpot.z0() );
178  if( pvHandle.isValid() && !pvHandle->empty() ) {
179  primaryVertex = pvHandle->at(0);
180  primaryVertexIsValid = true;
181  } else {
182  edm::LogError("DataNotAvailable")
183  << "No primary vertex available from EventSetup, not adding high level selection \n";
184  }
185  // this is needed by the IPTools methods from the tracking group
186  iSetup.get<TransientTrackRecord>().get("TransientTrackBuilder", trackBuilder);
187  }
188 
189  // this will be the new object collection
190  std::vector<Muon> * patMuons = new std::vector<Muon>();
191 
192  if( useParticleFlow_ ){
193  // get the PFCandidates of type muons
195  iEvent.getByToken(pfMuonToken_, pfMuons);
196 
197  unsigned index=0;
198  for( reco::PFCandidateConstIterator i = pfMuons->begin(); i != pfMuons->end(); ++i, ++index) {
199  const reco::PFCandidate& pfmu = *i;
200  //const reco::IsolaPFCandidate& pfmu = *i;
201  const reco::MuonRef& muonRef = pfmu.muonRef();
202  assert( muonRef.isNonnull() );
203 
204  MuonBaseRef muonBaseRef(muonRef);
205  Muon aMuon(muonBaseRef);
206 
207  if ( useUserData_ ) {
208  userDataHelper_.add( aMuon, iEvent, iSetup );
209  }
210 
211  // embed high level selection
212  if ( embedHighLevelSelection_ ) {
213  // get the tracks
214  reco::TrackRef innerTrack = muonBaseRef->innerTrack();
215  reco::TrackRef globalTrack= muonBaseRef->globalTrack();
216  reco::TrackRef bestTrack = muonBaseRef->muonBestTrack();
217  reco::TrackRef chosenTrack = innerTrack;
218  // Make sure the collection it points to is there
219  if ( bestTrack.isNonnull() && bestTrack.isAvailable() )
220  chosenTrack = bestTrack;
221 
222  if ( chosenTrack.isNonnull() && chosenTrack.isAvailable() ) {
223  unsigned int nhits = chosenTrack->numberOfValidHits(); // ????
224  aMuon.setNumberOfValidHits( nhits );
225 
226  reco::TransientTrack tt = trackBuilder->build(chosenTrack);
227  embedHighLevel( aMuon,
228  chosenTrack,
229  tt,
230  primaryVertex,
231  primaryVertexIsValid,
232  beamSpot,
233  beamSpotIsValid );
234 
235  // Correct to PV, or beam spot
236  if ( !usePV_ ) {
237  double corr_d0 = -1.0 * chosenTrack->dxy( beamPoint );
238  aMuon.setDB( corr_d0, -1.0 );
239  } else {
240  std::pair<bool,Measurement1D> result = IPTools::absoluteTransverseImpactParameter(tt, primaryVertex);
241  double d0_corr = result.second.value();
242  double d0_err = result.second.error();
243  aMuon.setDB( d0_corr, d0_err );
244  }
245  }
246 
247  if ( globalTrack.isNonnull() && globalTrack.isAvailable() ) {
248  double norm_chi2 = globalTrack->chi2() / globalTrack->ndof();
249  aMuon.setNormChi2( norm_chi2 );
250  }
251  }
252  reco::PFCandidateRef pfRef(pfMuons,index);
253  //reco::PFCandidatePtr ptrToMother(pfMuons,index);
254  reco::CandidateBaseRef pfBaseRef( pfRef );
255 
256  aMuon.setPFCandidateRef( pfRef );
257  if( embedPFCandidate_ ) aMuon.embedPFCandidate();
258  fillMuon( aMuon, muonBaseRef, pfBaseRef, genMatches, deposits, isolationValues );
259  patMuons->push_back(aMuon);
260  }
261  }
262  else {
264  iEvent.getByToken(muonToken_, muons);
265 
266  // embedding of muon MET corrections
268  //edm::ValueMap<reco::MuonMETCorrectionData> caloMETmuCorValueMap;
270  iEvent.getByToken(caloMETMuonCorrsToken_, caloMETMuonCorrs);
271  //caloMETmuCorValueMap = *caloMETmuCorValueMap_h;
272  }
274  //edm::ValueMap<reco::MuonMETCorrectionData> tcMETmuCorValueMap;
276  iEvent.getByToken(tcMETMuonCorrsToken_, tcMETMuonCorrs);
277  //tcMETmuCorValueMap = *tcMETmuCorValueMap_h;
278  }
279  for (edm::View<reco::Muon>::const_iterator itMuon = muons->begin(); itMuon != muons->end(); ++itMuon) {
280  // construct the Muon from the ref -> save ref to original object
281  unsigned int idx = itMuon - muons->begin();
282  MuonBaseRef muonRef = muons->refAt(idx);
283  reco::CandidateBaseRef muonBaseRef( muonRef );
284 
285  Muon aMuon(muonRef);
286  fillMuon( aMuon, muonRef, muonBaseRef, genMatches, deposits, isolationValues);
287 
288  // Isolation
289  if (isolator_.enabled()) {
290  //reco::CandidatePtr mother = ptrToMother->sourceCandidatePtr(0);
291  isolator_.fill(*muons, idx, isolatorTmpStorage_);
292  typedef pat::helper::MultiIsolator::IsolationValuePairs IsolationValuePairs;
293  // better to loop backwards, so the vector is resized less times
294  for (IsolationValuePairs::const_reverse_iterator it = isolatorTmpStorage_.rbegin(), ed = isolatorTmpStorage_.rend(); it != ed; ++it) {
295  aMuon.setIsolation(it->first, it->second);
296  }
297  }
298 
299  // for (size_t j = 0, nd = deposits.size(); j < nd; ++j) {
300  // aMuon.setIsoDeposit(isoDepositLabels_[j].first,
301  // (*deposits[j])[muonRef]);
302  // }
303 
304  // add sel to selected
305  edm::Ptr<reco::Muon> muonsPtr = muons->ptrAt(idx);
306  if ( useUserData_ ) {
307  userDataHelper_.add( aMuon, iEvent, iSetup );
308  }
309 
310  // embed high level selection
311  if ( embedHighLevelSelection_ ) {
312  // get the tracks
313  reco::TrackRef innerTrack = itMuon->innerTrack();
314  reco::TrackRef globalTrack= itMuon->globalTrack();
315  reco::TrackRef bestTrack = itMuon->muonBestTrack();
316  reco::TrackRef chosenTrack = innerTrack;
317  // Make sure the collection it points to is there
318  if ( bestTrack.isNonnull() && bestTrack.isAvailable() )
319  chosenTrack = bestTrack;
320  if ( chosenTrack.isNonnull() && chosenTrack.isAvailable() ) {
321  unsigned int nhits = chosenTrack->numberOfValidHits(); // ????
322  aMuon.setNumberOfValidHits( nhits );
323 
324  reco::TransientTrack tt = trackBuilder->build(chosenTrack);
325  embedHighLevel( aMuon,
326  chosenTrack,
327  tt,
328  primaryVertex,
329  primaryVertexIsValid,
330  beamSpot,
331  beamSpotIsValid );
332 
333  // Correct to PV, or beam spot
334  if ( !usePV_ ) {
335  double corr_d0 = -1.0 * chosenTrack->dxy( beamPoint );
336  aMuon.setDB( corr_d0, -1.0 );
337  } else {
338  std::pair<bool,Measurement1D> result = IPTools::absoluteTransverseImpactParameter(tt, primaryVertex);
339  double d0_corr = result.second.value();
340  double d0_err = result.second.error();
341  aMuon.setDB( d0_corr, d0_err );
342  }
343  }
344 
345  if ( globalTrack.isNonnull() && globalTrack.isAvailable() ) {
346  double norm_chi2 = globalTrack->chi2() / globalTrack->ndof();
347  aMuon.setNormChi2( norm_chi2 );
348  }
349  }
350 
351  // embed MET muon corrections
352  if( embedCaloMETMuonCorrs_ ) aMuon.embedCaloMETMuonCorrs((*caloMETMuonCorrs)[muonRef]);
353  if( embedTcMETMuonCorrs_ ) aMuon.embedTcMETMuonCorrs((*tcMETMuonCorrs )[muonRef]);
354 
355  patMuons->push_back(aMuon);
356  }
357  }
358 
359  // sort muons in pt
360  std::sort(patMuons->begin(), patMuons->end(), pTComparator_);
361 
362  // put genEvt object in Event
363  std::auto_ptr<std::vector<Muon> > ptr(patMuons);
364  iEvent.put(ptr);
365 
367 }
368 
369 
370 void PATMuonProducer::fillMuon( Muon& aMuon, const MuonBaseRef& muonRef, const reco::CandidateBaseRef& baseRef, const GenAssociations& genMatches, const IsoDepositMaps& deposits, const IsolationValueMaps& isolationValues ) const
371 {
372  // in the particle flow algorithm,
373  // the muon momentum is recomputed.
374  // the new value is stored as the momentum of the
375  // resulting PFCandidate of type Muon, and choosen
376  // as the pat::Muon momentum
377  if (useParticleFlow_)
378  aMuon.setP4( aMuon.pfCandidateRef()->p4() );
379  if (embedTrack_) aMuon.embedTrack();
382 
383  // embed the TeV refit track refs (only available for globalMuons)
384  if (aMuon.isGlobalMuon()) {
386  aMuon.embedPickyMuon();
388  aMuon.embedTpfmsMuon();
390  aMuon.embedDytMuon();
391  }
392 
393  // embed best tracks (at the end, so unless forceEmbedBestTrack_ is true we can save some space not embedding them twice)
396 
397  // store the match to the generated final state muons
398  if (addGenMatch_) {
399  for(size_t i = 0, n = genMatches.size(); i < n; ++i) {
400  reco::GenParticleRef genMuon = (*genMatches[i])[baseRef];
401  aMuon.addGenParticleRef(genMuon);
402  }
403  if (embedGenMatch_) aMuon.embedGenParticle();
404  }
405  if (efficiencyLoader_.enabled()) {
406  efficiencyLoader_.setEfficiencies( aMuon, muonRef );
407  }
408 
409  for (size_t j = 0, nd = deposits.size(); j < nd; ++j) {
410  if(useParticleFlow_) {
411  if (deposits[j]->contains(baseRef.id())) {
412  aMuon.setIsoDeposit(isoDepositLabels_[j].first, (*deposits[j])[baseRef]);
413  } else if (deposits[j]->contains(muonRef.id())){
414  aMuon.setIsoDeposit(isoDepositLabels_[j].first, (*deposits[j])[muonRef]);
415  } else {
416  reco::CandidatePtr source = aMuon.pfCandidateRef()->sourceCandidatePtr(0);
417  aMuon.setIsoDeposit(isoDepositLabels_[j].first, (*deposits[j])[source]);
418  }
419  }
420  else{
421  aMuon.setIsoDeposit(isoDepositLabels_[j].first, (*deposits[j])[muonRef]);
422  }
423  }
424 
425  for (size_t j = 0; j<isolationValues.size(); ++j) {
426  if(useParticleFlow_) {
427  if (isolationValues[j]->contains(baseRef.id())) {
428  aMuon.setIsolation(isolationValueLabels_[j].first, (*isolationValues[j])[baseRef]);
429  } else if (isolationValues[j]->contains(muonRef.id())) {
430  aMuon.setIsolation(isolationValueLabels_[j].first, (*isolationValues[j])[muonRef]);
431  } else {
432  reco::CandidatePtr source = aMuon.pfCandidateRef()->sourceCandidatePtr(0);
433  aMuon.setIsolation(isolationValueLabels_[j].first, (*isolationValues[j])[source]);
434  }
435  }
436  else{
437  aMuon.setIsolation(isolationValueLabels_[j].first, (*isolationValues[j])[muonRef]);
438  }
439  }
440 
441  if (resolutionLoader_.enabled()) {
443  }
444 }
445 
446 // ParameterSet description for module
448 {
450  iDesc.setComment("PAT muon producer module");
451 
452  // input source
453  iDesc.add<edm::InputTag>("muonSource", edm::InputTag("no default"))->setComment("input collection");
454 
455  // embedding
456  iDesc.add<bool>("embedMuonBestTrack", true)->setComment("embed muon best track (global pflow)");
457  iDesc.add<bool>("embedTunePMuonBestTrack", true)->setComment("embed muon best track (muon only)");
458  iDesc.add<bool>("forceBestTrackEmbedding", true)->setComment("force embedding separately the best tracks even if they're already embedded e.g. as tracker or global tracks");
459  iDesc.add<bool>("embedTrack", true)->setComment("embed external track");
460  iDesc.add<bool>("embedStandAloneMuon", true)->setComment("embed external stand-alone muon");
461  iDesc.add<bool>("embedCombinedMuon", false)->setComment("embed external combined muon");
462  iDesc.add<bool>("embedPickyMuon", false)->setComment("embed external picky track");
463  iDesc.add<bool>("embedTpfmsMuon", false)->setComment("embed external tpfms track");
464  iDesc.add<bool>("embedDytMuon", false)->setComment("embed external dyt track ");
465 
466  // embedding of MET muon corrections
467  iDesc.add<bool>("embedCaloMETMuonCorrs", true)->setComment("whether to add MET muon correction for caloMET or not");
468  iDesc.add<edm::InputTag>("caloMETMuonCorrs", edm::InputTag("muonMETValueMapProducer" , "muCorrData"))->setComment("source of MET muon corrections for caloMET");
469  iDesc.add<bool>("embedTcMETMuonCorrs", true)->setComment("whether to add MET muon correction for tcMET or not");
470  iDesc.add<edm::InputTag>("tcMETMuonCorrs", edm::InputTag("muonTCMETValueMapProducer" , "muCorrData"))->setComment("source of MET muon corrections for tcMET");
471 
472  // pf specific parameters
473  iDesc.add<edm::InputTag>("pfMuonSource", edm::InputTag("pfMuons"))->setComment("particle flow input collection");
474  iDesc.add<bool>("useParticleFlow", false)->setComment("whether to use particle flow or not");
475  iDesc.add<bool>("embedPFCandidate", false)->setComment("embed external particle flow object");
476 
477  // MC matching configurables
478  iDesc.add<bool>("addGenMatch", true)->setComment("add MC matching");
479  iDesc.add<bool>("embedGenMatch", false)->setComment("embed MC matched MC information");
480  std::vector<edm::InputTag> emptySourceVector;
481  iDesc.addNode( edm::ParameterDescription<edm::InputTag>("genParticleMatch", edm::InputTag(), true) xor
482  edm::ParameterDescription<std::vector<edm::InputTag> >("genParticleMatch", emptySourceVector, true)
483  )->setComment("input with MC match information");
484 
486 
487  // IsoDeposit configurables
488  edm::ParameterSetDescription isoDepositsPSet;
489  isoDepositsPSet.addOptional<edm::InputTag>("tracker");
490  isoDepositsPSet.addOptional<edm::InputTag>("ecal");
491  isoDepositsPSet.addOptional<edm::InputTag>("hcal");
492  isoDepositsPSet.addOptional<edm::InputTag>("particle");
493  isoDepositsPSet.addOptional<edm::InputTag>("pfChargedHadrons");
494  isoDepositsPSet.addOptional<edm::InputTag>("pfChargedAll");
495  isoDepositsPSet.addOptional<edm::InputTag>("pfPUChargedHadrons");
496  isoDepositsPSet.addOptional<edm::InputTag>("pfNeutralHadrons");
497  isoDepositsPSet.addOptional<edm::InputTag>("pfPhotons");
498  isoDepositsPSet.addOptional<std::vector<edm::InputTag> >("user");
499  iDesc.addOptional("isoDeposits", isoDepositsPSet);
500 
501  // isolation values configurables
502  edm::ParameterSetDescription isolationValuesPSet;
503  isolationValuesPSet.addOptional<edm::InputTag>("tracker");
504  isolationValuesPSet.addOptional<edm::InputTag>("ecal");
505  isolationValuesPSet.addOptional<edm::InputTag>("hcal");
506  isolationValuesPSet.addOptional<edm::InputTag>("particle");
507  isolationValuesPSet.addOptional<edm::InputTag>("pfChargedHadrons");
508  isolationValuesPSet.addOptional<edm::InputTag>("pfChargedAll");
509  isolationValuesPSet.addOptional<edm::InputTag>("pfPUChargedHadrons");
510  isolationValuesPSet.addOptional<edm::InputTag>("pfNeutralHadrons");
511  isolationValuesPSet.addOptional<edm::InputTag>("pfPhotons");
512  iDesc.addOptional("isolationValues", isolationValuesPSet);
513 
514  // Efficiency configurables
515  edm::ParameterSetDescription efficienciesPSet;
516  efficienciesPSet.setAllowAnything(); // TODO: the pat helper needs to implement a description.
517  iDesc.add("efficiencies", efficienciesPSet);
518  iDesc.add<bool>("addEfficiencies", false);
519 
520  // Check to see if the user wants to add user data
521  edm::ParameterSetDescription userDataPSet;
523  iDesc.addOptional("userData", userDataPSet);
524 
525  edm::ParameterSetDescription isolationPSet;
526  isolationPSet.setAllowAnything(); // TODO: the pat helper needs to implement a description.
527  iDesc.add("userIsolation", isolationPSet);
528 
529  iDesc.add<bool>("embedHighLevelSelection", true)->setComment("embed high level selection");
530  edm::ParameterSetDescription highLevelPSet;
531  highLevelPSet.setAllowAnything();
532  iDesc.addNode( edm::ParameterDescription<edm::InputTag>("beamLineSrc", edm::InputTag(), true)
533  )->setComment("input with high level selection");
535  )->setComment("input with high level selection");
536  iDesc.addNode( edm::ParameterDescription<bool>("usePV", bool(), true)
537  )->setComment("input with high level selection, use primary vertex (true) or beam line (false)");
538 
539  //descriptions.add("PATMuonProducer", iDesc);
540 }
541 
542 
543 
544 // embed various impact parameters with errors
545 // embed high level selection
547  reco::TrackRef track,
550  bool primaryVertexIsValid,
551  reco::BeamSpot & beamspot,
552  bool beamspotIsValid
553  )
554 {
555  // Correct to PV
556 
557  // PV2D
558  std::pair<bool,Measurement1D> result =
560  GlobalVector(track->px(),
561  track->py(),
562  track->pz()),
563  primaryVertex);
564  double d0_corr = result.second.value();
565  double d0_err = primaryVertexIsValid ? result.second.error() : -1.0;
566  aMuon.setDB( d0_corr, d0_err, pat::Muon::PV2D);
567 
568 
569  // PV3D
570  result =
572  GlobalVector(track->px(),
573  track->py(),
574  track->pz()),
575  primaryVertex);
576  d0_corr = result.second.value();
577  d0_err = primaryVertexIsValid ? result.second.error() : -1.0;
578  aMuon.setDB( d0_corr, d0_err, pat::Muon::PV3D);
579 
580 
581  // Correct to beam spot
582  // make a fake vertex out of beam spot
583  reco::Vertex vBeamspot(beamspot.position(), beamspot.rotatedCovariance3D());
584 
585  // BS2D
586  result =
588  GlobalVector(track->px(),
589  track->py(),
590  track->pz()),
591  vBeamspot);
592  d0_corr = result.second.value();
593  d0_err = beamspotIsValid ? result.second.error() : -1.0;
594  aMuon.setDB( d0_corr, d0_err, pat::Muon::BS2D);
595 
596  // BS3D
597  result =
599  GlobalVector(track->px(),
600  track->py(),
601  track->pz()),
602  vBeamspot);
603  d0_corr = result.second.value();
604  d0_err = beamspotIsValid ? result.second.error() : -1.0;
605  aMuon.setDB( d0_corr, d0_err, pat::Muon::BS3D);
606 }
607 
609 
bool embedTpfmsMuon_
embed track from tpfms muon fit into the muon
bool enabled() const
&#39;true&#39; if this there is at least one efficiency configured
bool useUserData_
add user data to the muon (this will be data members of th muon even w/o embedding) ...
bool isAvailable() const
Definition: Ref.h:276
T getParameter(std::string const &) const
void setComment(std::string const &value)
double z0() const
z coordinate
Definition: BeamSpot.h:68
Assists in assimilating all pat::UserData into pat objects.
bool usePV_
use the primary vertex or the beamspot
int i
Definition: DBlmapReader.cc:9
void embedStandAloneMuon()
set reference to Track reconstructed in the muon detector only (reimplemented from reco::Muon) ...
Definition: Muon.cc:303
ParameterDescriptionBase * addOptional(U const &iLabel, T const &value)
bool isNonnull() const
Checks for non-null.
Definition: Ref.h:250
edm::EDGetTokenT< edm::ValueMap< reco::MuonMETCorrectionData > > tcMETMuonCorrsToken_
source of tcMET muon corrections
void setIsolation(IsolationKeys key, float value)
Definition: Lepton.h:98
bool embedTcMETMuonCorrs_
embed muon MET correction info for tcMET into the muon
class definition
bool existsAs(std::string const &parameterName, bool trackiness=true) const
checks if a parameter exists as a given type
Definition: ParameterSet.h:184
edm::EDGetTokenT< std::vector< reco::Vertex > > pvToken_
input source of the primary vertex
bool contains(EventRange const &lh, EventID const &rh)
Definition: EventRange.cc:38
void embedPFCandidate()
embed the IsolatedPFCandidate pointed to by pfCandidateRef_
Definition: Muon.cc:366
edm::EDGetTokenT< edm::View< reco::Muon > > muonToken_
input source
edm::EDGetTokenT< edm::ValueMap< reco::MuonMETCorrectionData > > caloMETMuonCorrsToken_
source of caloMET muon corrections
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:446
void setAllowAnything()
allow any parameter label/value pairs
void embedMuonBestTrack(bool force=false)
embed the Track selected to be the best measurement of the muon parameters
Definition: Muon.cc:245
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
bool embedCaloMETMuonCorrs_
embed muon MET correction info for caloMET into the muon
std::pair< bool, Measurement1D > signedTransverseImpactParameter(const reco::TransientTrack &track, const GlobalVector &direction, const reco::Vertex &vertex)
Definition: IPTools.cc:50
bool isGlobalMuon() const
Definition: Muon.h:218
ParameterDescriptionNode * addNode(ParameterDescriptionNode const &node)
bool embedBestTrack_
embed the track from best muon measurement (global pflow)
std::pair< bool, Measurement1D > signedImpactParameter3D(const reco::TransientTrack &track, const GlobalVector &direction, const reco::Vertex &vertex)
Definition: IPTools.cc:71
virtual void setP4(const LorentzVector &p4)
set 4-momentum
auto vector_transform(std::vector< InputType > const &input, Function predicate) -> std::vector< typename std::remove_cv< typename std::remove_reference< decltype(predicate(input.front()))>::type >::type >
Definition: transform.h:11
PFCandidateCollection::const_iterator PFCandidateConstIterator
iterator
void setResolutions(pat::PATObject< T > &obj) const
Sets the efficiencies for this object, using the reference to the original objects.
void setPFCandidateRef(const reco::PFCandidateRef &ref)
add a reference to the source IsolatedPFCandidate
Definition: Muon.h:133
bool isRealData() const
Definition: EventBase.h:60
void embedHighLevel(pat::Muon &aMuon, reco::TrackRef track, reco::TransientTrack &tt, reco::Vertex &primaryVertex, bool primaryVertexIsValid, reco::BeamSpot &beamspot, bool beamspotIsValid)
ProductID id() const
Definition: RefToBase.h:221
void embedPickyMuon()
embed reference to the above picky Track
Definition: Muon.cc:336
PATMuonProducer(const edm::ParameterSet &iConfig)
default constructir
edm::EDGetTokenT< reco::PFCandidateCollection > pfMuonToken_
input source pfCandidates that will be to be transformed into pat::Muons, when using PF2PAT ...
pat::helper::MultiIsolator isolator_
helper class to add userdefined isolation values to the muon
std::vector< edm::EDGetTokenT< edm::ValueMap< IsoDeposit > > > isoDepositTokens_
bool enabled() const
&#39;true&#39; if this there is at least one efficiency configured
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
void setIsoDeposit(IsolationKeys key, const IsoDeposit &dep)
Sets the IsoDeposit associated with some key; if it is already existent, it is overwritten.
Definition: Lepton.h:175
void embedCombinedMuon()
set reference to Track reconstructed in both tracked and muon detector (reimplemented from reco::Muon...
Definition: Muon.cc:313
static void fillDescription(edm::ParameterSetDescription &iDesc)
edm::EDGetTokenT< reco::BeamSpot > beamLineToken_
input source of the primary vertex/beamspot
void embedCaloMETMuonCorrs(const reco::MuonMETCorrectionData &t)
embed the MuonMETCorrectionData for muon corrected caloMET
Definition: Muon.cc:322
bool useParticleFlow_
switch to use particle flow (PF2PAT) or not
pat::PATUserDataHelper< pat::Muon > userDataHelper_
helper class to add userData to the muon
bool isAValidMuonTrack(const MuonTrackType &type) const
Definition: Muon.cc:853
bool enabled() const
True if it has a non null configuration.
Definition: MultiIsolator.h:50
bool embedStandAloneMuon_
embed track from muon system into the muon
void setComment(std::string const &value)
reco::PFCandidateRef pfCandidateRef() const
reference to the source IsolatedPFCandidates
Definition: Muon.cc:228
int iEvent
Definition: GenABIO.cc:230
void beginEvent(const edm::Event &event, const edm::EventSetup &eventSetup)
GreaterByPt< Muon > pTComparator_
bool embedTrack_
embed the track from inner tracker into the muon
bool addGenMatch_
add generator match information
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
description of config file parameters
OrphanHandle< PROD > put(std::auto_ptr< PROD > product)
Put a new product.
Definition: Event.h:113
void embedGenParticle()
Definition: PATObject.h:677
void embedTrack()
set reference to Track reconstructed in the tracker only (reimplemented from reco::Muon) ...
Definition: Muon.cc:293
void embedTcMETMuonCorrs(const reco::MuonMETCorrectionData &t)
embed the MuonMETCorrectionData for tcMET
Definition: Muon.cc:329
tuple result
Definition: query.py:137
virtual void produce(edm::Event &iEvent, const edm::EventSetup &iSetup) override
everything that needs to be done during the event loop
int j
Definition: DBlmapReader.cc:9
math::XYZPoint Point
point in the space
Definition: TrackBase.h:82
ParameterDescriptionBase * add(U const &iLabel, T const &value)
bool first
Definition: L1TdeRCT.cc:75
bool isValid() const
Definition: HandleBase.h:76
reco::MuonRef muonRef() const
Definition: PFCandidate.cc:450
void embedTpfmsMuon()
embed reference to the above tpfms Track
Definition: Muon.cc:346
void addGenParticleRef(const reco::GenParticleRef &ref)
Definition: PATObject.h:661
void embedDytMuon()
embed reference to the above dyt Track
Definition: Muon.cc:356
bool embedTunePBestTrack_
embed the track from best muon measurement (muon only)
static void fillDescription(edm::ParameterSetDescription &iDesc)
Method for documentation and validation of PSet.
tuple idx
DEBUGGING if hasattr(process,&quot;trackMonIterativeTracking2012&quot;): print &quot;trackMonIterativeTracking2012 D...
const T & get() const
Definition: EventSetup.h:55
void setEfficiencies(pat::PATObject< T > &obj, const R &originalRef) const
Sets the efficiencies for this object, using the reference to the original objects.
void embedTunePMuonBestTrack(bool force=false)
embed the Track selected to be the best measurement of the muon parameters
Definition: Muon.cc:267
std::pair< bool, Measurement1D > absoluteTransverseImpactParameter(const reco::TransientTrack &transientTrack, const reco::Vertex &vertex)
Definition: IPTools.cc:43
std::vector< edm::Handle< edm::Association< reco::GenParticleCollection > > > GenAssociations
void fillMuon(Muon &aMuon, const MuonBaseRef &muonRef, const reco::CandidateBaseRef &baseRef, const GenAssociations &genMatches, const IsoDepositMaps &deposits, const IsolationValueMaps &isolationValues) const
common muon filling, for both the standard and PF2PAT case
std::vector< std::pair< pat::IsolationKeys, float > > IsolationValuePairs
Definition: MultiIsolator.h:16
Particle reconstructed by the particle flow algorithm.
Definition: PFCandidate.h:39
pat::helper::EfficiencyLoader efficiencyLoader_
helper class to add efficiencies to the muon
bool embedPickyMuon_
embed track from picky muon fit into the muon
void setNormChi2(double normChi2)
Definition: Muon.h:231
tuple muons
Definition: patZpeak.py:38
boost::indirect_iterator< typename seq_t::const_iterator > const_iterator
Definition: View.h:81
bool embedDytMuon_
embed track from DYT muon fit into the muon
double y0() const
y coordinate
Definition: BeamSpot.h:66
std::vector< edm::Handle< edm::ValueMap< IsoDeposit > > > IsoDepositMaps
pat::helper::MultiIsolator::IsolationValuePairs isolatorTmpStorage_
isolation value pair for temporary storage before being folded into the muon
bool embedGenMatch_
embed the gen match information into the muon
const Point & position() const
position
Definition: BeamSpot.h:62
IsolationLabels isoDepositLabels_
input source for isoDeposits
std::vector< edm::EDGetTokenT< edm::Association< reco::GenParticleCollection > > > genMatchTokens_
input tags for generator match information
volatile std::atomic< bool > shutdown_flag false
Covariance3DMatrix rotatedCovariance3D() const
Definition: BeamSpot.cc:78
IsolationLabels isolationValueLabels_
input source isolation value maps
std::vector< edm::Handle< edm::ValueMap< double > > > IsolationValueMaps
bool forceEmbedBestTrack_
force separate embed of the best track even if already embedded
bool embedPFCandidate_
embed pfCandidates into the muon
void newEvent(const edm::Event &event, const edm::EventSetup &setup) const
To be called for each new event, reads in the EventSetup object.
std::vector< edm::EDGetTokenT< edm::ValueMap< double > > > isolationValueTokens_
void setNumberOfValidHits(unsigned int numberOfValidHits)
Definition: Muon.h:226
bool embedCombinedMuon_
embed track of the combined fit into the muon
Analysis-level muon class.
Definition: Muon.h:50
pat::helper::KinResolutionsLoader resolutionLoader_
helper class to add resolutions to the muon
static std::string const source
Definition: EdmProvDump.cc:43
void newEvent(const edm::Event &event) const
To be called for each new event, reads in the ValueMaps for efficiencies.
void setDB(double dB, double edB, IpType type=None)
Definition: Muon.h:216
Global3DVector GlobalVector
Definition: GlobalVector.h:10
void fill(const edm::View< T > &coll, int idx, IsolationValuePairs &isolations) const
Definition: MultiIsolator.h:82
tuple pfMuons
Definition: pfMuons_cff.py:8
double x0() const
x coordinate
Definition: BeamSpot.h:64
bool embedHighLevelSelection_
embed high level selection variables