115 if ( embedHighLevelSelection_ ) {
120 produces<std::vector<Muon> >();
188 bool beamSpotIsValid =
false;
189 bool primaryVertexIsValid =
false;
199 if( beamSpotHandle.
isValid() ){
200 beamSpot = *beamSpotHandle;
201 beamSpotIsValid =
true;
204 <<
"No beam spot available from EventSetup, not adding high level selection \n";
206 if( pvHandle.
isValid() && !pvHandle->empty() ) {
207 primaryVertex = pvHandle->at(0);
208 primaryVertexIsValid =
true;
211 <<
"No primary vertex available from EventSetup, not adding high level selection \n";
218 std::vector<Muon> *
patMuons =
new std::vector<Muon>();
233 Muon aMuon(muonBaseRef);
248 chosenTrack = bestTrack;
251 unsigned int nhits = chosenTrack->numberOfValidHits();
259 primaryVertexIsValid,
266 double norm_chi2 = globalTrack->chi2() / globalTrack->ndof();
280 (*PUPPIIsolation_neutral_hadrons)[muonBaseRef],
281 (*PUPPIIsolation_photons)[muonBaseRef]);
284 (*PUPPINoLeptonsIsolation_neutral_hadrons)[muonBaseRef],
285 (*PUPPINoLeptonsIsolation_photons)[muonBaseRef]);
296 patMuons->push_back(aMuon);
324 unsigned int idx = itMuon - muons->begin();
331 aMuon.
setIsolationPUPPI((*PUPPIIsolation_charged_hadrons)[muonRef], (*PUPPIIsolation_neutral_hadrons)[muonRef], (*PUPPIIsolation_photons)[muonRef]);
332 aMuon.
setIsolationPUPPINoLeptons((*PUPPINoLeptonsIsolation_charged_hadrons)[muonRef], (*PUPPINoLeptonsIsolation_neutral_hadrons)[muonRef], (*PUPPINoLeptonsIsolation_photons)[muonRef]);
370 chosenTrack = bestTrack;
372 unsigned int nhits = chosenTrack->numberOfValidHits();
380 primaryVertexIsValid,
387 double norm_chi2 = globalTrack->chi2() / globalTrack->ndof();
399 if (pfmu.muonRef().isNonnull()) {
400 if (pfmu.muonRef().id() != muonRef.id())
throw cms::Exception(
"Configuration") <<
"Muon reference within PF candidates does not point to the muon collection." << std::endl;
401 if (pfmu.muonRef().key() == muonRef.key()) {
408 patMuons->push_back(aMuon);
413 std::sort(patMuons->begin(), patMuons->end(),
pTComparator_);
416 std::unique_ptr<std::vector<Muon> > ptr(patMuons);
452 for(
size_t i = 0,
n = genMatches.size();
i <
n; ++
i) {
462 for (
size_t j = 0, nd = deposits.size(); j < nd; ++j) {
466 }
else if (deposits[j]->
contains(muonRef.
id())){
478 for (
size_t j = 0; j<isolationValues.size(); ++j) {
480 if (isolationValues[j]->
contains(baseRef.
id())) {
482 }
else if (isolationValues[j]->
contains(muonRef.
id())) {
509 iDesc.
add<
bool>(
"embedMuonBestTrack",
true)->setComment(
"embed muon best track (global pflow)");
510 iDesc.
add<
bool>(
"embedTunePMuonBestTrack",
true)->setComment(
"embed muon best track (muon only)");
511 iDesc.
add<
bool>(
"forceBestTrackEmbedding",
true)->setComment(
"force embedding separately the best tracks even if they're already embedded e.g. as tracker or global tracks");
512 iDesc.
add<
bool>(
"embedTrack",
true)->setComment(
"embed external track");
513 iDesc.
add<
bool>(
"embedStandAloneMuon",
true)->setComment(
"embed external stand-alone muon");
514 iDesc.
add<
bool>(
"embedCombinedMuon",
false)->setComment(
"embed external combined muon");
515 iDesc.
add<
bool>(
"embedPickyMuon",
false)->setComment(
"embed external picky track");
516 iDesc.
add<
bool>(
"embedTpfmsMuon",
false)->setComment(
"embed external tpfms track");
517 iDesc.
add<
bool>(
"embedDytMuon",
false)->setComment(
"embed external dyt track ");
520 iDesc.
add<
bool>(
"embedCaloMETMuonCorrs",
true)->setComment(
"whether to add MET muon correction for caloMET or not");
521 iDesc.
add<
edm::InputTag>(
"caloMETMuonCorrs",
edm::InputTag(
"muonMETValueMapProducer" ,
"muCorrData"))->setComment(
"source of MET muon corrections for caloMET");
522 iDesc.
add<
bool>(
"embedTcMETMuonCorrs",
true)->setComment(
"whether to add MET muon correction for tcMET or not");
523 iDesc.
add<
edm::InputTag>(
"tcMETMuonCorrs",
edm::InputTag(
"muonTCMETValueMapProducer" ,
"muCorrData"))->setComment(
"source of MET muon corrections for tcMET");
527 iDesc.
add<
bool>(
"useParticleFlow",
false)->setComment(
"whether to use particle flow or not");
528 iDesc.
add<
bool>(
"embedPFCandidate",
false)->setComment(
"embed external particle flow object");
529 iDesc.
add<
bool>(
"embedPfEcalEnergy",
true)->setComment(
"add ecal energy as reconstructed by PF");
532 iDesc.
add<
bool>(
"addGenMatch",
true)->setComment(
"add MC matching");
533 iDesc.
add<
bool>(
"embedGenMatch",
false)->setComment(
"embed MC matched MC information");
534 std::vector<edm::InputTag> emptySourceVector;
537 )->
setComment(
"input with MC match information");
552 isoDepositsPSet.
addOptional<std::vector<edm::InputTag> >(
"user");
566 iDesc.
addOptional(
"isolationValues", isolationValuesPSet);
580 iDesc.
add(
"efficiencies", efficienciesPSet);
581 iDesc.
add<
bool>(
"addEfficiencies",
false);
590 iDesc.
add(
"userIsolation", isolationPSet);
592 iDesc.
add<
bool>(
"embedHighLevelSelection",
true)->setComment(
"embed high level selection");
596 )->
setComment(
"input with high level selection");
598 )->
setComment(
"input with high level selection");
611 bool primaryVertexIsValid,
619 std::pair<bool,Measurement1D>
result =
625 double d0_corr = result.second.value();
626 double d0_err = primaryVertexIsValid ? result.second.error() : -1.0;
637 d0_corr = result.second.value();
638 d0_err = primaryVertexIsValid ? result.second.error() : -1.0;
653 d0_corr = result.second.value();
654 d0_err = beamspotIsValid ? result.second.error() : -1.0;
664 d0_corr = result.second.value();
665 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) ...
edm::EDGetTokenT< edm::ValueMap< float > > PUPPIIsolation_photons_
T getParameter(std::string const &) const
double ecalEnergy() const
return corrected Ecal energy
void setComment(std::string const &value)
Assists in assimilating all pat::UserData into pat objects.
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
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
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
bool existsAs(std::string const ¶meterName, bool trackiness=true) const
checks if a parameter exists as a given type
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)
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< 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
void setAllowAnything()
allow any parameter label/value pairs
#define DEFINE_FWK_MODULE(type)
bool embedCaloMETMuonCorrs_
embed muon MET correction info for caloMET into the muon
void embedMuonBestTrack(bool force=false)
void setIsolationPUPPINoLeptons(float chargedhadrons, float neutralhadrons, float photons)
sets PUPPINoLeptons isolations
reco::TransientTrack build(const reco::Track *p) const
bool isGlobalMuon() const
ParameterDescriptionNode * addNode(ParameterDescriptionNode const &node)
bool embedBestTrack_
embed the track from best muon measurement (global pflow)
bool addResolutions_
add resolutions to the muon (this will be data members of th muon even w/o embedding) ...
edm::EDGetTokenT< edm::ValueMap< float > > PUPPINoLeptonsIsolation_charged_hadrons_
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
void setResolutions(pat::PATObject< T > &obj) const
Sets the efficiencies for this object, using the reference to the original objects.
void setPFCandidateRef(const reco::PFCandidateRef &ref)
add a reference to the source IsolatedPFCandidate
void embedHighLevel(pat::Muon &aMuon, reco::TrackRef track, reco::TransientTrack &tt, reco::Vertex &primaryVertex, bool primaryVertexIsValid, reco::BeamSpot &beamspot, bool beamspotIsValid)
edm::EDGetTokenT< edm::ValueMap< float > > PUPPINoLeptonsIsolation_neutral_hadrons_
void embedStandAloneMuon()
set reference to Track reconstructed in the muon detector only (reimplemented from reco::Muon) ...
PATMuonProducer(const edm::ParameterSet &iConfig)
default constructir
edm::EDGetTokenT< reco::PFCandidateCollection > pfMuonToken_
input source pfCandidates that will be to be transformed into pat::Muons, when using PF2PAT ...
void setIsolationPUPPI(float chargedhadrons, float neutralhadrons, float photons)
sets PUPPI isolations
pat::helper::MultiIsolator isolator_
helper class to add userdefined isolation values to the muon
std::vector< edm::EDGetTokenT< edm::ValueMap< IsoDeposit > > > isoDepositTokens_
bool enabled() const
'true' if this there is at least one efficiency configured
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
void setIsoDeposit(IsolationKeys key, const IsoDeposit &dep)
Sets the IsoDeposit associated with some key; if it is already existent, it is overwritten.
void embedTrack()
set reference to Track reconstructed in the tracker only (reimplemented from reco::Muon) ...
static void fillDescription(edm::ParameterSetDescription &iDesc)
edm::EDGetTokenT< reco::BeamSpot > beamLineToken_
input source of the primary vertex/beamspot
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.
bool embedStandAloneMuon_
embed track from muon system into the muon
void setComment(std::string const &value)
~PATMuonProducer()
default destructur
void beginEvent(const edm::Event &event, const edm::EventSetup &eventSetup)
GreaterByPt< Muon > pTComparator_
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
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
description of config file parameters
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_
ConsumesCollector consumesCollector()
Use a ConsumesCollector to gather consumes information from helper functions.
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
virtual void produce(edm::Event &iEvent, const edm::EventSetup &iSetup) override
everything that needs to be done during the event loop
ParameterDescriptionNode * ifValue(ParameterDescription< T > const &switchParameter, std::unique_ptr< ParameterDescriptionCases< T > > cases)
reco::PFCandidateRef pfCandidateRef() const
ParameterDescriptionBase * add(U const &iLabel, T const &value)
reco::MuonRef muonRef() const
bool isAValidMuonTrack(const MuonTrackType &type) const
void addGenParticleRef(const reco::GenParticleRef &ref)
void setPfEcalEnergy(float pfEcalEnergy)
bool embedTunePBestTrack_
embed the track from best muon measurement (muon only)
static void fillDescription(edm::ParameterSetDescription &iDesc)
Method for documentation and validation of PSet.
void setEfficiencies(pat::PATObject< T > &obj, const R &originalRef) const
Sets the efficiencies for this object, using the reference to the original objects.
virtual void setP4(const LorentzVector &p4) final
set 4-momentum
std::vector< edm::Handle< edm::Association< reco::GenParticleCollection > > > GenAssociations
void fillMuon(Muon &aMuon, const MuonBaseRef &muonRef, const reco::CandidateBaseRef &baseRef, const GenAssociations &genMatches, const IsoDepositMaps &deposits, const IsolationValueMaps &isolationValues) const
common muon filling, for both the standard and PF2PAT case
std::vector< std::pair< pat::IsolationKeys, float > > IsolationValuePairs
Particle reconstructed by the particle flow algorithm.
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)
std::vector< edm::Handle< edm::ValueMap< IsoDeposit > > > IsoDepositMaps
pat::helper::MultiIsolator::IsolationValuePairs isolatorTmpStorage_
isolation value pair for temporary storage before being folded into the muon
bool embedGenMatch_
embed the gen match information into the muon
const Point & position() const
position
void readIsolationLabels(const edm::ParameterSet &iConfig, const char *psetName, IsolationLabels &labels, std::vector< edm::EDGetTokenT< edm::ValueMap< T > > > &tokens)
IsolationLabels isoDepositLabels_
input source for isoDeposits
std::vector< edm::EDGetTokenT< edm::Association< reco::GenParticleCollection > > > genMatchTokens_
input tags for generator match information
Covariance3DMatrix rotatedCovariance3D() const
IsolationLabels isolationValueLabels_
input source isolation value maps
std::vector< edm::Handle< edm::ValueMap< double > > > IsolationValueMaps
void embedPickyMuon()
embed reference to the above picky Track
bool forceEmbedBestTrack_
force separate embed of the best track even if already embedded
bool embedPFCandidate_
embed pfCandidates into the muon
std::vector< edm::EDGetTokenT< edm::ValueMap< double > > > isolationValueTokens_
void setNumberOfValidHits(unsigned int numberOfValidHits)
bool embedCombinedMuon_
embed track of the combined fit into the muon
Analysis-level muon class.
pat::helper::KinResolutionsLoader resolutionLoader_
helper class to add resolutions to the muon
static std::string const source
edm::EDGetTokenT< edm::ValueMap< float > > PUPPIIsolation_neutral_hadrons_
Global3DVector GlobalVector
void fill(const edm::View< T > &coll, int idx, IsolationValuePairs &isolations) const
bool embedHighLevelSelection_
embed high level selection variables