84 return std::make_unique<PATMuonHeavyObjectCache>(
iConfig);
97 typedef std::vector<edm::Handle<edm::Association<reco::GenParticleCollection>>>
GenAssociations;
112 template <
typename T>
114 const char* psetName,
132 bool primaryVertexIsValid,
134 bool beamspotIsValid);
138 const DetId& chamberId);
140 edm::Handle<std::vector<pat::TriggerObjectStandAlone>>& triggerObjects,
144 edm::Handle<std::vector<pat::TriggerObjectStandAlone>>& triggerObjects,
146 const std::vector<std::string>& collection_names);
193 std::vector<edm::EDGetTokenT<edm::Association<reco::GenParticleCollection>>>
genMatchTokens_;
271 template <
typename T>
273 const char* psetName,
278 if (iConfig.
exists(psetName)) {
281 if (depconf.
exists(
"tracker"))
283 if (depconf.
exists(
"ecal"))
285 if (depconf.
exists(
"hcal"))
287 if (depconf.
exists(
"pfAllParticles")) {
290 if (depconf.
exists(
"pfChargedHadrons")) {
293 if (depconf.
exists(
"pfChargedAll")) {
296 if (depconf.
exists(
"pfPUChargedHadrons")) {
299 if (depconf.
exists(
"pfNeutralHadrons")) {
302 if (depconf.
exists(
"pfPhotons")) {
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) {
313 labels, [
this](
IsolationLabel const&
label) {
return consumes<edm::ValueMap<T>>(label.second); });
317 return consumes<edm::ValueMap<T>>(label.second);
328 float mvaDrMax = iConfig.
getParameter<
double>(
"mvaDrMax");
329 muonMvaEstimator_ = std::make_unique<MuonMvaEstimator>(mvaTrainingFile, mvaDrMax);
330 muonLowPtMvaEstimator_ = std::make_unique<MuonMvaEstimator>(mvaLowPtTrainingFile, mvaDrMax);
335 softMuonMvaEstimator_ = std::make_unique<SoftMuonMvaEstimator>(softMvaTrainingFile);
340 : relMiniIsoPUCorrected_(0),
341 useUserData_(iConfig.exists(
"userData")),
342 computeMuonMVA_(
false),
343 computeSoftMuonMVA_(
false),
344 recomputeBasicSelectors_(
false),
346 isolator_(iConfig.exists(
"userIsolation") ? iConfig.getParameter<edm::
ParameterSet>(
"userIsolation")
352 patMuonPutToken_{produces<std::vector<Muon>>()} {
354 muonToken_ = consumes<edm::View<reco::Muon>>(
iConfig.getParameter<
edm::InputTag>(
"muonSource"));
356 embedBestTrack_ =
iConfig.getParameter<
bool>(
"embedMuonBestTrack");
357 embedTunePBestTrack_ =
iConfig.getParameter<
bool>(
"embedTunePMuonBestTrack");
358 forceEmbedBestTrack_ =
iConfig.getParameter<
bool>(
"forceBestTrackEmbedding");
359 embedTrack_ =
iConfig.getParameter<
bool>(
"embedTrack");
360 embedCombinedMuon_ =
iConfig.getParameter<
bool>(
"embedCombinedMuon");
361 embedStandAloneMuon_ =
iConfig.getParameter<
bool>(
"embedStandAloneMuon");
363 embedCaloMETMuonCorrs_ =
iConfig.getParameter<
bool>(
"embedCaloMETMuonCorrs");
364 embedTcMETMuonCorrs_ =
iConfig.getParameter<
bool>(
"embedTcMETMuonCorrs");
365 caloMETMuonCorrsToken_ =
366 mayConsume<edm::ValueMap<reco::MuonMETCorrectionData>>(
iConfig.getParameter<
edm::InputTag>(
"caloMETMuonCorrs"));
367 tcMETMuonCorrsToken_ =
368 mayConsume<edm::ValueMap<reco::MuonMETCorrectionData>>(
iConfig.getParameter<
edm::InputTag>(
"tcMETMuonCorrs"));
370 useParticleFlow_ =
iConfig.getParameter<
bool>(
"useParticleFlow");
371 embedPFCandidate_ =
iConfig.getParameter<
bool>(
"embedPFCandidate");
372 pfMuonToken_ = mayConsume<reco::PFCandidateCollection>(
iConfig.getParameter<
edm::InputTag>(
"pfMuonSource"));
373 embedPfEcalEnergy_ =
iConfig.getParameter<
bool>(
"embedPfEcalEnergy");
375 embedPickyMuon_ =
iConfig.getParameter<
bool>(
"embedPickyMuon");
376 embedTpfmsMuon_ =
iConfig.getParameter<
bool>(
"embedTpfmsMuon");
377 embedDytMuon_ =
iConfig.getParameter<
bool>(
"embedDytMuon");
379 addInverseBeta_ =
iConfig.getParameter<
bool>(
"addInverseBeta");
380 if (addInverseBeta_) {
381 muonTimeExtraToken_ =
382 consumes<edm::ValueMap<reco::MuonTimeExtra>>(
iConfig.getParameter<
edm::InputTag>(
"sourceMuonTimeExtra"));
385 addGenMatch_ =
iConfig.getParameter<
bool>(
"addGenMatch");
387 embedGenMatch_ =
iConfig.getParameter<
bool>(
"embedGenMatch");
393 iConfig.getParameter<std::vector<edm::InputTag>>(
"genParticleMatch"),
398 addEfficiencies_ =
iConfig.getParameter<
bool>(
"addEfficiencies");
399 if (addEfficiencies_) {
404 addResolutions_ =
iConfig.getParameter<
bool>(
"addResolutions");
405 if (addResolutions_) {
410 addPuppiIsolation_ =
iConfig.getParameter<
bool>(
"addPuppiIsolation");
411 if (addPuppiIsolation_) {
412 PUPPIIsolation_charged_hadrons_ =
413 consumes<edm::ValueMap<float>>(
iConfig.getParameter<
edm::InputTag>(
"puppiIsolationChargedHadrons"));
414 PUPPIIsolation_neutral_hadrons_ =
415 consumes<edm::ValueMap<float>>(
iConfig.getParameter<
edm::InputTag>(
"puppiIsolationNeutralHadrons"));
416 PUPPIIsolation_photons_ =
419 PUPPINoLeptonsIsolation_charged_hadrons_ =
420 consumes<edm::ValueMap<float>>(
iConfig.getParameter<
edm::InputTag>(
"puppiNoLeptonsIsolationChargedHadrons"));
421 PUPPINoLeptonsIsolation_neutral_hadrons_ =
422 consumes<edm::ValueMap<float>>(
iConfig.getParameter<
edm::InputTag>(
"puppiNoLeptonsIsolationNeutralHadrons"));
423 PUPPINoLeptonsIsolation_photons_ =
424 consumes<edm::ValueMap<float>>(
iConfig.getParameter<
edm::InputTag>(
"puppiNoLeptonsIsolationPhotons"));
427 readIsolationLabels(
iConfig,
"isoDeposits", isoDepositLabels_, isoDepositTokens_);
429 readIsolationLabels(
iConfig,
"isolationValues", isolationValueLabels_, isolationValueTokens_);
435 embedHighLevelSelection_ =
iConfig.getParameter<
bool>(
"embedHighLevelSelection");
436 if (embedHighLevelSelection_) {
442 computeMiniIso_ =
iConfig.getParameter<
bool>(
"computeMiniIso");
444 computePuppiCombinedIso_ =
iConfig.getParameter<
bool>(
"computePuppiCombinedIso");
446 effectiveAreaVec_ =
iConfig.getParameter<std::vector<double>>(
"effectiveAreaVec");
448 miniIsoParams_ =
iConfig.getParameter<std::vector<double>>(
"miniIsoParams");
449 if (computeMiniIso_ && miniIsoParams_.size() != 9) {
450 throw cms::Exception(
"ParameterError") <<
"miniIsoParams must have exactly 9 elements.\n";
452 if (computeMiniIso_ || computePuppiCombinedIso_)
453 pcToken_ = consumes<pat::PackedCandidateCollection>(
iConfig.getParameter<
edm::InputTag>(
"pfCandsForMiniIso"));
456 recomputeBasicSelectors_ =
iConfig.getParameter<
bool>(
"recomputeBasicSelectors");
457 computeMuonMVA_ =
iConfig.getParameter<
bool>(
"computeMuonMVA");
458 if (computeMuonMVA_ and not computeMiniIso_)
459 throw cms::Exception(
"ConfigurationError") <<
"MiniIso is needed for Muon MVA calculation.\n";
461 if (computeMuonMVA_) {
463 mvaBTagCollectionTag_ = consumes<reco::JetTagCollection>(
iConfig.getParameter<
edm::InputTag>(
"mvaJetTag"));
464 mvaL1Corrector_ = consumes<reco::JetCorrector>(
iConfig.getParameter<
edm::InputTag>(
"mvaL1Corrector"));
465 mvaL1L2L3ResCorrector_ = consumes<reco::JetCorrector>(
iConfig.getParameter<
edm::InputTag>(
"mvaL1L2L3ResCorrector"));
467 mvaUseJec_ =
iConfig.getParameter<
bool>(
"mvaUseJec");
470 computeSoftMuonMVA_ =
iConfig.getParameter<
bool>(
"computeSoftMuonMVA");
473 simInfo_ = consumes<edm::ValueMap<reco::MuonSimInfo>>(
iConfig.getParameter<
edm::InputTag>(
"muonSimInfo"));
475 addTriggerMatching_ =
iConfig.getParameter<
bool>(
"addTriggerMatching");
476 if (addTriggerMatching_) {
478 consumes<std::vector<pat::TriggerObjectStandAlone>>(
iConfig.getParameter<
edm::InputTag>(
"triggerObjects"));
479 triggerResults_ = consumes<edm::TriggerResults>(
iConfig.getParameter<
edm::InputTag>(
"triggerResults"));
481 hltCollectionFilters_ =
iConfig.getParameter<std::vector<std::string>>(
"hltCollectionFilters");
488 const DetId& chamberId) {
489 const GeomDet* chamberGeometry = geometry->idToDet(chamberId);
490 if (chamberGeometry) {
491 LocalPoint localPosition(chamberMatch.
x, chamberMatch.
y, 0);
492 return std::optional<GlobalPoint>(std::in_place, chamberGeometry->
toGlobal(localPosition));
494 return std::optional<GlobalPoint>();
498 edm::Handle<std::vector<pat::TriggerObjectStandAlone>>& triggerObjects,
506 std::optional<GlobalPoint> muonPosition;
511 for (
const auto& chamberMatch : aMuon.
matches()) {
514 if (
abs(detId.station()) > 3)
517 if (
abs(detId.station()) == 2)
521 CSCDetId detId(chamberMatch.id.rawId());
522 if (
abs(detId.station()) > 3)
525 if (
abs(detId.station()) == 2)
529 if (not muonPosition)
531 for (
const auto& triggerObject : *triggerObjects) {
533 if (
std::abs(triggerObject.eta()) < 0.001) {
535 if (
deltaPhi(triggerObject.phi(), muonPosition->phi()) > 0.1)
539 if (
deltaR(triggerObject.p4(), *muonPosition) > 0.15)
550 edm::Handle<std::vector<pat::TriggerObjectStandAlone>>& triggerObjects,
552 const std::vector<std::string>& collection_filter_names) {
555 for (
const auto& triggerObject : *triggerObjects) {
558 for (
const auto&
name : collection_filter_names) {
559 if (triggerObject.hasCollection(
name)) {
579 throw cms::Exception(
"FatalError") <<
"Unable to find GlobalTrackingGeometryRecord in event!\n";
656 bool beamSpotIsValid =
false;
657 bool primaryVertexIsValid =
false;
667 if (beamSpotHandle.
isValid()) {
668 beamSpot = *beamSpotHandle;
669 beamSpotIsValid =
true;
671 edm::LogError(
"DataNotAvailable") <<
"No beam spot available from EventSetup, not adding high level selection \n";
673 if (pvHandle.
isValid() && !pvHandle->empty()) {
674 primaryVertex = pvHandle->at(0);
675 primaryVertexIsValid =
true;
678 <<
"No primary vertex available from EventSetup, not adding high level selection \n";
704 Muon aMuon(muonBaseRef);
719 chosenTrack = bestTrack;
722 unsigned int nhits = chosenTrack->numberOfValidHits();
726 embedHighLevel(aMuon, chosenTrack, tt, primaryVertex, primaryVertexIsValid, beamSpot, beamSpotIsValid);
730 double norm_chi2 = globalTrack->chi2() / globalTrack->ndof();
741 fillMuon(aMuon, muonBaseRef, pfBaseRef, genMatches, deposits, isolationValues);
748 (*PUPPIIsolation_neutral_hadrons)[muonBaseRef],
749 (*PUPPIIsolation_photons)[muonBaseRef]);
752 (*PUPPINoLeptonsIsolation_neutral_hadrons)[muonBaseRef],
753 (*PUPPINoLeptonsIsolation_photons)[muonBaseRef]);
763 patMuons.push_back(aMuon);
796 unsigned int idx = itMuon - muons->begin();
801 fillMuon(aMuon, muonRef, muonBaseRef, genMatches, deposits, isolationValues);
806 (*PUPPIIsolation_neutral_hadrons)[muonRef],
807 (*PUPPIIsolation_photons)[muonRef]);
809 (*PUPPINoLeptonsIsolation_neutral_hadrons)[muonRef],
810 (*PUPPINoLeptonsIsolation_photons)[muonRef]);
850 chosenTrack = bestTrack;
852 unsigned int nhits = chosenTrack->numberOfValidHits();
856 embedHighLevel(aMuon, chosenTrack, tt, primaryVertex, primaryVertexIsValid, beamSpot, beamSpotIsValid);
860 double norm_chi2 = globalTrack->chi2() / globalTrack->ndof();
876 if (pfmu.muonRef().isNonnull()) {
877 if (pfmu.muonRef().id() != muonRef.id())
879 <<
"Muon reference within PF candidates does not point to the muon collection." << std::endl;
880 if (pfmu.muonRef().key() == muonRef.key()) {
899 if (simInfoIsAvailalbe) {
900 const auto& msi = (*simInfo)[muonBaseRef];
916 patMuons.push_back(aMuon);
921 std::sort(patMuons.begin(), patMuons.end(), [](
auto const& t1,
auto const& t2) {
return t1.pt() > t2.pt(); });
931 if (primaryVertexIsValid)
936 bool triggerObjectsAvailable =
false;
937 bool triggerResultsAvailable =
false;
943 for (
auto&
muon : patMuons) {
952 muon.setSelectors(0);
953 bool isRun2016BCDEF = (272728 <= iEvent.
run() && iEvent.
run() <= 278808);
956 float miniIsoValue = -1;
968 double puppiCombinedIsolationPAT = -1;
976 float jetPtRatio = 0.0;
977 float jetPtRel = 0.0;
979 float mva_lowpt = 0.0;
982 mva = globalCache()->muonMvaEstimator().computeMva(
muon,
984 *(mvaBTagCollectionTag.
product()),
989 mvaL1L2L3ResCorrector.
product());
990 mva_lowpt = globalCache()->muonLowPtMvaEstimator().computeMva(
muon,
992 *(mvaBTagCollectionTag.
product()),
997 mvaL1L2L3ResCorrector.
product());
1000 mva = globalCache()->muonMvaEstimator().computeMva(
1001 muon, primaryVertex, *mvaBTagCollectionTag, jetPtRatio, jetPtRel, miniIsoValue);
1002 mva_lowpt = globalCache()->muonLowPtMvaEstimator().computeMva(
1003 muon, primaryVertex, *mvaBTagCollectionTag, jetPtRatio, jetPtRel, miniIsoValue);
1006 muon.setMvaValue(mva);
1007 muon.setLowPtMvaValue(mva_lowpt);
1008 muon.setJetPtRatio(jetPtRatio);
1009 muon.setJetPtRel(jetPtRel);
1014 miniIsoValue < 0.11 && (
muon.jetPtRatio() > 0.74 ||
muon.jetPtRel() > 6.8));
1022 const double sip3D = edB3D > 0 ? dB3D / edB3D : 0.0;
1027 dB2D < 0.05 and dz < 0.1) {
1034 if (
muon.pt() > 5 and
muon.isLooseMuon() and sip3D < 4 and dB2D < 0.5 and dz < 1) {
1042 float mva = globalCache()->softMuonMvaEstimator().computeMva(
muon);
1043 muon.setSoftMvaValue(mva);
1094 for (
auto const& genMatch : genMatches) {
1105 for (
size_t j = 0, nd = deposits.size();
j < nd; ++
j) {
1120 for (
size_t j = 0;
j < isolationValues.size(); ++
j) {
1124 }
else if (isolationValues[
j]->
contains(muonRef.
id())) {
1164 constexpr
double dR_threshold = 0.4;
1165 constexpr
double dR2_threshold = dR_threshold * dR_threshold;
1166 constexpr
double mix_fraction = 0.5;
1168 double val_PuppiWithLep = 0.0;
1169 double val_PuppiWithoutLep = 0.0;
1171 for (
const auto& cand : *pc) {
1177 if (pType ==
OTHER) {
1178 if (cand.pdgId() != 1 && cand.pdgId() != 2 &&
abs(cand.pdgId()) != 11 &&
abs(cand.pdgId()) != 13) {
1179 LogTrace(
"PATMuonProducer") <<
"candidate with PDGID = " << cand.pdgId()
1180 <<
" is not CH/NH/PH/e/mu or 1/2 (and this is removed from isolation calculation)"
1186 if (d_eta > dR_threshold)
1190 if (d_phi > dR_threshold)
1194 if (dR2 > dR2_threshold)
1196 if (pType == CH && dR2 < 0.0001 * 0.0001)
1198 if (pType == NH && dR2 < 0.01 * 0.01)
1200 if (pType == PH && dR2 < 0.01 * 0.01)
1202 val_PuppiWithLep += cand.pt() * cand.puppiWeight();
1203 val_PuppiWithoutLep += cand.pt() * cand.puppiWeightNoLep();
1207 double reliso_Puppi_withLep = val_PuppiWithLep / muon.
pt();
1208 double reliso_Puppi_withoutlep = val_PuppiWithoutLep / muon.
pt();
1209 double reliso_Puppi_combined = mix_fraction * reliso_Puppi_withLep + (1.0 - mix_fraction) * reliso_Puppi_withoutlep;
1210 return reliso_Puppi_combined;
1222 iDesc.
setComment(
"PAT muon producer module");
1228 iDesc.
add<
bool>(
"embedMuonBestTrack",
true)->setComment(
"embed muon best track (global pflow)");
1229 iDesc.
add<
bool>(
"embedTunePMuonBestTrack",
true)->setComment(
"embed muon best track (muon only)");
1230 iDesc.
add<
bool>(
"forceBestTrackEmbedding",
true)
1232 "force embedding separately the best tracks even if they're already embedded e.g. as tracker or global "
1234 iDesc.
add<
bool>(
"embedTrack",
true)->setComment(
"embed external track");
1235 iDesc.
add<
bool>(
"embedStandAloneMuon",
true)->setComment(
"embed external stand-alone muon");
1236 iDesc.
add<
bool>(
"embedCombinedMuon",
false)->setComment(
"embed external combined muon");
1237 iDesc.
add<
bool>(
"embedPickyMuon",
false)->setComment(
"embed external picky track");
1238 iDesc.
add<
bool>(
"embedTpfmsMuon",
false)->setComment(
"embed external tpfms track");
1239 iDesc.
add<
bool>(
"embedDytMuon",
false)->setComment(
"embed external dyt track ");
1242 iDesc.
add<
bool>(
"embedCaloMETMuonCorrs",
true)->setComment(
"whether to add MET muon correction for caloMET or not");
1244 ->setComment(
"source of MET muon corrections for caloMET");
1245 iDesc.
add<
bool>(
"embedTcMETMuonCorrs",
true)->setComment(
"whether to add MET muon correction for tcMET or not");
1247 ->setComment(
"source of MET muon corrections for tcMET");
1251 iDesc.
add<
bool>(
"useParticleFlow",
false)->setComment(
"whether to use particle flow or not");
1252 iDesc.
add<
bool>(
"embedPFCandidate",
false)->setComment(
"embed external particle flow object");
1253 iDesc.
add<
bool>(
"embedPfEcalEnergy",
true)->setComment(
"add ecal energy as reconstructed by PF");
1256 iDesc.
add<
bool>(
"addInverseBeta",
true)->setComment(
"add combined inverse beta");
1258 ->setComment(
"source of inverse beta values");
1261 iDesc.
add<
bool>(
"addGenMatch",
true)->setComment(
"add MC matching");
1262 iDesc.
add<
bool>(
"embedGenMatch",
false)->setComment(
"embed MC matched MC information");
1263 std::vector<edm::InputTag> emptySourceVector;
1267 ->
setComment(
"input with MC match information");
1270 iDesc.
add<
bool>(
"computeMiniIso",
false)->setComment(
"whether or not to compute and store electron mini-isolation");
1271 iDesc.
add<
bool>(
"computePuppiCombinedIso",
false)
1272 ->setComment(
"whether or not to compute and store puppi combined isolation");
1275 ->setComment(
"collection to use to compute mini-iso");
1276 iDesc.
add<std::vector<double>>(
"miniIsoParams", std::vector<double>())
1277 ->
setComment(
"mini-iso parameters to use for muons");
1279 iDesc.
add<
bool>(
"addTriggerMatching",
false)->setComment(
"add L1 and HLT matching to offline muon");
1294 isoDepositsPSet.
addOptional<std::vector<edm::InputTag>>(
"user");
1295 iDesc.
addOptional(
"isoDeposits", isoDepositsPSet);
1308 iDesc.
addOptional(
"isolationValues", isolationValuesPSet);
1312 "puppiIsolationChargedHadrons",
1313 edm::InputTag(
"muonPUPPIIsolation",
"h+-DR030-ThresholdVeto000-ConeVeto000"),
1316 "puppiIsolationNeutralHadrons",
1317 edm::InputTag(
"muonPUPPIIsolation",
"h0-DR030-ThresholdVeto000-ConeVeto001"),
1320 "puppiIsolationPhotons",
1321 edm::InputTag(
"muonPUPPIIsolation",
"gamma-DR030-ThresholdVeto000-ConeVeto001"),
1324 "puppiNoLeptonsIsolationChargedHadrons",
1325 edm::InputTag(
"muonPUPPINoLeptonsIsolation",
"h+-DR030-ThresholdVeto000-ConeVeto000"),
1328 "puppiNoLeptonsIsolationNeutralHadrons",
1329 edm::InputTag(
"muonPUPPINoLeptonsIsolation",
"h0-DR030-ThresholdVeto000-ConeVeto001"),
1332 "puppiNoLeptonsIsolationPhotons",
1333 edm::InputTag(
"muonPUPPINoLeptonsIsolation",
"gamma-DR030-ThresholdVeto000-ConeVeto001"),
1340 iDesc.
add(
"efficiencies", efficienciesPSet);
1341 iDesc.
add<
bool>(
"addEfficiencies",
false);
1350 iDesc.
add(
"userIsolation", isolationPSet);
1352 iDesc.
add<
bool>(
"embedHighLevelSelection",
true)->setComment(
"embed high level selection");
1356 ->
setComment(
"input with high level selection");
1358 ->
setComment(
"input with high level selection");
1369 bool primaryVertexIsValid,
1371 bool beamspotIsValid) {
1380 std::pair<bool, Measurement1D>
result =
1382 double d0_corr = result.second.value();
1383 double d0_err = primaryVertexIsValid ? result.second.error() : -1.0;
1396 d0_corr = result.second.value();
1397 d0_err = beamspotIsValid ? result.second.error() : -1.0;
bool embedTpfmsMuon_
embed track from tpfms muon fit into the muon
edm::EDGetTokenT< edm::ValueMap< float > > PUPPIIsolation_charged_hadrons_
bool enabled() const
'true' 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) ...
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)
edm::EDGetTokenT< edm::ValueMap< float > > PUPPIIsolation_photons_
double ecalEnergy() const
return corrected Ecal energy
void setComment(std::string const &value)
Assists in assimilating all pat::UserData into pat objects.
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
void embedDytMuon()
embed reference to the above dyt Track
ParameterDescriptionBase * addOptional(U const &iLabel, T const &value)
bool isNonnull() const
Checks for non-null.
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)
bool embedTcMETMuonCorrs_
embed muon MET correction info for tcMET into the muon
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)
double pt() const final
transverse momentum
edm::EDGetTokenT< edm::ValueMap< reco::MuonTimeExtra > > muonTimeExtraToken_
input tag for reading inverse beta
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::EventIDconst &, edm::Timestampconst & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
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
bool getByToken(EDGetToken token, Handle< PROD > &result) const
enum start value shifted to 81 so as to avoid clashes with PDG codes
void setAllowAnything()
allow any parameter label/value pairs
double zError() const
error on z
void setSimFlavour(int f)
#define DEFINE_FWK_MODULE(type)
GlobalPoint toGlobal(const Local2DPoint &lp) const
Conversion to the global R.F. from the R.F. of the GeomDet.
bool embedCaloMETMuonCorrs_
embed muon MET correction info for caloMET into the muon
bool isChargedHadron(long pdgid)
~PATMuonProducer() override
default destructur
edm::EDGetTokenT< edm::ValueMap< reco::MuonSimInfo > > simInfo_
MC info.
void embedMuonBestTrack(bool force=false)
std::vector< pat::PackedCandidate > PackedCandidateCollection
void setIsolationPUPPINoLeptons(float chargedhadrons, float neutralhadrons, float photons)
sets PUPPINoLeptons isolations
void setMuonMiniIso(pat::Muon &aMuon, const pat::PackedCandidateCollection *pc)
reco::TransientTrack build(const reco::Track *p) const
PATMuonProducer(const edm::ParameterSet &iConfig, PATMuonHeavyObjectCache const *)
default constructir
bool exists(std::string const ¶meterName) const
checks if a parameter exists
bool addTriggerMatching_
Trigger.
ParameterDescriptionNode * addNode(ParameterDescriptionNode const &node)
bool embedBestTrack_
embed the track from best muon measurement (global pflow)
edm::EDGetTokenT< reco::JetCorrector > mvaL1Corrector_
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) ...
double covariance(int i, int j) const
(i, j)-th element of error matrix, i, j = 0, ... 2
IsolationKeys
Enum defining isolation keys.
void unpackPathNames(const edm::TriggerNames &names)
unpack trigger names into indices
edm::EDGetTokenT< edm::ValueMap< float > > PUPPINoLeptonsIsolation_charged_hadrons_
std::vector< double > miniIsoParams_
void setSimPhi(float phi)
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 >
PFCandidateCollection::const_iterator PFCandidateConstIterator
iterator
bool computePuppiCombinedIso_
void setResolutions(pat::PATObject< T > &obj) const
Sets the efficiencies for this object, using the reference to the original objects.
void setSimProdRho(float rho)
void setSimHeaviestMotherFlavour(int id)
reco::Muon::Selector makeSelectorBitset(reco::Muon const &muon, reco::Vertex const *vertex=nullptr, bool run2016_hip_mitigation=false)
void setPFCandidateRef(const reco::PFCandidateRef &ref)
add a reference to the source IsolatedPFCandidate
const Point & position() const
position
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)
void embedStandAloneMuon()
set reference to Track reconstructed in the muon detector only (reimplemented from reco::Muon) ...
double relMiniIsoPUCorrected_
edm::EDGetTokenT< reco::JetTagCollection > mvaBTagCollectionTag_
pat::MuonMvaEstimator const & muonMvaEstimator() const
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
pat::helper::MultiIsolator isolator_
std::vector< edm::EDGetTokenT< edm::ValueMap< IsoDeposit > > > isoDepositTokens_
bool enabled() const
'true' if this there is at least one efficiency configured
void setIsoDeposit(IsolationKeys key, const IsoDeposit &dep)
Sets the IsoDeposit associated with some key; if it is already existent, it is overwritten.
void embedTrack()
set reference to Track reconstructed in the tracker only (reimplemented from reco::Muon) ...
edm::TriggerNames const & triggerNames(edm::TriggerResults const &triggerResults) const override
static void fillDescription(edm::ParameterSetDescription &iDesc)
const PFIsolation & miniPFIsolation() const
std::vector< IsolationLabel > IsolationLabels
edm::EDGetTokenT< reco::BeamSpot > beamLineToken_
input source of the primary vertex/beamspot
std::unique_ptr< const pat::MuonMvaEstimator > muonLowPtMvaEstimator_
bool getData(T &iHolder) const
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
bool enabled() const
True if it has a non null configuration.
std::vector< edm::Handle< edm::ValueMap< IsoDeposit > > > IsoDepositMaps
bool embedStandAloneMuon_
embed track from muon system into the muon
void setComment(std::string const &value)
edm::EDGetTokenT< edm::TriggerResults > triggerResults_
void beginEvent(const edm::Event &event, const edm::EventSetup &eventSetup)
pat::SoftMuonMvaEstimator const & softMuonMvaEstimator() const
bool embedTrack_
embed the track from inner tracker into the muon
void setDB(double dB, double edB, IPTYPE type=PV2D)
bool addGenMatch_
add generator match information
PATMuonHeavyObjectCache(const edm::ParameterSet &)
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
description of config file parameters
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 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_
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
std::unique_ptr< const pat::MuonMvaEstimator > muonMvaEstimator_
reco::PFCandidateRef pfCandidateRef() const
tuple key
prepare the HTCondor submission files and eventually submit them
Abs< T >::type abs(const T &t)
double relMiniIsoPUCorrected(const pat::Muon &aMuon, double rho)
edm::EDGetTokenT< pat::PackedCandidateCollection > pcToken_
std::pair< pat::IsolationKeys, edm::InputTag > IsolationLabel
static void globalEndJob(PATMuonHeavyObjectCache *)
static std::string const triggerResults
ParameterDescriptionBase * add(U const &iLabel, T const &value)
double puppiCombinedIsolation(const pat::Muon &muon, const pat::PackedCandidateCollection *pc)
void readTimeExtra(const reco::MuonTimeExtra &t)
std::vector< std::string > hltCollectionFilters_
float miniIsoDr(const reco::Candidate::PolarLorentzVector &p4, float mindr, float maxdr, float kt_scale)
reco::MuonRef muonRef() const
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)
std::vector< std::pair< pat::IsolationKeys, float > > IsolationValuePairs
bool isAValidMuonTrack(const MuonTrackType &type) const
constexpr auto deltaR2(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
void addGenParticleRef(const reco::GenParticleRef &ref)
void setPfEcalEnergy(float pfEcalEnergy)
bool embedTunePBestTrack_
embed the track from best muon measurement (muon only)
T const * product() const
OrphanHandle< PROD > emplace(EDPutTokenT< PROD > token, Args &&...args)
puts a new product
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)
T getParameter(std::string const &) const
void setEfficiencies(pat::PATObject< T > &obj, const R &originalRef) const
Sets the efficiencies for this object, using the reference to the original objects.
void addTriggerObjectMatch(const TriggerObjectStandAlone &trigObj)
add a trigger match
void setExtSimType(reco::ExtendedMuonSimType type)
std::vector< MuonChamberMatch > & matches()
get muon matching information
void setMiniPFIsolation(PFIsolation const &iso)
std::unique_ptr< const pat::SoftMuonMvaEstimator > softMuonMvaEstimator_
std::vector< edm::Handle< edm::Association< reco::GenParticleCollection > > > GenAssociations
edm::EDGetTokenT< reco::JetCorrector > mvaL1L2L3ResCorrector_
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
void setSimProdZ(float z)
Particle reconstructed by the particle flow algorithm.
std::vector< edm::Handle< edm::ValueMap< double > > > IsolationValueMaps
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)
boost::indirect_iterator< typename seq_t::const_iterator > const_iterator
bool embedDytMuon_
embed track from DYT muon fit into the muon
void embedCaloMETMuonCorrs(const reco::MuonMETCorrectionData &t)
const edm::EDPutTokenT< std::vector< Muon > > patMuonPutToken_
Calculates a lepton'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
const Point & position() const
position
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)
ESHandle< T > getHandle(const ESGetToken< T, R > &iToken) const
Covariance3DMatrix rotatedCovariance3D() const
IsolationLabels isolationValueLabels_
input source isolation value maps
bool recomputeBasicSelectors_
void embedPickyMuon()
embed reference to the above picky Track
double phi() const final
momentum azimuthal angle
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)
bool computeMuonMVA_
standard muon selectors
void setSimEta(float eta)
bool embedCombinedMuon_
embed track of the combined fit into the muon
pat::MuonMvaEstimator const & muonLowPtMvaEstimator() const
Analysis-level muon class.
pat::helper::KinResolutionsLoader resolutionLoader_
helper class to add resolutions to the muon
static std::string const source
bool isGlobalMuon() const override
void setP4(const LorentzVector &p4) final
set 4-momentum
edm::EDGetTokenT< edm::ValueMap< float > > PUPPIIsolation_neutral_hadrons_
std::optional< GlobalPoint > getMuonDirection(const reco::MuonChamberMatch &chamberMatch, const edm::ESHandle< GlobalTrackingGeometry > &geometry, const DetId &chamberId)
bool isNeutralHadron(long pdgid)
Global3DVector GlobalVector
Calculates a lepton's tracker isolation pt.
Analysis-level trigger object class (stand-alone)
void setSimMatchQuality(float quality)
void fill(const edm::View< T > &coll, int idx, IsolationValuePairs &isolations) const
void setSimTpEvent(int tpEvent)
bool embedHighLevelSelection_
embed high level selection variables
double eta() const final
momentum pseudorapidity