Public Member Functions | |
PdfWeightProducer (const edm::ParameterSet &) | |
~PdfWeightProducer () | |
Private Member Functions | |
virtual void | beginJob () |
virtual void | endJob () |
virtual void | produce (edm::Event &, const edm::EventSetup &) |
Private Attributes | |
std::string | fixPOWHEG_ |
edm::InputTag | genTag_ |
edm::InputTag | pdfInfoTag_ |
std::vector< std::string > | pdfSetNames_ |
std::vector< std::string > | pdfShortNames_ |
Definition at line 20 of file PdfWeightProducer.cc.
PdfWeightProducer::PdfWeightProducer | ( | const edm::ParameterSet & | pset | ) | [explicit] |
Definition at line 51 of file PdfWeightProducer.cc.
References dot(), fixPOWHEG_, gen::k, pdfSetNames_, and pdfShortNames_.
: fixPOWHEG_(pset.getUntrackedParameter<std::string> ("FixPOWHEG", "")), genTag_(pset.getUntrackedParameter<edm::InputTag> ("GenTag", edm::InputTag("genParticles"))), pdfInfoTag_(pset.getUntrackedParameter<edm::InputTag> ("PdfInfoTag", edm::InputTag("generator"))), pdfSetNames_(pset.getUntrackedParameter<std::vector<std::string> > ("PdfSetNames")) { if (fixPOWHEG_ != "") pdfSetNames_.insert(pdfSetNames_.begin(),fixPOWHEG_); if (pdfSetNames_.size()>3) { edm::LogWarning("") << pdfSetNames_.size() << " PDF sets requested on input. Using only the first 3 sets and ignoring the rest!!"; pdfSetNames_.erase(pdfSetNames_.begin()+3,pdfSetNames_.end()); } for (unsigned int k=0; k<pdfSetNames_.size(); k++) { size_t dot = pdfSetNames_[k].find_first_of('.'); size_t underscore = pdfSetNames_[k].find_first_of('_'); if (underscore<dot) { pdfShortNames_.push_back(pdfSetNames_[k].substr(0,underscore)); } else { pdfShortNames_.push_back(pdfSetNames_[k].substr(0,dot)); } produces<std::vector<double> >(pdfShortNames_[k].data()); } }
PdfWeightProducer::~PdfWeightProducer | ( | ) |
Definition at line 77 of file PdfWeightProducer.cc.
{}
void PdfWeightProducer::beginJob | ( | void | ) | [private, virtual] |
Reimplemented from edm::EDProducer.
Definition at line 80 of file PdfWeightProducer.cc.
References LHAPDF::initPDFSet(), gen::k, and pdfSetNames_.
{ for (unsigned int k=1; k<=pdfSetNames_.size(); k++) { LHAPDF::initPDFSet(k,pdfSetNames_[k-1]); } }
void PdfWeightProducer::endJob | ( | void | ) | [private, virtual] |
void PdfWeightProducer::produce | ( | edm::Event & | iEvent, |
const edm::EventSetup & | |||
) | [private, virtual] |
Implements edm::EDProducer.
Definition at line 90 of file PdfWeightProducer.cc.
References abs, edm::InputTag::encode(), fixPOWHEG_, genParticleCandidates2GenParticles_cfi::genParticles, genTag_, edm::Event::getByLabel(), i, edm::HandleBase::id(), edm::EventBase::isRealData(), gen::k, reco::LeafCandidate::mass(), LHAPDF::numberPDF(), RooFit::pdf1(), pdfInfoTag_, pdfSetNames_, pdfShortNames_, reco::LeafCandidate::pdgId(), edm::Event::put(), mathSSE::sqrt(), ntuplemaker::status, reco::LeafCandidate::status(), LHAPDF::usePDFMember(), create_public_pileup_plots::weights, and LHAPDF::xfx().
{ if (iEvent.isRealData()) return; edm::Handle<GenEventInfoProduct> pdfstuff; if (!iEvent.getByLabel(pdfInfoTag_, pdfstuff)) { edm::LogError("PDFWeightProducer") << ">>> PdfInfo not found: " << pdfInfoTag_.encode() << " !!!"; return; } float Q = pdfstuff->pdf()->scalePDF; int id1 = pdfstuff->pdf()->id.first; double x1 = pdfstuff->pdf()->x.first; double pdf1 = pdfstuff->pdf()->xPDF.first; int id2 = pdfstuff->pdf()->id.second; double x2 = pdfstuff->pdf()->x.second; double pdf2 = pdfstuff->pdf()->xPDF.second; // Ad-hoc fix for POWHEG if (fixPOWHEG_!="") { edm::Handle<reco::GenParticleCollection> genParticles; if (!iEvent.getByLabel(genTag_, genParticles)) { edm::LogError("PDFWeightProducer") << ">>> genParticles not found: " << genTag_.encode() << " !!!"; return; } unsigned int gensize = genParticles->size(); double mboson = 0.; for(unsigned int i = 0; i<gensize; ++i) { const reco::GenParticle& part = (*genParticles)[i]; int status = part.status(); if (status!=3) continue; int id = part.pdgId(); if (id!=23 && abs(id)!=24) continue; mboson = part.mass(); break; } Q = sqrt(mboson*mboson+Q*Q); LHAPDF::usePDFMember(1,0); pdf1 = LHAPDF::xfx(1, x1, Q, id1)/x1; pdf2 = LHAPDF::xfx(1, x2, Q, id2)/x2; } // Put PDF weights in the event for (unsigned int k=1; k<=pdfSetNames_.size(); ++k) { std::auto_ptr<std::vector<double> > weights (new std::vector<double>); unsigned int nweights = 1; if (LHAPDF::numberPDF(k)>1) nweights += LHAPDF::numberPDF(k); weights->reserve(nweights); for (unsigned int i=0; i<nweights; ++i) { LHAPDF::usePDFMember(k,i); double newpdf1 = LHAPDF::xfx(k, x1, Q, id1)/x1; double newpdf2 = LHAPDF::xfx(k, x2, Q, id2)/x2; weights->push_back(newpdf1/pdf1*newpdf2/pdf2); } iEvent.put(weights,pdfShortNames_[k-1]); } }
std::string PdfWeightProducer::fixPOWHEG_ [private] |
Definition at line 30 of file PdfWeightProducer.cc.
Referenced by PdfWeightProducer(), and produce().
edm::InputTag PdfWeightProducer::genTag_ [private] |
Definition at line 31 of file PdfWeightProducer.cc.
Referenced by produce().
edm::InputTag PdfWeightProducer::pdfInfoTag_ [private] |
Definition at line 32 of file PdfWeightProducer.cc.
Referenced by produce().
std::vector<std::string> PdfWeightProducer::pdfSetNames_ [private] |
Definition at line 33 of file PdfWeightProducer.cc.
Referenced by beginJob(), PdfWeightProducer(), and produce().
std::vector<std::string> PdfWeightProducer::pdfShortNames_ [private] |
Definition at line 34 of file PdfWeightProducer.cc.
Referenced by PdfWeightProducer(), and produce().