From 2f457f0a18a8bc5fc82e23f9436b732474947da9 Mon Sep 17 00:00:00 2001 From: cmsbuild Date: Fri, 23 Jan 2015 21:37:21 +0100 Subject: [PATCH] Merge pull request #7348 from bendavid/hepmcweightfix Fix handling of weights in generator interfaces --- GeneratorInterface/Core/interface/HadronizerFilter.h | 6 ++---- .../Pythia8Interface/plugins/Pythia8Hadronizer.cc | 10 +++++++--- .../GeneratorProducts/interface/GenEventInfoProduct.h | 6 +++++- .../GeneratorProducts/src/GenEventInfoProduct.cc | 2 +- 4 files changed, 15 insertions(+), 9 deletions(-) diff --git a/GeneratorInterface/Core/interface/HadronizerFilter.h b/GeneratorInterface/Core/interface/HadronizerFilter.h index 0da94ec3d6e43..f36b8b354fb70 100644 --- a/GeneratorInterface/Core/interface/HadronizerFilter.h +++ b/GeneratorInterface/Core/interface/HadronizerFilter.h @@ -224,12 +224,10 @@ namespace edm double multihadweight = double(naccept)/double(nAttempts_); //adjust weight for GenEventInfoProduct - std::vector genEventInfoWeights = finalGenEventInfo->weights(); - genEventInfoWeights.push_back(multihadweight); - finalGenEventInfo->setWeights(genEventInfoWeights); + finalGenEventInfo->weights()[0] *= multihadweight; //adjust weight for HepMC GenEvent (used e.g for RIVET) - finalEvent->weights().push_back(multihadweight); + finalEvent->weights()[0] *= multihadweight; } diff --git a/GeneratorInterface/Pythia8Interface/plugins/Pythia8Hadronizer.cc b/GeneratorInterface/Pythia8Interface/plugins/Pythia8Hadronizer.cc index e04b8d9b7ba6b..535d644dbf42d 100644 --- a/GeneratorInterface/Pythia8Interface/plugins/Pythia8Hadronizer.cc +++ b/GeneratorInterface/Pythia8Interface/plugins/Pythia8Hadronizer.cc @@ -484,7 +484,11 @@ bool Pythia8Hadronizer::hadronize() bool py8next = fMasterGen->next(); - double mergeweight = fMasterGen.get()->info.mergingWeight(); + double mergeweight = fMasterGen.get()->info.mergingWeightNLO(); + if (fMergingHook) { + mergeweight *= fMergingHook->getNormFactor(); + } + //protect against 0-weight from ckkw or similar if (!py8next || std::abs(mergeweight)==0.) @@ -516,9 +520,9 @@ bool Pythia8Hadronizer::hadronize() return false; } - //add ckkw merging weight + //add ckkw/umeps/unlops merging weight if (mergeweight!=1.) { - event()->weights().push_back(mergeweight); + event()->weights()[0] *= mergeweight; } if (fEmissionVetoHook) { diff --git a/SimDataFormats/GeneratorProducts/interface/GenEventInfoProduct.h b/SimDataFormats/GeneratorProducts/interface/GenEventInfoProduct.h index 9196a47d99357..2525784bde5c9 100644 --- a/SimDataFormats/GeneratorProducts/interface/GenEventInfoProduct.h +++ b/SimDataFormats/GeneratorProducts/interface/GenEventInfoProduct.h @@ -25,8 +25,12 @@ class GenEventInfoProduct { // getters + std::vector &weights() { return weights_; } const std::vector &weights() const { return weights_; } - double weight() const; + + double weight() const { return weights_.empty() ? 1.0 : weights_[0]; } + + double weightProduct() const; unsigned int signalProcessID() const { return signalProcessID_; } diff --git a/SimDataFormats/GeneratorProducts/src/GenEventInfoProduct.cc b/SimDataFormats/GeneratorProducts/src/GenEventInfoProduct.cc index b77136b3311be..570f29064c9c1 100644 --- a/SimDataFormats/GeneratorProducts/src/GenEventInfoProduct.cc +++ b/SimDataFormats/GeneratorProducts/src/GenEventInfoProduct.cc @@ -74,7 +74,7 @@ GenEventInfoProduct &GenEventInfoProduct::operator = (GenEventInfoProduct const return *this; } -double GenEventInfoProduct::weight() const +double GenEventInfoProduct::weightProduct() const { return std::accumulate(weights_.begin(), weights_.end(), 1., std::multiplies());