47 isolator_(iConfig.exists(
"userIsolation") ? iConfig.getParameter<edm::
ParameterSet>(
"userIsolation") : edm::
ParameterSet(), consumesCollector(),
false)
84 addEfficiencies_ = iConfig.getParameter<
bool>(
"addEfficiencies");
89 addResolutions_ = iConfig.getParameter<
bool>(
"addResolutions");
90 if (addResolutions_) {
94 readIsolationLabels(iConfig,
"isoDeposits", isoDepositLabels_, isoDepositTokens_);
96 readIsolationLabels(iConfig,
"isolationValues", isolationValueLabels_, isolationValueTokens_);
102 embedHighLevelSelection_ = iConfig.getParameter<
bool>(
"embedHighLevelSelection");
103 if ( embedHighLevelSelection_ ) {
104 beamLineToken_ = consumes<reco::BeamSpot>(iConfig.getParameter<
edm::InputTag>(
"beamLineSrc"));
105 pvToken_ = consumes<std::vector<reco::Vertex> >(iConfig.getParameter<
edm::InputTag>(
"pvSrc"));
108 produces<std::vector<Muon> >();
112 PATMuonProducer::~PATMuonProducer()
157 bool beamSpotIsValid =
false;
158 bool primaryVertexIsValid =
false;
168 if( beamSpotHandle.
isValid() ){
169 beamSpot = *beamSpotHandle;
170 beamSpotIsValid =
true;
173 <<
"No beam spot available from EventSetup, not adding high level selection \n";
175 if( pvHandle.
isValid() && !pvHandle->empty() ) {
176 primaryVertex = pvHandle->at(0);
177 primaryVertexIsValid =
true;
180 <<
"No primary vertex available from EventSetup, not adding high level selection \n";
187 std::vector<Muon> *
patMuons =
new std::vector<Muon>();
202 Muon aMuon(muonBaseRef);
217 chosenTrack = bestTrack;
220 unsigned int nhits = chosenTrack->numberOfValidHits();
228 primaryVertexIsValid,
235 double norm_chi2 = globalTrack->chi2() / globalTrack->ndof();
245 fillMuon( aMuon, muonBaseRef, pfBaseRef, genMatches, deposits, isolationValues );
251 patMuons->push_back(aMuon);
279 unsigned int idx = itMuon - muons->begin();
284 fillMuon( aMuon, muonRef, muonBaseRef, genMatches, deposits, isolationValues);
317 chosenTrack = bestTrack;
319 unsigned int nhits = chosenTrack->numberOfValidHits();
327 primaryVertexIsValid,
334 double norm_chi2 = globalTrack->chi2() / globalTrack->ndof();
346 if (pfmu.muonRef().isNonnull()) {
347 if (pfmu.muonRef().id() != muonRef.id())
throw cms::Exception(
"Configuration") <<
"Muon reference within PF candidates does not point to the muon collection." << std::endl;
348 if (pfmu.muonRef().key() == muonRef.key()) {
355 patMuons->push_back(aMuon);
363 std::auto_ptr<std::vector<Muon> > ptr(patMuons);
399 for(
size_t i = 0,
n = genMatches.size();
i <
n; ++
i) {
409 for (
size_t j = 0, nd = deposits.size();
j < nd; ++
j) {
425 for (
size_t j = 0;
j<isolationValues.size(); ++
j) {
429 }
else if (isolationValues[
j]->
contains(muonRef.
id())) {
456 iDesc.
add<
bool>(
"embedMuonBestTrack",
true)->setComment(
"embed muon best track (global pflow)");
457 iDesc.
add<
bool>(
"embedTunePMuonBestTrack",
true)->setComment(
"embed muon best track (muon only)");
458 iDesc.
add<
bool>(
"forceBestTrackEmbedding",
true)->setComment(
"force embedding separately the best tracks even if they're already embedded e.g. as tracker or global tracks");
459 iDesc.
add<
bool>(
"embedTrack",
true)->setComment(
"embed external track");
460 iDesc.
add<
bool>(
"embedStandAloneMuon",
true)->setComment(
"embed external stand-alone muon");
461 iDesc.
add<
bool>(
"embedCombinedMuon",
false)->setComment(
"embed external combined muon");
462 iDesc.
add<
bool>(
"embedPickyMuon",
false)->setComment(
"embed external picky track");
463 iDesc.
add<
bool>(
"embedTpfmsMuon",
false)->setComment(
"embed external tpfms track");
464 iDesc.
add<
bool>(
"embedDytMuon",
false)->setComment(
"embed external dyt track ");
467 iDesc.
add<
bool>(
"embedCaloMETMuonCorrs",
true)->setComment(
"whether to add MET muon correction for caloMET or not");
468 iDesc.
add<
edm::InputTag>(
"caloMETMuonCorrs",
edm::InputTag(
"muonMETValueMapProducer" ,
"muCorrData"))->setComment(
"source of MET muon corrections for caloMET");
469 iDesc.
add<
bool>(
"embedTcMETMuonCorrs",
true)->setComment(
"whether to add MET muon correction for tcMET or not");
470 iDesc.
add<
edm::InputTag>(
"tcMETMuonCorrs",
edm::InputTag(
"muonTCMETValueMapProducer" ,
"muCorrData"))->setComment(
"source of MET muon corrections for tcMET");
474 iDesc.
add<
bool>(
"useParticleFlow",
false)->setComment(
"whether to use particle flow or not");
475 iDesc.
add<
bool>(
"embedPFCandidate",
false)->setComment(
"embed external particle flow object");
476 iDesc.
add<
bool>(
"embedPfEcalEnergy",
true)->setComment(
"add ecal energy as reconstructed by PF");
479 iDesc.
add<
bool>(
"addGenMatch",
true)->setComment(
"add MC matching");
480 iDesc.
add<
bool>(
"embedGenMatch",
false)->setComment(
"embed MC matched MC information");
481 std::vector<edm::InputTag> emptySourceVector;
484 )->
setComment(
"input with MC match information");
499 isoDepositsPSet.
addOptional<std::vector<edm::InputTag> >(
"user");
513 iDesc.
addOptional(
"isolationValues", isolationValuesPSet);
518 iDesc.
add(
"efficiencies", efficienciesPSet);
519 iDesc.
add<
bool>(
"addEfficiencies",
false);
528 iDesc.
add(
"userIsolation", isolationPSet);
530 iDesc.
add<
bool>(
"embedHighLevelSelection",
true)->setComment(
"embed high level selection");
534 )->
setComment(
"input with high level selection");
536 )->
setComment(
"input with high level selection");
549 bool primaryVertexIsValid,
557 std::pair<bool,Measurement1D>
result =
563 double d0_corr = result.second.value();
564 double d0_err = primaryVertexIsValid ? result.second.error() : -1.0;
575 d0_corr = result.second.value();
576 d0_err = primaryVertexIsValid ? result.second.error() : -1.0;
591 d0_corr = result.second.value();
592 d0_err = beamspotIsValid ? result.second.error() : -1.0;
602 d0_corr = result.second.value();
603 d0_err = beamspotIsValid ? result.second.error() : -1.0;
bool embedTpfmsMuon_
embed track from tpfms muon fit into the muon
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) ...
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.
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
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)
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)
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)
bool isGlobalMuon() const
ParameterDescriptionNode * addNode(ParameterDescriptionNode const &node)
bool embedBestTrack_
embed the track from best muon measurement (global pflow)
virtual void setP4(const LorentzVector &p4)
set 4-momentum
auto vector_transform(std::vector< InputType > const &input, Function predicate) -> std::vector< typename std::remove_cv< typename std::remove_reference< decltype(predicate(input.front()))>::type >::type >
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)
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 ...
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)
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
OrphanHandle< PROD > put(std::auto_ptr< PROD > product)
Put a new product.
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_
virtual void produce(edm::Event &iEvent, const edm::EventSetup &iSetup) override
everything that needs to be done during the event loop
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.
tuple idx
DEBUGGING if hasattr(process,"trackMonIterativeTracking2012"): print "trackMonIterativeTracking2012 D...
void setEfficiencies(pat::PATObject< T > &obj, const R &originalRef) const
Sets the efficiencies for this object, using the reference to the original objects.
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
IsolationLabels isoDepositLabels_
input source for isoDeposits
std::vector< edm::EDGetTokenT< edm::Association< reco::GenParticleCollection > > > genMatchTokens_
input tags for generator match information
volatile std::atomic< bool > shutdown_flag false
Covariance3DMatrix rotatedCovariance3D() const
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
Global3DVector GlobalVector
void fill(const edm::View< T > &coll, int idx, IsolationValuePairs &isolations) const
bool embedHighLevelSelection_
embed high level selection variables