CMS 3D CMS Logo

PATMuonProducer.cc
Go to the documentation of this file.
1 
54 
55 namespace pat {
56 
58  public:
60 
64 
65  private:
66  std::unique_ptr<const pat::CalculatePtRatioRel> calculatePtRatioRel_;
67  std::unique_ptr<const pat::MuonMvaIDEstimator> muonMvaIDEstimator_;
68  std::unique_ptr<const pat::SoftMuonMvaEstimator> softMuonMvaEstimator_;
69  };
70 
72  class TrackerIsolationPt;
73  class CaloIsolationEnergy;
74 
76  class PATMuonProducer : public edm::stream::EDProducer<edm::GlobalCache<PATMuonHeavyObjectCache>> {
77  public:
79  explicit PATMuonProducer(const edm::ParameterSet& iConfig, PATMuonHeavyObjectCache const*);
81  ~PATMuonProducer() override;
82 
83  static std::unique_ptr<PATMuonHeavyObjectCache> initializeGlobalCache(const edm::ParameterSet& iConfig) {
84  return std::make_unique<PATMuonHeavyObjectCache>(iConfig);
85  }
86 
88 
90  void produce(edm::Event& iEvent, const edm::EventSetup& iSetup) override;
92  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
93 
94  private:
97  typedef std::vector<edm::Handle<edm::Association<reco::GenParticleCollection>>> GenAssociations;
98  typedef std::vector<edm::Handle<edm::ValueMap<IsoDeposit>>> IsoDepositMaps;
99  typedef std::vector<edm::Handle<edm::ValueMap<double>>> IsolationValueMaps;
100  typedef std::pair<pat::IsolationKeys, edm::InputTag> IsolationLabel;
101  typedef std::vector<IsolationLabel> IsolationLabels;
102 
104  void fillMuon(Muon& aMuon,
105  const MuonBaseRef& muonRef,
106  const reco::CandidateBaseRef& baseRef,
107  const GenAssociations& genMatches,
108  const IsoDepositMaps& deposits,
109  const IsolationValueMaps& isolationValues) const;
112  template <typename T>
113  void readIsolationLabels(const edm::ParameterSet& iConfig,
114  const char* psetName,
117 
119  double getRelMiniIsoPUCorrected(const pat::Muon& muon, double rho, const std::vector<double>& area);
120 
122  bool isNeutralHadron(long pdgid);
123  bool isChargedHadron(long pdgid);
124  bool isPhoton(long pdgid);
125 
126  // embed various impact parameters with errors
127  // embed high level selection
128  void embedHighLevel(pat::Muon& aMuon,
132  bool primaryVertexIsValid,
134  bool beamspotIsValid);
135  double relMiniIsoPUCorrected(const pat::Muon& aMuon, double rho);
136  std::optional<GlobalPoint> getMuonDirection(const reco::MuonChamberMatch& chamberMatch,
138  const DetId& chamberId);
140  edm::Handle<std::vector<pat::TriggerObjectStandAlone>>& triggerObjects,
141  const edm::TriggerNames& names,
144  edm::Handle<std::vector<pat::TriggerObjectStandAlone>>& triggerObjects,
145  const edm::TriggerNames& names,
146  const std::vector<std::string>& collection_names);
147 
148  private:
151 
152  // for mini-iso calculation
156  std::vector<double> effectiveAreaVec_;
157  std::vector<double> miniIsoParams_;
159 
193  std::vector<edm::EDGetTokenT<edm::Association<reco::GenParticleCollection>>> genMatchTokens_;
214  std::vector<edm::EDGetTokenT<edm::ValueMap<IsoDeposit>>> isoDepositTokens_;
217  std::vector<edm::EDGetTokenT<edm::ValueMap<double>>> isolationValueTokens_;
226  //PUPPI isolation tokens
230  //PUPPINoLeptons isolation tokens
238  bool useJec_;
243 
253 
256 
261  std::vector<std::string> hltCollectionFilters_;
262 
265 
267  };
268 
269 } // namespace pat
270 
271 template <typename T>
273  const char* psetName,
276  labels.clear();
277 
278  if (iConfig.exists(psetName)) {
280 
281  if (depconf.exists("tracker"))
282  labels.emplace_back(pat::TrackIso, depconf.getParameter<edm::InputTag>("tracker"));
283  if (depconf.exists("ecal"))
284  labels.emplace_back(pat::EcalIso, depconf.getParameter<edm::InputTag>("ecal"));
285  if (depconf.exists("hcal"))
286  labels.emplace_back(pat::HcalIso, depconf.getParameter<edm::InputTag>("hcal"));
287  if (depconf.exists("pfAllParticles")) {
288  labels.emplace_back(pat::PfAllParticleIso, depconf.getParameter<edm::InputTag>("pfAllParticles"));
289  }
290  if (depconf.exists("pfChargedHadrons")) {
291  labels.emplace_back(pat::PfChargedHadronIso, depconf.getParameter<edm::InputTag>("pfChargedHadrons"));
292  }
293  if (depconf.exists("pfChargedAll")) {
294  labels.emplace_back(pat::PfChargedAllIso, depconf.getParameter<edm::InputTag>("pfChargedAll"));
295  }
296  if (depconf.exists("pfPUChargedHadrons")) {
297  labels.emplace_back(pat::PfPUChargedHadronIso, depconf.getParameter<edm::InputTag>("pfPUChargedHadrons"));
298  }
299  if (depconf.exists("pfNeutralHadrons")) {
300  labels.emplace_back(pat::PfNeutralHadronIso, depconf.getParameter<edm::InputTag>("pfNeutralHadrons"));
301  }
302  if (depconf.exists("pfPhotons")) {
303  labels.emplace_back(pat::PfGammaIso, depconf.getParameter<edm::InputTag>("pfPhotons"));
304  }
305  if (depconf.exists("user")) {
306  std::vector<edm::InputTag> userdeps = depconf.getParameter<std::vector<edm::InputTag>>("user");
307  std::vector<edm::InputTag>::const_iterator it = userdeps.begin(), ed = userdeps.end();
309  for (; it != ed; ++it, ++key) {
310  labels.push_back(std::make_pair(pat::IsolationKeys(key), *it));
311  }
312  tokens = edm::vector_transform(
313  labels, [this](IsolationLabel const& label) { return consumes<edm::ValueMap<T>>(label.second); });
314  }
315  }
317  return consumes<edm::ValueMap<T>>(label.second);
318  });
319 }
320 
321 using namespace pat;
322 using namespace std;
323 
325  if (iConfig.getParameter<bool>("computeMiniIso")) {
326  float mvaDrMax = iConfig.getParameter<double>("mvaDrMax");
327  calculatePtRatioRel_ = std::make_unique<CalculatePtRatioRel>(mvaDrMax * mvaDrMax);
328  }
329 
330  if (iConfig.getParameter<bool>("computeMuonIDMVA")) {
331  edm::FileInPath mvaIDTrainingFile = iConfig.getParameter<edm::FileInPath>("mvaIDTrainingFile");
332  muonMvaIDEstimator_ = std::make_unique<MuonMvaIDEstimator>(mvaIDTrainingFile);
333  }
334 
335  if (iConfig.getParameter<bool>("computeSoftMuonMVA")) {
336  edm::FileInPath softMvaTrainingFile = iConfig.getParameter<edm::FileInPath>("softMvaTrainingFile");
337  softMuonMvaEstimator_ = std::make_unique<SoftMuonMvaEstimator>(softMvaTrainingFile);
338  }
339 }
340 
342  : relMiniIsoPUCorrected_(0),
343  useUserData_(iConfig.exists("userData")),
344  computeMuonIDMVA_(false),
345  computeSoftMuonMVA_(false),
346  recomputeBasicSelectors_(false),
347  useJec_(false),
348  isolator_(iConfig.getParameter<edm::ParameterSet>("userIsolation"), consumesCollector(), false),
349  geometryToken_{esConsumes()},
350  transientTrackBuilderToken_{esConsumes(edm::ESInputTag("", "TransientTrackBuilder"))},
351  patMuonPutToken_{produces<std::vector<Muon>>()} {
352  // input source
353  muonToken_ = consumes<edm::View<reco::Muon>>(iConfig.getParameter<edm::InputTag>("muonSource"));
354  // embedding of tracks
355  embedBestTrack_ = iConfig.getParameter<bool>("embedMuonBestTrack");
356  embedTunePBestTrack_ = iConfig.getParameter<bool>("embedTunePMuonBestTrack");
357  forceEmbedBestTrack_ = iConfig.getParameter<bool>("forceBestTrackEmbedding");
358  embedTrack_ = iConfig.getParameter<bool>("embedTrack");
359  embedCombinedMuon_ = iConfig.getParameter<bool>("embedCombinedMuon");
360  embedStandAloneMuon_ = iConfig.getParameter<bool>("embedStandAloneMuon");
361  // embedding of muon MET correction information
362  embedCaloMETMuonCorrs_ = iConfig.getParameter<bool>("embedCaloMETMuonCorrs");
363  embedTcMETMuonCorrs_ = iConfig.getParameter<bool>("embedTcMETMuonCorrs");
364  caloMETMuonCorrsToken_ =
365  mayConsume<edm::ValueMap<reco::MuonMETCorrectionData>>(iConfig.getParameter<edm::InputTag>("caloMETMuonCorrs"));
366  tcMETMuonCorrsToken_ =
367  mayConsume<edm::ValueMap<reco::MuonMETCorrectionData>>(iConfig.getParameter<edm::InputTag>("tcMETMuonCorrs"));
368  // pflow specific configurables
369  useParticleFlow_ = iConfig.getParameter<bool>("useParticleFlow");
370  embedPFCandidate_ = iConfig.getParameter<bool>("embedPFCandidate");
371  pfMuonToken_ = mayConsume<reco::PFCandidateCollection>(iConfig.getParameter<edm::InputTag>("pfMuonSource"));
372  embedPfEcalEnergy_ = iConfig.getParameter<bool>("embedPfEcalEnergy");
373  // embedding of tracks from TeV refit
374  embedPickyMuon_ = iConfig.getParameter<bool>("embedPickyMuon");
375  embedTpfmsMuon_ = iConfig.getParameter<bool>("embedTpfmsMuon");
376  embedDytMuon_ = iConfig.getParameter<bool>("embedDytMuon");
377  // embedding of inverse beta variable information
378  addInverseBeta_ = iConfig.getParameter<bool>("addInverseBeta");
379  if (addInverseBeta_) {
380  muonTimeExtraToken_ =
381  consumes<edm::ValueMap<reco::MuonTimeExtra>>(iConfig.getParameter<edm::InputTag>("sourceMuonTimeExtra"));
382  }
383  // Monte Carlo matching
384  addGenMatch_ = iConfig.getParameter<bool>("addGenMatch");
385  if (addGenMatch_) {
386  embedGenMatch_ = iConfig.getParameter<bool>("embedGenMatch");
387  if (iConfig.existsAs<edm::InputTag>("genParticleMatch")) {
388  genMatchTokens_.push_back(consumes<edm::Association<reco::GenParticleCollection>>(
389  iConfig.getParameter<edm::InputTag>("genParticleMatch")));
390  } else {
391  genMatchTokens_ = edm::vector_transform(
392  iConfig.getParameter<std::vector<edm::InputTag>>("genParticleMatch"),
393  [this](edm::InputTag const& tag) { return consumes<edm::Association<reco::GenParticleCollection>>(tag); });
394  }
395  }
396  // efficiencies
397  addEfficiencies_ = iConfig.getParameter<bool>("addEfficiencies");
398  if (addEfficiencies_) {
399  efficiencyLoader_ =
400  pat::helper::EfficiencyLoader(iConfig.getParameter<edm::ParameterSet>("efficiencies"), consumesCollector());
401  }
402  // resolutions
403  addResolutions_ = iConfig.getParameter<bool>("addResolutions");
404  if (addResolutions_) {
405  resolutionLoader_ =
406  pat::helper::KinResolutionsLoader(iConfig.getParameter<edm::ParameterSet>("resolutions"), consumesCollector());
407  }
408  // puppi
409  addPuppiIsolation_ = iConfig.getParameter<bool>("addPuppiIsolation");
410  if (addPuppiIsolation_) {
411  PUPPIIsolation_charged_hadrons_ =
412  consumes<edm::ValueMap<float>>(iConfig.getParameter<edm::InputTag>("puppiIsolationChargedHadrons"));
413  PUPPIIsolation_neutral_hadrons_ =
414  consumes<edm::ValueMap<float>>(iConfig.getParameter<edm::InputTag>("puppiIsolationNeutralHadrons"));
415  PUPPIIsolation_photons_ =
416  consumes<edm::ValueMap<float>>(iConfig.getParameter<edm::InputTag>("puppiIsolationPhotons"));
417  //puppiNoLeptons
418  PUPPINoLeptonsIsolation_charged_hadrons_ =
419  consumes<edm::ValueMap<float>>(iConfig.getParameter<edm::InputTag>("puppiNoLeptonsIsolationChargedHadrons"));
420  PUPPINoLeptonsIsolation_neutral_hadrons_ =
421  consumes<edm::ValueMap<float>>(iConfig.getParameter<edm::InputTag>("puppiNoLeptonsIsolationNeutralHadrons"));
422  PUPPINoLeptonsIsolation_photons_ =
423  consumes<edm::ValueMap<float>>(iConfig.getParameter<edm::InputTag>("puppiNoLeptonsIsolationPhotons"));
424  }
425  // read isoDeposit labels, for direct embedding
426  readIsolationLabels(iConfig, "isoDeposits", isoDepositLabels_, isoDepositTokens_);
427  // read isolation value labels, for direct embedding
428  readIsolationLabels(iConfig, "isolationValues", isolationValueLabels_, isolationValueTokens_);
429  // check to see if the user wants to add user data
430  if (useUserData_) {
431  userDataHelper_ = PATUserDataHelper<Muon>(iConfig.getParameter<edm::ParameterSet>("userData"), consumesCollector());
432  }
433  // embed high level selection variables
434  embedHighLevelSelection_ = iConfig.getParameter<bool>("embedHighLevelSelection");
435  if (embedHighLevelSelection_) {
436  beamLineToken_ = consumes<reco::BeamSpot>(iConfig.getParameter<edm::InputTag>("beamLineSrc"));
437  pvToken_ = consumes<std::vector<reco::Vertex>>(iConfig.getParameter<edm::InputTag>("pvSrc"));
438  }
439 
440  //for mini-isolation calculation
441  computeMiniIso_ = iConfig.getParameter<bool>("computeMiniIso");
442 
443  computePuppiCombinedIso_ = iConfig.getParameter<bool>("computePuppiCombinedIso");
444 
445  effectiveAreaVec_ = iConfig.getParameter<std::vector<double>>("effectiveAreaVec");
446 
447  miniIsoParams_ = iConfig.getParameter<std::vector<double>>("miniIsoParams");
448  if (computeMiniIso_ && miniIsoParams_.size() != 9) {
449  throw cms::Exception("ParameterError") << "miniIsoParams must have exactly 9 elements.\n";
450  }
451  if (computeMiniIso_ || computePuppiCombinedIso_)
452  pcToken_ = consumes<pat::PackedCandidateCollection>(iConfig.getParameter<edm::InputTag>("pfCandsForMiniIso"));
453 
454  // standard selectors
455  recomputeBasicSelectors_ = iConfig.getParameter<bool>("recomputeBasicSelectors");
456  computeMuonIDMVA_ = iConfig.getParameter<bool>("computeMuonIDMVA");
457 
458  if (computeMiniIso_) {
459  // pfCombinedInclusiveSecondaryVertexV2BJetTags
460  mvaBTagCollectionTag_ = consumes<reco::JetTagCollection>(iConfig.getParameter<edm::InputTag>("mvaJetTag"));
461  mvaL1Corrector_ = consumes<reco::JetCorrector>(iConfig.getParameter<edm::InputTag>("mvaL1Corrector"));
462  mvaL1L2L3ResCorrector_ = consumes<reco::JetCorrector>(iConfig.getParameter<edm::InputTag>("mvaL1L2L3ResCorrector"));
463  rho_ = consumes<double>(iConfig.getParameter<edm::InputTag>("rho"));
464  useJec_ = iConfig.getParameter<bool>("useJec");
465  }
466 
467  computeSoftMuonMVA_ = iConfig.getParameter<bool>("computeSoftMuonMVA");
468 
469  // MC info
470  simInfo_ = consumes<edm::ValueMap<reco::MuonSimInfo>>(iConfig.getParameter<edm::InputTag>("muonSimInfo"));
471 
472  addTriggerMatching_ = iConfig.getParameter<bool>("addTriggerMatching");
473  if (addTriggerMatching_) {
474  triggerObjects_ =
475  consumes<std::vector<pat::TriggerObjectStandAlone>>(iConfig.getParameter<edm::InputTag>("triggerObjects"));
476  triggerResults_ = consumes<edm::TriggerResults>(iConfig.getParameter<edm::InputTag>("triggerResults"));
477  }
478  hltCollectionFilters_ = iConfig.getParameter<std::vector<std::string>>("hltCollectionFilters");
479 }
480 
482 
483 std::optional<GlobalPoint> PATMuonProducer::getMuonDirection(const reco::MuonChamberMatch& chamberMatch,
485  const DetId& chamberId) {
486  const GeomDet* chamberGeometry = geometry->idToDet(chamberId);
487  if (chamberGeometry) {
488  LocalPoint localPosition(chamberMatch.x, chamberMatch.y, 0);
489  return std::optional<GlobalPoint>(std::in_place, chamberGeometry->toGlobal(localPosition));
490  }
491  return std::optional<GlobalPoint>();
492 }
493 
495  edm::Handle<std::vector<pat::TriggerObjectStandAlone>>& triggerObjects,
496  const edm::TriggerNames& names,
498  // L1 trigger object parameters are defined at MB2/ME2. Use the muon
499  // chamber matching information to get the local direction of the
500  // muon trajectory and convert it to a global direction to match the
501  // trigger objects
502 
503  std::optional<GlobalPoint> muonPosition;
504  // Loop over chambers
505  // initialize muonPosition with any available match, just in case
506  // the second station is missing - it's better folling back to
507  // dR matching at IP
508  for (const auto& chamberMatch : aMuon.matches()) {
509  if (chamberMatch.id.subdetId() == MuonSubdetId::DT) {
510  DTChamberId detId(chamberMatch.id.rawId());
511  if (abs(detId.station()) > 3)
512  continue;
513  muonPosition = getMuonDirection(chamberMatch, geometry, detId);
514  if (abs(detId.station()) == 2)
515  break;
516  }
517  if (chamberMatch.id.subdetId() == MuonSubdetId::CSC) {
518  CSCDetId detId(chamberMatch.id.rawId());
519  if (abs(detId.station()) > 3)
520  continue;
521  muonPosition = getMuonDirection(chamberMatch, geometry, detId);
522  if (abs(detId.station()) == 2)
523  break;
524  }
525  }
526  if (not muonPosition)
527  return;
528  for (const auto& triggerObject : *triggerObjects) {
529  if (triggerObject.hasTriggerObjectType(trigger::TriggerL1Mu)) {
530  if (std::abs(triggerObject.eta()) < 0.001) {
531  // L1 is defined in X-Y plain
532  if (deltaPhi(triggerObject.phi(), muonPosition->phi()) > 0.1)
533  continue;
534  } else {
535  // 3D L1
536  if (deltaR(triggerObject.p4(), *muonPosition) > 0.15)
537  continue;
538  }
539  pat::TriggerObjectStandAlone obj(triggerObject);
540  obj.unpackPathNames(names);
541  aMuon.addTriggerObjectMatch(obj);
542  }
543  }
544 }
545 
547  edm::Handle<std::vector<pat::TriggerObjectStandAlone>>& triggerObjects,
548  const edm::TriggerNames& names,
549  const std::vector<std::string>& collection_filter_names) {
550  // WARNING: in a case of close-by muons the dR matching may select both muons.
551  // It's better to select the best match for a given collection.
552  for (const auto& triggerObject : *triggerObjects) {
553  if (triggerObject.hasTriggerObjectType(trigger::TriggerMuon)) {
554  bool keepIt = false;
555  for (const auto& name : collection_filter_names) {
556  if (triggerObject.hasCollection(name)) {
557  keepIt = true;
558  break;
559  }
560  }
561  if (not keepIt)
562  continue;
563  if (deltaR(triggerObject.p4(), muon) > 0.1)
564  continue;
565  pat::TriggerObjectStandAlone obj(triggerObject);
566  obj.unpackPathNames(names);
567  muon.addTriggerObjectMatch(obj);
568  }
569  }
570 }
571 
573  // get the tracking Geometry
574  auto geometry = iSetup.getHandle(geometryToken_);
575  if (!geometry.isValid())
576  throw cms::Exception("FatalError") << "Unable to find GlobalTrackingGeometryRecord in event!\n";
577 
578  // switch off embedding (in unschedules mode)
579  if (iEvent.isRealData()) {
580  addGenMatch_ = false;
581  embedGenMatch_ = false;
582  }
583 
585  iEvent.getByToken(muonToken_, muons);
586 
589  iEvent.getByToken(pcToken_, pc);
590 
591  // get the ESHandle for the transient track builder,
592  // if needed for high level selection embedding
593  TransientTrackBuilder const* trackBuilder = nullptr;
594 
595  if (isolator_.enabled())
596  isolator_.beginEvent(iEvent, iSetup);
601 
603  for (size_t j = 0; j < isoDepositTokens_.size(); ++j) {
604  iEvent.getByToken(isoDepositTokens_[j], deposits[j]);
605  }
606 
608  for (size_t j = 0; j < isolationValueTokens_.size(); ++j) {
610  }
611 
612  //value maps for puppi isolation
613  edm::Handle<edm::ValueMap<float>> PUPPIIsolation_charged_hadrons;
614  edm::Handle<edm::ValueMap<float>> PUPPIIsolation_neutral_hadrons;
615  edm::Handle<edm::ValueMap<float>> PUPPIIsolation_photons;
616  //value maps for puppiNoLeptons isolation
617  edm::Handle<edm::ValueMap<float>> PUPPINoLeptonsIsolation_charged_hadrons;
618  edm::Handle<edm::ValueMap<float>> PUPPINoLeptonsIsolation_neutral_hadrons;
619  edm::Handle<edm::ValueMap<float>> PUPPINoLeptonsIsolation_photons;
620  if (addPuppiIsolation_) {
621  //puppi
622  iEvent.getByToken(PUPPIIsolation_charged_hadrons_, PUPPIIsolation_charged_hadrons);
623  iEvent.getByToken(PUPPIIsolation_neutral_hadrons_, PUPPIIsolation_neutral_hadrons);
624  iEvent.getByToken(PUPPIIsolation_photons_, PUPPIIsolation_photons);
625  //puppiNoLeptons
626  iEvent.getByToken(PUPPINoLeptonsIsolation_charged_hadrons_, PUPPINoLeptonsIsolation_charged_hadrons);
627  iEvent.getByToken(PUPPINoLeptonsIsolation_neutral_hadrons_, PUPPINoLeptonsIsolation_neutral_hadrons);
628  iEvent.getByToken(PUPPINoLeptonsIsolation_photons_, PUPPINoLeptonsIsolation_photons);
629  }
630 
631  // inputs for muon mva
632  edm::Handle<reco::JetTagCollection> mvaBTagCollectionTag;
635  if (computeMiniIso_) {
636  iEvent.getByToken(mvaBTagCollectionTag_, mvaBTagCollectionTag);
639  }
640 
641  // prepare the MC genMatchTokens_
642  GenAssociations genMatches(genMatchTokens_.size());
643  if (addGenMatch_) {
644  for (size_t j = 0, nd = genMatchTokens_.size(); j < nd; ++j) {
645  iEvent.getByToken(genMatchTokens_[j], genMatches[j]);
646  }
647  }
648 
649  // prepare the high level selection: needs beamline
650  // OR primary vertex, depending on user selection
653  bool beamSpotIsValid = false;
654  bool primaryVertexIsValid = false;
656  // get the beamspot
657  edm::Handle<reco::BeamSpot> beamSpotHandle;
658  iEvent.getByToken(beamLineToken_, beamSpotHandle);
659 
660  // get the primary vertex
662  iEvent.getByToken(pvToken_, pvHandle);
663 
664  if (beamSpotHandle.isValid()) {
665  beamSpot = *beamSpotHandle;
666  beamSpotIsValid = true;
667  } else {
668  edm::LogError("DataNotAvailable") << "No beam spot available from EventSetup, not adding high level selection \n";
669  }
670  if (pvHandle.isValid() && !pvHandle->empty()) {
671  primaryVertex = pvHandle->at(0);
672  primaryVertexIsValid = true;
673  } else {
674  edm::LogError("DataNotAvailable")
675  << "No primary vertex available from EventSetup, not adding high level selection \n";
676  }
677  // this is needed by the IPTools methods from the tracking group
678  trackBuilder = &iSetup.getData(transientTrackBuilderToken_);
679  }
680 
681  // MC info
683  bool simInfoIsAvailalbe = iEvent.getByToken(simInfo_, simInfo);
684 
685  // this will be the new object collection
686  std::vector<Muon> patMuons;
687 
689  if (useParticleFlow_) {
690  // get the PFCandidates of type muons
691  iEvent.getByToken(pfMuonToken_, pfMuons);
692 
693  unsigned index = 0;
694  for (reco::PFCandidateConstIterator i = pfMuons->begin(); i != pfMuons->end(); ++i, ++index) {
695  const reco::PFCandidate& pfmu = *i;
696  //const reco::IsolaPFCandidate& pfmu = *i;
697  const reco::MuonRef& muonRef = pfmu.muonRef();
698  assert(muonRef.isNonnull());
699 
700  MuonBaseRef muonBaseRef(muonRef);
701  Muon aMuon(muonBaseRef);
702 
703  if (useUserData_) {
704  userDataHelper_.add(aMuon, iEvent, iSetup);
705  }
706 
707  // embed high level selection
709  // get the tracks
710  reco::TrackRef innerTrack = muonBaseRef->innerTrack();
711  reco::TrackRef globalTrack = muonBaseRef->globalTrack();
712  reco::TrackRef bestTrack = muonBaseRef->muonBestTrack();
713  reco::TrackRef chosenTrack = innerTrack;
714  // Make sure the collection it points to is there
715  if (bestTrack.isNonnull() && bestTrack.isAvailable())
716  chosenTrack = bestTrack;
717 
718  if (chosenTrack.isNonnull() && chosenTrack.isAvailable()) {
719  unsigned int nhits = chosenTrack->numberOfValidHits(); // ????
721 
722  reco::TransientTrack tt = trackBuilder->build(chosenTrack);
723  embedHighLevel(aMuon, chosenTrack, tt, primaryVertex, primaryVertexIsValid, beamSpot, beamSpotIsValid);
724  }
725 
726  if (globalTrack.isNonnull() && globalTrack.isAvailable() && !embedCombinedMuon_) {
727  double norm_chi2 = globalTrack->chi2() / globalTrack->ndof();
728  aMuon.setNormChi2(norm_chi2);
729  }
730  }
731  reco::PFCandidateRef pfRef(pfMuons, index);
732  //reco::PFCandidatePtr ptrToMother(pfMuons,index);
733  reco::CandidateBaseRef pfBaseRef(pfRef);
734 
735  aMuon.setPFCandidateRef(pfRef);
736  if (embedPFCandidate_)
737  aMuon.embedPFCandidate();
738  fillMuon(aMuon, muonBaseRef, pfBaseRef, genMatches, deposits, isolationValues);
739 
740  if (computeMiniIso_)
741  setMuonMiniIso(aMuon, pc.product());
742 
743  if (addPuppiIsolation_) {
744  aMuon.setIsolationPUPPI((*PUPPIIsolation_charged_hadrons)[muonBaseRef],
745  (*PUPPIIsolation_neutral_hadrons)[muonBaseRef],
746  (*PUPPIIsolation_photons)[muonBaseRef]);
747 
748  aMuon.setIsolationPUPPINoLeptons((*PUPPINoLeptonsIsolation_charged_hadrons)[muonBaseRef],
749  (*PUPPINoLeptonsIsolation_neutral_hadrons)[muonBaseRef],
750  (*PUPPINoLeptonsIsolation_photons)[muonBaseRef]);
751  } else {
752  aMuon.setIsolationPUPPI(-999., -999., -999.);
753  aMuon.setIsolationPUPPINoLeptons(-999., -999., -999.);
754  }
755 
756  if (embedPfEcalEnergy_) {
757  aMuon.setPfEcalEnergy(pfmu.ecalEnergy());
758  }
759 
760  patMuons.push_back(aMuon);
761  }
762  } else {
764  iEvent.getByToken(muonToken_, muons);
765 
766  // embedding of muon MET corrections
768  //edm::ValueMap<reco::MuonMETCorrectionData> caloMETmuCorValueMap;
771  //caloMETmuCorValueMap = *caloMETmuCorValueMap_h;
772  }
774  //edm::ValueMap<reco::MuonMETCorrectionData> tcMETmuCorValueMap;
775  if (embedTcMETMuonCorrs_) {
777  //tcMETmuCorValueMap = *tcMETmuCorValueMap_h;
778  }
779 
781  // get the PFCandidates of type muons
782  iEvent.getByToken(pfMuonToken_, pfMuons);
783  }
784 
786  if (addInverseBeta_) {
787  // get MuonTimerExtra value map
788  iEvent.getByToken(muonTimeExtraToken_, muonsTimeExtra);
789  }
790 
791  for (edm::View<reco::Muon>::const_iterator itMuon = muons->begin(); itMuon != muons->end(); ++itMuon) {
792  // construct the Muon from the ref -> save ref to original object
793  unsigned int idx = itMuon - muons->begin();
794  MuonBaseRef muonRef = muons->refAt(idx);
795  reco::CandidateBaseRef muonBaseRef(muonRef);
796 
797  Muon aMuon(muonRef);
798  fillMuon(aMuon, muonRef, muonBaseRef, genMatches, deposits, isolationValues);
799  if (computeMiniIso_)
800  setMuonMiniIso(aMuon, pc.product());
801  if (addPuppiIsolation_) {
802  aMuon.setIsolationPUPPI((*PUPPIIsolation_charged_hadrons)[muonRef],
803  (*PUPPIIsolation_neutral_hadrons)[muonRef],
804  (*PUPPIIsolation_photons)[muonRef]);
805  aMuon.setIsolationPUPPINoLeptons((*PUPPINoLeptonsIsolation_charged_hadrons)[muonRef],
806  (*PUPPINoLeptonsIsolation_neutral_hadrons)[muonRef],
807  (*PUPPINoLeptonsIsolation_photons)[muonRef]);
808  } else {
809  aMuon.setIsolationPUPPI(-999., -999., -999.);
810  aMuon.setIsolationPUPPINoLeptons(-999., -999., -999.);
811  }
812 
813  // Isolation
814  if (isolator_.enabled()) {
815  //reco::CandidatePtr mother = ptrToMother->sourceCandidatePtr(0);
817  typedef pat::helper::MultiIsolator::IsolationValuePairs IsolationValuePairs;
818  // better to loop backwards, so the vector is resized less times
819  for (IsolationValuePairs::const_reverse_iterator it = isolatorTmpStorage_.rbegin(),
820  ed = isolatorTmpStorage_.rend();
821  it != ed;
822  ++it) {
823  aMuon.setIsolation(it->first, it->second);
824  }
825  }
826 
827  // for (size_t j = 0, nd = deposits.size(); j < nd; ++j) {
828  // aMuon.setIsoDeposit(isoDepositLabels_[j].first,
829  // (*deposits[j])[muonRef]);
830  // }
831 
832  // add sel to selected
833  edm::Ptr<reco::Muon> muonsPtr = muons->ptrAt(idx);
834  if (useUserData_) {
835  userDataHelper_.add(aMuon, iEvent, iSetup);
836  }
837 
838  // embed high level selection
840  // get the tracks
841  reco::TrackRef innerTrack = itMuon->innerTrack();
842  reco::TrackRef globalTrack = itMuon->globalTrack();
843  reco::TrackRef bestTrack = itMuon->muonBestTrack();
844  reco::TrackRef chosenTrack = innerTrack;
845  // Make sure the collection it points to is there
846  if (bestTrack.isNonnull() && bestTrack.isAvailable())
847  chosenTrack = bestTrack;
848  if (chosenTrack.isNonnull() && chosenTrack.isAvailable()) {
849  unsigned int nhits = chosenTrack->numberOfValidHits(); // ????
851 
852  reco::TransientTrack tt = trackBuilder->build(chosenTrack);
853  embedHighLevel(aMuon, chosenTrack, tt, primaryVertex, primaryVertexIsValid, beamSpot, beamSpotIsValid);
854  }
855 
856  if (globalTrack.isNonnull() && globalTrack.isAvailable()) {
857  double norm_chi2 = globalTrack->chi2() / globalTrack->ndof();
858  aMuon.setNormChi2(norm_chi2);
859  }
860  }
861 
862  // embed MET muon corrections
864  aMuon.embedCaloMETMuonCorrs((*caloMETMuonCorrs)[muonRef]);
866  aMuon.embedTcMETMuonCorrs((*tcMETMuonCorrs)[muonRef]);
867 
869  if (embedPfEcalEnergy_)
870  aMuon.setPfEcalEnergy(-99.0);
871  unsigned index = 0;
872  for (const reco::PFCandidate& pfmu : *pfMuons) {
873  if (pfmu.muonRef().isNonnull()) {
874  if (pfmu.muonRef().id() != muonRef.id())
875  throw cms::Exception("Configuration")
876  << "Muon reference within PF candidates does not point to the muon collection." << std::endl;
877  if (pfmu.muonRef().key() == muonRef.key()) {
878  reco::PFCandidateRef pfRef(pfMuons, index);
879  aMuon.setPFCandidateRef(pfRef);
880  if (embedPfEcalEnergy_)
881  aMuon.setPfEcalEnergy(pfmu.ecalEnergy());
882  if (embedPFCandidate_)
883  aMuon.embedPFCandidate();
884  break;
885  }
886  }
887  index++;
888  }
889  }
890 
891  if (addInverseBeta_) {
892  aMuon.readTimeExtra((*muonsTimeExtra)[muonRef]);
893  }
894  // MC info
895  aMuon.initSimInfo();
896  if (simInfoIsAvailalbe) {
897  const auto& msi = (*simInfo)[muonBaseRef];
898  aMuon.setSimType(msi.primaryClass);
899  aMuon.setExtSimType(msi.extendedClass);
900  aMuon.setSimFlavour(msi.flavour);
901  aMuon.setSimHeaviestMotherFlavour(msi.heaviestMotherFlavour);
902  aMuon.setSimPdgId(msi.pdgId);
903  aMuon.setSimMotherPdgId(msi.motherPdgId);
904  aMuon.setSimBX(msi.tpBX);
905  aMuon.setSimTpEvent(msi.tpEvent);
906  aMuon.setSimProdRho(msi.vertex.Rho());
907  aMuon.setSimProdZ(msi.vertex.Z());
908  aMuon.setSimPt(msi.p4.pt());
909  aMuon.setSimEta(msi.p4.eta());
910  aMuon.setSimPhi(msi.p4.phi());
911  aMuon.setSimMatchQuality(msi.tpAssoQuality);
912  }
913  patMuons.push_back(aMuon);
914  }
915  }
916 
917  // sort muons in pt
918  std::sort(patMuons.begin(), patMuons.end(), [](auto const& t1, auto const& t2) { return t1.pt() > t2.pt(); });
919 
920  // Store standard muon selection decisions and jet related
921  // quantaties.
922  // Need a separate loop over muons to have all inputs properly
923  // computed and stored in the object.
925  if (computeMiniIso_)
926  iEvent.getByToken(rho_, rho);
927  const reco::Vertex* pv(nullptr);
928  if (primaryVertexIsValid)
929  pv = &primaryVertex;
930 
933  bool triggerObjectsAvailable = false;
934  bool triggerResultsAvailable = false;
935  if (addTriggerMatching_) {
936  triggerObjectsAvailable = iEvent.getByToken(triggerObjects_, triggerObjects);
937  triggerResultsAvailable = iEvent.getByToken(triggerResults_, triggerResults);
938  }
939 
940  for (auto& muon : patMuons) {
941  // trigger info
942  if (addTriggerMatching_ and triggerObjectsAvailable and triggerResultsAvailable) {
943  const edm::TriggerNames& triggerNames(iEvent.triggerNames(*triggerResults));
946  }
947 
949  muon.setSelectors(0);
950  bool isRun2016BCDEF = (272728 <= iEvent.run() && iEvent.run() <= 278808);
951  muon.setSelectors(muon::makeSelectorBitset(muon, pv, isRun2016BCDEF));
952  }
953  float miniIsoValue = -1;
954  if (computeMiniIso_) {
955  // MiniIsolation working points
956 
957  miniIsoValue = getRelMiniIsoPUCorrected(muon, *rho, effectiveAreaVec_);
958 
959  muon.setSelector(reco::Muon::MiniIsoLoose, miniIsoValue < 0.40);
960  muon.setSelector(reco::Muon::MiniIsoMedium, miniIsoValue < 0.20);
961  muon.setSelector(reco::Muon::MiniIsoTight, miniIsoValue < 0.10);
962  muon.setSelector(reco::Muon::MiniIsoVeryTight, miniIsoValue < 0.05);
963  }
964 
965  double puppiCombinedIsolationPAT = -1;
967  puppiCombinedIsolationPAT = puppiCombinedIsolation(muon, pc.product());
968  muon.setSelector(reco::Muon::PuppiIsoLoose, puppiCombinedIsolationPAT < 0.27);
969  muon.setSelector(reco::Muon::PuppiIsoMedium, puppiCombinedIsolationPAT < 0.22);
970  muon.setSelector(reco::Muon::PuppiIsoTight, puppiCombinedIsolationPAT < 0.12);
971  }
972 
973  std::array<float, 2> jetPtRatioRel = {{0.0, 0.0}};
974  if (primaryVertexIsValid && computeMiniIso_) {
975  if (useJec_) {
976  jetPtRatioRel = globalCache()->calculatePtRatioRel().computePtRatioRel(
977  muon, *(mvaBTagCollectionTag.product()), mvaL1Corrector.product(), mvaL1L2L3ResCorrector.product());
978  } else {
979  jetPtRatioRel = globalCache()->calculatePtRatioRel().computePtRatioRel(muon, *mvaBTagCollectionTag);
980  }
981 
982  muon.setJetPtRatio(jetPtRatioRel[0]);
983  muon.setJetPtRel(jetPtRatioRel[1]);
984 
985  // multi-isolation
986  if (computeMiniIso_) {
987  muon.setSelector(reco::Muon::MultiIsoMedium,
988  miniIsoValue < 0.11 && (muon.jetPtRatio() > 0.74 || muon.jetPtRel() > 6.8));
989  }
990  }
991 
992  // MVA ID
993  float mvaID = 0.0;
994  constexpr int MVAsentinelValue = -99;
995  constexpr float mvaIDmediumCut = 0.08;
996  constexpr float mvaIDtightCut = 0.12;
997  if (computeMuonIDMVA_) {
998  const double dz = std::abs(muon.muonBestTrack()->dz(primaryVertex.position()));
999  const double dxy = std::abs(muon.muonBestTrack()->dxy(primaryVertex.position()));
1000  if (muon.isLooseMuon()) {
1001  mvaID = globalCache()->muonMvaIDEstimator().computeMVAID(muon)[1];
1002  } else {
1003  mvaID = MVAsentinelValue;
1004  }
1005  muon.setMvaIDValue(mvaID);
1006  muon.setSelector(reco::Muon::MvaIDwpMedium, muon.mvaIDValue() > mvaIDmediumCut);
1007  muon.setSelector(reco::Muon::MvaIDwpTight, muon.mvaIDValue() > mvaIDtightCut and dz < 0.5 and dxy < 0.2);
1008  }
1009 
1010  //SOFT MVA
1011  if (computeSoftMuonMVA_) {
1012  float mva = globalCache()->softMuonMvaEstimator().computeMva(muon);
1013  muon.setSoftMvaValue(mva);
1014  //preselection in SoftMuonMvaEstimator.cc
1015  muon.setSelector(reco::Muon::SoftMvaId, muon.softMvaValue() > 0.58); //WP choose for bmm4
1016  }
1017  }
1018 
1019  // put products in Event
1021 
1022  if (isolator_.enabled())
1023  isolator_.endEvent();
1024 }
1025 
1027  const MuonBaseRef& muonRef,
1028  const reco::CandidateBaseRef& baseRef,
1029  const GenAssociations& genMatches,
1030  const IsoDepositMaps& deposits,
1031  const IsolationValueMaps& isolationValues) const {
1032  // in the particle flow algorithm,
1033  // the muon momentum is recomputed.
1034  // the new value is stored as the momentum of the
1035  // resulting PFCandidate of type Muon, and choosen
1036  // as the pat::Muon momentum
1037  if (useParticleFlow_)
1038  aMuon.setP4(aMuon.pfCandidateRef()->p4());
1039  if (embedTrack_)
1040  aMuon.embedTrack();
1042  aMuon.embedStandAloneMuon();
1043  if (embedCombinedMuon_)
1044  aMuon.embedCombinedMuon();
1045 
1046  // embed the TeV refit track refs (only available for globalMuons)
1047  if (aMuon.isGlobalMuon()) {
1049  aMuon.embedPickyMuon();
1051  aMuon.embedTpfmsMuon();
1053  aMuon.embedDytMuon();
1054  }
1055 
1056  // embed best tracks (at the end, so unless forceEmbedBestTrack_ is true we can save some space not embedding them twice)
1057  if (embedBestTrack_)
1061 
1062  // store the match to the generated final state muons
1063  if (addGenMatch_) {
1064  for (auto const& genMatch : genMatches) {
1065  reco::GenParticleRef genMuon = (*genMatch)[baseRef];
1066  aMuon.addGenParticleRef(genMuon);
1067  }
1068  if (embedGenMatch_)
1069  aMuon.embedGenParticle();
1070  }
1071  if (efficiencyLoader_.enabled()) {
1072  efficiencyLoader_.setEfficiencies(aMuon, muonRef);
1073  }
1074 
1075  for (size_t j = 0, nd = deposits.size(); j < nd; ++j) {
1076  if (useParticleFlow_) {
1077  if (deposits[j]->contains(baseRef.id())) {
1078  aMuon.setIsoDeposit(isoDepositLabels_[j].first, (*deposits[j])[baseRef]);
1079  } else if (deposits[j]->contains(muonRef.id())) {
1080  aMuon.setIsoDeposit(isoDepositLabels_[j].first, (*deposits[j])[muonRef]);
1081  } else {
1082  reco::CandidatePtr source = aMuon.pfCandidateRef()->sourceCandidatePtr(0);
1084  }
1085  } else {
1086  aMuon.setIsoDeposit(isoDepositLabels_[j].first, (*deposits[j])[muonRef]);
1087  }
1088  }
1089 
1090  for (size_t j = 0; j < isolationValues.size(); ++j) {
1091  if (useParticleFlow_) {
1092  if (isolationValues[j]->contains(baseRef.id())) {
1094  } else if (isolationValues[j]->contains(muonRef.id())) {
1096  } else {
1097  reco::CandidatePtr source = aMuon.pfCandidateRef()->sourceCandidatePtr(0);
1099  }
1100  } else {
1102  }
1103  }
1104 
1105  if (resolutionLoader_.enabled()) {
1107  }
1108 }
1109 
1112  aMuon.polarP4(),
1113  miniIsoParams_[0],
1114  miniIsoParams_[1],
1115  miniIsoParams_[2],
1116  miniIsoParams_[3],
1117  miniIsoParams_[4],
1118  miniIsoParams_[5],
1119  miniIsoParams_[6],
1120  miniIsoParams_[7],
1121  miniIsoParams_[8]);
1122  aMuon.setMiniPFIsolation(miniiso);
1123 }
1124 
1125 double PATMuonProducer::getRelMiniIsoPUCorrected(const pat::Muon& muon, double rho, const std::vector<double>& area) {
1126  double mindr(miniIsoParams_[0]);
1127  double maxdr(miniIsoParams_[1]);
1128  double kt_scale(miniIsoParams_[2]);
1129  double drcut = pat::miniIsoDr(muon.polarP4(), mindr, maxdr, kt_scale);
1130  return pat::muonRelMiniIsoPUCorrected(muon.miniPFIsolation(), muon.polarP4(), drcut, rho, area);
1131 }
1132 
1134  constexpr double dR_threshold = 0.4;
1135  constexpr double dR2_threshold = dR_threshold * dR_threshold;
1136  constexpr double mix_fraction = 0.5;
1137  enum particleType { CH = 0, NH = 1, PH = 2, OTHER = 100000 };
1138  double val_PuppiWithLep = 0.0;
1139  double val_PuppiWithoutLep = 0.0;
1140 
1141  for (const auto& cand : *pc) { //pat::pat::PackedCandidate loop start
1142 
1143  const particleType pType = isChargedHadron(cand.pdgId()) ? CH
1144  : isNeutralHadron(cand.pdgId()) ? NH
1145  : isPhoton(cand.pdgId()) ? PH
1146  : OTHER;
1147  if (pType == OTHER) {
1148  if (cand.pdgId() != 1 && cand.pdgId() != 2 && abs(cand.pdgId()) != 11 && abs(cand.pdgId()) != 13) {
1149  LogTrace("PATMuonProducer") << "candidate with PDGID = " << cand.pdgId()
1150  << " is not CH/NH/PH/e/mu or 1/2 (and this is removed from isolation calculation)"
1151  << std::endl;
1152  }
1153  continue;
1154  }
1155  double d_eta = std::abs(cand.eta() - muon.eta());
1156  if (d_eta > dR_threshold)
1157  continue;
1158 
1159  double d_phi = std::abs(reco::deltaPhi(cand.phi(), muon.phi()));
1160  if (d_phi > dR_threshold)
1161  continue;
1162 
1163  double dR2 = reco::deltaR2(cand, muon);
1164  if (dR2 > dR2_threshold)
1165  continue;
1166  if (pType == CH && dR2 < 0.0001 * 0.0001)
1167  continue;
1168  if (pType == NH && dR2 < 0.01 * 0.01)
1169  continue;
1170  if (pType == PH && dR2 < 0.01 * 0.01)
1171  continue;
1172  val_PuppiWithLep += cand.pt() * cand.puppiWeight();
1173  val_PuppiWithoutLep += cand.pt() * cand.puppiWeightNoLep();
1174 
1175  } //pat::pat::PackedCandidate loop end
1176 
1177  double reliso_Puppi_withLep = val_PuppiWithLep / muon.pt();
1178  double reliso_Puppi_withoutlep = val_PuppiWithoutLep / muon.pt();
1179  double reliso_Puppi_combined = mix_fraction * reliso_Puppi_withLep + (1.0 - mix_fraction) * reliso_Puppi_withoutlep;
1180  return reliso_Puppi_combined;
1181 }
1182 
1184 
1186 
1187 bool PATMuonProducer::isPhoton(long pdgid) { return pdgid == 22; }
1188 
1189 // ParameterSet description for module
1192  iDesc.setComment("PAT muon producer module");
1193 
1194  // input source
1195  iDesc.add<edm::InputTag>("muonSource", edm::InputTag("no default"))->setComment("input collection");
1196 
1197  // embedding
1198  iDesc.add<bool>("embedMuonBestTrack", true)->setComment("embed muon best track (global pflow)");
1199  iDesc.add<bool>("embedTunePMuonBestTrack", true)->setComment("embed muon best track (muon only)");
1200  iDesc.add<bool>("forceBestTrackEmbedding", true)
1201  ->setComment(
1202  "force embedding separately the best tracks even if they're already embedded e.g. as tracker or global "
1203  "tracks");
1204  iDesc.add<bool>("embedTrack", true)->setComment("embed external track");
1205  iDesc.add<bool>("embedStandAloneMuon", true)->setComment("embed external stand-alone muon");
1206  iDesc.add<bool>("embedCombinedMuon", false)->setComment("embed external combined muon");
1207  iDesc.add<bool>("embedPickyMuon", false)->setComment("embed external picky track");
1208  iDesc.add<bool>("embedTpfmsMuon", false)->setComment("embed external tpfms track");
1209  iDesc.add<bool>("embedDytMuon", false)->setComment("embed external dyt track ");
1210 
1211  // embedding of MET muon corrections
1212  iDesc.add<bool>("embedCaloMETMuonCorrs", true)->setComment("whether to add MET muon correction for caloMET or not");
1213  iDesc.add<edm::InputTag>("caloMETMuonCorrs", edm::InputTag("muonMETValueMapProducer", "muCorrData"))
1214  ->setComment("source of MET muon corrections for caloMET");
1215  iDesc.add<bool>("embedTcMETMuonCorrs", true)->setComment("whether to add MET muon correction for tcMET or not");
1216  iDesc.add<edm::InputTag>("tcMETMuonCorrs", edm::InputTag("muonTCMETValueMapProducer", "muCorrData"))
1217  ->setComment("source of MET muon corrections for tcMET");
1218 
1219  // pf specific parameters
1220  iDesc.add<edm::InputTag>("pfMuonSource", edm::InputTag("pfMuons"))->setComment("particle flow input collection");
1221  iDesc.add<bool>("useParticleFlow", false)->setComment("whether to use particle flow or not");
1222  iDesc.add<bool>("embedPFCandidate", false)->setComment("embed external particle flow object");
1223  iDesc.add<bool>("embedPfEcalEnergy", true)->setComment("add ecal energy as reconstructed by PF");
1224 
1225  // inverse beta computation
1226  iDesc.add<bool>("addInverseBeta", true)->setComment("add combined inverse beta");
1227  iDesc.add<edm::InputTag>("sourceInverseBeta", edm::InputTag("muons", "combined"))
1228  ->setComment("source of inverse beta values");
1229 
1230  // MC matching configurables
1231  iDesc.add<bool>("addGenMatch", true)->setComment("add MC matching");
1232  iDesc.add<bool>("embedGenMatch", false)->setComment("embed MC matched MC information");
1233  std::vector<edm::InputTag> emptySourceVector;
1234  iDesc
1235  .addNode(edm::ParameterDescription<edm::InputTag>("genParticleMatch", edm::InputTag(), true) xor
1236  edm::ParameterDescription<std::vector<edm::InputTag>>("genParticleMatch", emptySourceVector, true))
1237  ->setComment("input with MC match information");
1238 
1239  // mini-iso
1240  iDesc.add<bool>("computeMiniIso", false)->setComment("whether or not to compute and store electron mini-isolation");
1241  iDesc.add<bool>("computePuppiCombinedIso", false)
1242  ->setComment("whether or not to compute and store puppi combined isolation");
1243 
1244  iDesc.add<edm::InputTag>("pfCandsForMiniIso", edm::InputTag("packedPFCandidates"))
1245  ->setComment("collection to use to compute mini-iso");
1246  iDesc.add<std::vector<double>>("miniIsoParams", std::vector<double>())
1247  ->setComment("mini-iso parameters to use for muons");
1248 
1249  iDesc.add<bool>("addTriggerMatching", false)->setComment("add L1 and HLT matching to offline muon");
1250 
1252 
1253  // IsoDeposit configurables
1254  edm::ParameterSetDescription isoDepositsPSet;
1255  isoDepositsPSet.addOptional<edm::InputTag>("tracker");
1256  isoDepositsPSet.addOptional<edm::InputTag>("ecal");
1257  isoDepositsPSet.addOptional<edm::InputTag>("hcal");
1258  isoDepositsPSet.addOptional<edm::InputTag>("particle");
1259  isoDepositsPSet.addOptional<edm::InputTag>("pfChargedHadrons");
1260  isoDepositsPSet.addOptional<edm::InputTag>("pfChargedAll");
1261  isoDepositsPSet.addOptional<edm::InputTag>("pfPUChargedHadrons");
1262  isoDepositsPSet.addOptional<edm::InputTag>("pfNeutralHadrons");
1263  isoDepositsPSet.addOptional<edm::InputTag>("pfPhotons");
1264  isoDepositsPSet.addOptional<std::vector<edm::InputTag>>("user");
1265  iDesc.addOptional("isoDeposits", isoDepositsPSet);
1266 
1267  // isolation values configurables
1268  edm::ParameterSetDescription isolationValuesPSet;
1269  isolationValuesPSet.addOptional<edm::InputTag>("tracker");
1270  isolationValuesPSet.addOptional<edm::InputTag>("ecal");
1271  isolationValuesPSet.addOptional<edm::InputTag>("hcal");
1272  isolationValuesPSet.addOptional<edm::InputTag>("particle");
1273  isolationValuesPSet.addOptional<edm::InputTag>("pfChargedHadrons");
1274  isolationValuesPSet.addOptional<edm::InputTag>("pfChargedAll");
1275  isolationValuesPSet.addOptional<edm::InputTag>("pfPUChargedHadrons");
1276  isolationValuesPSet.addOptional<edm::InputTag>("pfNeutralHadrons");
1277  isolationValuesPSet.addOptional<edm::InputTag>("pfPhotons");
1278  iDesc.addOptional("isolationValues", isolationValuesPSet);
1279 
1280  iDesc.ifValue(edm::ParameterDescription<bool>("addPuppiIsolation", false, true),
1282  "puppiIsolationChargedHadrons",
1283  edm::InputTag("muonPUPPIIsolation", "h+-DR030-ThresholdVeto000-ConeVeto000"),
1284  true) and
1286  "puppiIsolationNeutralHadrons",
1287  edm::InputTag("muonPUPPIIsolation", "h0-DR030-ThresholdVeto000-ConeVeto001"),
1288  true) and
1290  "puppiIsolationPhotons",
1291  edm::InputTag("muonPUPPIIsolation", "gamma-DR030-ThresholdVeto000-ConeVeto001"),
1292  true) and
1294  "puppiNoLeptonsIsolationChargedHadrons",
1295  edm::InputTag("muonPUPPINoLeptonsIsolation", "h+-DR030-ThresholdVeto000-ConeVeto000"),
1296  true) and
1298  "puppiNoLeptonsIsolationNeutralHadrons",
1299  edm::InputTag("muonPUPPINoLeptonsIsolation", "h0-DR030-ThresholdVeto000-ConeVeto001"),
1300  true) and
1302  "puppiNoLeptonsIsolationPhotons",
1303  edm::InputTag("muonPUPPINoLeptonsIsolation", "gamma-DR030-ThresholdVeto000-ConeVeto001"),
1304  true)) or
1305  false >> edm::EmptyGroupDescription());
1306 
1307  // Efficiency configurables
1308  edm::ParameterSetDescription efficienciesPSet;
1309  efficienciesPSet.setAllowAnything(); // TODO: the pat helper needs to implement a description.
1310  iDesc.add("efficiencies", efficienciesPSet);
1311  iDesc.add<bool>("addEfficiencies", false);
1312 
1313  // Check to see if the user wants to add user data
1314  edm::ParameterSetDescription userDataPSet;
1316  iDesc.addOptional("userData", userDataPSet);
1317 
1318  edm::ParameterSetDescription isolationPSet;
1319  isolationPSet.setAllowAnything(); // TODO: the pat helper needs to implement a description.
1320  iDesc.add("userIsolation", isolationPSet);
1321 
1322  iDesc.add<bool>("embedHighLevelSelection", true)->setComment("embed high level selection");
1323  edm::ParameterSetDescription highLevelPSet;
1324  highLevelPSet.setAllowAnything();
1325  iDesc.addNode(edm::ParameterDescription<edm::InputTag>("beamLineSrc", edm::InputTag(), true))
1326  ->setComment("input with high level selection");
1328  ->setComment("input with high level selection");
1329 
1330  //descriptions.add("PATMuonProducer", iDesc);
1331 }
1332 
1333 // embed various impact parameters with errors
1334 // embed high level selection
1339  bool primaryVertexIsValid,
1341  bool beamspotIsValid) {
1342  // Correct to PV
1343 
1344  // PV2D
1345  aMuon.setDB(track->dxy(primaryVertex.position()),
1346  track->dxyError(primaryVertex.position(), primaryVertex.covariance()),
1347  pat::Muon::PV2D);
1348 
1349  // PV3D
1350  std::pair<bool, Measurement1D> result =
1352  double d0_corr = result.second.value();
1353  double d0_err = primaryVertexIsValid ? result.second.error() : -1.0;
1354  aMuon.setDB(d0_corr, d0_err, pat::Muon::PV3D);
1355 
1356  // Correct to beam spot
1357 
1358  // BS2D
1359  aMuon.setDB(track->dxy(beamspot), track->dxyError(beamspot), pat::Muon::BS2D);
1360 
1361  // make a fake vertex out of beam spot
1362  reco::Vertex vBeamspot(beamspot.position(), beamspot.rotatedCovariance3D());
1363 
1364  // BS3D
1365  result = IPTools::signedImpactParameter3D(tt, GlobalVector(track->px(), track->py(), track->pz()), vBeamspot);
1366  d0_corr = result.second.value();
1367  d0_err = beamspotIsValid ? result.second.error() : -1.0;
1368  aMuon.setDB(d0_corr, d0_err, pat::Muon::BS3D);
1369 
1370  // PVDZ
1371  aMuon.setDB(
1372  track->dz(primaryVertex.position()), std::hypot(track->dzError(), primaryVertex.zError()), pat::Muon::PVDZ);
1373 }
1374 
1376 
bool embedTpfmsMuon_
embed track from tpfms muon fit into the muon
edm::EDGetTokenT< edm::ValueMap< float > > PUPPIIsolation_charged_hadrons_
bool useUserData_
add user data to the muon (this will be data members of th muon even w/o embedding) ...
void readIsolationLabels(const edm::ParameterSet &iConfig, const char *psetName, IsolationLabels &labels, std::vector< edm::EDGetTokenT< edm::ValueMap< T >>> &tokens)
constexpr double deltaPhi(double phi1, double phi2)
Definition: deltaPhi.h:26
edm::EDGetTokenT< edm::ValueMap< float > > PUPPIIsolation_photons_
bool enabled() const
&#39;true&#39; if this there is at least one efficiency configured
void setComment(std::string const &value)
ParameterDescriptionNode * ifValue(ParameterDescription< T > const &switchParameter, std::unique_ptr< ParameterDescriptionCases< T >> cases)
void newEvent(const edm::Event &event)
To be called for each new event, reads in the ValueMaps for efficiencies.
bool addPuppiIsolation_
add puppi isolation
ESGetTokenH3DDVariant esConsumes(std::string const &Record, edm::ConsumesCollector &)
Definition: DeDxTools.cc:283
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
void embedDytMuon()
embed reference to the above dyt Track
ParameterDescriptionBase * addOptional(U const &iLabel, T const &value)
void embedTpfmsMuon()
embed reference to the above tpfms Track
edm::EDGetTokenT< edm::ValueMap< reco::MuonMETCorrectionData > > tcMETMuonCorrsToken_
source of tcMET muon corrections
void setIsolation(IsolationKeys key, float value)
Definition: Lepton.h:115
bool embedTcMETMuonCorrs_
embed muon MET correction info for tcMET into the muon
class definition
void embedTcMETMuonCorrs(const reco::MuonMETCorrectionData &t)
edm::EDGetTokenT< std::vector< reco::Vertex > > pvToken_
input source of the primary vertex
bool contains(EventRange const &lh, EventID const &rh)
Definition: EventRange.cc:37
T const & getData(const ESGetToken< T, R > &iToken) const noexcept(false)
Definition: EventSetup.h:119
bool enabled() const
True if it has a non null configuration.
Definition: MultiIsolator.h:55
static const int OTHER
edm::EDGetTokenT< edm::ValueMap< reco::MuonTimeExtra > > muonTimeExtraToken_
input tag for reading inverse beta
edm::EDGetTokenT< edm::ValueMap< float > > PUPPINoLeptonsIsolation_photons_
void embedCombinedMuon()
set reference to Track reconstructed in both tracked and muon detector (reimplemented from reco::Muon...
edm::EDGetTokenT< double > rho_
edm::EDGetTokenT< edm::View< reco::Muon > > muonToken_
input source
void embedTunePMuonBestTrack(bool force=false)
bool addEfficiencies_
add efficiencies to the muon (this will be data members of th muon even w/o embedding) ...
edm::EDGetTokenT< edm::ValueMap< reco::MuonMETCorrectionData > > caloMETMuonCorrsToken_
source of caloMET muon corrections
void setEfficiencies(pat::PATObject< T > &obj, const R &originalRef) const
Sets the efficiencies for this object, using the reference to the original objects.
enum start value shifted to 81 so as to avoid clashes with PDG codes
void setAllowAnything()
allow any parameter label/value pairs
void setSimFlavour(int f)
Definition: Muon.h:321
bool isAValidMuonTrack(const MuonTrackType &type) const
bool embedCaloMETMuonCorrs_
embed muon MET correction info for caloMET into the muon
bool isChargedHadron(long pdgid)
bool exists(std::string const &parameterName) const
checks if a parameter exists
~PATMuonProducer() override
default destructur
edm::EDGetTokenT< edm::ValueMap< reco::MuonSimInfo > > simInfo_
MC info.
T const * product() const
Definition: Handle.h:70
void embedMuonBestTrack(bool force=false)
std::vector< pat::PackedCandidate > PackedCandidateCollection
void setIsolationPUPPINoLeptons(float chargedhadrons, float neutralhadrons, float photons)
sets PUPPINoLeptons isolations
Definition: Muon.h:207
void setMuonMiniIso(pat::Muon &aMuon, const pat::PackedCandidateCollection *pc)
PATMuonProducer(const edm::ParameterSet &iConfig, PATMuonHeavyObjectCache const *)
default constructir
bool addTriggerMatching_
Trigger.
void setSimBX(int bx)
Definition: Muon.h:325
ParameterDescriptionNode * addNode(ParameterDescriptionNode const &node)
bool embedBestTrack_
embed the track from best muon measurement (global pflow)
CH
LTS and SET for low trigger suppression.
edm::EDGetTokenT< reco::JetCorrector > mvaL1Corrector_
std::pair< bool, Measurement1D > signedImpactParameter3D(const reco::TransientTrack &track, const GlobalVector &direction, const reco::Vertex &vertex)
Definition: IPTools.cc:81
bool isNonnull() const
Checks for non-null.
Definition: Ref.h:238
const edm::ESGetToken< TransientTrackBuilder, TransientTrackRecord > transientTrackBuilderToken_
bool addResolutions_
add resolutions to the muon (this will be data members of th muon even w/o embedding) ...
void setResolutions(pat::PATObject< T > &obj) const
Sets the efficiencies for this object, using the reference to the original objects.
IsolationKeys
Enum defining isolation keys.
Definition: Isolation.h:9
edm::EDGetTokenT< edm::ValueMap< float > > PUPPINoLeptonsIsolation_charged_hadrons_
std::vector< double > miniIsoParams_
void setSimPhi(float phi)
Definition: Muon.h:331
Log< level::Error, false > LogError
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 setSimProdRho(float rho)
Definition: Muon.h:327
void setSimHeaviestMotherFlavour(int id)
Definition: Muon.h:322
reco::Muon::Selector makeSelectorBitset(reco::Muon const &muon, reco::Vertex const *vertex=nullptr, bool run2016_hip_mitigation=false)
assert(be >=bs)
void setPFCandidateRef(const reco::PFCandidateRef &ref)
add a reference to the source IsolatedPFCandidate
Definition: Muon.h:141
void embedHighLevel(pat::Muon &aMuon, reco::TrackRef track, reco::TransientTrack &tt, reco::Vertex &primaryVertex, bool primaryVertexIsValid, reco::BeamSpot &beamspot, bool beamspotIsValid)
std::vector< double > effectiveAreaVec_
const std::string names[nVars_]
edm::EDGetTokenT< edm::ValueMap< float > > PUPPINoLeptonsIsolation_neutral_hadrons_
void setSimType(reco::MuonSimType type)
Definition: Muon.h:319
void embedStandAloneMuon()
set reference to Track reconstructed in the muon detector only (reimplemented from reco::Muon) ...
#define LogTrace(id)
edm::EDGetTokenT< reco::JetTagCollection > mvaBTagCollectionTag_
edm::EDGetTokenT< reco::PFCandidateCollection > pfMuonToken_
input source pfCandidates that will be to be transformed into pat::Muons, when using PF2PAT ...
void setIsolationPUPPI(float chargedhadrons, float neutralhadrons, float photons)
sets PUPPI isolations
Definition: Muon.h:201
ProductID id() const
Definition: RefToBase.h:216
pat::helper::MultiIsolator isolator_
std::vector< edm::EDGetTokenT< edm::ValueMap< IsoDeposit > > > isoDepositTokens_
void fill(const edm::View< T > &coll, int idx, IsolationValuePairs &isolations) const
Definition: MultiIsolator.h:84
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:191
Definition: HeavyIon.h:7
void embedTrack()
set reference to Track reconstructed in the tracker only (reimplemented from reco::Muon) ...
static void fillDescription(edm::ParameterSetDescription &iDesc)
pat::MuonMvaIDEstimator const & muonMvaIDEstimator() const
reco::TransientTrack build(const reco::Track *p) const
std::vector< IsolationLabel > IsolationLabels
edm::EDGetTokenT< reco::BeamSpot > beamLineToken_
input source of the primary vertex/beamspot
bool addInverseBeta_
add combined inverse beta measurement into the muon
bool useParticleFlow_
switch to use particle flow (PF2PAT) or not
pat::PATUserDataHelper< pat::Muon > userDataHelper_
helper class to add userData to the muon
std::vector< edm::Handle< edm::ValueMap< IsoDeposit > > > IsoDepositMaps
char const * label
bool embedStandAloneMuon_
embed track from muon system into the muon
void setComment(std::string const &value)
edm::EDGetTokenT< edm::TriggerResults > triggerResults_
int iEvent
Definition: GenABIO.cc:224
Definition: TTTypes.h:54
void beginEvent(const edm::Event &event, const edm::EventSetup &eventSetup)
bool embedTrack_
embed the track from inner tracker into the muon
void setDB(double dB, double edB, IPTYPE type=PV2D)
Definition: Muon.h:247
bool addGenMatch_
add generator match information
PATMuonHeavyObjectCache(const edm::ParameterSet &)
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
description of config file parameters
Definition: Muon.py:1
void fillL1TriggerInfo(pat::Muon &muon, edm::Handle< std::vector< pat::TriggerObjectStandAlone >> &triggerObjects, const edm::TriggerNames &names, const edm::ESHandle< GlobalTrackingGeometry > &geometry)
double muonRelMiniIsoPUCorrected(const PFIsolation &iso, const reco::Candidate::PolarLorentzVector &p4, double dr, double rho, const std::vector< double > &area)
const edm::ESGetToken< GlobalTrackingGeometry, GlobalTrackingGeometryRecord > geometryToken_
bool embedPfEcalEnergy_
add ecal PF energy
void embedGenParticle()
Definition: PATObject.h:768
void newEvent(const edm::Event &event, const edm::EventSetup &setup)
To be called for each new event, reads in the EventSetup object.
void embedPFCandidate()
embed the IsolatedPFCandidate pointed to by pfCandidateRef_
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e< void, edm::EventID const &, edm::Timestamp const & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
Definition: Activities.doc:12
bool isAvailable() const
Definition: Ref.h:541
bool enabled() const
&#39;true&#39; if this there is at least one efficiency configured
const PolarLorentzVector & polarP4() const final
four-momentum Lorentz vector
void produce(edm::Event &iEvent, const edm::EventSetup &iSetup) override
everything that needs to be done during the event loop
bool computeMuonIDMVA_
standard muon selectors
def pv(vc)
Definition: MetAnalyzer.py:7
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
double relMiniIsoPUCorrected(const pat::Muon &aMuon, double rho)
edm::EDGetTokenT< pat::PackedCandidateCollection > pcToken_
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
std::pair< pat::IsolationKeys, edm::InputTag > IsolationLabel
static void globalEndJob(PATMuonHeavyObjectCache *)
static std::string const triggerResults
Definition: EdmProvDump.cc:47
ParameterDescriptionBase * add(U const &iLabel, T const &value)
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
double puppiCombinedIsolation(const pat::Muon &muon, const pat::PackedCandidateCollection *pc)
double ecalEnergy() const
return corrected Ecal energy
Definition: PFCandidate.h:221
ESHandle< T > getHandle(const ESGetToken< T, R > &iToken) const
Definition: EventSetup.h:130
reco::MuonRef muonRef() const
Definition: PFCandidate.cc:448
void readTimeExtra(const reco::MuonTimeExtra &t)
std::vector< std::string > hltCollectionFilters_
void add(ObjectType &patObject, edm::Event const &iEvent, edm::EventSetup const &iSetup)
float miniIsoDr(const reco::Candidate::PolarLorentzVector &p4, float mindr, float maxdr, float kt_scale)
GlobalPoint toGlobal(const Local2DPoint &lp) const
Conversion to the global R.F. from the R.F. of the GeomDet.
Definition: GeomDet.h:49
void fillHltTriggerInfo(pat::Muon &muon, edm::Handle< std::vector< pat::TriggerObjectStandAlone >> &triggerObjects, const edm::TriggerNames &names, const std::vector< std::string > &collection_names)
static std::unique_ptr< PATMuonHeavyObjectCache > initializeGlobalCache(const edm::ParameterSet &iConfig)
Definition: DetId.h:17
std::vector< std::pair< pat::IsolationKeys, float > > IsolationValuePairs
Definition: MultiIsolator.h:17
void initSimInfo(void)
constexpr auto deltaR2(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
Definition: deltaR.h:16
void addGenParticleRef(const reco::GenParticleRef &ref)
Definition: PATObject.h:751
void setPfEcalEnergy(float pfEcalEnergy)
Definition: Muon.h:277
bool embedTunePBestTrack_
embed the track from best muon measurement (muon only)
static void fillDescription(edm::ParameterSetDescription &iDesc)
Method for documentation and validation of PSet.
double getRelMiniIsoPUCorrected(const pat::Muon &muon, double rho, const std::vector< double > &area)
void setSimMotherPdgId(int id)
Definition: Muon.h:324
void addTriggerObjectMatch(const TriggerObjectStandAlone &trigObj)
add a trigger match
Definition: PATObject.h:238
void setExtSimType(reco::ExtendedMuonSimType type)
Definition: Muon.h:320
std::vector< MuonChamberMatch > & matches()
get muon matching information
Definition: Muon.h:145
std::unique_ptr< const pat::MuonMvaIDEstimator > muonMvaIDEstimator_
void setMiniPFIsolation(PFIsolation const &iso)
Definition: Lepton.h:217
std::unique_ptr< const pat::SoftMuonMvaEstimator > softMuonMvaEstimator_
bool isValid() const
Definition: HandleBase.h:70
std::vector< edm::Handle< edm::Association< reco::GenParticleCollection > > > GenAssociations
edm::EDGetTokenT< reco::JetCorrector > mvaL1L2L3ResCorrector_
void setSimProdZ(float z)
Definition: Muon.h:328
Particle reconstructed by the particle flow algorithm.
Definition: PFCandidate.h:41
std::vector< edm::Handle< edm::ValueMap< double > > > IsolationValueMaps
pat::helper::EfficiencyLoader efficiencyLoader_
helper class to add efficiencies to the muon
HLT enums.
bool embedPickyMuon_
embed track from picky muon fit into the muon
void setNormChi2(double normChi2)
Definition: Muon.h:262
boost::indirect_iterator< typename seq_t::const_iterator > const_iterator
Definition: View.h:86
bool embedDytMuon_
embed track from DYT muon fit into the muon
void embedCaloMETMuonCorrs(const reco::MuonMETCorrectionData &t)
pat::CalculatePtRatioRel const & calculatePtRatioRel() const
void setSimPdgId(int id)
Definition: Muon.h:323
const edm::EDPutTokenT< std::vector< Muon > > patMuonPutToken_
void setSimPt(float pt)
Definition: Muon.h:329
reco::PFCandidateRef pfCandidateRef() const
Calculates a lepton&#39;s calorimetric isolation energy.
bool isPhoton(long pdgid)
pat::helper::MultiIsolator::IsolationValuePairs isolatorTmpStorage_
isolation value pair for temporary storage before being folded into the muon
edm::EDGetTokenT< std::vector< pat::TriggerObjectStandAlone > > triggerObjects_
bool embedGenMatch_
embed the gen match information into the muon
IsolationLabels isoDepositLabels_
input source for isoDeposits
std::vector< edm::EDGetTokenT< edm::Association< reco::GenParticleCollection > > > genMatchTokens_
input tags for generator match information
PFIsolation getMiniPFIsolation(const pat::PackedCandidateCollection *pfcands, const reco::Candidate::PolarLorentzVector &p4, float mindr=0.05, float maxdr=0.2, float kt_scale=10.0, float ptthresh=0.5, float deadcone_ch=0.0001, float deadcone_pu=0.01, float deadcone_ph=0.01, float deadcone_nh=0.01, float dZ_cut=0.0)
std::unique_ptr< const pat::CalculatePtRatioRel > calculatePtRatioRel_
static constexpr int DT
Definition: MuonSubdetId.h:11
IsolationLabels isolationValueLabels_
input source isolation value maps
void embedPickyMuon()
embed reference to the above picky Track
static constexpr int CSC
Definition: MuonSubdetId.h:12
primaryVertex
hltOfflineBeamSpot for HLTMON
bool forceEmbedBestTrack_
force separate embed of the best track even if already embedded
edm::RefToBase< reco::Muon > MuonBaseRef
typedefs for convenience
bool embedPFCandidate_
embed pfCandidates into the muon
std::vector< edm::EDGetTokenT< edm::ValueMap< double > > > isolationValueTokens_
void setNumberOfValidHits(unsigned int numberOfValidHits)
Definition: Muon.h:255
void setSimEta(float eta)
Definition: Muon.h:330
bool embedCombinedMuon_
embed track of the combined fit into the muon
Analysis-level muon class.
Definition: Muon.h:51
pat::helper::KinResolutionsLoader resolutionLoader_
helper class to add resolutions to the muon
static std::string const source
Definition: EdmProvDump.cc:49
bool isGlobalMuon() const override
Definition: Muon.h:303
void setP4(const LorentzVector &p4) final
set 4-momentum
pat::SoftMuonMvaEstimator const & softMuonMvaEstimator() const
edm::EDGetTokenT< edm::ValueMap< float > > PUPPIIsolation_neutral_hadrons_
def move(src, dest)
Definition: eostools.py:511
std::optional< GlobalPoint > getMuonDirection(const reco::MuonChamberMatch &chamberMatch, const edm::ESHandle< GlobalTrackingGeometry > &geometry, const DetId &chamberId)
bool isNeutralHadron(long pdgid)
genMatch
add extra information on genMatch
Global3DVector GlobalVector
Definition: GlobalVector.h:10
Calculates a lepton&#39;s tracker isolation pt.
Analysis-level trigger object class (stand-alone)
void setSimMatchQuality(float quality)
Definition: Muon.h:332
void setSimTpEvent(int tpEvent)
Definition: Muon.h:326
bool embedHighLevelSelection_
embed high level selection variables