File indexing completed on 2024-04-06 12:23:25
0001 #include "FWCore/Framework/interface/one/EDAnalyzer.h"
0002 #include "FWCore/Framework/interface/Event.h"
0003 #include "FWCore/Framework/interface/EventSetup.h"
0004 #include "DataFormats/Common/interface/Handle.h"
0005 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0006 #include "FWCore/Utilities/interface/InputTag.h"
0007 #include "SimDataFormats/GeneratorProducts/interface/HepMCProduct.h"
0008 #include "SimDataFormats/GeneratorProducts/interface/LHEEventProduct.h"
0009 #include "SimDataFormats/GeneratorProducts/interface/GenEventInfoProduct.h"
0010 #include "SimGeneral/HepPDTRecord/interface/ParticleDataTable.h"
0011 #include "PhysicsTools/HepMCCandAlgos/interface/PDFWeightsHelper.h"
0012 #include "FWCore/Utilities/interface/EDMException.h"
0013 #include "FWCore/ServiceRegistry/interface/Service.h"
0014 #include "CommonTools/UtilAlgos/interface/TFileService.h"
0015 #include "TTree.h"
0016 #include <iostream>
0017 using namespace std;
0018 using namespace edm;
0019 using namespace HepMC;
0020
0021 class PDFWeightsTest : public edm::one::EDAnalyzer<> {
0022 private:
0023 PDFWeightsHelper pdfweightshelper_;
0024 EDGetTokenT<LHEEventProduct> srcToken_;
0025 EDGetTokenT<LHEEventProduct> srcTokenAlt_;
0026 EDGetTokenT<GenEventInfoProduct> srcTokenGen_;
0027
0028 unsigned int pdfWeightOffset_;
0029 unsigned int nPdfWeights_;
0030 unsigned int nPdfEigWeights_;
0031
0032 TTree* tree_;
0033 std::vector<float> pdfweights_;
0034 std::vector<float> pdfeigweights_;
0035 float weight_;
0036
0037 public:
0038 explicit PDFWeightsTest(const ParameterSet& cfg)
0039 : srcToken_(consumes<LHEEventProduct>(edm::InputTag("externalLHEProducer"))),
0040 srcTokenAlt_(consumes<LHEEventProduct>(edm::InputTag("source"))),
0041 srcTokenGen_(consumes<GenEventInfoProduct>(edm::InputTag("generator"))),
0042 pdfWeightOffset_(cfg.getParameter<unsigned int>("pdfWeightOffset")),
0043 nPdfWeights_(cfg.getParameter<unsigned int>("nPdfWeights")),
0044 nPdfEigWeights_(cfg.getParameter<unsigned int>("nPdfEigWeights")),
0045 pdfweights_(nPdfWeights_),
0046 pdfeigweights_(nPdfEigWeights_) {
0047 edm::Service<TFileService> fs;
0048 tree_ = fs->make<TTree>("tree", "");
0049
0050 tree_->Branch("pdfrep", &pdfweights_);
0051 tree_->Branch("pdfeig", &pdfeigweights_);
0052 tree_->Branch("weight", &weight_);
0053
0054 edm::FileInPath mc2hessianCSV = cfg.getParameter<edm::FileInPath>("mc2hessianCSV");
0055 pdfweightshelper_.Init(nPdfWeights_, nPdfEigWeights_, mc2hessianCSV);
0056 }
0057
0058 private:
0059 void analyze(const Event& evt, const EventSetup& es) override {
0060 Handle<LHEEventProduct> lheInfo;
0061 evt.getByToken(srcToken_, lheInfo);
0062
0063 if (!lheInfo.isValid()) {
0064 evt.getByToken(srcTokenAlt_, lheInfo);
0065 }
0066
0067 double nomlheweight = lheInfo->weights()[0].wgt;
0068
0069 Handle<GenEventInfoProduct> genInfo;
0070 evt.getByToken(srcTokenGen_, genInfo);
0071
0072 weight_ = genInfo->weight();
0073
0074
0075 std::vector<double> inpdfweights(nPdfWeights_);
0076 for (unsigned int ipdf = 0; ipdf < nPdfWeights_; ++ipdf) {
0077 unsigned int iwgt = ipdf + pdfWeightOffset_;
0078
0079
0080 pdfweights_[ipdf] = lheInfo->weights()[iwgt].wgt * weight_ / nomlheweight;
0081
0082
0083 inpdfweights[ipdf] = lheInfo->weights()[iwgt].wgt;
0084 }
0085
0086 std::vector<double> outpdfweights(nPdfEigWeights_);
0087
0088 pdfweightshelper_.DoMC2Hessian(nomlheweight, inpdfweights.data(), outpdfweights.data());
0089
0090 for (unsigned int iwgt = 0; iwgt < nPdfEigWeights_; ++iwgt) {
0091 double wgtval = outpdfweights[iwgt];
0092
0093
0094 pdfeigweights_[iwgt] = wgtval * weight_ / nomlheweight;
0095 }
0096
0097 tree_->Fill();
0098 }
0099 };
0100
0101 #include "FWCore/Framework/interface/MakerMacros.h"
0102
0103 DEFINE_FWK_MODULE(PDFWeightsTest);