41 : useUserData_(iConfig.exists(
"userData")), printWarning_(
true) {
45 if (iConfig.
exists(
"embedCaloTowers")) {
52 if (getJetMCFlavour_ && useLegacyJetMCFlavour_)
55 else if (getJetMCFlavour_ && !useLegacyJetMCFlavour_)
71 if (addJetCorrFactors_) {
73 iConfig.
getParameter<std::vector<edm::InputTag>>(
"jetCorrFactorsSource"),
74 [
this](
edm::InputTag const &
tag) { return consumes<edm::ValueMap<JetCorrFactors>>(tag); });
80 return mayConsume<reco::JetFloatAssociation::Container>(
tag);
85 tagInfoTags_, [
this](
edm::InputTag const &tag) {
return mayConsume<edm::View<reco::BaseTagInfo>>(
tag); });
87 if (addAssociatedTracks_)
108 if (discriminatorTags_.empty()) {
109 addDiscriminators_ =
false;
111 for (std::vector<edm::InputTag>::const_iterator it = discriminatorTags_.begin(), ed = discriminatorTags_.end();
116 if ((pos != std::string::npos) && (pos != label.length() - 7)) {
117 label.erase(pos + 7);
119 if (!it->instance().empty()) {
120 label = (label +
std::string(
":") + it->instance());
125 if (tagInfoTags_.empty()) {
126 addTagInfos_ =
false;
128 for (std::vector<edm::InputTag>::const_iterator it = tagInfoTags_.begin(), ed = tagInfoTags_.end(); it != ed;
132 if ((pos != std::string::npos) && (pos != label.length() - 8)) {
133 label.erase(pos + 8);
139 addDiscriminators_ =
false;
140 addTagInfos_ =
false;
147 produces<std::vector<Jet>>();
148 produces<reco::GenJetCollection>(
"genJets");
149 produces<std::vector<CaloTower>>(
"caloTowers");
150 produces<reco::PFCandidateCollection>(
"pfCandidates");
151 produces<edm::OwnVector<reco::BaseTagInfo>>(
"tagInfos");
199 std::vector<edm::ValueMap<JetCorrFactors>> jetCorrs;
204 jetCorrs.push_back(*jetCorr);
209 std::vector<edm::Handle<reco::JetFloatAssociation::Container>> jetDiscriminators;
216 std::vector<edm::Handle<edm::View<reco::BaseTagInfo>>> jetTagInfos;
238 auto patJets = std::make_unique<std::vector<Jet>>();
240 auto genJetsOut = std::make_unique<reco::GenJetCollection>();
241 auto caloTowersOut = std::make_unique<std::vector<CaloTower>>();
242 auto pfCandidatesOut = std::make_unique<reco::PFCandidateCollection>();
243 auto tagInfosOut = std::make_unique<edm::OwnVector<reco::BaseTagInfo>>();
254 unsigned int idx = itJet - jets->begin();
264 cj = dynamic_cast<const reco::CaloJet *>(jetRef.
get());
271 for (std::vector<CaloTowerPtr>::const_iterator towBegin = itowers.begin(),
272 towEnd = itowers.end(),
276 if (itow->isAvailable() && itow->isNonnull()) {
277 caloTowersOut->push_back(**itow);
280 edm::Ptr<CaloTower> caloForwardRef(h_caloTowersOut.id(), caloTowerRef.key(), h_caloTowersOut.productGetter());
295 for (std::vector<reco::PFCandidatePtr>::const_iterator partBegin = iparticles.begin(),
296 partEnd = iparticles.end(),
300 pfCandidatesOut->push_back(**ipart);
304 h_pfCandidatesOut.id(), pfCollectionRef.key(), h_pfCandidatesOut.productGetter());
321 std::vector<std::string>
levels = jetCorrs[0][jetRef].correctionLabels();
322 if (
std::find(levels.begin(), levels.end(),
"L2L3Residual") != levels.end()) {
323 ajet.
initializeJEC(jetCorrs[0][jetRef].jecLevel(
"L2L3Residual"));
324 }
else if (
std::find(levels.begin(), levels.end(),
"L3Absolute") != levels.end()) {
325 ajet.
initializeJEC(jetCorrs[0][jetRef].jecLevel(
"L3Absolute"));
327 ajet.
initializeJEC(jetCorrs[0][jetRef].jecLevel(
"Uncorrected"));
330 <<
"L2L3Residual and L3Absolute are not part of the jetCorrFactors\n" 331 <<
"of module " << jetCorrs[0][jetRef].jecSet() <<
". Jets will remain" 360 genJetsOut->push_back(*genjet);
387 for (
size_t k = 0;
k < jetDiscriminators.size(); ++
k) {
388 float value = (*jetDiscriminators[
k])[jetRef];
393 for (
size_t k = 0;
k < jetTagInfos.size(); ++
k) {
398 if ((idx < taginfos.
size()) && (taginfos[idx].
jet() == jetRef)) {
399 match = taginfos.
ptrAt(idx);
405 if (itTI->jet() == jetRef) {
406 match = taginfos.
ptrAt(itTI - taginfos.
begin());
412 tagInfosOut->push_back(match->
clone());
415 h_tagInfosOut.id(), &tagInfosOut->back(), tagInfosOut->size() - 1);
471 ->setComment(
"embed external CaloTowers (not to be used on AOD input)");
472 iDesc.
add<
bool>(
"embedPFCandidates",
true)->setComment(
"embed external PFCandidates");
475 iDesc.
add<
bool>(
"addGenPartonMatch",
true)->setComment(
"add MC matching");
476 iDesc.
add<
bool>(
"embedGenPartonMatch",
false)->setComment(
"embed MC matched MC information");
479 iDesc.
add<
bool>(
"addGenJetMatch",
true)->setComment(
"add MC matching");
480 iDesc.
add<
bool>(
"embedGenJetMatch",
false)->setComment(
"embed MC matched MC information");
483 iDesc.
add<
bool>(
"addJetCharge",
true);
487 iDesc.
add<
bool>(
"addJetID",
true)->setComment(
"Add jet ID information");
490 iDesc.
add<
bool>(
"addPartonJetMatch",
false);
494 iDesc.
add<
bool>(
"addAssociatedTracks",
true);
498 iDesc.
add<
bool>(
"addTagInfos",
true);
499 std::vector<edm::InputTag> emptyVInputTags;
500 iDesc.
add<std::vector<edm::InputTag>>(
"tagInfoSources", emptyVInputTags);
503 iDesc.
add<
bool>(
"addJetCorrFactors",
true);
504 iDesc.
add<std::vector<edm::InputTag>>(
"jetCorrFactorsSource", emptyVInputTags);
507 iDesc.
add<
bool>(
"addBTagInfo",
true);
508 iDesc.
add<
bool>(
"addDiscriminators",
true);
509 iDesc.
add<std::vector<edm::InputTag>>(
"discriminatorSources", emptyVInputTags);
512 iDesc.
add<
bool>(
"getJetMCFlavour",
true);
513 iDesc.
add<
bool>(
"useLegacyJetMCFlavour",
false);
514 iDesc.
add<
bool>(
"addJetFlavourInfo",
false);
523 iDesc.
add(
"efficiencies", efficienciesPSet);
524 iDesc.
add<
bool>(
"addEfficiencies",
false);
531 descriptions.
add(
"PATJetProducer", iDesc);
bool enabled() const
'true' if this there is at least one efficiency configured
void setJetID(reco::JetID const &id)
methods for jet ID
void initializeJEC(unsigned int level, const JetCorrFactors::Flavor &flavor=JetCorrFactors::NONE, unsigned int set=0)
initialize the jet to a given JEC level during creation starting from Uncorrected ...
value_type const * get() const
T getParameter(std::string const &) const
pat::helper::EfficiencyLoader efficiencyLoader_
Assists in assimilating all pat::UserData into pat objects.
void setGenParton(const reco::GenParticleRef &gp, bool embed=false)
method to set the matched parton
void newEvent(const edm::Event &event)
To be called for each new event, reads in the ValueMaps for efficiencies.
edm::EDGetTokenT< edm::View< reco::Jet > > jetsToken_
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
ParameterDescriptionBase * addOptional(U const &iLabel, T const &value)
void addJECFactors(const JetCorrFactors &jec)
add more sets of energy correction factors
bool isNonnull() const
Checks for non-null.
std::vector< edm::EDGetTokenT< edm::View< reco::BaseTagInfo > > > tagInfoTokens_
edm::EDGetTokenT< reco::JetTracksAssociation::Container > trackAssociationToken_
Jets made from CaloTowers.
virtual BaseTagInfo * clone(void) const
clone
std::vector< std::string > tagInfoLabels_
std::vector< edm::EDGetTokenT< edm::ValueMap< JetCorrFactors > > > jetCorrFactorsTokens_
bool addAssociatedTracks_
bool getByToken(EDGetToken token, Handle< PROD > &result) const
std::vector< edm::InputTag > tagInfoTags_
void setAllowAnything()
allow any parameter label/value pairs
Ptr< value_type > ptrAt(size_type i) const
pat::helper::KinResolutionsLoader resolutionLoader_
std::vector< GenJet > GenJetCollection
collection of GenJet objects
std::vector< std::string > discriminatorLabels_
bool exists(std::string const ¶meterName) const
checks if a parameter exists
const edm::RefToBase< reco::Jet > & getCaloJetRef() const
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
virtual std::vector< CaloTowerPtr > getCaloConstituents() const
get all constituents
void addBDiscriminatorPair(const std::pair< std::string, float > &thePair)
method to add a algolabel-discriminator pair
void setResolutions(pat::PATObject< T > &obj) const
Sets the efficiencies for this object, using the reference to the original objects.
~PATJetProducer() override
edm::EDGetTokenT< reco::JetFlavourInfoMatchingCollection > jetFlavourInfoToken_
Jets made from PFObjects.
void setCaloTowers(const CaloTowerFwdPtrCollection &caloTowers)
method to store the CaloJet constituents internally
GreaterByPt< Jet > pTComparator_
bool enabled() const
'true' if this there is at least one efficiency configured
static void fillDescription(edm::ParameterSetDescription &iDesc)
PATJetProducer(const edm::ParameterSet &iConfig)
bool isCaloJet() const
check to see if the jet is a reco::CaloJet
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
edm::EDGetTokenT< reco::JetFloatAssociation::Container > jetChargeToken_
void setHadronFlavour(int hadronFl)
method to set the hadron-based flavour of the jet
void setComment(std::string const &value)
#define DEFINE_FWK_MODULE(type)
Container::value_type value_type
const_iterator begin() const
void setPartonFlavour(int partonFl)
method to set the parton-based flavour of the jet
void setPFCandidates(const PFCandidateFwdPtrCollection &pfCandidates)
method to store the PFCandidate constituents internally
void newEvent(const edm::Event &event, const edm::EventSetup &setup)
To be called for each new event, reads in the EventSetup object.
Jets made from CaloJets corrected for ZSP and tracks.
Class for the storage of jet correction factors.
void setJetCharge(float jetCharge)
method to set the jet charge
edm::EDGetTokenT< reco::JetIDValueMap > jetIDMapToken_
genJetMatch
switch on/off embedding of matched genJet's
void setJetFlavourInfo(const reco::JetFlavourInfo &jetFlavourInfo)
method to set the JetFlavourInfo of the jet
std::vector< edm::InputTag > discriminatorTags_
ParameterDescriptionBase * add(U const &iLabel, T const &value)
RefProd< PROD > getRefBeforePut()
bool isPFJet() const
check to see if the jet is a reco::PFJet
bool isNonnull() const
Checks for non-null.
bool isJPTJet() const
check to see if the jet is a reco::JPTJet
pat::PATUserDataHelper< pat::Jet > userDataHelper_
std::vector< reco::PFCandidate > PFCandidateCollection
collection of PFCandidates
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 >
void setAssociatedTracks(const reco::TrackRefVector &tracks)
method to set the vector of refs to the tracks associated to this jet
edm::EDGetTokenT< reco::JetFlavourMatchingCollection > jetPartonMapToken_
static void fillDescription(edm::ParameterSetDescription &iDesc)
Method for documentation and validation of PSet.
bool useLegacyJetMCFlavour_
std::vector< edm::FwdPtr< CaloTower > > CaloTowerFwdPtrCollection
std::vector< edm::FwdPtr< reco::PFCandidate > > PFCandidateFwdPtrCollection
void setGenJetRef(const edm::FwdRef< reco::GenJetCollection > &gj)
method to set the matched generated jet reference, embedding if requested
void setEfficiencies(pat::PATObject< T > &obj, const R &originalRef) const
Sets the efficiencies for this object, using the reference to the original objects.
void add(std::string const &label, ParameterSetDescription const &psetDescription)
void produce(edm::Event &iEvent, const edm::EventSetup &iSetup) override
edm::EDGetTokenT< edm::Association< reco::GenJetCollection > > genJetToken_
std::vector< edm::EDGetTokenT< reco::JetFloatAssociation::Container > > discriminatorTokens_
boost::indirect_iterator< typename seq_t::const_iterator > const_iterator
edm::EDGetTokenT< edm::Association< reco::GenParticleCollection > > genPartonToken_
virtual std::vector< reco::PFCandidatePtr > getPFConstituents() const
get all constituents
const_iterator end() const
bool embedGenPartonMatch_
std::pair< typename Association::data_type::first_type, double > match(Reference key, Association association, bool bestMatchByMaxValue)
Generic matching function.
void addTagInfo(const std::string &label, const TagInfoFwdPtrCollection::value_type &info)