52 class JetFlavourIdentifier;
122 : useUserData_(iConfig.exists(
"userData")), printWarning_(
true) {
126 if (iConfig.
exists(
"embedCaloTowers")) {
133 if (getJetMCFlavour_ && useLegacyJetMCFlavour_)
136 else if (getJetMCFlavour_ && !useLegacyJetMCFlavour_)
152 if (addJetCorrFactors_) {
154 iConfig.
getParameter<std::vector<edm::InputTag>>(
"jetCorrFactorsSource"),
157 addBTagInfo_ =
iConfig.getParameter<
bool>(
"addBTagInfo");
158 addDiscriminators_ =
iConfig.getParameter<
bool>(
"addDiscriminators");
159 discriminatorTags_ =
iConfig.getParameter<std::vector<edm::InputTag>>(
"discriminatorSources");
161 return mayConsume<reco::JetFloatAssociation::Container>(
tag);
163 addTagInfos_ =
iConfig.getParameter<
bool>(
"addTagInfos");
164 tagInfoTags_ =
iConfig.getParameter<std::vector<edm::InputTag>>(
"tagInfoSources");
166 tagInfoTags_, [
this](
edm::InputTag const &tag) {
return mayConsume<edm::View<reco::BaseTagInfo>>(
tag); });
167 addAssociatedTracks_ =
iConfig.getParameter<
bool>(
"addAssociatedTracks");
168 if (addAssociatedTracks_)
169 trackAssociationToken_ =
170 consumes<reco::JetTracksAssociation::Container>(
iConfig.getParameter<
edm::InputTag>(
"trackAssociationSource"));
171 addJetCharge_ =
iConfig.getParameter<
bool>(
"addJetCharge");
174 consumes<reco::JetFloatAssociation::Container>(
iConfig.getParameter<
edm::InputTag>(
"jetChargeSource"));
175 addJetID_ =
iConfig.getParameter<
bool>(
"addJetID");
177 jetIDMapToken_ = consumes<reco::JetIDValueMap>(
iConfig.getParameter<
edm::InputTag>(
"jetIDMap"));
179 addEfficiencies_ =
iConfig.getParameter<
bool>(
"addEfficiencies");
180 if (addEfficiencies_) {
185 addResolutions_ =
iConfig.getParameter<
bool>(
"addResolutions");
186 if (addResolutions_) {
190 if (discriminatorTags_.empty()) {
191 addDiscriminators_ =
false;
193 for (std::vector<edm::InputTag>::const_iterator it = discriminatorTags_.begin(), ed = discriminatorTags_.end();
198 if ((pos != std::string::npos) && (pos != label.length() - 7)) {
199 label.erase(pos + 7);
201 if (!it->instance().empty()) {
202 label = (label +
std::string(
":") + it->instance());
204 discriminatorLabels_.push_back(label);
207 if (tagInfoTags_.empty()) {
208 addTagInfos_ =
false;
210 for (std::vector<edm::InputTag>::const_iterator it = tagInfoTags_.begin(), ed = tagInfoTags_.end(); it != ed;
214 if ((pos != std::string::npos) && (pos != label.length() - 8)) {
215 label.erase(pos + 8);
217 tagInfoLabels_.push_back(label);
221 addDiscriminators_ =
false;
222 addTagInfos_ =
false;
229 produces<std::vector<Jet>>();
230 produces<reco::GenJetCollection>(
"genJets");
231 produces<std::vector<CaloTower>>(
"caloTowers");
232 produces<reco::PFCandidateCollection>(
"pfCandidates");
233 produces<edm::OwnVector<reco::BaseTagInfo>>(
"tagInfos");
236 PATJetProducer::~PATJetProducer() {}
281 std::vector<edm::ValueMap<JetCorrFactors>> jetCorrs;
286 jetCorrs.push_back(*jetCorr);
291 std::vector<edm::Handle<reco::JetFloatAssociation::Container>> jetDiscriminators;
298 std::vector<edm::Handle<edm::View<reco::BaseTagInfo>>> jetTagInfos;
320 auto patJets = std::make_unique<std::vector<Jet>>();
322 auto genJetsOut = std::make_unique<reco::GenJetCollection>();
323 auto caloTowersOut = std::make_unique<std::vector<CaloTower>>();
324 auto pfCandidatesOut = std::make_unique<reco::PFCandidateCollection>();
325 auto tagInfosOut = std::make_unique<edm::OwnVector<reco::BaseTagInfo>>();
336 unsigned int idx = itJet - jets->begin();
346 cj = dynamic_cast<const reco::CaloJet *>(jetRef.
get());
353 for (std::vector<CaloTowerPtr>::const_iterator towBegin = itowers.begin(),
354 towEnd = itowers.end(),
358 if (itow->isAvailable() && itow->isNonnull()) {
359 caloTowersOut->push_back(**itow);
362 edm::Ptr<CaloTower> caloForwardRef(h_caloTowersOut.id(), caloTowerRef.key(), h_caloTowersOut.productGetter());
377 for (std::vector<reco::PFCandidatePtr>::const_iterator partBegin = iparticles.begin(),
378 partEnd = iparticles.end(),
382 pfCandidatesOut->push_back(**ipart);
386 h_pfCandidatesOut.id(), pfCollectionRef.key(), h_pfCandidatesOut.productGetter());
403 std::vector<std::string>
levels = jetCorrs[0][jetRef].correctionLabels();
404 if (
std::find(levels.begin(), levels.end(),
"L2L3Residual") != levels.end()) {
405 ajet.
initializeJEC(jetCorrs[0][jetRef].jecLevel(
"L2L3Residual"));
406 }
else if (
std::find(levels.begin(), levels.end(),
"L3Absolute") != levels.end()) {
407 ajet.
initializeJEC(jetCorrs[0][jetRef].jecLevel(
"L3Absolute"));
409 ajet.
initializeJEC(jetCorrs[0][jetRef].jecLevel(
"Uncorrected"));
412 <<
"L2L3Residual and L3Absolute are not part of the jetCorrFactors\n"
413 <<
"of module " << jetCorrs[0][jetRef].jecSet() <<
". Jets will remain"
442 genJetsOut->push_back(*genjet);
469 for (
size_t k = 0;
k < jetDiscriminators.size(); ++
k) {
470 float value = (*jetDiscriminators[
k])[jetRef];
475 for (
size_t k = 0;
k < jetTagInfos.size(); ++
k) {
480 if ((idx < taginfos.
size()) && (taginfos[idx].
jet() == jetRef)) {
481 match = taginfos.
ptrAt(idx);
487 if (itTI->jet() == jetRef) {
488 match = taginfos.
ptrAt(itTI - taginfos.
begin());
494 tagInfosOut->push_back(match->clone());
497 h_tagInfosOut.id(), &tagInfosOut->back(), tagInfosOut->size() - 1);
553 ->setComment(
"embed external CaloTowers (not to be used on AOD input)");
554 iDesc.
add<
bool>(
"embedPFCandidates",
true)->setComment(
"embed external PFCandidates");
557 iDesc.
add<
bool>(
"addGenPartonMatch",
true)->setComment(
"add MC matching");
558 iDesc.
add<
bool>(
"embedGenPartonMatch",
false)->setComment(
"embed MC matched MC information");
561 iDesc.
add<
bool>(
"addGenJetMatch",
true)->setComment(
"add MC matching");
562 iDesc.
add<
bool>(
"embedGenJetMatch",
false)->setComment(
"embed MC matched MC information");
565 iDesc.
add<
bool>(
"addJetCharge",
true);
569 iDesc.
add<
bool>(
"addJetID",
true)->setComment(
"Add jet ID information");
572 iDesc.
add<
bool>(
"addPartonJetMatch",
false);
576 iDesc.
add<
bool>(
"addAssociatedTracks",
true);
580 iDesc.
add<
bool>(
"addTagInfos",
true);
581 std::vector<edm::InputTag> emptyVInputTags;
582 iDesc.
add<std::vector<edm::InputTag>>(
"tagInfoSources", emptyVInputTags);
585 iDesc.
add<
bool>(
"addJetCorrFactors",
true);
586 iDesc.
add<std::vector<edm::InputTag>>(
"jetCorrFactorsSource", emptyVInputTags);
589 iDesc.
add<
bool>(
"addBTagInfo",
true);
590 iDesc.
add<
bool>(
"addDiscriminators",
true);
591 iDesc.
add<std::vector<edm::InputTag>>(
"discriminatorSources", emptyVInputTags);
594 iDesc.
add<
bool>(
"getJetMCFlavour",
true);
595 iDesc.
add<
bool>(
"useLegacyJetMCFlavour",
false);
596 iDesc.
add<
bool>(
"addJetFlavourInfo",
false);
605 iDesc.
add(
"efficiencies", efficienciesPSet);
606 iDesc.
add<
bool>(
"addEfficiencies",
false);
613 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
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.
GreaterByPt< CaloTower > caloPTComparator_
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.
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_
#define DEFINE_FWK_MODULE(type)
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
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 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)
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_
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
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
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.
Analysis-level calorimeter jet class.
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.
Log< level::Warning, false > LogWarning
void addTagInfo(const std::string &label, const TagInfoFwdPtrCollection::value_type &info)