Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Made FFTJetCorrector thread safe #7682

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -102,14 +102,14 @@ Corrector parseFFTJetCorrector(const edm::ParameterSet& ps,

// "adjuster" is a PSet
const edm::ParameterSet& adjuster = ps.getParameter<edm::ParameterSet>("adjuster");
boost::shared_ptr<AbsFFTJetAdjuster<MyJet,Adjustable> > adj =
boost::shared_ptr<const AbsFFTJetAdjuster<MyJet,Adjustable> > adj =
parseFFTJetAdjuster<MyJet,Adjustable>(adjuster, verbose);

// "scalers" is a VPSet
const std::vector<edm::ParameterSet>& scalers =
ps.getParameter<std::vector<edm::ParameterSet> >("scalers");
const unsigned nScalers = scalers.size();
std::vector<boost::shared_ptr<AbsFFTJetScaleCalculator<MyJet,Adjustable> > > sVec;
std::vector<boost::shared_ptr<const AbsFFTJetScaleCalculator<MyJet,Adjustable> > > sVec;
sVec.reserve(nScalers);
for (unsigned i=0; i<nScalers; ++i)
{
Expand Down
26 changes: 18 additions & 8 deletions JetMETCorrections/FFTJetObjects/interface/FFTJetCorrector.h
Expand Up @@ -17,11 +17,11 @@ class FFTJetCorrector
typedef AbsFFTJetScaleCalculator<jet_type, adjustable_type> AbsScaler;
typedef AbsFFTJetAdjuster<jet_type, adjustable_type> AbsAdjuster;

inline FFTJetCorrector(boost::shared_ptr<AbsAdjuster> adjuster,
const std::vector<boost::shared_ptr<AbsScaler> >& scalers,
inline FFTJetCorrector(boost::shared_ptr<const AbsAdjuster> adjuster,
const std::vector<boost::shared_ptr<const AbsScaler> >& scalers,
const unsigned i_level, const FFTJetCorrectorApp a)
: adjuster_(adjuster), scalers_(scalers),
buffer_(scalers.size()), level_(i_level), app_(a) {}
level_(i_level), app_(a) {}

inline void correct(const Jet& jet, const bool isMC,
const Adjustable& in, Adjustable* out) const
Expand All @@ -33,8 +33,19 @@ class FFTJetCorrector
*out = in;
else
{
const unsigned nAdj = buffer_.size();
double* buf = nAdj ? &buffer_[0] : static_cast<double*>(0);
const unsigned nAdj = scalers_.size();
//If we only need a small buffer, use one on the stack
// else we will use a std::vector
constexpr size_t kStaticBufferSize = 10;
double staticBuffer[kStaticBufferSize];
std::vector<double> dynamicBuffer;
double* buf = nullptr;
if(nAdj<=kStaticBufferSize) {
buf = &(staticBuffer[0]);
} else {
dynamicBuffer.resize(nAdj);
buf = &(dynamicBuffer[0]);
}
for (unsigned i=0; i<nAdj; ++i)
buf[i] = scalers_[i]->scale(jet, in);
adjuster_->adjust(jet, in, buf, nAdj, out);
Expand All @@ -45,9 +56,8 @@ class FFTJetCorrector
inline FFTJetCorrectorApp app() const {return app_;}

private:
boost::shared_ptr<AbsAdjuster> adjuster_;
std::vector<boost::shared_ptr<AbsScaler> > scalers_;
mutable std::vector<double> buffer_;
boost::shared_ptr<const AbsAdjuster> adjuster_;
std::vector<boost::shared_ptr<const AbsScaler> > scalers_;
unsigned level_;
FFTJetCorrectorApp app_;
};
Expand Down