40 #define PILEUP_CALCULATION_MASK 0x200 41 #define PILEUP_SUBTRACTION_MASK_4VEC 0x400 42 #define PILEUP_SUBTRACTION_MASK_PT 0x800 43 #define PILEUP_SUBTRACTION_MASK_ANY (PILEUP_SUBTRACTION_MASK_4VEC | \ 44 PILEUP_SUBTRACTION_MASK_PT) 51 #define jet_type_switch(method, arg1, arg2) do {\ 55 method <reco::CaloJet> ( arg1 , arg2 );\ 58 method <reco::PFJet> ( arg1 , arg2 );\ 61 method <reco::GenJet> ( arg1 , arg2 );\ 64 method <reco::TrackJet> ( arg1 , arg2 );\ 67 method <reco::BasicJet> ( arg1 , arg2 );\ 70 method <reco::JPTJet> ( arg1 , arg2 );\ 73 assert(!"ERROR in FFTJetCorrectionProducer : invalid jet type."\ 74 " This is a bug. Please report.");\ 83 inline bool operator()(
const Jet&
l,
const Jet&
r)
const 84 {
return l.pt() > r.pt();}
102 void endJob()
override ;
104 template <
typename Jet>
107 template <
typename Jet>
110 template <
typename Jet>
111 void performPileupSubtraction(
Jet&);
146 template <
typename T>
150 produces<std::vector<reco::FFTAnyJet<T> > >(
tag).setBranchAlias(alias);
154 template <
typename Jet>
159 FFTJet<float>& fftJet(
const_cast<FFTJet<float>&
>(jet.getFFTSpecific()));
162 fftJet.setFourVec(new4vec);
163 int status = fftJet.f_status();
168 fftJet.setStatus(status);
173 template <
typename Jet>
179 typedef std::vector<MyJet> MyCollection;
181 typedef typename Loader::data_type CorrectorSequence;
182 typedef typename CorrectorSequence::result_type CorrectorResult;
185 const unsigned nRecords = records.size();
186 std::vector<edm::ESHandle<CorrectorSequence> > handles(nRecords);
187 for (
unsigned irec=0; irec<nRecords; ++irec)
192 sequenceMasks.clear();
193 sequenceMasks.reserve(nRecords);
196 for (
unsigned irec=0; irec<nRecords; ++irec)
199 const unsigned nLevels = handles[irec]->nLevels();
200 for (
unsigned i=0;
i<nLevels; ++
i)
202 const unsigned lev = (*handles[irec])[
i].
level();
208 const int mask = (1 << lev);
209 if (totalMask & mask)
211 <<
"Error in FFTJetCorrectionProducer::applyCorrections:" 212 <<
" jet correction at level " << lev
213 <<
" is applied more than once\n";
218 sequenceMasks.push_back(levelMask << 12);
220 totalMask = (totalMask << 12);
230 const unsigned nJets = jets->size();
231 auto coll = std::make_unique<MyCollection>();
232 coll->reserve(nJets);
236 double previousPt = DBL_MAX;
237 for (
unsigned ijet=0; ijet<nJets; ++ijet)
239 const MyJet& j((*jets)[ijet]);
242 const int initialStatus = j.getFFTSpecific().f_status();
243 if (initialStatus & totalMask)
245 <<
"Error in FFTJetCorrectionProducer::applyCorrections: " 246 <<
"this jet collection is already corrected for some or all " 247 <<
"of the specified levels\n";
254 std::cout <<
"++++ Evt " << eventCount <<
" jet " << ijet
255 <<
": pt = " << corJ.pt()
256 <<
", eta = " << fj.
f_vec().eta()
270 <<
"Error in FFTJetCorrectionProducer::applyCorrections: " 271 <<
"this jet collection is already pileup-subtracted\n";
274 <<
"Error in FFTJetCorrectionProducer::applyCorrections: " 275 <<
"pileup was not calculated for this jet collection\n";
276 performPileupSubtraction(corJ);
282 <<
": pt = " << corJ.pt()
283 <<
", eta = " << fj.
f_vec().eta()
291 double sigmaSquared = 0.0;
292 for (
unsigned irec=0; irec<nRecords; ++irec)
294 const CorrectorResult&
corr = handles[irec]->correct(corJ, isMC);
297 FFTJet<float>& fftJet(
const_cast<FFTJet<float>&
>(corJ.getFFTSpecific()));
298 corJ.setP4(corr.vec());
299 fftJet.setFourVec(corr.vec());
302 fftJet.setStatus(fftJet.f_status() | sequenceMasks[irec]);
305 const double s = corr.sigma();
314 if (writeUncertainties)
315 corJ.setPileup(
sqrt(sigmaSquared));
320 const double pt = corJ.pt();
329 <<
": pt = " << corJ.pt()
330 <<
", eta = " << fj.
f_vec().eta()
341 if (writeUncertainties)
343 auto unc = std::make_unique<std::vector<float>>();
345 for (
unsigned ijet=0; ijet<nJets; ++ijet)
347 MyJet& j((*
coll)[ijet]);
348 unc->push_back(j.pileup());
366 records(ps.getParameter<
std::vector<
std::
string> >(
"records")),
367 writeUncertainties(ps.getParameter<
bool>(
"writeUncertainties")),
378 produces<std::vector<float> >(
outputLabel).setBranchAlias(alias);
T getUntrackedParameter(std::string const &, T const &) const
edm::EDGetTokenT< std::vector< reco::FFTAnyJet< reco::Jet > > > input_jets_token_
const std::string outputLabel
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
const edm::InputTag inputLabel
const bool subtractPileupAs4Vec
static PFTauRenderPlugin instance
bool getByToken(EDGetToken token, Handle< PROD > &result) const
void push_back(key_type i, value_type const &j, label_type const &flav="")
#define jet_type_switch(method, arg1, arg2)
void produce(edm::Event &, const edm::EventSetup &) override
void makeProduces(const std::string &alias, const std::string &tag)
void applyCorrections(edm::Event &iEvent, const edm::EventSetup &iSetup)
XYZTLorentzVectorD XYZTLorentzVector
Lorentz vector with cylindrical internal representation using pseudorapidity.
#define PILEUP_SUBTRACTION_MASK_PT
#define DEFINE_FWK_MODULE(type)
Implements inheritance relationships for FFTJet jets.
#define PILEUP_SUBTRACTION_MASK_4VEC
const math::XYZTLorentzVector & f_vec() const
FFTJetCorrectionProducer(const edm::ParameterSet &)
JetType parseJetType(const std::string &name)
void performPileupSubtraction(Jet &)
#define PILEUP_SUBTRACTION_MASK_ANY
Storage class for jets reconstructed by FFTJet package.
const bool subtractPileup
#define PILEUP_CALCULATION_MASK
const std::vector< std::string > records
const bool writeUncertainties
std::vector< int > sequenceMasks
~FFTJetCorrectionProducer() override
math::XYZTLorentzVector adjustForPileup(const math::XYZTLorentzVector &jet, const math::XYZTLorentzVector &pileup, bool subtractPileupAs4Vec)