22 : runMvas_(iConfig.getParameter<
bool>(
"runMvas")),
23 produceJetIds_(iConfig.getParameter<
bool>(
"produceJetIds")),
24 inputIsCorrected_(iConfig.getParameter<
bool>(
"inputIsCorrected")),
25 applyJec_(iConfig.getParameter<
bool>(
"applyJec")),
26 jec_(iConfig.getParameter<
std::
string>(
"jec")),
27 residualsFromTxt_(iConfig.getParameter<
bool>(
"residualsFromTxt")),
28 usePuppi_(iConfig.getParameter<
bool>(
"usePuppi")) {
33 std::vector<edm::ParameterSet>
algos = iConfig.
getParameter<std::vector<edm::ParameterSet>>(
"algos");
34 for (
auto const& algoPset : algos) {
39 assert(algos.size() == 1);
46 produces<edm::ValueMap<StoredPileupJetIdentifier>>(
"");
50 algos_.emplace_back(label, std::make_unique<PileupJetIdAlgo>(&algoGBRForestsAndConstants));
52 produces<edm::ValueMap<float>>(label +
"Discriminant");
53 produces<edm::ValueMap<int>>(label +
"Id");
59 input_vm_pujetid_token_ =
77 iEvent.
getByToken(input_jet_token_, jetHandle);
83 iEvent.
getByToken(input_vm_pujetid_token_, vmap);
90 vector<StoredPileupJetIdentifier>
ids;
91 map<string, vector<float>> mvas;
92 map<string, vector<int>> idflags;
95 VertexCollection::const_iterator
vtx;
99 iEvent.
getByToken(input_vertex_token_, vertexHandle);
101 vertexes = vertexHandle.
product();
104 vtx = vertexes->begin();
105 while (vtx != vertexes->end() && (vtx->isFake() || vtx->ndof() < 4)) {
108 if (vtx == vertexes->end()) {
109 vtx = vertexes->begin();
115 for (
unsigned int i = 0;
i < jets.
size(); ++
i) {
117 auto algoi = algos_.begin();
124 ispat = patjet !=
nullptr;
137 initJetEnergyCorrector(iSetup, iEvent.
isRealData());
142 jecCor_->setJetPt(jet.
pt());
144 jecCor_->setJetEta(jet.
eta());
145 jecCor_->setJetA(jet.
jetArea());
146 jecCor_->setRho(rho);
147 jec = jecCor_->getCorrection();
151 std::unique_ptr<reco::Jet> corrJet;
158 corrJet.reset(dynamic_cast<reco::Jet*>(jet.
clone()));
160 corrJet->scaleEnergy(scale);
162 const reco::Jet* theJet = (applyJec ? corrJet.get() : &
jet);
168 ids.push_back(puIdentifier);
171 puIdentifier = (*vmap)[jets.
refAt(
i)];
172 puIdentifier.
jetPt(theJet->
pt());
175 ialgo->
set(puIdentifier);
181 mvas[algoi->first].push_back(puIdentifier.
mva());
182 idflags[algoi->first].push_back(puIdentifier.
idFlag());
183 for (++algoi; algoi != algos_.end(); ++algoi) {
184 ialgo = algoi->second.get();
185 ialgo->
set(puIdentifier);
187 mvas[algoi->first].push_back(
id.
mva());
188 idflags[algoi->first].push_back(
id.idFlag());
195 for (
const auto& ialgo : algos_) {
197 vector<float>&
mva = mvas[ialgo.first];
198 auto mvaout = std::make_unique<ValueMap<float>>();
200 mvafiller.insert(jetHandle, mva.begin(), mva.end());
202 iEvent.
put(
std::move(mvaout), ialgo.first +
"Discriminant");
205 vector<int>& idflag = idflags[ialgo.first];
206 auto idflagout = std::make_unique<ValueMap<int>>();
208 idflagfiller.insert(jetHandle, idflag.begin(), idflag.end());
215 assert(jetHandle->size() == ids.size());
216 auto idsout = std::make_unique<ValueMap<StoredPileupJetIdentifier>>();
218 idsfiller.insert(jetHandle, ids.begin(), ids.end());
238 std::vector<std::string> jecLevels;
239 jecLevels.push_back(
"L1FastJet");
240 jecLevels.push_back(
"L2Relative");
241 jecLevels.push_back(
"L3Absolute");
243 jecLevels.push_back(
"L2L3Residual");
248 for (std::vector<std::string>::const_iterator ll = jecLevels.begin(); ll != jecLevels.end(); ++ll) {
250 jetCorPars_.push_back(ip);
257 jecCor_ = std::make_unique<FactorizedJetCorrector>(jetCorPars_);
std::vector< PileupJetIdAlgo::AlgoGBRForestsAndConstants > const & vAlgoGBRForestsAndConstants() const
T getParameter(std::string const &) const
void set(const PileupJetIdentifier &)
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
double eta() const final
momentum pseudorapidity
bool getByToken(EDGetToken token, Handle< PROD > &result) const
const int & idFlag() const
const float & mva() const
Base class for all types of Jets.
double pt() const final
transverse momentum
std::vector< Vertex > VertexCollection
collection of Vertex objects
const float & jetPt() const
PileupJetIdProducer(const edm::ParameterSet &, GBRForestsAndConstants const *)
RefToBase< value_type > refAt(size_type i) const
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
PileupJetIdentifier computeIdVariables(const reco::Jet *jet, float jec, const reco::Vertex *, const reco::VertexCollection &, double rho, bool usePuppi)
#define DEFINE_FWK_MODULE(type)
void addDefault(ParameterSetDescription const &psetDescription)
bool inputIsCorrected() const
std::string const & jec() const
edm::FileInPath const & residualsTxt() const
void initJetEnergyCorrector(const edm::EventSetup &iSetup, bool isData)
void produce(edm::Event &, const edm::EventSetup &) override
std::vector< PileupJetIdAlgo::AlgoGBRForestsAndConstants > vAlgoGBRForestsAndConstants_
const float & jetPhi() const
edm::FileInPath residualsTxt_
bool produceJetIds() const
T const * product() const
PileupJetIdentifier computeMva()
Analysis-level calorimeter jet class.
CompositePtrCandidate * clone() const override
returns a clone of the candidate
GBRForestsAndConstants(edm::ParameterSet const &)
virtual float jetArea() const
get jet area
const_reference at(size_type pos) const
std::string fullPath() const
bool residualsFromTxt() const
Jet correctedJet(const std::string &level, const std::string &flavor="none", const std::string &set="") const
double phi() const final
momentum azimuthal angle
~PileupJetIdProducer() override
const float & jetEta() const