CMS 3D CMS Logo

List of all members | Public Member Functions | Static Public Member Functions | Protected Attributes
GenWeightsTableProducer Class Reference
Inheritance diagram for GenWeightsTableProducer:
edm::global::EDProducer< edm::StreamCache< Counter >, edm::RunCache< DynamicWeightChoice >, edm::RunSummaryCache< Counter >, edm::EndRunProducer > edm::global::EDProducerBase edm::ProducerBase edm::EDConsumerBase edm::ProductRegistryHelper

Public Member Functions

std::unique_ptr< Counter > beginStream (edm::StreamID) const override
 
void fillLHEWeightTables (Counter *counter, const DynamicWeightChoice *weightChoice, double genWeight, const LHEEventProduct &lheProd, const GenEventInfoProduct &genProd, std::unique_ptr< nanoaod::FlatTable > &outScale, std::unique_ptr< nanoaod::FlatTable > &outPdf, std::unique_ptr< nanoaod::FlatTable > &outRwgt, std::unique_ptr< nanoaod::FlatTable > &outNamed, std::unique_ptr< nanoaod::FlatTable > &outPS) const
 
void fillOnlyPSWeightTable (Counter *counter, double genWeight, const GenEventInfoProduct &genProd, std::unique_ptr< nanoaod::FlatTable > &outPS) const
 
 GenWeightsTableProducer (edm::ParameterSet const &params)
 
std::shared_ptr< DynamicWeightChoice > globalBeginRun (edm::Run const &iRun, edm::EventSetup const &) const override
 
std::shared_ptr< Counter > globalBeginRunSummary (edm::Run const &, edm::EventSetup const &) const override
 
void globalEndRun (edm::Run const &, edm::EventSetup const &) const override
 
void globalEndRunProduce (edm::Run &iRun, edm::EventSetup const &, Counter const *runCounter) const override
 
void globalEndRunSummary (edm::Run const &, edm::EventSetup const &, Counter *runCounter) const override
 
void produce (edm::StreamID id, edm::Event &iEvent, const edm::EventSetup &iSetup) const override
 
void streamBeginRun (edm::StreamID id, edm::Run const &, edm::EventSetup const &) const override
 
void streamEndRunSummary (edm::StreamID id, edm::Run const &, edm::EventSetup const &, Counter *runCounter) const override
 
 ~GenWeightsTableProducer () override
 
- Public Member Functions inherited from edm::global::EDProducer< edm::StreamCache< Counter >, edm::RunCache< DynamicWeightChoice >, edm::RunSummaryCache< Counter >, edm::EndRunProducer >
 EDProducer ()=default
 
bool hasAbilityToProduceInLumis () const final
 
bool hasAbilityToProduceInRuns () const final
 
bool wantsGlobalLuminosityBlocks () const final
 
bool wantsGlobalRuns () const final
 
bool wantsStreamLuminosityBlocks () const final
 
bool wantsStreamRuns () const final
 
- Public Member Functions inherited from edm::global::EDProducerBase
 EDProducerBase ()
 
ModuleDescription const & moduleDescription () const
 
 ~EDProducerBase () override
 
- Public Member Functions inherited from edm::ProducerBase
void callWhenNewProductsRegistered (std::function< void(BranchDescription const &)> const &func)
 
std::vector< edm::ProductResolverIndex > const & indiciesForPutProducts (BranchType iBranchType) const
 
 ProducerBase ()
 
std::vector< edm::ProductResolverIndex > const & putTokenIndexToProductResolverIndex () const
 
void registerProducts (ProducerBase *, ProductRegistry *, ModuleDescription const &)
 
std::function< void(BranchDescription const &)> registrationCallback () const
 used by the fwk to register list of products More...
 
void resolvePutIndicies (BranchType iBranchType, ModuleToResolverIndicies const &iIndicies, std::string const &moduleLabel)
 
 ~ProducerBase () noexcept(false) override
 
- Public Member Functions inherited from edm::EDConsumerBase
std::vector< ConsumesInfoconsumesInfo () const
 
void convertCurrentProcessAlias (std::string const &processName)
 Convert "@currentProcess" in InputTag process names to the actual current process name. More...
 
 EDConsumerBase ()
 
 EDConsumerBase (EDConsumerBase const &)=delete
 
 EDConsumerBase (EDConsumerBase &&)=default
 
ESProxyIndex const * esGetTokenIndices (edm::Transition iTrans) const
 
ProductResolverIndexAndSkipBit indexFrom (EDGetToken, BranchType, TypeID const &) const
 
void itemsMayGet (BranchType, std::vector< ProductResolverIndexAndSkipBit > &) const
 
void itemsToGet (BranchType, std::vector< ProductResolverIndexAndSkipBit > &) const
 
std::vector< ProductResolverIndexAndSkipBit > const & itemsToGetFrom (BranchType iType) const
 
void labelsForToken (EDGetToken iToken, Labels &oLabels) const
 
void modulesWhoseProductsAreConsumed (std::vector< ModuleDescription const * > &modules, ProductRegistry const &preg, std::map< std::string, ModuleDescription const * > const &labelsToDesc, std::string const &processName) const
 
EDConsumerBase const & operator= (EDConsumerBase const &)=delete
 
EDConsumerBaseoperator= (EDConsumerBase &&)=default
 
bool registeredToConsume (ProductResolverIndex, bool, BranchType) const
 
bool registeredToConsumeMany (TypeID const &, BranchType) const
 
ProductResolverIndexAndSkipBit uncheckedIndexFrom (EDGetToken) const
 
void updateLookup (BranchType iBranchType, ProductResolverIndexHelper const &, bool iPrefetchMayGet)
 
void updateLookup (eventsetup::ESRecordsToProxyIndices const &)
 
virtual ~EDConsumerBase () noexcept(false)
 

Static Public Member Functions

static void fillDescriptions (edm::ConfigurationDescriptions &descriptions)
 
- Static Public Member Functions inherited from edm::global::EDProducerBase
static const std::string & baseType ()
 
static void fillDescriptions (ConfigurationDescriptions &descriptions)
 
static void prevalidate (ConfigurationDescriptions &descriptions)
 

Protected Attributes

std::atomic< bool > debug_
 
std::atomic< bool > debugRun_
 
const edm::EDGetTokenT< GenEventInfoProductgenTag_
 
std::atomic< bool > hasIssuedWarning_
 
std::unordered_map< std::string, uint32_t > lhaNameToID_
 
const std::vector< edm::InputTaglheLabel_
 
const std::vector< edm::EDGetTokenT< LHERunInfoProduct > > lheRunTag_
 
const std::vector< edm::EDGetTokenT< LHEEventProduct > > lheTag_
 
int lheWeightPrecision_
 
unsigned int maxPdfWeights_
 
std::vector< std::string > namedWeightIDs_
 
std::vector< std::string > namedWeightLabels_
 
std::vector< uint32_t > preferredPDFLHAIDs_
 

Additional Inherited Members

- Public Types inherited from edm::global::EDProducerBase
typedef EDProducerBase ModuleType
 
- Public Types inherited from edm::ProducerBase
using ModuleToResolverIndicies = std::unordered_multimap< std::string, std::tuple< edm::TypeID const *, const char *, edm::ProductResolverIndex >>
 
typedef ProductRegistryHelper::TypeLabelList TypeLabelList
 
- Public Types inherited from edm::EDConsumerBase
typedef ProductLabels Labels
 
- Protected Member Functions inherited from edm::EDConsumerBase
template<typename ProductType , BranchType B = InEvent>
EDGetTokenT< ProductType > consumes (edm::InputTag const &tag)
 
EDGetToken consumes (const TypeToGet &id, edm::InputTag const &tag)
 
template<BranchType B>
EDGetToken consumes (TypeToGet const &id, edm::InputTag const &tag)
 
ConsumesCollector consumesCollector ()
 Use a ConsumesCollector to gather consumes information from helper functions. More...
 
template<typename ProductType , BranchType B = InEvent>
void consumesMany ()
 
void consumesMany (const TypeToGet &id)
 
template<BranchType B>
void consumesMany (const TypeToGet &id)
 
template<typename ESProduct , typename ESRecord , Transition Tr = Transition::Event>
auto esConsumes ()
 
template<typename ESProduct , typename ESRecord , Transition Tr = Transition::Event>
auto esConsumes (ESInputTag const &tag)
 
template<typename ProductType , BranchType B = InEvent>
EDGetTokenT< ProductType > mayConsume (edm::InputTag const &tag)
 
EDGetToken mayConsume (const TypeToGet &id, edm::InputTag const &tag)
 
template<BranchType B>
EDGetToken mayConsume (const TypeToGet &id, edm::InputTag const &tag)
 

Detailed Description

Definition at line 141 of file GenWeightsTableProducer.cc.

Constructor & Destructor Documentation

GenWeightsTableProducer::GenWeightsTableProducer ( edm::ParameterSet const &  params)
inline

Definition at line 143 of file GenWeightsTableProducer.cc.

References Exception, edm::ParameterSet::getParameter(), nano_cff::lhaid, dataset::name, AlCaHLTBitMon_QueryRunRegistry::string, GlobalPosition_Frontier_DevDB_cff::tag, and edm::vector_transform().

143  :
144  genTag_(consumes<GenEventInfoProduct>(params.getParameter<edm::InputTag>("genEvent"))),
145  lheLabel_(params.getParameter<std::vector<edm::InputTag>>("lheInfo")),
146  lheTag_(edm::vector_transform(lheLabel_, [this](const edm::InputTag & tag) { return mayConsume<LHEEventProduct>(tag); })),
147  lheRunTag_(edm::vector_transform(lheLabel_, [this](const edm::InputTag & tag) { return mayConsume<LHERunInfoProduct, edm::InRun>(tag); })),
148  namedWeightIDs_(params.getParameter<std::vector<std::string>>("namedWeightIDs")),
149  namedWeightLabels_(params.getParameter<std::vector<std::string>>("namedWeightLabels")),
150  lheWeightPrecision_(params.getParameter<int32_t>("lheWeightPrecision")),
151  maxPdfWeights_(params.getParameter<uint32_t>("maxPdfWeights")),
152  debug_(params.getUntrackedParameter<bool>("debug",false)), debugRun_(debug_.load()),
153  hasIssuedWarning_(false)
154  {
155  produces<nanoaod::FlatTable>();
156  produces<nanoaod::FlatTable>("LHEScale");
157  produces<nanoaod::FlatTable>("LHEPdf");
158  produces<nanoaod::FlatTable>("LHEReweighting");
159  produces<nanoaod::FlatTable>("LHENamed");
160  produces<nanoaod::FlatTable>("PS");
161  produces<nanoaod::MergeableCounterTable,edm::Transition::EndRun>();
162  if (namedWeightIDs_.size() != namedWeightLabels_.size()) {
163  throw cms::Exception("Configuration", "Size mismatch between namedWeightIDs & namedWeightLabels");
164  }
165  for (const edm::ParameterSet & pdfps : params.getParameter<std::vector<edm::ParameterSet>>("preferredPDFs")) {
166  const std::string & name = pdfps.getParameter<std::string>("name");
167  uint32_t lhaid = pdfps.getParameter<uint32_t>("lhaid");
168  preferredPDFLHAIDs_.push_back(lhaid);
170  lhaNameToID_[name+".LHgrid"] = lhaid;
171  }
172  }
const std::vector< edm::EDGetTokenT< LHERunInfoProduct > > lheRunTag_
T getParameter(std::string const &) const
std::unordered_map< std::string, uint32_t > lhaNameToID_
const edm::EDGetTokenT< GenEventInfoProduct > genTag_
std::atomic< bool > hasIssuedWarning_
const std::vector< edm::InputTag > lheLabel_
auto vector_transform(std::vector< InputType > const &input, Function predicate) -> std::vector< typename std::remove_cv< typename std::remove_reference< decltype(predicate(input.front()))>::type >::type >
Definition: transform.h:11
std::vector< std::string > namedWeightLabels_
const std::vector< edm::EDGetTokenT< LHEEventProduct > > lheTag_
std::vector< uint32_t > preferredPDFLHAIDs_
std::vector< std::string > namedWeightIDs_
GenWeightsTableProducer::~GenWeightsTableProducer ( )
inlineoverride

Definition at line 174 of file GenWeightsTableProducer.cc.

174 {}

Member Function Documentation

std::unique_ptr<Counter> GenWeightsTableProducer::beginStream ( edm::StreamID  ) const
inlineoverride

Definition at line 568 of file GenWeightsTableProducer.cc.

568  {
569  return std::make_unique<Counter>();
570  }
static void GenWeightsTableProducer::fillDescriptions ( edm::ConfigurationDescriptions descriptions)
inlinestatic

Definition at line 612 of file GenWeightsTableProducer.cc.

References edm::ConfigurationDescriptions::add(), edm::ParameterSetDescription::add(), edm::ParameterSetDescription::addOptionalUntracked(), edm::ParameterSetDescription::addVPSet(), edm::ParameterDescriptionNode::setComment(), and AlCaHLTBitMon_QueryRunRegistry::string.

612  {
614  desc.add<edm::InputTag>("genEvent", edm::InputTag("generator"))->setComment("tag for the GenEventInfoProduct, to get the main weight");
615  desc.add<std::vector<edm::InputTag>>("lheInfo", std::vector<edm::InputTag>{{"externalLHEProducer"},{"source"}})->setComment("tag(s) for the LHE information (LHEEventProduct and LHERunInfoProduct)");
616 
618  prefpdf.add<std::string>("name");
619  prefpdf.add<uint32_t>("lhaid");
620  desc.addVPSet("preferredPDFs", prefpdf, std::vector<edm::ParameterSet>())->setComment("LHA PDF Ids of the preferred PDF sets, in order of preference (the first matching one will be used)");
621  desc.add<std::vector<std::string>>("namedWeightIDs")->setComment("set of LHA weight IDs for named LHE weights");
622  desc.add<std::vector<std::string>>("namedWeightLabels")->setComment("output names for the namedWeightIDs (in the same order)");
623  desc.add<int32_t>("lheWeightPrecision")->setComment("Number of bits in the mantissa for LHE weights");
624  desc.add<uint32_t>("maxPdfWeights")->setComment("Maximum number of PDF weights to save (to crop NN replicas)");
625  desc.addOptionalUntracked<bool>("debug")->setComment("dump out all LHE information for one event");
626  descriptions.add("genWeightsTable", desc);
627  }
void setComment(std::string const &value)
ParameterDescriptionBase * addVPSet(U const &iLabel, ParameterSetDescription const &validator, std::vector< ParameterSet > const &defaults)
ParameterDescriptionBase * add(U const &iLabel, T const &value)
void add(std::string const &label, ParameterSetDescription const &psetDescription)
ParameterDescriptionBase * addOptionalUntracked(U const &iLabel, T const &value)
void GenWeightsTableProducer::fillLHEWeightTables ( Counter *  counter,
const DynamicWeightChoice *  weightChoice,
double  genWeight,
const LHEEventProduct lheProd,
const GenEventInfoProduct genProd,
std::unique_ptr< nanoaod::FlatTable > &  outScale,
std::unique_ptr< nanoaod::FlatTable > &  outPdf,
std::unique_ptr< nanoaod::FlatTable > &  outRwgt,
std::unique_ptr< nanoaod::FlatTable > &  outNamed,
std::unique_ptr< nanoaod::FlatTable > &  outPS 
) const
inline

Definition at line 227 of file GenWeightsTableProducer.cc.

References spr::find(), nanoaod::FlatTable::FloatColumn, mps_fire::i, gen::n, LHEEventProduct::originalXWGTUP(), GenEventInfoProduct::weights(), and LHEEventProduct::weights().

238  {
239  bool lheDebug = debug_.exchange(false); // make sure only the first thread dumps out this (even if may still be mixed up with other output, but nevermind)
240 
241  const std::vector<std::string> & scaleWeightIDs = weightChoice->scaleWeightIDs;
242  const std::vector<std::string> & pdfWeightIDs = weightChoice->pdfWeightIDs;
243  const std::vector<std::string> & rwgtWeightIDs = weightChoice->rwgtIDs;
244 
245  double w0 = lheProd.originalXWGTUP();
246 
247  std::vector<double> wScale(scaleWeightIDs.size(), 1), wPDF(pdfWeightIDs.size(), 1), wRwgt(rwgtWeightIDs.size(), 1), wNamed(namedWeightIDs_.size(), 1);
248  for (auto & weight : lheProd.weights()) {
249  if (lheDebug) printf("Weight %+9.5f rel %+9.5f for id %s\n", weight.wgt, weight.wgt/w0, weight.id.c_str());
250  // now we do it slowly, can be optimized
251  auto mScale = std::find(scaleWeightIDs.begin(), scaleWeightIDs.end(), weight.id);
252  if (mScale != scaleWeightIDs.end()) wScale[mScale-scaleWeightIDs.begin()] = weight.wgt/w0;
253 
254  auto mPDF = std::find(pdfWeightIDs.begin(), pdfWeightIDs.end(), weight.id);
255  if (mPDF != pdfWeightIDs.end()) wPDF[mPDF-pdfWeightIDs.begin()] = weight.wgt/w0;
256 
257  auto mRwgt = std::find(rwgtWeightIDs.begin(), rwgtWeightIDs.end(), weight.id);
258  if (mRwgt != rwgtWeightIDs.end()) wRwgt[mRwgt-rwgtWeightIDs.begin()] = weight.wgt/w0;
259 
260  auto mNamed = std::find(namedWeightIDs_.begin(), namedWeightIDs_.end(), weight.id);
261  if (mNamed != namedWeightIDs_.end()) wNamed[mNamed-namedWeightIDs_.begin()] = weight.wgt/w0;
262  }
263 
264  int vectorSize = genProd.weights().size() == 14 ? 4 : 1;
265  std::vector<double> wPS(vectorSize, 1);
266  if (vectorSize > 1 ) {
267  for (unsigned int i=6; i<10; i++){
268  wPS[i-6] = (genProd.weights()[i])/w0;
269  }
270  }
271  outPS.reset(new nanoaod::FlatTable(wPS.size(), "PSWeight", false));
272  outPS->addColumn<float>("", wPS, vectorSize > 1 ? "PS weights (w_var / w_nominal); [0] is ISR=0.5 FSR=1; [1] is ISR=1 FSR=0.5; [2] is ISR=2 FSR=1; [3] is ISR=1 FSR=2 " : "dummy PS weight (1.0) ", nanoaod::FlatTable::FloatColumn, lheWeightPrecision_);
273 
274  outScale.reset(new nanoaod::FlatTable(wScale.size(), "LHEScaleWeight", false));
275  outScale->addColumn<float>("", wScale, weightChoice->scaleWeightsDoc, nanoaod::FlatTable::FloatColumn, lheWeightPrecision_);
276 
277  outPdf.reset(new nanoaod::FlatTable(wPDF.size(), "LHEPdfWeight", false));
278  outPdf->addColumn<float>("", wPDF, weightChoice->pdfWeightsDoc, nanoaod::FlatTable::FloatColumn, lheWeightPrecision_);
279 
280  outRwgt.reset(new nanoaod::FlatTable(wRwgt.size(), "LHEReweightingWeight", false));
281  outRwgt->addColumn<float>("", wRwgt, weightChoice->rwgtWeightDoc, nanoaod::FlatTable::FloatColumn, lheWeightPrecision_);
282 
283  outNamed.reset(new nanoaod::FlatTable(1, "LHEWeight", true));
284  outNamed->addColumnValue<float>("originalXWGTUP", lheProd.originalXWGTUP(), "Nominal event weight in the LHE file", nanoaod::FlatTable::FloatColumn);
285  for (unsigned int i = 0, n = wNamed.size(); i < n; ++i) {
286  outNamed->addColumnValue<float>(namedWeightLabels_[i], wNamed[i], "LHE weight for id "+namedWeightIDs_[i]+", relative to nominal", nanoaod::FlatTable::FloatColumn, lheWeightPrecision_);
287  }
288 
289  counter->incLHE(genWeight, wScale, wPDF, wRwgt, wNamed, wPS);
290  }
double originalXWGTUP() const
Definition: weight.py:1
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:20
const std::vector< WGT > & weights() const
std::vector< std::string > namedWeightLabels_
std::vector< double > & weights()
std::vector< std::string > namedWeightIDs_
void GenWeightsTableProducer::fillOnlyPSWeightTable ( Counter *  counter,
double  genWeight,
const GenEventInfoProduct genProd,
std::unique_ptr< nanoaod::FlatTable > &  outPS 
) const
inline

Definition at line 292 of file GenWeightsTableProducer.cc.

References nanoaod::FlatTable::FloatColumn, mps_fire::i, and GenEventInfoProduct::weights().

297  {
298  int vectorSize = genProd.weights().size() == 14 ? 4 : 1;
299 
300  std::vector<double> wPS(vectorSize, 1);
301  if (vectorSize > 1 ){
302  for (unsigned int i=6; i<10; i++){
303  wPS[i-6] = (genProd.weights()[i])/genWeight;
304  }
305  }
306 
307  outPS.reset(new nanoaod::FlatTable(wPS.size(), "PSWeight", false));
308  outPS->addColumn<float>("", wPS, vectorSize > 1 ? "PS weights (w_var / w_nominal); [0] is ISR=0.5 FSR=1; [1] is ISR=1 FSR=0.5; [2] is ISR=2 FSR=1; [3] is ISR=1 FSR=2 " : "dummy PS weight (1.0) " , nanoaod::FlatTable::FloatColumn, lheWeightPrecision_);
309 
310  counter->incGenOnly(genWeight);
311  counter->incPSOnly(genWeight,wPS);
312  }
std::vector< double > & weights()
std::shared_ptr<DynamicWeightChoice> GenWeightsTableProducer::globalBeginRun ( edm::Run const &  iRun,
edm::EventSetup const &   
) const
inlineoverride

Definition at line 317 of file GenWeightsTableProducer.cc.

References popcon2dropbox::copy(), gather_cfg::cout, end, spr::find(), plotBeamSpotDB::first, runEdmFileComparison::found, edm::Run::getByLabel(), LHERunInfoProduct::headers_begin(), LHERunInfoProduct::headers_end(), triggerObjects_cff::id, edm::HandleBase::isValid(), nano_cff::lhaid, nano_cff::lheInfo, groupFilesInBlocks::lines, and AlCaHLTBitMon_QueryRunRegistry::string.

317  {
319 
320  bool lheDebug = debugRun_.exchange(false); // make sure only the first thread dumps out this (even if may still be mixed up with other output, but nevermind)
321  auto weightChoice = std::make_shared<DynamicWeightChoice>();
322 
323  // getByToken throws since we're not in the endRun (see https://github.com/cms-sw/cmssw/pull/18499)
324  //if (iRun.getByToken(lheRunTag_, lheInfo)) {
325  for (const auto & lheLabel: lheLabel_) {
326  iRun.getByLabel(lheLabel, lheInfo);
327  if (lheInfo.isValid()) {
328  break;
329  }
330  }
331  if (lheInfo.isValid()) {
332  std::vector<ScaleVarWeight> scaleVariationIDs;
333  std::vector<PDFSetWeights> pdfSetWeightIDs;
334  std::vector<std::string> lheReweighingIDs;
335 
336  std::regex weightgroupmg26x("<weightgroup\\s+(?:name|type)=\"(.*)\"\\s+combine=\"(.*)\"\\s*>");
337  std::regex weightgroup("<weightgroup\\s+combine=\"(.*)\"\\s+(?:name|type)=\"(.*)\"\\s*>");
338  std::regex weightgroupRwgt("<weightgroup\\s+(?:name|type)=\"(.*)\"\\s*>");
339  std::regex endweightgroup("</weightgroup>");
340  std::regex scalewmg26x("<weight\\s+(?:.*\\s+)?id=\"(\\d+)\"\\s*(?:lhapdf=\\d+|dyn=\\s*-?\\d+)?\\s*((?:[mM][uU][rR]|renscfact)=\"(\\S+)\"\\s+(?:[mM][uU][Ff]|facscfact)=\"(\\S+)\")(\\s+.*)?</weight>");
341  std::regex scalew("<weight\\s+(?:.*\\s+)?id=\"(\\d+)\">\\s*(?:lhapdf=\\d+|dyn=\\s*-?\\d+)?\\s*((?:mu[rR]|renscfact)=(\\S+)\\s+(?:mu[Ff]|facscfact)=(\\S+)(\\s+.*)?)</weight>");
342  std::regex pdfw("<weight\\s+id=\"(\\d+)\">\\s*(?:PDF set|lhapdf|PDF|pdfset)\\s*=\\s*(\\d+)\\s*(?:\\s.*)?</weight>");
343  std::regex pdfwOld("<weight\\s+(?:.*\\s+)?id=\"(\\d+)\">\\s*Member \\s*(\\d+)\\s*(?:.*)</weight>");
344  std::regex pdfwmg26x("<weight\\s+id=\"(\\d+)\"\\s*MUR=\"(?:\\S+)\"\\s*MUF=\"(?:\\S+)\"\\s*(?:PDF set|lhapdf|PDF|pdfset)\\s*=\\s*\"(\\d+)\"\\s*>\\s*(?:PDF=(\\d+)\\s*MemberID=(\\d+))?\\s*(?:\\s.*)?</weight>");
345  std::regex rwgt("<weight\\s+id=\"(.+)\">(.+)?(</weight>)?");
346  std::smatch groups;
347  for (auto iter=lheInfo->headers_begin(), end = lheInfo->headers_end(); iter != end; ++iter) {
348  if (iter->tag() != "initrwgt") {
349  if (lheDebug) std::cout << "Skipping LHE header with tag" << iter->tag() << std::endl;
350  continue;
351  }
352  if (lheDebug) std::cout << "Found LHE header with tag" << iter->tag() << std::endl;
353  std::vector<std::string> lines = iter->lines();
354  bool missed_weightgroup=false; //Needed because in some of the samples ( produced with MG26X ) a small part of the header info is ordered incorrectly
355  bool ismg26x=false;
356  for (unsigned int iLine = 0, nLines = lines.size(); iLine < nLines; ++iLine) { //First start looping through the lines to see which weightgroup pattern is matched
357  boost::replace_all(lines[iLine],"&lt;", "<");
358  boost::replace_all(lines[iLine],"&gt;", ">");
359  if(std::regex_search(lines[iLine],groups,weightgroupmg26x)){
360  ismg26x=true;
361  }
362  }
363  for (unsigned int iLine = 0, nLines = lines.size(); iLine < nLines; ++iLine) {
364  if (lheDebug) std::cout << lines[iLine];
365  if (std::regex_search(lines[iLine], groups, ismg26x ? weightgroupmg26x : weightgroup) ) {
366  std::string groupname = groups.str(2);
367  if (ismg26x) groupname = groups.str(1);
368  if (lheDebug) std::cout << ">>> Looks like the beginning of a weight group for '" << groupname << "'" << std::endl;
369  if (groupname.find("scale_variation") == 0 || groupname == "Central scale variation") {
370  if (lheDebug) std::cout << ">>> Looks like scale variation for theory uncertainties" << std::endl;
371  for ( ++iLine; iLine < nLines; ++iLine) {
372  if (lheDebug) std::cout << " " << lines[iLine];
373  if (std::regex_search(lines[iLine], groups, ismg26x ? scalewmg26x : scalew)) {
374  if (lheDebug) std::cout << " >>> Scale weight " << groups[1].str() << " for " << groups[3].str() << " , " << groups[4].str() << " , " << groups[5].str() << std::endl;
375  scaleVariationIDs.emplace_back(groups.str(1), groups.str(2), groups.str(3), groups.str(4));
376  } else if (std::regex_search(lines[iLine], endweightgroup)) {
377  if (lheDebug) std::cout << ">>> Looks like the end of a weight group" << std::endl;
378  if (!missed_weightgroup){
379  break;
380  } else missed_weightgroup=false;
381  } else if (std::regex_search(lines[iLine], ismg26x ? weightgroupmg26x : weightgroup)) {
382  if (lheDebug) std::cout << ">>> Looks like the beginning of a new weight group, I will assume I missed the end of the group." << std::endl;
383  if (ismg26x) missed_weightgroup=true;
384  --iLine; // rewind by one, and go back to the outer loop
385  break;
386  }
387  }
388  } else if (groupname == "PDF_variation" || groupname.find("PDF_variation ") == 0) {
389  if (lheDebug) std::cout << ">>> Looks like a new-style block of PDF weights for one or more pdfs" << std::endl;
390  for ( ++iLine; iLine < nLines; ++iLine) {
391  if (lheDebug) std::cout << " " << lines[iLine];
392  if (std::regex_search(lines[iLine], groups, pdfw)) {
393  unsigned int lhaID = std::stoi(groups.str(2));
394  if (lheDebug) std::cout << " >>> PDF weight " << groups.str(1) << " for " << groups.str(2) << " = " << lhaID << std::endl;
395  if (pdfSetWeightIDs.empty() || ! pdfSetWeightIDs.back().maybe_add(groups.str(1),lhaID)) {
396  pdfSetWeightIDs.emplace_back(groups.str(1),lhaID);
397  }
398  } else if (std::regex_search(lines[iLine], endweightgroup)) {
399  if (lheDebug) std::cout << ">>> Looks like the end of a weight group" << std::endl;
400  if (!missed_weightgroup){
401  break;
402  } else missed_weightgroup=false;
403  } else if (std::regex_search(lines[iLine], ismg26x ? weightgroupmg26x : weightgroup)) {
404  if (lheDebug) std::cout << ">>> Looks like the beginning of a new weight group, I will assume I missed the end of the group." << std::endl;
405  if (ismg26x) missed_weightgroup=true;
406  --iLine; // rewind by one, and go back to the outer loop
407  break;
408  }
409  }
410  } else if (groupname == "PDF_variation1" || groupname == "PDF_variation2") {
411  if (lheDebug) std::cout << ">>> Looks like a new-style block of PDF weights for multiple pdfs" << std::endl;
412  unsigned int lastid = 0;
413  for ( ++iLine; iLine < nLines; ++iLine) {
414  if (lheDebug) std::cout << " " << lines[iLine];
415  if (std::regex_search(lines[iLine], groups, pdfw)) {
416  unsigned int id = std::stoi(groups.str(1));
417  unsigned int lhaID = std::stoi(groups.str(2));
418  if (lheDebug) std::cout << " >>> PDF weight " << groups.str(1) << " for " << groups.str(2) << " = " << lhaID << std::endl;
419  if (id != (lastid+1) || pdfSetWeightIDs.empty()) {
420  pdfSetWeightIDs.emplace_back(groups.str(1),lhaID);
421  } else {
422  pdfSetWeightIDs.back().add(groups.str(1),lhaID);
423  }
424  lastid = id;
425  } else if (std::regex_search(lines[iLine], endweightgroup)) {
426  if (lheDebug) std::cout << ">>> Looks like the end of a weight group" << std::endl;
427  if(!missed_weightgroup) {
428  break;
429  } else missed_weightgroup=false;
430  } else if (std::regex_search(lines[iLine], ismg26x ? weightgroupmg26x : weightgroup)) {
431  if (lheDebug) std::cout << ">>> Looks like the beginning of a new weight group, I will assume I missed the end of the group." << std::endl;
432  if (ismg26x) missed_weightgroup=true;
433  --iLine; // rewind by one, and go back to the outer loop
434  break;
435  }
436  }
437  } else if (lhaNameToID_.find(groupname) != lhaNameToID_.end()) {
438  if (lheDebug) std::cout << ">>> Looks like an old-style PDF weight for an individual pdf" << std::endl;
439  unsigned int firstLhaID = lhaNameToID_.find(groupname)->second;
440  bool first = true;
441  for ( ++iLine; iLine < nLines; ++iLine) {
442  if (lheDebug) std::cout << " " << lines[iLine];
443  if (std::regex_search(lines[iLine], groups, ismg26x ? pdfwmg26x : pdfwOld)) {
444  unsigned int member = 0;
445  if (ismg26x==0){
446  member = std::stoi(groups.str(2));
447  } else {
448  if (!groups.str(4).empty()){
449  member = std::stoi(groups.str(4));
450  }
451  }
452  unsigned int lhaID = member+firstLhaID;
453  if (lheDebug) std::cout << " >>> PDF weight " << groups.str(1) << " for " << member << " = " << lhaID << std::endl;
454  //if (member == 0) continue; // let's keep also the central value for now
455  if (first) {
456  pdfSetWeightIDs.emplace_back(groups.str(1),lhaID);
457  first = false;
458  } else {
459  pdfSetWeightIDs.back().add(groups.str(1),lhaID);
460  }
461  } else if (std::regex_search(lines[iLine], endweightgroup)) {
462  if (lheDebug) std::cout << ">>> Looks like the end of a weight group" << std::endl;
463  if (!missed_weightgroup) {
464  break;
465  } else missed_weightgroup=false;
466  } else if (std::regex_search(lines[iLine], ismg26x ? weightgroupmg26x : weightgroup)) {
467  if (lheDebug) std::cout << ">>> Looks like the beginning of a new weight group, I will assume I missed the end of the group." << std::endl;
468  if (ismg26x) missed_weightgroup=true;
469  --iLine; // rewind by one, and go back to the outer loop
470  break;
471  }
472  }
473  } else {
474  for ( ++iLine; iLine < nLines; ++iLine) {
475  if (lheDebug) std::cout << " " << lines[iLine];
476  if (std::regex_search(lines[iLine], groups, endweightgroup)) {
477  if (lheDebug) std::cout << ">>> Looks like the end of a weight group" << std::endl;
478  if (!missed_weightgroup){
479  break;
480  } else missed_weightgroup=false;
481  } else if (std::regex_search(lines[iLine], ismg26x ? weightgroupmg26x : weightgroup)) {
482  if (lheDebug) std::cout << ">>> Looks like the beginning of a new weight group, I will assume I missed the end of the group." << std::endl;
483  if (ismg26x) missed_weightgroup=true;
484  --iLine; // rewind by one, and go back to the outer loop
485  break;
486  }
487  }
488  }
489  } else if(std::regex_search(lines[iLine], groups, weightgroupRwgt) ) {
490  std::string groupname = groups.str(1);
491  if (groupname == "mg_reweighting") {
492  if (lheDebug) std::cout << ">>> Looks like a LHE weights for reweighting" << std::endl;
493  for ( ++iLine; iLine < nLines; ++iLine) {
494  if (lheDebug) std::cout << " " << lines[iLine];
495  if (std::regex_search(lines[iLine], groups, rwgt)) {
496  std::string rwgtID = groups.str(1);
497  if (lheDebug) std::cout << " >>> LHE reweighting weight: " << rwgtID << std::endl;
498  if (std::find(lheReweighingIDs.begin(), lheReweighingIDs.end(), rwgtID) == lheReweighingIDs.end()) {
499  // we're only interested in the beggining of the block
500  lheReweighingIDs.emplace_back(rwgtID);
501  }
502  } else if (std::regex_search(lines[iLine], endweightgroup)) {
503  if (lheDebug) std::cout << ">>> Looks like the end of a weight group" << std::endl;
504  if (!missed_weightgroup){
505  break;
506  } else missed_weightgroup=false;
507  } else if (std::regex_search(lines[iLine], ismg26x ? weightgroupmg26x : weightgroup)) {
508  if (lheDebug) std::cout << ">>> Looks like the beginning of a new weight group, I will assume I missed the end of the group." << std::endl;
509  if (ismg26x) missed_weightgroup=true;
510  --iLine; // rewind by one, and go back to the outer loop
511  break;
512  }
513  }
514  }
515  }
516  }
517  //std::cout << "============= END [ " << iter->tag() << " ] ============ \n\n" << std::endl;
518 
519  // ----- SCALE VARIATIONS -----
520  std::sort(scaleVariationIDs.begin(), scaleVariationIDs.end());
521  if (lheDebug) std::cout << "Found " << scaleVariationIDs.size() << " scale variations: " << std::endl;
522  std::stringstream scaleDoc; scaleDoc << "LHE scale variation weights (w_var / w_nominal); ";
523  for (unsigned int isw = 0, nsw = scaleVariationIDs.size(); isw < nsw; ++isw) {
524  const auto & sw = scaleVariationIDs[isw];
525  if (isw) scaleDoc << "; ";
526  scaleDoc << "[" << isw << "] is " << sw.label;
527  weightChoice->scaleWeightIDs.push_back(sw.wid);
528  if (lheDebug) printf(" id %s: scales ren = % .2f fact = % .2f text = %s\n", sw.wid.c_str(), sw.scales.first, sw.scales.second, sw.label.c_str());
529  }
530  if (!scaleVariationIDs.empty()) weightChoice->scaleWeightsDoc = scaleDoc.str();
531 
532  // ------ PDF VARIATIONS (take the preferred one) -----
533  if (lheDebug) {
534  std::cout << "Found " << pdfSetWeightIDs.size() << " PDF set errors: " << std::endl;
535  for (const auto & pw : pdfSetWeightIDs) printf("lhaIDs %6d - %6d (%3lu weights: %s, ... )\n", pw.lhaIDs.first, pw.lhaIDs.second, pw.wids.size(), pw.wids.front().c_str());
536  }
537 
538  // ------ LHE REWEIGHTING -------
539  if (lheDebug) {
540  std::cout << "Found " << lheReweighingIDs.size() << " reweighting weights" << std::endl;
541  }
542  std::copy(lheReweighingIDs.begin(), lheReweighingIDs.end(), std::back_inserter(weightChoice->rwgtIDs));
543 
544  std::stringstream pdfDoc; pdfDoc << "LHE pdf variation weights (w_var / w_nominal) for LHA IDs ";
545  bool found = false;
546  for (uint32_t lhaid : preferredPDFLHAIDs_) {
547  for (const auto & pw : pdfSetWeightIDs) {
548  if (pw.lhaIDs.first != lhaid && pw.lhaIDs.first != (lhaid+1)) continue; // sometimes the first weight is not saved if that PDF is the nominal one for the sample
549  if (pw.wids.size() == 1) continue; // only consider error sets
550  pdfDoc << pw.lhaIDs.first << " - " << pw.lhaIDs.second;
551  weightChoice->pdfWeightIDs = pw.wids;
552  if (maxPdfWeights_ < pw.wids.size()) {
553  weightChoice->pdfWeightIDs.resize(maxPdfWeights_); // drop some replicas
554  pdfDoc << ", truncated to the first " << maxPdfWeights_ << " replicas";
555  }
556  weightChoice->pdfWeightsDoc = pdfDoc.str();
557  found = true; break;
558  }
559  if (found) break;
560  }
561  }
562  }
563  return weightChoice;
564  }
std::unordered_map< std::string, uint32_t > lhaNameToID_
def copy(args, dbName)
headers_const_iterator headers_end() const
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:20
const std::vector< edm::InputTag > lheLabel_
headers_const_iterator headers_begin() const
#define end
Definition: vmac.h:39
bool isValid() const
Definition: HandleBase.h:74
std::vector< uint32_t > preferredPDFLHAIDs_
std::shared_ptr<Counter> GenWeightsTableProducer::globalBeginRunSummary ( edm::Run const &  ,
edm::EventSetup const &   
) const
inlineoverride

Definition at line 576 of file GenWeightsTableProducer.cc.

576  {
577  return std::make_shared<Counter>();
578  }
void GenWeightsTableProducer::globalEndRun ( edm::Run const &  ,
edm::EventSetup const &   
) const
inlineoverride

Definition at line 610 of file GenWeightsTableProducer.cc.

610 { }
void GenWeightsTableProducer::globalEndRunProduce ( edm::Run iRun,
edm::EventSetup const &  ,
Counter const *  runCounter 
) const
inlineoverride

Definition at line 587 of file GenWeightsTableProducer.cc.

References mps_fire::i, eostools::move(), gen::n, MillePedeFileConverter_cfg::out, edm::Run::put(), and heppy_batch::val.

587  {
588  auto out = std::make_unique<nanoaod::MergeableCounterTable>();
589  out->addInt("genEventCount", "event count", runCounter->num);
590  out->addFloat("genEventSumw", "sum of gen weights", runCounter->sumw);
591  out->addFloat("genEventSumw2", "sum of gen (weight^2)", runCounter->sumw2);
592 
593  double norm = runCounter->sumw ? 1.0/runCounter->sumw : 1;
594  auto sumScales = runCounter->sumScale; for (auto & val : sumScales) val *= norm;
595  out->addVFloat("LHEScaleSumw", "Sum of genEventWeight * LHEScaleWeight[i], divided by genEventSumw", sumScales);
596  auto sumPDFs = runCounter->sumPDF; for (auto & val : sumPDFs) val *= norm;
597  out->addVFloat("LHEPdfSumw", "Sum of genEventWeight * LHEPdfWeight[i], divided by genEventSumw", sumPDFs);
598  if (!runCounter->sumRwgt.empty()) {
599  auto sumRwgts = runCounter->sumRwgt; for (auto & val : sumRwgts) val *= norm;
600  out->addVFloat("LHEReweightingSumw", "Sum of genEventWeight * LHEReweightingWeight[i], divided by genEventSumw", sumRwgts);
601  }
602  if (!runCounter->sumNamed.empty()) { // it could be empty if there's no LHE info in the sample
603  for (unsigned int i = 0, n = namedWeightLabels_.size(); i < n; ++i) {
604  out->addFloat("LHESumw_"+namedWeightLabels_[i], "Sum of genEventWeight * LHEWeight_"+namedWeightLabels_[i]+", divided by genEventSumw", runCounter->sumNamed[i] * norm);
605  }
606  }
607  iRun.put(std::move(out));
608  }
std::vector< std::string > namedWeightLabels_
void put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Run.h:108
def move(src, dest)
Definition: eostools.py:511
void GenWeightsTableProducer::globalEndRunSummary ( edm::Run const &  ,
edm::EventSetup const &  ,
Counter *  runCounter 
) const
inlineoverride

Definition at line 584 of file GenWeightsTableProducer.cc.

584  {
585  }
void GenWeightsTableProducer::produce ( edm::StreamID  id,
edm::Event iEvent,
const edm::EventSetup iSetup 
) const
inlineoverride

Definition at line 176 of file GenWeightsTableProducer.cc.

References nanoaod::FlatTable::FloatColumn, edm::Event::getByToken(), edm::Event::getRun(), edm::Run::index(), edm::HandleBase::isValid(), nano_cff::lheInfo, eostools::move(), MillePedeFileConverter_cfg::out, edm::Event::put(), GenEventInfoProduct::weight(), and mps_merge::weight.

176  {
177  // get my counter for weights
178  Counter * counter = streamCache(id);
179 
180  // generator information (always available)
182  iEvent.getByToken(genTag_, genInfo);
183  double weight = genInfo->weight();
184 
185  // table for gen info, always available
186  auto out = std::make_unique<nanoaod::FlatTable>(1, "genWeight", true);
187  out->setDoc("generator weight");
188  out->addColumnValue<float>("", weight, "generator weight", nanoaod::FlatTable::FloatColumn);
189  iEvent.put(std::move(out));
190 
191  // tables for LHE weights, may not be filled
192  std::unique_ptr<nanoaod::FlatTable> lheScaleTab, lhePdfTab, lheRwgtTab, lheNamedTab;
193  std::unique_ptr<nanoaod::FlatTable> genPSTab;
194 
196  for (const auto & lheTag: lheTag_) {
197  iEvent.getByToken(lheTag, lheInfo);
198  if (lheInfo.isValid()) {
199  break;
200  }
201  }
202  if (lheInfo.isValid()) {
203  // get the dynamic choice of weights
204  const DynamicWeightChoice * weightChoice = runCache(iEvent.getRun().index());
205  // go fill tables
206  fillLHEWeightTables(counter, weightChoice, weight, *lheInfo, *genInfo, lheScaleTab, lhePdfTab, lheRwgtTab, lheNamedTab, genPSTab);
207  } else {
208  // Still try to add the PS weights
209  fillOnlyPSWeightTable(counter, weight, *genInfo, genPSTab);
210  // make dummy values
211  lheScaleTab.reset(new nanoaod::FlatTable(1, "LHEScaleWeights", true));
212  lhePdfTab.reset(new nanoaod::FlatTable(1, "LHEPdfWeights", true));
213  lheRwgtTab.reset(new nanoaod::FlatTable(1, "LHEReweightingWeights", true));
214  lheNamedTab.reset(new nanoaod::FlatTable(1, "LHENamedWeights", true));
215  if (!hasIssuedWarning_.exchange(true)) {
216  edm::LogWarning("LHETablesProducer") << "No LHEEventProduct, so there will be no LHE Tables\n";
217  }
218  }
219 
220  iEvent.put(std::move(lheScaleTab), "LHEScale");
221  iEvent.put(std::move(lhePdfTab), "LHEPdf");
222  iEvent.put(std::move(lheRwgtTab), "LHEReweighting");
223  iEvent.put(std::move(lheNamedTab), "LHENamed");
224  iEvent.put(std::move(genPSTab), "PS");
225  }
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:125
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:517
const edm::EDGetTokenT< GenEventInfoProduct > genTag_
Definition: weight.py:1
Run const & getRun() const
Definition: Event.cc:99
double weight() const
std::atomic< bool > hasIssuedWarning_
void fillLHEWeightTables(Counter *counter, const DynamicWeightChoice *weightChoice, double genWeight, const LHEEventProduct &lheProd, const GenEventInfoProduct &genProd, std::unique_ptr< nanoaod::FlatTable > &outScale, std::unique_ptr< nanoaod::FlatTable > &outPdf, std::unique_ptr< nanoaod::FlatTable > &outRwgt, std::unique_ptr< nanoaod::FlatTable > &outNamed, std::unique_ptr< nanoaod::FlatTable > &outPS) const
std::function< unsigned int(align::ID)> Counter
RunIndex index() const
Definition: Run.cc:21
void fillOnlyPSWeightTable(Counter *counter, double genWeight, const GenEventInfoProduct &genProd, std::unique_ptr< nanoaod::FlatTable > &outPS) const
bool isValid() const
Definition: HandleBase.h:74
const std::vector< edm::EDGetTokenT< LHEEventProduct > > lheTag_
def move(src, dest)
Definition: eostools.py:511
void GenWeightsTableProducer::streamBeginRun ( edm::StreamID  id,
edm::Run const &  ,
edm::EventSetup const &   
) const
inlineoverride

Definition at line 572 of file GenWeightsTableProducer.cc.

572  {
573  streamCache(id)->clear();
574  }
void GenWeightsTableProducer::streamEndRunSummary ( edm::StreamID  id,
edm::Run const &  ,
edm::EventSetup const &  ,
Counter *  runCounter 
) const
inlineoverride

Definition at line 580 of file GenWeightsTableProducer.cc.

580  {
581  runCounter->merge(*streamCache(id));
582  }

Member Data Documentation

std::atomic<bool> GenWeightsTableProducer::debug_
mutableprotected

Definition at line 643 of file GenWeightsTableProducer.cc.

std::atomic<bool> GenWeightsTableProducer::debugRun_
mutableprotected

Definition at line 643 of file GenWeightsTableProducer.cc.

const edm::EDGetTokenT<GenEventInfoProduct> GenWeightsTableProducer::genTag_
protected

Definition at line 631 of file GenWeightsTableProducer.cc.

std::atomic<bool> GenWeightsTableProducer::hasIssuedWarning_
mutableprotected

Definition at line 643 of file GenWeightsTableProducer.cc.

std::unordered_map<std::string,uint32_t> GenWeightsTableProducer::lhaNameToID_
protected

Definition at line 637 of file GenWeightsTableProducer.cc.

const std::vector<edm::InputTag> GenWeightsTableProducer::lheLabel_
protected

Definition at line 632 of file GenWeightsTableProducer.cc.

const std::vector<edm::EDGetTokenT<LHERunInfoProduct> > GenWeightsTableProducer::lheRunTag_
protected

Definition at line 634 of file GenWeightsTableProducer.cc.

const std::vector<edm::EDGetTokenT<LHEEventProduct> > GenWeightsTableProducer::lheTag_
protected

Definition at line 633 of file GenWeightsTableProducer.cc.

int GenWeightsTableProducer::lheWeightPrecision_
protected

Definition at line 640 of file GenWeightsTableProducer.cc.

unsigned int GenWeightsTableProducer::maxPdfWeights_
protected

Definition at line 641 of file GenWeightsTableProducer.cc.

std::vector<std::string> GenWeightsTableProducer::namedWeightIDs_
protected

Definition at line 638 of file GenWeightsTableProducer.cc.

std::vector<std::string> GenWeightsTableProducer::namedWeightLabels_
protected

Definition at line 639 of file GenWeightsTableProducer.cc.

std::vector<uint32_t> GenWeightsTableProducer::preferredPDFLHAIDs_
protected

Definition at line 636 of file GenWeightsTableProducer.cc.