From 94f0922fed8158b0891f3035c328124c9dd95c84 Mon Sep 17 00:00:00 2001 From: Nick Smith Date: Wed, 18 Jan 2023 15:18:46 -0600 Subject: [PATCH 01/98] Fixup recipe for LCG-based standalone environment --- Makefile | 2 +- bin/PerfTest.cpp | 4 +- docs/index.md | 11 ++-- src/classes.h | 128 +++++++++++++++++++++++------------------------ 4 files changed, 75 insertions(+), 70 deletions(-) diff --git a/Makefile b/Makefile index c5d9a120597..a43c619e9cc 100644 --- a/Makefile +++ b/Makefile @@ -97,7 +97,7 @@ $(OBJ_DIR): @mkdir -p $(OBJ_DIR)/a $(OBJ_DIR)/a/$(DICTNAME).cc: $(SRC_DIR)/classes_def.xml | $(OBJ_DIR) - genreflex $(SRC_DIR)/classes.h -s $< -o $@ --deep --fail_on_warnings --rootmap=$(OBJ_DIR)/a/$(DICTNAME).rootmap --rootmap-lib=$(SONAME) -I$(PARENT_DIR) + genreflex $(SRC_DIR)/classes.h -s $< -o $@ --deep --fail_on_warnings --rootmap=$(OBJ_DIR)/a/$(DICTNAME).rootmap --rootmap-lib=$(SONAME) -Isrc mv $(OBJ_DIR)/a/$(DICTNAME).rootmap $(LIB_DIR)/ mv $(OBJ_DIR)/a/$(DICTNAME)_rdict.pcm $(LIB_DIR)/ diff --git a/bin/PerfTest.cpp b/bin/PerfTest.cpp index 4a456f22d50..55f3ce7cdaf 100644 --- a/bin/PerfTest.cpp +++ b/bin/PerfTest.cpp @@ -6,8 +6,8 @@ #include "RooMsgService.h" #include #include -#include "HiggsAnalysis/CombinedLimit/interface/CachingNLL.h" -#include "HiggsAnalysis/CombinedLimit/interface/ProfilingTools.h" +#include "../interface/CachingNLL.h" +#include "../interface/ProfilingTools.h" void (*dump_)(const char *); diff --git a/docs/index.md b/docs/index.md index 6e489c05da2..d81b51385bf 100644 --- a/docs/index.md +++ b/docs/index.md @@ -113,14 +113,19 @@ make -j 4 You will need to source `env_standalone.sh` each time you want to use the package, or add it to your login. ### Standalone compilation with LCG -LCG102 contains ROOT 6.26, which at the time of writing is not available in any CMSSW release. -This repo can be compiled against LCG102 with: -``` +LCG102 and above contains ROOT 6.26, which at the time of writing is not available in any CMSSW release. +This repo can be compiled against LCG with: +```sh git clone https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit.git HiggsAnalysis/CombinedLimit cd HiggsAnalysis/CombinedLimit source env_lcg.sh make LCG=1 -j 8 ``` +To change the LCG version, edit `env_lcg.sh`. The resulting binaries can be relocated (e.g. for use in a +batch job) if the following files are included in the job tarball: +```sh +tar -zcf Combine_LCG_env.tar.gz build interface src/classes.h --exclude=obj +``` ### Standalone compilation with `conda` This recipe will work both for linux and MacOS diff --git a/src/classes.h b/src/classes.h index fc5ece7e62a..c694cebcf24 100644 --- a/src/classes.h +++ b/src/classes.h @@ -1,68 +1,68 @@ -#include "HiggsAnalysis/CombinedLimit/interface/TestProposal.h" -#include "HiggsAnalysis/CombinedLimit/interface/DebugProposal.h" -#include "HiggsAnalysis/CombinedLimit/interface/VerticalInterpPdf.h" -#include "HiggsAnalysis/CombinedLimit/interface/VerticalInterpHistPdf.h" -#include "HiggsAnalysis/CombinedLimit/interface/AsymPow.h" -#include "HiggsAnalysis/CombinedLimit/interface/AsymQuad.h" -#include "HiggsAnalysis/CombinedLimit/interface/CombDataSetFactory.h" -#include "HiggsAnalysis/CombinedLimit/interface/TH1Keys.h" -#include "HiggsAnalysis/CombinedLimit/interface/RooSimultaneousOpt.h" -#include "HiggsAnalysis/CombinedLimit/interface/SimpleCacheSentry.h" -#include "HiggsAnalysis/CombinedLimit/interface/th1fmorph.h" -#include "HiggsAnalysis/CombinedLimit/interface/HZZ4L_RooCTauPdf_1D.h" -#include "HiggsAnalysis/CombinedLimit/interface/HZZ4L_RooCTauPdf_1D_Expanded.h" -#include "HiggsAnalysis/CombinedLimit/interface/HZZ4L_RooCTauPdf_2D.h" -#include "HiggsAnalysis/CombinedLimit/interface/HZZ4LRooPdfs.h" -#include "HiggsAnalysis/CombinedLimit/interface/HWWLVJRooPdfs.h" -#include "HiggsAnalysis/CombinedLimit/interface/HZZ2L2QRooPdfs.h" -#include "HiggsAnalysis/CombinedLimit/interface/HGGRooPdfs.h" -#include "HiggsAnalysis/CombinedLimit/interface/HZGRooPdfs.h" -#include "HiggsAnalysis/CombinedLimit/interface/SequentialMinimizer.h" -#include "HiggsAnalysis/CombinedLimit/interface/ProcessNormalization.h" -#include "HiggsAnalysis/CombinedLimit/interface/RooRealFlooredSumPdf.h" -#include "HiggsAnalysis/CombinedLimit/interface/RooSpline1D.h" -#include "HiggsAnalysis/CombinedLimit/interface/RooSplineND.h" -#include "HiggsAnalysis/CombinedLimit/interface/RooScaleLOSM.h" -#include "HiggsAnalysis/CombinedLimit/interface/RooMultiPdf.h" -#include "HiggsAnalysis/CombinedLimit/interface/RooBernsteinFast.h" -#include "HiggsAnalysis/CombinedLimit/interface/SimpleGaussianConstraint.h" -#include "HiggsAnalysis/CombinedLimit/interface/SimplePoissonConstraint.h" -#include "HiggsAnalysis/CombinedLimit/interface/SimpleConstraintGroup.h" -#include "HiggsAnalysis/CombinedLimit/interface/AtlasPdfs.h" -#include "HiggsAnalysis/CombinedLimit/interface/FastTemplateFunc.h" -#include "HiggsAnalysis/CombinedLimit/interface/HZZ4L_RooSpinZeroPdf.h" -#include "HiggsAnalysis/CombinedLimit/interface/HZZ4L_RooSpinZeroPdf_1D.h" -#include "HiggsAnalysis/CombinedLimit/interface/HZZ4L_RooSpinZeroPdf_2D.h" -#include "HiggsAnalysis/CombinedLimit/interface/HZZ4L_RooSpinZeroPdf_phase.h" -#include "HiggsAnalysis/CombinedLimit/interface/VBFHZZ4L_RooSpinZeroPdf.h" -#include "HiggsAnalysis/CombinedLimit/interface/VBFHZZ4L_RooSpinZeroPdf_fast.h" +#include "../interface/TestProposal.h" +#include "../interface/DebugProposal.h" +#include "../interface/VerticalInterpPdf.h" +#include "../interface/VerticalInterpHistPdf.h" +#include "../interface/AsymPow.h" +#include "../interface/AsymQuad.h" +#include "../interface/CombDataSetFactory.h" +#include "../interface/TH1Keys.h" +#include "../interface/RooSimultaneousOpt.h" +#include "../interface/SimpleCacheSentry.h" +#include "../interface/th1fmorph.h" +#include "../interface/HZZ4L_RooCTauPdf_1D.h" +#include "../interface/HZZ4L_RooCTauPdf_1D_Expanded.h" +#include "../interface/HZZ4L_RooCTauPdf_2D.h" +#include "../interface/HZZ4LRooPdfs.h" +#include "../interface/HWWLVJRooPdfs.h" +#include "../interface/HZZ2L2QRooPdfs.h" +#include "../interface/HGGRooPdfs.h" +#include "../interface/HZGRooPdfs.h" +#include "../interface/SequentialMinimizer.h" +#include "../interface/ProcessNormalization.h" +#include "../interface/RooRealFlooredSumPdf.h" +#include "../interface/RooSpline1D.h" +#include "../interface/RooSplineND.h" +#include "../interface/RooScaleLOSM.h" +#include "../interface/RooMultiPdf.h" +#include "../interface/RooBernsteinFast.h" +#include "../interface/SimpleGaussianConstraint.h" +#include "../interface/SimplePoissonConstraint.h" +#include "../interface/SimpleConstraintGroup.h" +#include "../interface/AtlasPdfs.h" +#include "../interface/FastTemplateFunc.h" +#include "../interface/HZZ4L_RooSpinZeroPdf.h" +#include "../interface/HZZ4L_RooSpinZeroPdf_1D.h" +#include "../interface/HZZ4L_RooSpinZeroPdf_2D.h" +#include "../interface/HZZ4L_RooSpinZeroPdf_phase.h" +#include "../interface/VBFHZZ4L_RooSpinZeroPdf.h" +#include "../interface/VBFHZZ4L_RooSpinZeroPdf_fast.h" -#include "HiggsAnalysis/CombinedLimit/interface/HZZ4L_RooSpinZeroPdf_1D_fast.h" -#include "HiggsAnalysis/CombinedLimit/interface/HZZ4L_RooSpinZeroPdf_2D_fast.h" -#include "HiggsAnalysis/CombinedLimit/interface/HZZ4L_RooSpinZeroPdf_phase_fast.h" -#include "HiggsAnalysis/CombinedLimit/interface/VVHZZ4L_RooSpinZeroPdf_1D_fast.h" +#include "../interface/HZZ4L_RooSpinZeroPdf_1D_fast.h" +#include "../interface/HZZ4L_RooSpinZeroPdf_2D_fast.h" +#include "../interface/HZZ4L_RooSpinZeroPdf_phase_fast.h" +#include "../interface/VVHZZ4L_RooSpinZeroPdf_1D_fast.h" -#include "HiggsAnalysis/CombinedLimit/interface/HWWLVJJRooPdfs.h" -#include "HiggsAnalysis/CombinedLimit/interface/RooMorphingPdf.h" -#include "HiggsAnalysis/CombinedLimit/interface/RooParametricHist.h" -#include "HiggsAnalysis/CombinedLimit/interface/RooParametricHist2D.h" -#include "HiggsAnalysis/CombinedLimit/interface/RooParametricShapeBinPdf.h" -#include "HiggsAnalysis/CombinedLimit/interface/GaussExp.h" -#include "HiggsAnalysis/CombinedLimit/interface/RooDoubleCBFast.h" -#include "HiggsAnalysis/CombinedLimit/interface/CMSHistFunc.h" -#include "HiggsAnalysis/CombinedLimit/interface/CMSHistErrorPropagator.h" -#include "HiggsAnalysis/CombinedLimit/interface/CMSHistSum.h" -#include "HiggsAnalysis/CombinedLimit/interface/CMSHistFuncWrapper.h" -#include "HiggsAnalysis/CombinedLimit/interface/RooTaylorExpansion.h" -#include "HiggsAnalysis/CombinedLimit/interface/SimpleTaylorExpansion1D.h" +#include "../interface/HWWLVJJRooPdfs.h" +#include "../interface/RooMorphingPdf.h" +#include "../interface/RooParametricHist.h" +#include "../interface/RooParametricHist2D.h" +#include "../interface/RooParametricShapeBinPdf.h" +#include "../interface/GaussExp.h" +#include "../interface/RooDoubleCBFast.h" +#include "../interface/CMSHistFunc.h" +#include "../interface/CMSHistErrorPropagator.h" +#include "../interface/CMSHistSum.h" +#include "../interface/CMSHistFuncWrapper.h" +#include "../interface/RooTaylorExpansion.h" +#include "../interface/SimpleTaylorExpansion1D.h" -#include "HiggsAnalysis/CombinedLimit/interface/RooPiecewisePolynomial.h" +#include "../interface/RooPiecewisePolynomial.h" -#include "HiggsAnalysis/CombinedLimit/interface/RooNCSplineCore.h" -#include "HiggsAnalysis/CombinedLimit/interface/RooNCSpline_1D_fast.h" -#include "HiggsAnalysis/CombinedLimit/interface/RooNCSpline_2D_fast.h" -#include "HiggsAnalysis/CombinedLimit/interface/RooNCSpline_3D_fast.h" -#include "HiggsAnalysis/CombinedLimit/interface/RooFuncPdf.h" -#include "HiggsAnalysis/CombinedLimit/interface/RooCheapProduct.h" -#include "HiggsAnalysis/CombinedLimit/interface/CMSHggFormula.h" -#include "HiggsAnalysis/CombinedLimit/interface/SimpleProdPdf.h" +#include "../interface/RooNCSplineCore.h" +#include "../interface/RooNCSpline_1D_fast.h" +#include "../interface/RooNCSpline_2D_fast.h" +#include "../interface/RooNCSpline_3D_fast.h" +#include "../interface/RooFuncPdf.h" +#include "../interface/RooCheapProduct.h" +#include "../interface/CMSHggFormula.h" +#include "../interface/SimpleProdPdf.h" From 2fd2c1140561e2b11320466462a13976a0f19d7e Mon Sep 17 00:00:00 2001 From: Nick Smith Date: Fri, 9 Jun 2023 17:31:57 -0500 Subject: [PATCH 02/98] Working CMSInterferenceFunc --- Makefile | 5 +- interface/CMSInterferenceFunc.h | 66 +++++++++++++++++ src/CMSInterferenceFunc.cxx | 123 ++++++++++++++++++++++++++++++++ src/classes.h | 1 + src/classes_def.xml | 4 ++ 5 files changed, 197 insertions(+), 2 deletions(-) create mode 100644 interface/CMSInterferenceFunc.h create mode 100644 src/CMSInterferenceFunc.cxx diff --git a/Makefile b/Makefile index c5d9a120597..51ce762aabb 100644 --- a/Makefile +++ b/Makefile @@ -53,11 +53,12 @@ DICTNAME=$(LIBNAME)_xr # Linker and flags ------------------------------------------------------------- LD = $(shell root-config --ld) ROOTLDFLAGS = $(shell root-config --ldflags) +ROOTLIBDIR = $(shell root-config --libdir) # OS x specific linkage DARWIN := $(shell uname|grep Darwin) ifdef DARWIN -LDFLAGS = $(ROOTLDFLAGS) -shared -install_name @rpath/$(SONAME) -fPIC -EXELDFLAGS = -Wl,-rpath,'@executable_path/../lib' +LDFLAGS = $(ROOTLDFLAGS) -g -shared -install_name @rpath/$(SONAME) -fPIC +EXELDFLAGS = -Wl,-rpath,'@executable_path/../lib' -Wl,-rpath,$(ROOTLIBDIR) else LDFLAGS = $(ROOTLDFLAGS) -shared -Wl,-soname,$(SONAME) -Wl,-E -Wl,-z,defs -fPIC EXELDFLAGS = diff --git a/interface/CMSInterferenceFunc.h b/interface/CMSInterferenceFunc.h new file mode 100644 index 00000000000..02391a680f2 --- /dev/null +++ b/interface/CMSInterferenceFunc.h @@ -0,0 +1,66 @@ +#ifndef CMSInterferenceFunc_h +#define CMSInterferenceFunc_h +#include + +#include "RooAbsReal.h" +#include "RooRealVar.h" +#include "RooRealProxy.h" +#include "RooListProxy.h" +#include "RooChangeTracker.h" + +#include "SimpleCacheSentry.h" + +class _InterferenceEval; + +class CMSInterferenceFunc : public RooAbsReal { + public: + CMSInterferenceFunc(); + CMSInterferenceFunc(CMSInterferenceFunc const& other, const char* name = 0); + /* + * For a coefficients list of length n and edges array of length b+1, + * the binscaling nested vector should have b entries (for b bins) with + * each being of length n*(n+1)/2, corresponding to the upper triangular + * elements of the scaling matrix, i.e. (m_00, m_01, m_02, ..., m_11, m_12, ...) + */ + CMSInterferenceFunc( + const char* name, + const char* title, + RooRealVar& x, + const RooArgList& coefficients, + const std::vector& edges, + const std::vector> binscaling + ); + virtual ~CMSInterferenceFunc(); + + virtual TObject* clone(const char* newname) const override { + return new CMSInterferenceFunc(*this, newname); + }; + + void printMultiline( + std::ostream& os, Int_t contents, Bool_t verbose, TString indent + ) const override; + + // public because it is called on deserializing, in classes_def.xml + void initialize() const; + + // batch accessor for CMSHistFunc / CMSHistSum + const std::vector& batchGetBinValues() const; + + protected: + RooRealProxy x_; + RooListProxy coefficients_; + std::vector edges_; + std::vector> binscaling_; + + mutable RooChangeTracker sentry_; //! + mutable std::unique_ptr<_InterferenceEval> evaluator_; //! + + double evaluate() const override; + + private: + void updateCache() const; + + ClassDefOverride(CMSInterferenceFunc, 1) +}; + +#endif // CMSInterferenceFunc_h diff --git a/src/CMSInterferenceFunc.cxx b/src/CMSInterferenceFunc.cxx new file mode 100644 index 00000000000..945089e7a8e --- /dev/null +++ b/src/CMSInterferenceFunc.cxx @@ -0,0 +1,123 @@ +#include "../interface/CMSInterferenceFunc.h" +#include "TBuffer.h" +#include + +class _InterferenceEval { + public: + _InterferenceEval(std::vector> scaling_in, size_t ncoef) { + binscaling_.reserve(scaling_in.size()); + for(const auto& bin : scaling_in) { + Eigen::MatrixXd mat(ncoef, ncoef); + size_t k=0; + for(size_t i=0; i& getValues() const { return values_; }; + + private: + std::vector binscaling_; + Eigen::VectorXd coefficients_; + std::vector values_; +}; + + +CMSInterferenceFunc::CMSInterferenceFunc() {}; + +CMSInterferenceFunc::CMSInterferenceFunc( + CMSInterferenceFunc const& other, const char* name + ) : + RooAbsReal(other, name), x_("x", this, other.x_), + coefficients_("coefficients", this, other.coefficients_), + edges_(other.edges_), binscaling_(other.binscaling_), + sentry_(other.sentry_, name) +{ + initialize(); +} + +CMSInterferenceFunc::CMSInterferenceFunc( + const char* name, const char* title, RooRealVar& x, + RooArgList const& coefficients, const std::vector& edges, + const std::vector> binscaling + ) : + RooAbsReal(name, title), x_("x", "", this, x), + coefficients_("coefficients", "", this), + edges_(edges), binscaling_(binscaling), + sentry_(TString(name) + "_sentry", "", coefficients) +{ + coefficients_.add(coefficients); + initialize(); +} + +CMSInterferenceFunc::~CMSInterferenceFunc() = default; + +void CMSInterferenceFunc::printMultiline( + std::ostream& os, Int_t contents, Bool_t verbose, TString indent + ) const { + RooAbsReal::printMultiline(os, contents, verbose, indent); + os << ">> Sentry: " << sentry_.hasChanged(false) << "\n"; + sentry_.Print("v"); +} + +void CMSInterferenceFunc::initialize() const { + // take the opportunity to validate persistent data + size_t nbins = edges_.size() - 1; + size_t ncoef = coefficients_.getSize(); + + if ( binscaling_.size() != nbins ) { + throw std::invalid_argument( + "Number of bins as determined from bin edges (" + + std::to_string(nbins) + ") does not match bin" + " scaling array (" + std::to_string(binscaling_.size()) + ")" + ); + } + for (size_t i=0; i < nbins; ++i) { + if ( binscaling_[i].size() != ncoef*(ncoef+1)/2 ) { + throw std::invalid_argument( + "Length of bin scaling matrix upper triangle for bin " + std::to_string(i) + + " (" + std::to_string(binscaling_[i].size() ) + ") is not consistent" + + " with the length of the coefficient array (" + std::to_string(ncoef) + ")" + ); + } + } + + evaluator_ = std::make_unique<_InterferenceEval>(binscaling_, ncoef); +} + +void CMSInterferenceFunc::updateCache() const { + for (int i=0; i < coefficients_.getSize(); ++i) { + evaluator_->setCoefficient(i, dynamic_cast(coefficients_.at(i))->getVal()); + } + evaluator_->computeValues(); +} + +double CMSInterferenceFunc::evaluate() const { + if ( sentry_.hasChanged(true) ) updateCache(); + + auto it = std::upper_bound(std::begin(edges_), std::end(edges_), x_->getVal()); + if ( (it == std::begin(edges_)) or (it == std::end(edges_)) ) { + return 0.0; + } + size_t idx = std::distance(std::begin(edges_), it) - 1; + return evaluator_->getValues()[idx]; +} + +const std::vector& CMSInterferenceFunc::batchGetBinValues() const { + // we don't really expect the cache to be valid, as upstream callers are + // managing their own and calling this only when dirty, but let's check anyway + if ( not sentry_.hasChanged(true) ) updateCache(); + return evaluator_->getValues(); +} + diff --git a/src/classes.h b/src/classes.h index fc5ece7e62a..41ad96a356a 100644 --- a/src/classes.h +++ b/src/classes.h @@ -66,3 +66,4 @@ #include "HiggsAnalysis/CombinedLimit/interface/RooCheapProduct.h" #include "HiggsAnalysis/CombinedLimit/interface/CMSHggFormula.h" #include "HiggsAnalysis/CombinedLimit/interface/SimpleProdPdf.h" +#include "HiggsAnalysis/CombinedLimit/interface/CMSInterferenceFunc.h" diff --git a/src/classes_def.xml b/src/classes_def.xml index ae303590427..43a07cebb72 100644 --- a/src/classes_def.xml +++ b/src/classes_def.xml @@ -221,4 +221,8 @@ + + + initialize();]]> + From 8c494e800be80c78994b672c36c26271564eaebc Mon Sep 17 00:00:00 2001 From: Nick Smith Date: Tue, 13 Jun 2023 10:25:50 -0500 Subject: [PATCH 03/98] Give up on RooChangeTracker, add hook in CMSHistFunc --- interface/CMSHistFunc.h | 10 +++++++-- interface/CMSInterferenceFunc.h | 9 +++----- src/CMSHistFunc.cc | 37 ++++++++++++++++++++++++++++++--- src/CMSInterferenceFunc.cxx | 22 +++++++++++++------- src/classes_def.xml | 3 --- 5 files changed, 59 insertions(+), 22 deletions(-) diff --git a/interface/CMSHistFunc.h b/interface/CMSHistFunc.h index 53c09837458..2c8ee8b509a 100644 --- a/interface/CMSHistFunc.h +++ b/interface/CMSHistFunc.h @@ -15,6 +15,7 @@ #include "CMSHistV.h" #include "FastTemplate_Old.h" #include "SimpleCacheSentry.h" +#include "CMSInterferenceFunc.h" class CMSHistFuncWrapper; @@ -85,7 +86,7 @@ class CMSHistFunc : public RooAbsReal { virtual TObject* clone(const char* newname) const { return new CMSHistFunc(*this, newname); } - virtual ~CMSHistFunc() {} + virtual ~CMSHistFunc(); void addHorizontalMorph(RooAbsReal& hvar, TVectorD hpoints); @@ -148,6 +149,8 @@ class CMSHistFunc : public RooAbsReal { friend class CMSHistV; friend class CMSHistSum; + // TODO: allow any class that implements hasChanged() and batchGetBinValues() + void injectExternalMorph(CMSInterferenceFunc& morph); /* – RooAbsArg::setVerboseEval(Int_t level) • Level 0 – No messages @@ -190,6 +193,9 @@ class CMSHistFunc : public RooAbsReal { static bool enable_fast_vertical_; //! not to be serialized + // This is an "optional proxy", i.e. a list with either zero or one entry + RooListProxy external_morph_; + private: void initialize() const; void setGlobalCache() const; @@ -214,7 +220,7 @@ class CMSHistFunc : public RooAbsReal { void applyRebin() const; - ClassDef(CMSHistFunc, 1) + ClassDef(CMSHistFunc, 2) }; diff --git a/interface/CMSInterferenceFunc.h b/interface/CMSInterferenceFunc.h index 02391a680f2..4d8525b5027 100644 --- a/interface/CMSInterferenceFunc.h +++ b/interface/CMSInterferenceFunc.h @@ -6,8 +6,6 @@ #include "RooRealVar.h" #include "RooRealProxy.h" #include "RooListProxy.h" -#include "RooChangeTracker.h" - #include "SimpleCacheSentry.h" class _InterferenceEval; @@ -40,10 +38,8 @@ class CMSInterferenceFunc : public RooAbsReal { std::ostream& os, Int_t contents, Bool_t verbose, TString indent ) const override; - // public because it is called on deserializing, in classes_def.xml - void initialize() const; - // batch accessor for CMSHistFunc / CMSHistSum + bool hasChanged() const { return !sentry_.good(); }; const std::vector& batchGetBinValues() const; protected: @@ -52,12 +48,13 @@ class CMSInterferenceFunc : public RooAbsReal { std::vector edges_; std::vector> binscaling_; - mutable RooChangeTracker sentry_; //! + mutable SimpleCacheSentry sentry_; //! mutable std::unique_ptr<_InterferenceEval> evaluator_; //! double evaluate() const override; private: + void initialize() const; void updateCache() const; ClassDefOverride(CMSInterferenceFunc, 1) diff --git a/src/CMSHistFunc.cc b/src/CMSHistFunc.cc index 6c7463d7943..a05a5c1854f 100644 --- a/src/CMSHistFunc.cc +++ b/src/CMSHistFunc.cc @@ -48,7 +48,8 @@ CMSHistFunc::CMSHistFunc(const char* name, const char* title, RooRealVar& x, vtype_(VerticalSetting::QuadLinear), divide_by_width_(divide_by_width), vsmooth_par_(1.0), - fast_vertical_(false) { + fast_vertical_(false), + external_morph_("external_morph", "", this) { if (divide_by_width_) { for (unsigned i = 0; i < cache_.size(); ++i) { cache_[i] /= cache_.GetWidth(i); @@ -120,16 +121,25 @@ CMSHistFunc::CMSHistFunc(CMSHistFunc const& other, const char* name) vtype_(other.vtype_), divide_by_width_(other.divide_by_width_), vsmooth_par_(other.vsmooth_par_), - fast_vertical_(false) { + fast_vertical_(false), + external_morph_("external_morph", this, other.external_morph_) +{ // initialize(); } +CMSHistFunc::~CMSHistFunc() = default; + void CMSHistFunc::initialize() const { if (initialized_) return; vmorph_sentry_.SetName(TString(this->GetName()) + "_vmorph_sentry"); hmorph_sentry_.SetName(TString(this->GetName()) + "_hmorph_sentry"); hmorph_sentry_.addVars(hmorphs_); vmorph_sentry_.addVars(vmorphs_); + if ( external_morph_.getSize() ) { + RooArgSet* deps = external_morph_.at(0)->getParameters({*x_}); + vmorph_sentry_.addVars(*deps); + delete deps; + } hmorph_sentry_.setValueDirty(); vmorph_sentry_.setValueDirty(); vmorphs_vec_.resize(vmorphs_.getSize()); @@ -313,7 +323,8 @@ void CMSHistFunc::updateCache() const { if (mcache_.size() == 0) mcache_.resize(storage_.size()); } - if (step1) { + bool external_morph_updated = (external_morph_.getSize() && dynamic_cast(external_morph_.at(0))->hasChanged()); + if (step1 || external_morph_updated) { fast_vertical_ = false; } @@ -551,6 +562,16 @@ void CMSHistFunc::updateCache() const { } if (!fast_vertical_) { mcache_[idx].step2 = mcache_[idx].step1; + if ( external_morph_.getSize() ) { +#if HFVERBOSE > 0 + std::cout << "Template before external morph update:" << mcache_[idx].step2.Integral() << "\n"; + mcache_[idx].step2.Dump(); +#endif + auto& extdata = dynamic_cast(external_morph_.at(0))->batchGetBinValues(); + for(size_t i=0; i> Sentry: " << sentry_.hasChanged(false) << "\n"; + os << ">> Sentry: " << (sentry_.good() ? "clean" : "dirty") << "\n"; sentry_.Print("v"); } @@ -93,18 +91,25 @@ void CMSInterferenceFunc::initialize() const { } } + sentry_.SetName(TString(GetName()) + "_sentry"); + sentry_.addVars(coefficients_); + sentry_.setValueDirty(); evaluator_ = std::make_unique<_InterferenceEval>(binscaling_, ncoef); } void CMSInterferenceFunc::updateCache() const { for (int i=0; i < coefficients_.getSize(); ++i) { - evaluator_->setCoefficient(i, dynamic_cast(coefficients_.at(i))->getVal()); + auto* coef = dynamic_cast(coefficients_.at(i)); + if ( coef == nullptr ) throw std::runtime_error("Lost coef!"); + evaluator_->setCoefficient(i, coef->getVal()); } evaluator_->computeValues(); + sentry_.reset(); } double CMSInterferenceFunc::evaluate() const { - if ( sentry_.hasChanged(true) ) updateCache(); + if ( not evaluator_ ) initialize(); + if ( not sentry_.good() ) updateCache(); auto it = std::upper_bound(std::begin(edges_), std::end(edges_), x_->getVal()); if ( (it == std::begin(edges_)) or (it == std::end(edges_)) ) { @@ -117,7 +122,8 @@ double CMSInterferenceFunc::evaluate() const { const std::vector& CMSInterferenceFunc::batchGetBinValues() const { // we don't really expect the cache to be valid, as upstream callers are // managing their own and calling this only when dirty, but let's check anyway - if ( not sentry_.hasChanged(true) ) updateCache(); + if ( not evaluator_ ) initialize(); + if ( not sentry_.good() ) updateCache(); return evaluator_->getValues(); } diff --git a/src/classes_def.xml b/src/classes_def.xml index 43a07cebb72..61ff7496828 100644 --- a/src/classes_def.xml +++ b/src/classes_def.xml @@ -222,7 +222,4 @@ - - initialize();]]> - From 6619f7eb2904df94e8d13bbc9a2189973721898a Mon Sep 17 00:00:00 2001 From: Nick Smith Date: Tue, 13 Jun 2023 11:09:02 -0500 Subject: [PATCH 04/98] Add test to exercise functionality --- test/test_interference.py | 134 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100755 test/test_interference.py diff --git a/test/test_interference.py b/test/test_interference.py new file mode 100755 index 00000000000..29eee08e4f1 --- /dev/null +++ b/test/test_interference.py @@ -0,0 +1,134 @@ +#!/usr/bin/env python3 +import ROOT +import numpy as np +import subprocess + + +def array2vector_2d(array): + assert len(array.shape) == 2 + out = ROOT.std.vector["std::vector"]() + out.reserve(len(array)) + for row in array: + out.push_back(row) + return out + + +def to_TH1(name, array): + h = ROOT.TH1D(name, name, 20, 250, 1200) + for i, val in enumerate(array): + h.SetBinContent(i+1, val) + return h + + +# make some shapes +fout = ROOT.TFile("shapes.root", "recreate") +nom = 100 * np.array([0.14253603, 0.21781641, 0.22698837, 0.19603483, 0.19259561, 0.15552859, 0.13909682, 0.09438712, 0.08521593, 0.06878416, 0.06419854, 0.04318116, 0.04776676, 0.03057073, 0.02866007, 0.02292805, 0.02139951, 0.02063524, 0.01222829, 0.01337466]) +obs = nom.copy() + +hnom = to_TH1("VBFHH", nom) +for i, val in enumerate(nom): + hnom.SetBinError(i+1, np.sqrt(val)*0.1) +hnom.Write() +to_TH1("VBFHH_jesUp", nom*np.linspace(0.95, 1.05, 20)).Write() +to_TH1("VBFHH_jesDown", nom/np.linspace(0.95, 1.05, 20)).Write() + +nom = 100*np.exp(-np.linspace(0, 1, 20)) +obs += nom +hnom = to_TH1("background", nom) +for i, val in enumerate(nom): + hnom.SetBinError(i+1, np.sqrt(val)*0.1) +hnom.Write() +to_TH1("background_jesUp", nom*np.linspace(0.95, 1.05, 20)).Write() +to_TH1("background_jesDown", nom/np.linspace(0.95, 1.05, 20)).Write() + +to_TH1("data_obs", np.round(obs)).Write() + +# write a card +with open("card.txt", "w") as fout: + fout.write("""\ +Combination of card.txt +imax 1 number of bins +jmax 1 number of processes minus 1 +kmax 3 number of nuisance parameters +---------------------------------------------------------------------------------------------------------------------------------- +shapes * ch1 shapes.root $PROCESS $PROCESS_$SYSTEMATIC +---------------------------------------------------------------------------------------------------------------------------------- +bin ch1 +observation -1 +---------------------------------------------------------------------------------------------------------------------------------- +bin ch1 ch1 +process VBFHH background +process 0 1 +rate -1 -1 +---------------------------------------------------------------------------------------------------------------------------------- +bgnorm lnN - 1.3 +jes shape 1.0 1.0 +lumi lnN 1.02 1.02 +* autoMCStats 0 +""") + +subprocess.call("text2workspace.py card.txt".split(" ")) +fcard = ROOT.TFile.Open("card.root") +w = fcard.Get("w") + +scaling = array2vector_2d( + np.array( + [ + [ 3.303536746664150e00, -8.541709820382220e00, 4.235348320712800e00, 2.296464188467882e01, -1.107996258835088e01, 5.504469544697623e00, ], + [ 2.206443321428910e00, -7.076836641962523e00, 4.053185685866683e00, 2.350989689214267e01, -1.308569222837996e01, 7.502346155380032e00, ], + [ 2.323314512827915e00, -9.040565356058327e00, 6.135410429832603e00, 3.597836755817654e01, -2.387500375686657e01, 1.625863529518014e01, ], + [ 5.925805332888091e-01, -3.139640204484572e00, 1.976422909655008e00, 1.713589230378096e01, -1.051500934722200e01, 6.627980447033357e00, ], + [ 3.505170703269003e-01, -2.237551781735236e00, 1.483246407331564e00, 1.484170437843385e01, -9.493221195626012e00, 6.302831691298613e00, ], + [ 2.334740816002986e-01, -1.799815305424720e00, 1.225734691240980e00, 1.440275907010786e01, -9.473328823485497e00, 6.458585723630323e00, ], + [ 1.959374052725543e-01, -1.757624939190617e00, 1.257071800464856e00, 1.626453309470772e01, -1.127433100208976e01, 8.089297781650776e00, ], + [ 1.865040295194290e-01, -1.822069966644771e00, 1.391201452068932e00, 1.849884116334009e01, -1.360944960795888e01, 1.039529105220993e01, ], + [ 9.726648808697150e-02, -1.169327097322687e00, 8.635283997541450e-01, 1.459008882076805e01, -1.037926824643990e01, 7.682778579161866e00, ], + [ 8.780552015079510e-02, -1.156467907936071e00, 9.032722960981284e-01, 1.589008007570035e01, -1.189269332401088e01, 9.313892275846490e00, ], + [ 2.006114827320551e-01, -2.776793529232688e00, 2.335437756631023e00, 3.912099794229794e01, -3.232054661687562e01, 2.720219535392458e01, ], + [ 5.179066270217598e-02, -8.550833654170061e-01, 6.753041305320768e-01, 1.482948643635128e01, -1.117147343869588e01, 8.821228248108168e00, ], + [ 5.095452842967559e-02, -9.482107499527080e-01, 7.561787601252029e-01, 1.825692153880631e01, -1.408060600559859e01, 1.123739992361621e01, ], + [ 1.801729907958822e-02, -4.102710173962256e-01, 2.950547079487041e-01, 9.828612567782274e00, -6.724075992501888e00, 4.831954737036956e00, ], + [ 2.762233787081839e-02, -6.400852678490596e-01, 5.127706114146487e-01, 1.546123935330864e01, -1.188156027745066e01, 9.528888176590677e00, ], + [ 3.165499001015300e-02, -7.790988142691099e-01, 6.486071576135261e-01, 1.986193598270219e01, -1.597020317079789e01, 1.330779868219462e01, ], + [ 1.316620750610005e-02, -3.821583465978776e-01, 2.914985575363581e-01, 1.167177892863827e01, -8.480579644763935e00, 6.457533731506537e00, ], + [ 2.886802887767344e-02, -8.369930524359994e-01, 7.103796160970196e-01, 2.491187028333814e01, -2.057801184441048e01, 1.746851224928310e01, ], + [ 2.930989281275648e-02, -9.242683589392606e-01, 7.918145320034853e-01, 2.981526833971985e01, -2.501001674094063e01, 2.144036290322020e01, ], + [ 5.160360892358020e-02, -1.673006024492507e00, 1.526329404862879e00, 5.506880032083917e01, -4.949344845658728e01, 4.515984622267106e01, ], + ] + ) +) + +kv, k2v, kl = ( + w.factory("kv[1, 0, 2]"), + w.factory("k2v[1, 0, 2]"), + w.factory("kl[1, 0, 2]"), +) + +w.Import( + ROOT.CMSInterferenceFunc( + "ch1_vbfhh_morph", + "", + w.var("CMS_th1x"), + ROOT.RooArgList( + w.factory("expr('@0*@1', kv, kl)"), + w.factory("expr('@0*@0', kv)"), + k2v, + ), + list(range(21)), + scaling, + ), + ROOT.RooFit.RecycleConflictNodes() +) +func = w.function("ch1_vbfhh_morph") +print(func.getVal()) + +histfunc = w.function("shapeSig_ch1_VBFHH_morph") +histfunc.injectExternalMorph(func) + +fout = ROOT.TFile("card_morph.root", "recreate") +w.Write() +fout.Close() + +subprocess.call( + "combine -M MultiDimFit card_morph.root --redefineSignalPOIs kv,k2v,kl --freezeParameters r --setParameters r=1,kv=1,k2v=1,kl=1 -t 100".split(" ") +) From a62418d2ebde5395765efa80a0322eab2f5a64f7 Mon Sep 17 00:00:00 2001 From: Nick Smith Date: Tue, 13 Jun 2023 11:18:07 -0500 Subject: [PATCH 05/98] Lint --- test/test_interference.py | 249 +++++++++++++++++++++++++++++++------- 1 file changed, 208 insertions(+), 41 deletions(-) diff --git a/test/test_interference.py b/test/test_interference.py index 29eee08e4f1..dee90307dd9 100755 --- a/test/test_interference.py +++ b/test/test_interference.py @@ -16,36 +16,60 @@ def array2vector_2d(array): def to_TH1(name, array): h = ROOT.TH1D(name, name, 20, 250, 1200) for i, val in enumerate(array): - h.SetBinContent(i+1, val) + h.SetBinContent(i + 1, val) return h # make some shapes fout = ROOT.TFile("shapes.root", "recreate") -nom = 100 * np.array([0.14253603, 0.21781641, 0.22698837, 0.19603483, 0.19259561, 0.15552859, 0.13909682, 0.09438712, 0.08521593, 0.06878416, 0.06419854, 0.04318116, 0.04776676, 0.03057073, 0.02866007, 0.02292805, 0.02139951, 0.02063524, 0.01222829, 0.01337466]) +nom = 100 * np.array( + [ + 0.14253603, + 0.21781641, + 0.22698837, + 0.19603483, + 0.19259561, + 0.15552859, + 0.13909682, + 0.09438712, + 0.08521593, + 0.06878416, + 0.06419854, + 0.04318116, + 0.04776676, + 0.03057073, + 0.02866007, + 0.02292805, + 0.02139951, + 0.02063524, + 0.01222829, + 0.01337466, + ] +) obs = nom.copy() hnom = to_TH1("VBFHH", nom) for i, val in enumerate(nom): - hnom.SetBinError(i+1, np.sqrt(val)*0.1) + hnom.SetBinError(i + 1, np.sqrt(val) * 0.1) hnom.Write() -to_TH1("VBFHH_jesUp", nom*np.linspace(0.95, 1.05, 20)).Write() -to_TH1("VBFHH_jesDown", nom/np.linspace(0.95, 1.05, 20)).Write() +to_TH1("VBFHH_jesUp", nom * np.linspace(0.95, 1.05, 20)).Write() +to_TH1("VBFHH_jesDown", nom / np.linspace(0.95, 1.05, 20)).Write() -nom = 100*np.exp(-np.linspace(0, 1, 20)) +nom = 100 * np.exp(-np.linspace(0, 1, 20)) obs += nom hnom = to_TH1("background", nom) for i, val in enumerate(nom): - hnom.SetBinError(i+1, np.sqrt(val)*0.1) + hnom.SetBinError(i + 1, np.sqrt(val) * 0.1) hnom.Write() -to_TH1("background_jesUp", nom*np.linspace(0.95, 1.05, 20)).Write() -to_TH1("background_jesDown", nom/np.linspace(0.95, 1.05, 20)).Write() +to_TH1("background_jesUp", nom * np.linspace(0.95, 1.05, 20)).Write() +to_TH1("background_jesDown", nom / np.linspace(0.95, 1.05, 20)).Write() to_TH1("data_obs", np.round(obs)).Write() # write a card with open("card.txt", "w") as fout: - fout.write("""\ + fout.write( + """\ Combination of card.txt imax 1 number of bins jmax 1 number of processes minus 1 @@ -53,19 +77,20 @@ def to_TH1(name, array): ---------------------------------------------------------------------------------------------------------------------------------- shapes * ch1 shapes.root $PROCESS $PROCESS_$SYSTEMATIC ---------------------------------------------------------------------------------------------------------------------------------- -bin ch1 -observation -1 +bin ch1 +observation -1 ---------------------------------------------------------------------------------------------------------------------------------- -bin ch1 ch1 +bin ch1 ch1 process VBFHH background -process 0 1 -rate -1 -1 +process 0 1 +rate -1 -1 ---------------------------------------------------------------------------------------------------------------------------------- -bgnorm lnN - 1.3 -jes shape 1.0 1.0 -lumi lnN 1.02 1.02 +bgnorm lnN - 1.3 +jes shape 1.0 1.0 +lumi lnN 1.02 1.02 * autoMCStats 0 -""") +""" + ) subprocess.call("text2workspace.py card.txt".split(" ")) fcard = ROOT.TFile.Open("card.root") @@ -74,26 +99,166 @@ def to_TH1(name, array): scaling = array2vector_2d( np.array( [ - [ 3.303536746664150e00, -8.541709820382220e00, 4.235348320712800e00, 2.296464188467882e01, -1.107996258835088e01, 5.504469544697623e00, ], - [ 2.206443321428910e00, -7.076836641962523e00, 4.053185685866683e00, 2.350989689214267e01, -1.308569222837996e01, 7.502346155380032e00, ], - [ 2.323314512827915e00, -9.040565356058327e00, 6.135410429832603e00, 3.597836755817654e01, -2.387500375686657e01, 1.625863529518014e01, ], - [ 5.925805332888091e-01, -3.139640204484572e00, 1.976422909655008e00, 1.713589230378096e01, -1.051500934722200e01, 6.627980447033357e00, ], - [ 3.505170703269003e-01, -2.237551781735236e00, 1.483246407331564e00, 1.484170437843385e01, -9.493221195626012e00, 6.302831691298613e00, ], - [ 2.334740816002986e-01, -1.799815305424720e00, 1.225734691240980e00, 1.440275907010786e01, -9.473328823485497e00, 6.458585723630323e00, ], - [ 1.959374052725543e-01, -1.757624939190617e00, 1.257071800464856e00, 1.626453309470772e01, -1.127433100208976e01, 8.089297781650776e00, ], - [ 1.865040295194290e-01, -1.822069966644771e00, 1.391201452068932e00, 1.849884116334009e01, -1.360944960795888e01, 1.039529105220993e01, ], - [ 9.726648808697150e-02, -1.169327097322687e00, 8.635283997541450e-01, 1.459008882076805e01, -1.037926824643990e01, 7.682778579161866e00, ], - [ 8.780552015079510e-02, -1.156467907936071e00, 9.032722960981284e-01, 1.589008007570035e01, -1.189269332401088e01, 9.313892275846490e00, ], - [ 2.006114827320551e-01, -2.776793529232688e00, 2.335437756631023e00, 3.912099794229794e01, -3.232054661687562e01, 2.720219535392458e01, ], - [ 5.179066270217598e-02, -8.550833654170061e-01, 6.753041305320768e-01, 1.482948643635128e01, -1.117147343869588e01, 8.821228248108168e00, ], - [ 5.095452842967559e-02, -9.482107499527080e-01, 7.561787601252029e-01, 1.825692153880631e01, -1.408060600559859e01, 1.123739992361621e01, ], - [ 1.801729907958822e-02, -4.102710173962256e-01, 2.950547079487041e-01, 9.828612567782274e00, -6.724075992501888e00, 4.831954737036956e00, ], - [ 2.762233787081839e-02, -6.400852678490596e-01, 5.127706114146487e-01, 1.546123935330864e01, -1.188156027745066e01, 9.528888176590677e00, ], - [ 3.165499001015300e-02, -7.790988142691099e-01, 6.486071576135261e-01, 1.986193598270219e01, -1.597020317079789e01, 1.330779868219462e01, ], - [ 1.316620750610005e-02, -3.821583465978776e-01, 2.914985575363581e-01, 1.167177892863827e01, -8.480579644763935e00, 6.457533731506537e00, ], - [ 2.886802887767344e-02, -8.369930524359994e-01, 7.103796160970196e-01, 2.491187028333814e01, -2.057801184441048e01, 1.746851224928310e01, ], - [ 2.930989281275648e-02, -9.242683589392606e-01, 7.918145320034853e-01, 2.981526833971985e01, -2.501001674094063e01, 2.144036290322020e01, ], - [ 5.160360892358020e-02, -1.673006024492507e00, 1.526329404862879e00, 5.506880032083917e01, -4.949344845658728e01, 4.515984622267106e01, ], + [ + 3.303536746664150e00, + -8.541709820382220e00, + 4.235348320712800e00, + 2.296464188467882e01, + -1.107996258835088e01, + 5.504469544697623e00, + ], + [ + 2.206443321428910e00, + -7.076836641962523e00, + 4.053185685866683e00, + 2.350989689214267e01, + -1.308569222837996e01, + 7.502346155380032e00, + ], + [ + 2.323314512827915e00, + -9.040565356058327e00, + 6.135410429832603e00, + 3.597836755817654e01, + -2.387500375686657e01, + 1.625863529518014e01, + ], + [ + 5.925805332888091e-01, + -3.139640204484572e00, + 1.976422909655008e00, + 1.713589230378096e01, + -1.051500934722200e01, + 6.627980447033357e00, + ], + [ + 3.505170703269003e-01, + -2.237551781735236e00, + 1.483246407331564e00, + 1.484170437843385e01, + -9.493221195626012e00, + 6.302831691298613e00, + ], + [ + 2.334740816002986e-01, + -1.799815305424720e00, + 1.225734691240980e00, + 1.440275907010786e01, + -9.473328823485497e00, + 6.458585723630323e00, + ], + [ + 1.959374052725543e-01, + -1.757624939190617e00, + 1.257071800464856e00, + 1.626453309470772e01, + -1.127433100208976e01, + 8.089297781650776e00, + ], + [ + 1.865040295194290e-01, + -1.822069966644771e00, + 1.391201452068932e00, + 1.849884116334009e01, + -1.360944960795888e01, + 1.039529105220993e01, + ], + [ + 9.726648808697150e-02, + -1.169327097322687e00, + 8.635283997541450e-01, + 1.459008882076805e01, + -1.037926824643990e01, + 7.682778579161866e00, + ], + [ + 8.780552015079510e-02, + -1.156467907936071e00, + 9.032722960981284e-01, + 1.589008007570035e01, + -1.189269332401088e01, + 9.313892275846490e00, + ], + [ + 2.006114827320551e-01, + -2.776793529232688e00, + 2.335437756631023e00, + 3.912099794229794e01, + -3.232054661687562e01, + 2.720219535392458e01, + ], + [ + 5.179066270217598e-02, + -8.550833654170061e-01, + 6.753041305320768e-01, + 1.482948643635128e01, + -1.117147343869588e01, + 8.821228248108168e00, + ], + [ + 5.095452842967559e-02, + -9.482107499527080e-01, + 7.561787601252029e-01, + 1.825692153880631e01, + -1.408060600559859e01, + 1.123739992361621e01, + ], + [ + 1.801729907958822e-02, + -4.102710173962256e-01, + 2.950547079487041e-01, + 9.828612567782274e00, + -6.724075992501888e00, + 4.831954737036956e00, + ], + [ + 2.762233787081839e-02, + -6.400852678490596e-01, + 5.127706114146487e-01, + 1.546123935330864e01, + -1.188156027745066e01, + 9.528888176590677e00, + ], + [ + 3.165499001015300e-02, + -7.790988142691099e-01, + 6.486071576135261e-01, + 1.986193598270219e01, + -1.597020317079789e01, + 1.330779868219462e01, + ], + [ + 1.316620750610005e-02, + -3.821583465978776e-01, + 2.914985575363581e-01, + 1.167177892863827e01, + -8.480579644763935e00, + 6.457533731506537e00, + ], + [ + 2.886802887767344e-02, + -8.369930524359994e-01, + 7.103796160970196e-01, + 2.491187028333814e01, + -2.057801184441048e01, + 1.746851224928310e01, + ], + [ + 2.930989281275648e-02, + -9.242683589392606e-01, + 7.918145320034853e-01, + 2.981526833971985e01, + -2.501001674094063e01, + 2.144036290322020e01, + ], + [ + 5.160360892358020e-02, + -1.673006024492507e00, + 1.526329404862879e00, + 5.506880032083917e01, + -4.949344845658728e01, + 4.515984622267106e01, + ], ] ) ) @@ -117,7 +282,7 @@ def to_TH1(name, array): list(range(21)), scaling, ), - ROOT.RooFit.RecycleConflictNodes() + ROOT.RooFit.RecycleConflictNodes(), ) func = w.function("ch1_vbfhh_morph") print(func.getVal()) @@ -130,5 +295,7 @@ def to_TH1(name, array): fout.Close() subprocess.call( - "combine -M MultiDimFit card_morph.root --redefineSignalPOIs kv,k2v,kl --freezeParameters r --setParameters r=1,kv=1,k2v=1,kl=1 -t 100".split(" ") + "combine -M MultiDimFit card_morph.root --redefineSignalPOIs kv,k2v,kl --freezeParameters r --setParameters r=1,kv=1,k2v=1,kl=1 -t 100".split( + " " + ) ) From 7bc66a4dc99aad03023f3188c092929f6a565654 Mon Sep 17 00:00:00 2001 From: Nick Smith Date: Tue, 13 Jun 2023 11:22:24 -0500 Subject: [PATCH 06/98] Lint correctly --- test/test_interference.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/test/test_interference.py b/test/test_interference.py index dee90307dd9..4bfe43b9785 100755 --- a/test/test_interference.py +++ b/test/test_interference.py @@ -295,7 +295,5 @@ def to_TH1(name, array): fout.Close() subprocess.call( - "combine -M MultiDimFit card_morph.root --redefineSignalPOIs kv,k2v,kl --freezeParameters r --setParameters r=1,kv=1,k2v=1,kl=1 -t 100".split( - " " - ) + "combine -M MultiDimFit card_morph.root --redefineSignalPOIs kv,k2v,kl --freezeParameters r --setParameters r=1,kv=1,k2v=1,kl=1 -t 100".split(" ") ) From 1473ddf9671150e3994c8a35868f14ee003c7097 Mon Sep 17 00:00:00 2001 From: Nick Smith Date: Tue, 13 Jun 2023 12:28:39 -0500 Subject: [PATCH 07/98] Errant space is a problem on linux --- test/test_interference.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_interference.py b/test/test_interference.py index 4bfe43b9785..a5c302683c6 100755 --- a/test/test_interference.py +++ b/test/test_interference.py @@ -295,5 +295,5 @@ def to_TH1(name, array): fout.Close() subprocess.call( - "combine -M MultiDimFit card_morph.root --redefineSignalPOIs kv,k2v,kl --freezeParameters r --setParameters r=1,kv=1,k2v=1,kl=1 -t 100".split(" ") + "combine -M MultiDimFit card_morph.root --redefineSignalPOIs kv,k2v,kl --freezeParameters r --setParameters r=1,kv=1,k2v=1,kl=1 -t 100".split(" ") ) From 99b4ed944ce7510b91e16f8ff365dfc8891fa4a8 Mon Sep 17 00:00:00 2001 From: Kyle Cormier Date: Thu, 29 Jun 2023 17:13:15 +0200 Subject: [PATCH 08/98] Fix arguments for setting pdfindex when generating and fitting toys in tutorial --- docs/tutorial2023/parametric_exercise.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorial2023/parametric_exercise.md b/docs/tutorial2023/parametric_exercise.md index 4ff84b25f5b..c8131249fb3 100644 --- a/docs/tutorial2023/parametric_exercise.md +++ b/docs/tutorial2023/parametric_exercise.md @@ -890,7 +890,7 @@ Compile the datacard with: text2workspace.py datacard_part5.txt -m 125 ``` -The `RooMultiPdf` is a handy object for performing bias studies as all functions can be stored in a single workspace. You can then set which function is used for generating the toys with the `--setParameters pdfindex=i` option, and which function is used for fitting with `--setParameters pdfindex=i --freezeParameters pdfindex=j` options. +The `RooMultiPdf` is a handy object for performing bias studies as all functions can be stored in a single workspace. You can then set which function is used for generating the toys with the `--setParameters pdfindex_Tag0=i` option, and which function is used for fitting with `--setParameters pdfindex_Tag0=j --freezeParameters pdfindex_Tag0` options. * It would be a useful exercise to repeat the bias studies from part 4 but using the RooMultiPdf workspace. What happens when you do not freeze the index in the fitting step? From bea74052b59f179d020d6b31f075519a7e086a28 Mon Sep 17 00:00:00 2001 From: Nicholas Smith Date: Fri, 30 Jun 2023 11:32:56 -0500 Subject: [PATCH 09/98] Update index.md --- docs/index.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/index.md b/docs/index.md index d81b51385bf..c71d3702c2b 100644 --- a/docs/index.md +++ b/docs/index.md @@ -113,8 +113,7 @@ make -j 4 You will need to source `env_standalone.sh` each time you want to use the package, or add it to your login. ### Standalone compilation with LCG -LCG102 and above contains ROOT 6.26, which at the time of writing is not available in any CMSSW release. -This repo can be compiled against LCG with: +For compilation outside of CMSSW, for example to use ROOT versions not yet available in CMSSW, one can compile against LCG releases. The recipe shown below compiles with LCG_102 which contains ROOT 6.26: ```sh git clone https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit.git HiggsAnalysis/CombinedLimit cd HiggsAnalysis/CombinedLimit From 7db73223b80099a1b1528bb6cde352c9bb77ef9d Mon Sep 17 00:00:00 2001 From: Nicholas Smith Date: Fri, 30 Jun 2023 11:35:14 -0500 Subject: [PATCH 10/98] Update index.md --- docs/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/index.md b/docs/index.md index c71d3702c2b..fdff17f7c39 100644 --- a/docs/index.md +++ b/docs/index.md @@ -113,7 +113,7 @@ make -j 4 You will need to source `env_standalone.sh` each time you want to use the package, or add it to your login. ### Standalone compilation with LCG -For compilation outside of CMSSW, for example to use ROOT versions not yet available in CMSSW, one can compile against LCG releases. The recipe shown below compiles with LCG_102 which contains ROOT 6.26: +For compilation outside of CMSSW, for example to use ROOT versions not yet available in CMSSW, one can compile against LCG releases. The current default is to compile with LCG_102 which contains ROOT 6.26: ```sh git clone https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit.git HiggsAnalysis/CombinedLimit cd HiggsAnalysis/CombinedLimit From 34531133cda3f7375fb0170decc14648713c9fe0 Mon Sep 17 00:00:00 2001 From: Aliya Nigamova Date: Tue, 4 Jul 2023 12:18:54 +0200 Subject: [PATCH 11/98] test lcg-cmssw fix --- Makefile | 2 +- src/classes.h | 128 +++++++++++++++++++++++++------------------------- 2 files changed, 65 insertions(+), 65 deletions(-) diff --git a/Makefile b/Makefile index a43c619e9cc..06e935731e5 100644 --- a/Makefile +++ b/Makefile @@ -97,7 +97,7 @@ $(OBJ_DIR): @mkdir -p $(OBJ_DIR)/a $(OBJ_DIR)/a/$(DICTNAME).cc: $(SRC_DIR)/classes_def.xml | $(OBJ_DIR) - genreflex $(SRC_DIR)/classes.h -s $< -o $@ --deep --fail_on_warnings --rootmap=$(OBJ_DIR)/a/$(DICTNAME).rootmap --rootmap-lib=$(SONAME) -Isrc + genreflex $(SRC_DIR)/classes.h -s $< -o $@ --deep --fail_on_warnings --rootmap=$(OBJ_DIR)/a/$(DICTNAME).rootmap --rootmap-lib=$(SONAME) -Isrc -I$(PARENT_DIR) mv $(OBJ_DIR)/a/$(DICTNAME).rootmap $(LIB_DIR)/ mv $(OBJ_DIR)/a/$(DICTNAME)_rdict.pcm $(LIB_DIR)/ diff --git a/src/classes.h b/src/classes.h index c694cebcf24..fc5ece7e62a 100644 --- a/src/classes.h +++ b/src/classes.h @@ -1,68 +1,68 @@ -#include "../interface/TestProposal.h" -#include "../interface/DebugProposal.h" -#include "../interface/VerticalInterpPdf.h" -#include "../interface/VerticalInterpHistPdf.h" -#include "../interface/AsymPow.h" -#include "../interface/AsymQuad.h" -#include "../interface/CombDataSetFactory.h" -#include "../interface/TH1Keys.h" -#include "../interface/RooSimultaneousOpt.h" -#include "../interface/SimpleCacheSentry.h" -#include "../interface/th1fmorph.h" -#include "../interface/HZZ4L_RooCTauPdf_1D.h" -#include "../interface/HZZ4L_RooCTauPdf_1D_Expanded.h" -#include "../interface/HZZ4L_RooCTauPdf_2D.h" -#include "../interface/HZZ4LRooPdfs.h" -#include "../interface/HWWLVJRooPdfs.h" -#include "../interface/HZZ2L2QRooPdfs.h" -#include "../interface/HGGRooPdfs.h" -#include "../interface/HZGRooPdfs.h" -#include "../interface/SequentialMinimizer.h" -#include "../interface/ProcessNormalization.h" -#include "../interface/RooRealFlooredSumPdf.h" -#include "../interface/RooSpline1D.h" -#include "../interface/RooSplineND.h" -#include "../interface/RooScaleLOSM.h" -#include "../interface/RooMultiPdf.h" -#include "../interface/RooBernsteinFast.h" -#include "../interface/SimpleGaussianConstraint.h" -#include "../interface/SimplePoissonConstraint.h" -#include "../interface/SimpleConstraintGroup.h" -#include "../interface/AtlasPdfs.h" -#include "../interface/FastTemplateFunc.h" -#include "../interface/HZZ4L_RooSpinZeroPdf.h" -#include "../interface/HZZ4L_RooSpinZeroPdf_1D.h" -#include "../interface/HZZ4L_RooSpinZeroPdf_2D.h" -#include "../interface/HZZ4L_RooSpinZeroPdf_phase.h" -#include "../interface/VBFHZZ4L_RooSpinZeroPdf.h" -#include "../interface/VBFHZZ4L_RooSpinZeroPdf_fast.h" +#include "HiggsAnalysis/CombinedLimit/interface/TestProposal.h" +#include "HiggsAnalysis/CombinedLimit/interface/DebugProposal.h" +#include "HiggsAnalysis/CombinedLimit/interface/VerticalInterpPdf.h" +#include "HiggsAnalysis/CombinedLimit/interface/VerticalInterpHistPdf.h" +#include "HiggsAnalysis/CombinedLimit/interface/AsymPow.h" +#include "HiggsAnalysis/CombinedLimit/interface/AsymQuad.h" +#include "HiggsAnalysis/CombinedLimit/interface/CombDataSetFactory.h" +#include "HiggsAnalysis/CombinedLimit/interface/TH1Keys.h" +#include "HiggsAnalysis/CombinedLimit/interface/RooSimultaneousOpt.h" +#include "HiggsAnalysis/CombinedLimit/interface/SimpleCacheSentry.h" +#include "HiggsAnalysis/CombinedLimit/interface/th1fmorph.h" +#include "HiggsAnalysis/CombinedLimit/interface/HZZ4L_RooCTauPdf_1D.h" +#include "HiggsAnalysis/CombinedLimit/interface/HZZ4L_RooCTauPdf_1D_Expanded.h" +#include "HiggsAnalysis/CombinedLimit/interface/HZZ4L_RooCTauPdf_2D.h" +#include "HiggsAnalysis/CombinedLimit/interface/HZZ4LRooPdfs.h" +#include "HiggsAnalysis/CombinedLimit/interface/HWWLVJRooPdfs.h" +#include "HiggsAnalysis/CombinedLimit/interface/HZZ2L2QRooPdfs.h" +#include "HiggsAnalysis/CombinedLimit/interface/HGGRooPdfs.h" +#include "HiggsAnalysis/CombinedLimit/interface/HZGRooPdfs.h" +#include "HiggsAnalysis/CombinedLimit/interface/SequentialMinimizer.h" +#include "HiggsAnalysis/CombinedLimit/interface/ProcessNormalization.h" +#include "HiggsAnalysis/CombinedLimit/interface/RooRealFlooredSumPdf.h" +#include "HiggsAnalysis/CombinedLimit/interface/RooSpline1D.h" +#include "HiggsAnalysis/CombinedLimit/interface/RooSplineND.h" +#include "HiggsAnalysis/CombinedLimit/interface/RooScaleLOSM.h" +#include "HiggsAnalysis/CombinedLimit/interface/RooMultiPdf.h" +#include "HiggsAnalysis/CombinedLimit/interface/RooBernsteinFast.h" +#include "HiggsAnalysis/CombinedLimit/interface/SimpleGaussianConstraint.h" +#include "HiggsAnalysis/CombinedLimit/interface/SimplePoissonConstraint.h" +#include "HiggsAnalysis/CombinedLimit/interface/SimpleConstraintGroup.h" +#include "HiggsAnalysis/CombinedLimit/interface/AtlasPdfs.h" +#include "HiggsAnalysis/CombinedLimit/interface/FastTemplateFunc.h" +#include "HiggsAnalysis/CombinedLimit/interface/HZZ4L_RooSpinZeroPdf.h" +#include "HiggsAnalysis/CombinedLimit/interface/HZZ4L_RooSpinZeroPdf_1D.h" +#include "HiggsAnalysis/CombinedLimit/interface/HZZ4L_RooSpinZeroPdf_2D.h" +#include "HiggsAnalysis/CombinedLimit/interface/HZZ4L_RooSpinZeroPdf_phase.h" +#include "HiggsAnalysis/CombinedLimit/interface/VBFHZZ4L_RooSpinZeroPdf.h" +#include "HiggsAnalysis/CombinedLimit/interface/VBFHZZ4L_RooSpinZeroPdf_fast.h" -#include "../interface/HZZ4L_RooSpinZeroPdf_1D_fast.h" -#include "../interface/HZZ4L_RooSpinZeroPdf_2D_fast.h" -#include "../interface/HZZ4L_RooSpinZeroPdf_phase_fast.h" -#include "../interface/VVHZZ4L_RooSpinZeroPdf_1D_fast.h" +#include "HiggsAnalysis/CombinedLimit/interface/HZZ4L_RooSpinZeroPdf_1D_fast.h" +#include "HiggsAnalysis/CombinedLimit/interface/HZZ4L_RooSpinZeroPdf_2D_fast.h" +#include "HiggsAnalysis/CombinedLimit/interface/HZZ4L_RooSpinZeroPdf_phase_fast.h" +#include "HiggsAnalysis/CombinedLimit/interface/VVHZZ4L_RooSpinZeroPdf_1D_fast.h" -#include "../interface/HWWLVJJRooPdfs.h" -#include "../interface/RooMorphingPdf.h" -#include "../interface/RooParametricHist.h" -#include "../interface/RooParametricHist2D.h" -#include "../interface/RooParametricShapeBinPdf.h" -#include "../interface/GaussExp.h" -#include "../interface/RooDoubleCBFast.h" -#include "../interface/CMSHistFunc.h" -#include "../interface/CMSHistErrorPropagator.h" -#include "../interface/CMSHistSum.h" -#include "../interface/CMSHistFuncWrapper.h" -#include "../interface/RooTaylorExpansion.h" -#include "../interface/SimpleTaylorExpansion1D.h" +#include "HiggsAnalysis/CombinedLimit/interface/HWWLVJJRooPdfs.h" +#include "HiggsAnalysis/CombinedLimit/interface/RooMorphingPdf.h" +#include "HiggsAnalysis/CombinedLimit/interface/RooParametricHist.h" +#include "HiggsAnalysis/CombinedLimit/interface/RooParametricHist2D.h" +#include "HiggsAnalysis/CombinedLimit/interface/RooParametricShapeBinPdf.h" +#include "HiggsAnalysis/CombinedLimit/interface/GaussExp.h" +#include "HiggsAnalysis/CombinedLimit/interface/RooDoubleCBFast.h" +#include "HiggsAnalysis/CombinedLimit/interface/CMSHistFunc.h" +#include "HiggsAnalysis/CombinedLimit/interface/CMSHistErrorPropagator.h" +#include "HiggsAnalysis/CombinedLimit/interface/CMSHistSum.h" +#include "HiggsAnalysis/CombinedLimit/interface/CMSHistFuncWrapper.h" +#include "HiggsAnalysis/CombinedLimit/interface/RooTaylorExpansion.h" +#include "HiggsAnalysis/CombinedLimit/interface/SimpleTaylorExpansion1D.h" -#include "../interface/RooPiecewisePolynomial.h" +#include "HiggsAnalysis/CombinedLimit/interface/RooPiecewisePolynomial.h" -#include "../interface/RooNCSplineCore.h" -#include "../interface/RooNCSpline_1D_fast.h" -#include "../interface/RooNCSpline_2D_fast.h" -#include "../interface/RooNCSpline_3D_fast.h" -#include "../interface/RooFuncPdf.h" -#include "../interface/RooCheapProduct.h" -#include "../interface/CMSHggFormula.h" -#include "../interface/SimpleProdPdf.h" +#include "HiggsAnalysis/CombinedLimit/interface/RooNCSplineCore.h" +#include "HiggsAnalysis/CombinedLimit/interface/RooNCSpline_1D_fast.h" +#include "HiggsAnalysis/CombinedLimit/interface/RooNCSpline_2D_fast.h" +#include "HiggsAnalysis/CombinedLimit/interface/RooNCSpline_3D_fast.h" +#include "HiggsAnalysis/CombinedLimit/interface/RooFuncPdf.h" +#include "HiggsAnalysis/CombinedLimit/interface/RooCheapProduct.h" +#include "HiggsAnalysis/CombinedLimit/interface/CMSHggFormula.h" +#include "HiggsAnalysis/CombinedLimit/interface/SimpleProdPdf.h" From 72ac5c2ee115c52420c3d882f342d027ba9d0ece Mon Sep 17 00:00:00 2001 From: nckw Date: Thu, 6 Jul 2023 09:45:23 +0100 Subject: [PATCH 12/98] Nckw add example teststat plots (#845) * Update plotter with more options * Add example figures of test-stat distributions * Fix linter * Better placement of figures * Modifying options Modify options to use hyphens instead of underscore in `plotTestStatCLs.py` Added a warning to user if it looks like `--doublesided` option should be used and hasn't been used. --------- Co-authored-by: Nick Wardle --- docs/part3/commonstatsmethods.md | 15 +++++++++++++-- docs/part3/images/exampleLHC.jpg | Bin 0 -> 497365 bytes docs/part3/images/exampleTEV.jpg | Bin 0 -> 389924 bytes test/plotTestStatCLs.py | 20 ++++++++++++++++++++ test/plotting/qmuPlot.cxx | 19 ++++++++++++++++--- 5 files changed, 49 insertions(+), 5 deletions(-) create mode 100644 docs/part3/images/exampleLHC.jpg create mode 100644 docs/part3/images/exampleTEV.jpg diff --git a/docs/part3/commonstatsmethods.md b/docs/part3/commonstatsmethods.md index 0f25488ad90..03cf546eedd 100644 --- a/docs/part3/commonstatsmethods.md +++ b/docs/part3/commonstatsmethods.md @@ -599,10 +599,21 @@ The distributions of the test-statistic can also be plotted, at each value in th python test/plotTestStatCLs.py --input mygrid.root --poi r --val all --mass MASS ``` -The resulting output file will contain a canvas showing the distribution of the test statistic background only and signal+background hypothesis at each value of **r**. Use `--help` to see more options for this script. +The resulting output file will contain a canvas showing the distribution of the test statistic background only and signal+background hypothesis at each value of **r**. Use `--help` to see more options for this script. !!! info - If you used the TEV or LEP style test statistic (using the commands as described above), then you should include the option `--doublesided`, which will also take care of defining the correct integrals for $p_{\mu}$ and $p_{b}$. + If you used the TEV or LEP style test statistic (using the commands as described above), then you should include the option `--doublesided`, which will also take care of defining the correct integrals for $p_{\mu}$ and $p_{b}$. Click on the examples below to see what a typical output of this plotting tool will look like when using the LHC test statistic, or TEV test statistic. + +
+qLHC test stat example +![](images/exampleLHC.jpg) +
+ +
+qTEV test stat example +![](images/exampleTEV.jpg) +
+ ## Computing Significances with toys diff --git a/docs/part3/images/exampleLHC.jpg b/docs/part3/images/exampleLHC.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8c2c4143a9caf84bb784f357d9abf6aab1c3c399 GIT binary patch literal 497365 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ý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�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]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�qp2p#d0RDRI$<+Xu`XUc!j4V-~~>7uY9h(u~U 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¨Wx{Xwv>9$=s2(>kS5jm#Qzd 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 W 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

>!RnIqSucX8LOyjQEGY_uyy}!r&V_YzR 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 IdW^j1z{dP!t{cJO?V%FC+e6v!!2UYUz&Bx{1 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៪>#-^xqSRel7J!MZ13%L|t=|qCqp}oS7~? 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�PDs!zK)&xw5K$enue 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 z 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 0: @@ -167,8 +184,11 @@ def findPOIvals(fi, m): options.rebin, options.expected, options.quantileExpected, + options.sub_label, ) canvases.append(can.Clone()) + if options.save_as_pdf: + can.SaveAs(options.output + "_" + can.GetName() + ".pdf") ft.Close() ofile = ROOT.TFile(options.output, "RECREATE") for can in canvases: diff --git a/test/plotting/qmuPlot.cxx b/test/plotting/qmuPlot.cxx index 39c6983d4a1..e75bf6759ad 100644 --- a/test/plotting/qmuPlot.cxx +++ b/test/plotting/qmuPlot.cxx @@ -202,7 +202,7 @@ TCanvas *q0Plot(float mass, std::string poinam , float poival, int rebin=0, bool -TCanvas *qmuPlot(float mass, std::string poinam, double poival, int mode=0, int invert=0,int rebin=0, int runExpected_=0, double quantileExpected_=0.5) { +TCanvas *qmuPlot(float mass, std::string poinam, double poival, int mode=0, int invert=0,int rebin=0, int runExpected_=0, double quantileExpected_=0.5,std::string testStatSublabel="") { if (gFile == 0) { std::cerr << "You must have a file open " << std::endl; return 0; } TTree *t = (TTree *) gFile->Get("q"); if (t == 0) { std::cerr << "File " << gFile->GetName() << " does not contain a tree called 'q'" << std::endl; return 0; } @@ -213,6 +213,16 @@ TCanvas *qmuPlot(float mass, std::string poinam, double poival, int mode=0, int TH1F *qB; TH1F *qS; + // check if should use --doublesided (mode==1) option + if (mode==0) { + TH1F *qTest; + t->Draw("2*q>>qTest","weight*(type==-1)"); + qTest = (TH1F*) gROOT->FindObject("qTest")->Clone(); + if (qTest->Integral(1,qTest->FindBin(0)) > 0.3*qTest->Integral()) { + std::cout << "WARNING -- It looks like you are using either the TEV or LEP style test-statistic. If so, you should use the option --doublesided" << std::endl; + } + } + if (mode==0) t->Draw("max(2*q,0)>>qB","weight*(type==-1)"); else t->Draw("2*q>>qB","weight*(type==-1)"); @@ -321,7 +331,9 @@ TCanvas *qmuPlot(float mass, std::string poinam, double poival, int mode=0, int } leg1->AddEntry(qO, "observed value", "L"); - TLegend *leg2 = new TLegend(.63,.67,.93,.48); + TLegend *leg2; + if (mode==0) leg2 = new TLegend(.63,.67,.93,.48); + else leg2 = new TLegend(.13,.87,.43,.68); leg2->SetFillColor(0); leg2->SetShadowColor(0); leg2->SetTextFont(42); @@ -354,7 +366,8 @@ TCanvas *qmuPlot(float mass, std::string poinam, double poival, int mode=0, int leg2->Draw(); qB->SetTitle(""); qB->GetYaxis()->SetTitle(""); - qB->GetXaxis()->SetTitle(Form("q_{%s}(%s = %g, m_{H} = %g GeV)",poinam.c_str(),poinam.c_str(),poival,mass)); + if (testStatSublabel.length()>0) qB->GetXaxis()->SetTitle(Form("q_{%s}(%s = %g, m_{H} = %g GeV)",testStatSublabel.c_str(),poinam.c_str(),poival,mass)); + else qB->GetXaxis()->SetTitle(Form("q_{%s}(%s = %g, m_{H} = %g GeV)",poinam.c_str(),poinam.c_str(),poival,mass)); qB->GetXaxis()->SetTitleOffset(1.05); From 0ffe287d75af3fdeac64685026887c1d8457f961 Mon Sep 17 00:00:00 2001 From: nckw Date: Thu, 6 Jul 2023 09:54:33 +0100 Subject: [PATCH 13/98] Update commonstatsmethods.md Need to use html inside details block --- docs/part3/commonstatsmethods.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/part3/commonstatsmethods.md b/docs/part3/commonstatsmethods.md index 03cf546eedd..412e093d9b0 100644 --- a/docs/part3/commonstatsmethods.md +++ b/docs/part3/commonstatsmethods.md @@ -606,12 +606,12 @@ The resulting output file will contain a canvas showing the distribution of the
qLHC test stat example -![](images/exampleLHC.jpg) +
qTEV test stat example -![](images/exampleTEV.jpg) +
From 7f88d6268773a11679595ccd6c05236c51416b21 Mon Sep 17 00:00:00 2001 From: nckw Date: Thu, 6 Jul 2023 09:56:41 +0100 Subject: [PATCH 14/98] Update mystyle.css --- docs/mystyle.css | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/docs/mystyle.css b/docs/mystyle.css index b98f18b87a2..c772445bda6 100644 --- a/docs/mystyle.css +++ b/docs/mystyle.css @@ -6,3 +6,22 @@ overflow-y: auto } } + +details > summary { + padding: 2px 6px; + width: 15em; + background-color: #ddd; + border: none; + cursor: pointer; +} + +details > p { + border-radius: 0 0 10px 10px; + background-color: #ddd; + padding: 2px 6px; + margin: 0; +} + +details[open] > summary { + background-color: #ccf; +} From e9948b8954cf8db8b4734a2f7fd20c9f947bc8d0 Mon Sep 17 00:00:00 2001 From: nckw Date: Thu, 6 Jul 2023 09:57:57 +0100 Subject: [PATCH 15/98] Update commonstatsmethods.md trying again with proper path --- docs/part3/commonstatsmethods.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/part3/commonstatsmethods.md b/docs/part3/commonstatsmethods.md index 412e093d9b0..251df526bc5 100644 --- a/docs/part3/commonstatsmethods.md +++ b/docs/part3/commonstatsmethods.md @@ -606,12 +606,12 @@ The resulting output file will contain a canvas showing the distribution of the
qLHC test stat example - +
qTEV test stat example - +
From c92a2e4aaa2d9b6ce08d95e646ed41fc067c666f Mon Sep 17 00:00:00 2001 From: nckw Date: Thu, 6 Jul 2023 10:01:53 +0100 Subject: [PATCH 16/98] Update mystyle.css Make details boxes more visible --- docs/mystyle.css | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/mystyle.css b/docs/mystyle.css index c772445bda6..888130bf17a 100644 --- a/docs/mystyle.css +++ b/docs/mystyle.css @@ -7,6 +7,11 @@ } } +details { + font: 16px "Open Sans", Calibri, sans-serif; + width: 620px; +} + details > summary { padding: 2px 6px; width: 15em; From e2b1a2aee2a365b5e818b43977135247b68f2783 Mon Sep 17 00:00:00 2001 From: nckw Date: Thu, 6 Jul 2023 10:08:09 +0100 Subject: [PATCH 17/98] Update commonstatsmethods.md Resize and apply proper path --- docs/part3/commonstatsmethods.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/part3/commonstatsmethods.md b/docs/part3/commonstatsmethods.md index 251df526bc5..4378fceef1b 100644 --- a/docs/part3/commonstatsmethods.md +++ b/docs/part3/commonstatsmethods.md @@ -606,12 +606,12 @@ The resulting output file will contain a canvas showing the distribution of the
qLHC test stat example - +
qTEV test stat example - +
From 4c65e489dc669853e2dc2b494c835aad46ff0832 Mon Sep 17 00:00:00 2001 From: nckw Date: Thu, 6 Jul 2023 10:23:40 +0100 Subject: [PATCH 18/98] Update commonstatsmethods.md Trying will full raw path (why is this necessary?) --- docs/part3/commonstatsmethods.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/part3/commonstatsmethods.md b/docs/part3/commonstatsmethods.md index 4378fceef1b..ae9f2652806 100644 --- a/docs/part3/commonstatsmethods.md +++ b/docs/part3/commonstatsmethods.md @@ -606,12 +606,12 @@ The resulting output file will contain a canvas showing the distribution of the
qLHC test stat example - +
qTEV test stat example - +
From 998c847cddc271355ee8b3c0a58f6b53fdecde94 Mon Sep 17 00:00:00 2001 From: Nick Wardle Date: Thu, 6 Jul 2023 12:45:51 +0200 Subject: [PATCH 19/98] Fixing issue with figures in details block --- docs/mystyle.css | 23 +++++------------------ docs/part3/commonstatsmethods.md | 17 +++++++++-------- mkdocs.yml | 1 + 3 files changed, 15 insertions(+), 26 deletions(-) diff --git a/docs/mystyle.css b/docs/mystyle.css index 888130bf17a..57f24c52e2b 100644 --- a/docs/mystyle.css +++ b/docs/mystyle.css @@ -8,25 +8,12 @@ } details { - font: 16px "Open Sans", Calibri, sans-serif; - width: 620px; + display: block; + border-left: 0.1em solid #909090; + padding-left: 0.5em; } -details > summary { - padding: 2px 6px; - width: 15em; - background-color: #ddd; - border: none; - cursor: pointer; +details[open] { + padding-bottom: 0.5em; } -details > p { - border-radius: 0 0 10px 10px; - background-color: #ddd; - padding: 2px 6px; - margin: 0; -} - -details[open] > summary { - background-color: #ccf; -} diff --git a/docs/part3/commonstatsmethods.md b/docs/part3/commonstatsmethods.md index ae9f2652806..94d0576e131 100644 --- a/docs/part3/commonstatsmethods.md +++ b/docs/part3/commonstatsmethods.md @@ -604,16 +604,17 @@ The resulting output file will contain a canvas showing the distribution of the !!! info If you used the TEV or LEP style test statistic (using the commands as described above), then you should include the option `--doublesided`, which will also take care of defining the correct integrals for $p_{\mu}$ and $p_{b}$. Click on the examples below to see what a typical output of this plotting tool will look like when using the LHC test statistic, or TEV test statistic. -
-qLHC test stat example - -
+/// details | **qLHC test stat example** -
-qTEV test stat example - -
+![](images/exampleLHC.jpg) + +/// + +/// details | **qTEV test stat example** + +![](images/exampleTEV.jpg) +/// ## Computing Significances with toys diff --git a/mkdocs.yml b/mkdocs.yml index d916a886f00..cea1e69861f 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -38,4 +38,5 @@ extra_javascript: markdown_extensions: - pymdownx.arithmatex - pymdownx.details + - pymdownx.blocks.details - admonition From c51be3fa40e235b52100ad53c17bee6cc9e566d8 Mon Sep 17 00:00:00 2001 From: kcormi <59726645+kcormi@users.noreply.github.com> Date: Thu, 6 Jul 2023 12:56:35 +0200 Subject: [PATCH 20/98] Documentation update (details blocks and absolute paths) (#848) * Add note on documentation local vs deployed * Updating to use details blocks with mkdocs * Switch to using mkdown details blocks uniformly in commonstatsmethods --------- Co-authored-by: nckw --- contributing.md | 4 +++ docs/part3/commonstatsmethods.md | 45 +++++++++++++++++++------------- 2 files changed, 31 insertions(+), 18 deletions(-) diff --git a/contributing.md b/contributing.md index 70075c735b0..172ed36f2b3 100644 --- a/contributing.md +++ b/contributing.md @@ -97,6 +97,10 @@ mkdocs serve from the main repository directory. mkdocs will then print a link you can open to check the page generated in your browser. +**NOTE:** mkdocs builds which use internal links (or images etc) with absolute paths will work for local deployment, but will break when deployed to the public documentations pages. +Please ensure you use relative paths. Currently, this is the only known feature where the behvaiour differs between local mkdocs and public pages deployment. +If you'd like to test the deployment directly, the suggested method is to set up a docs page using your personal github account; this should mimic the exact settings of the official page. + ## Big Contributions We welcome large contributions to combine. diff --git a/docs/part3/commonstatsmethods.md b/docs/part3/commonstatsmethods.md index 94d0576e131..ba7b69d7fda 100644 --- a/docs/part3/commonstatsmethods.md +++ b/docs/part3/commonstatsmethods.md @@ -186,8 +186,7 @@ Again, the resulting limit tree will contain the result. You can also save the c Exclusion regions can be made from the posterior once an ordering principle is defined to decide how to grow the contour (there's infinite possible regions that contain 68% of the posterior pdf). Below is a simple example script which can be used to plot the posterior distribution from these chains and calculate the *smallest* such region. Note that in this example we are ignoring the burn-in (but you can add it by just editing `for i in range(mychain.numEntries()):` to `for i in range(200,mychain.numEntries()):` eg for a burn-in of 200. -
-Show example script +/// details | **Show example script**

 import ROOT
 
@@ -250,7 +249,7 @@ lu.Draw()
 
 print " %g %% (%g %%) interval (target)  = %g < r < %g "%(trueCL,CL,vl,vu)
 
-
+/// Running the script on the output file produced for the same datacard (including the `--saveChain` option) will produce the following output @@ -360,8 +359,7 @@ For relatively simple models, the observed and expected limits can be calculated combine realistic-counting-experiment.txt -M HybridNew --LHCmode LHC-limits ``` -
-Show output +/// details | **Show output**
 <<< Combine >>>
 >>> including systematics
@@ -531,8 +529,9 @@ Fit to 5 points: 1.91034 +/- 0.0388334
  -- Hybrid New --
 Limit: r < 1.91034 +/- 0.0388334 @ 95% CL
 Done in 0.01 min (cpu), 4.09 min (real)
-Failed to delete temporary file roostats-Sprxsw.root: No such file or directory
-
+Failed to delete temporary file roostats-Sprxsw.root: No such file or directory + +/// The result stored in the **limit** branch of the output tree will be the upper limit (and its error stored in **limitErr**). The default behavior will be, as above, to search for the upper limit on **r** however, the values of $p_{\mu}, p_{b}$ and CLs can be calculated for a particular value **r=X** by specifying the option `--singlePoint=X`. In this case, the value stored in the branch **limit** will be the value of CLs (or $p_{\mu}$) (see the [FAQ](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part4/usefullinks/#faq) section). @@ -616,6 +615,7 @@ The resulting output file will contain a canvas showing the distribution of the /// + ## Computing Significances with toys Computation of expected significance with toys is a two step procedure: first you need to run one or more jobs to construct the expected distribution of the test statistic. As with setting limits, there are a number of different configurations for generating toys but we will use the preferred option using, @@ -724,11 +724,17 @@ combine -M FitDiagnostics -d combined_card.root -n _fit_CRonly_result --saveShap By taking the total background, the total signal, and the data shapes from FitDiagnostics output, we can compare the post-fit predictions from the S+B fit (first case) and the CR-only fit (second case) with the observation as reported below: -??? "FitDiagnostics S+B fit" - ![](images/result_fitSB.png) +/// details | **FitDiagnostics S+B fit** + +![](images/result_fitSB.png) + +/// + +/// details | **FitDiagnostics CR-only fit** -??? "FitDiagnostics CR-only fit" - ![](images/result_fitCRonly.png) +![](images/result_fitCRonly.png) + +/// To compute a p-value for the two results, one needs to compare the observed goodness-of-fit value previously computed with expected distribution of the test-statistic obtained in toys: @@ -739,11 +745,15 @@ To compute a p-value for the two results, one needs to compare the observed good where the former gives the result for the S+B model, while the latter gives the test-statistic for CR-only fit. The command `--setParameters r=0,mask_ch1=1` is needed to ensure that toys are thrown using the nuisance parameters estimated from the CR-only fit to the data. The comparison between the observation and the expected distribition should look like the following two plots: -??? "Goodness-of-fit for S+B model" - ![](images/gof_sb.png) +/// details | **Goodness-of-fit for S+B model** + +![](images/gof_sb.png) +/// -??? "Goodness-of-fit for CR-only model" - ![](images/gof_CRonly.png) +/// details | **Goodness-of-fit for CR-only model** + +![](images/gof_CRonly.png) +/// ### Making a plot of the GoF test-statistic distribution @@ -843,8 +853,7 @@ As an example, lets produce the $-2\Delta\ln{\mathcal{L}}$ scan as a function of combine toy-hgg-125.root -M MultiDimFit --algo grid --points 2000 --setParameterRanges r_qqH=0,10:r_ggH=0,4 -m 125 --fastScan ``` -
-Show output +/// details | **Show output**

  <<< Combine >>>
 >>> including systematics
@@ -880,7 +889,7 @@ Point 220/2025, (i,j) = (4,40), r_ggH = 0.400000, r_qqH = 9.000000
 
 Done in 0.00 min (cpu), 0.02 min (real)
 
-
+/// The scan, along with the best fit point can be drawn using root, From 4da56657c814cd379e2d89a582a250e3d03e6681 Mon Sep 17 00:00:00 2001 From: nckw Date: Thu, 6 Jul 2023 15:29:42 +0100 Subject: [PATCH 21/98] Update commonstatsmethods.md Remove 5-level headers (they look terrible and are not necessary) --- docs/part3/commonstatsmethods.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/part3/commonstatsmethods.md b/docs/part3/commonstatsmethods.md index ba7b69d7fda..2445ae81ef9 100644 --- a/docs/part3/commonstatsmethods.md +++ b/docs/part3/commonstatsmethods.md @@ -264,7 +264,7 @@ An example to make contours when ordering by probability density is in [bayesCon The `MarkovChainMC` algorithm has many configurable parameters, and you're encouraged to experiment with those because the default configuration might not be the best for you (or might not even work for you at all) -##### Iterations, burn-in, tries +#### Iterations, burn-in, tries Three parameters control how the MCMC integration is performed: @@ -272,7 +272,7 @@ Three parameters control how the MCMC integration is performed: - the number of **iterations** (option `-i`) determines how many points are proposed to fill a single Markov Chain. The default value is 10k, and a plausible range is between 5k (for quick checks) and 20-30k for lengthy calculations. Usually beyond 30k you get a better tradeoff in time vs accuracy by increasing the number of chains (option `--tries`) - the number of **burn-in steps** (option `-b`) is the number of points that are removed from the beginning of the chain before using it to compute the limit. The default is 200. If your chain is very long, you might want to try increase this a bit (e.g. to some hundreds). Instead going below 50 is probably dangerous. -##### Proposals +#### Proposals The option `--proposal` controls the way new points are proposed to fill in the MC chain. @@ -933,7 +933,7 @@ If you suspect your fits/uncertainties are not stable, you may also try to run c For a full list of options use `combine -M MultiDimFit --help` -##### Fitting only some parameters +#### Fitting only some parameters If your model contains more than one parameter of interest, you can still decide to fit a smaller number of them, using the option `--parameters` (or `-P`), with a syntax like this: @@ -1002,7 +1002,7 @@ The point belongs to your confidence region if $p_{x}$ is larger than $\alpha$ ( !!! warning You should not use this method without the option `--singlePoint`. Although combine will not complain, the algorithm to find the crossing will only find a single crossing and therefore not find the correct interval. Instead you should calculate the Feldman-Cousins intervals as described above. -#### Physical boundaries +### Physical boundaries Imposing physical boundaries (such as requiring $\mu>0$ for a signal strength) is achieved by setting the ranges of the physics model parameters using @@ -1026,11 +1026,11 @@ This can sometimes be an issue as Minuit may not know if has successfully conver As in general for `HybridNew`, you can split the task into multiple tasks (grid and/or batch) and then merge the outputs, as described in the [combineTool for job submission](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part3/runningthetool/#combinetool-for-job-submission) section. -#### Extracting contours +### Extracting contours As in general for `HybridNew`, you can split the task into multiple tasks (grid and/or batch) and then merge the outputs with `hadd`. You can also refer to the [combineTool for job submission](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part3/runningthetool/#combinetool-for-job-submission) section for submitting the jobs to the grid/batch. -##### 1D intervals +#### Extracting 1D intervals For *one-dimensional* models only, and if the parameter behaves like a cross-section, the code is somewhat able to do interpolation and determine the values of your parameter on the contour (just like it does for the limits). As with limits, read in the grid of points and extract 1D intervals using, @@ -1042,7 +1042,7 @@ The output tree will contain the values of the POI which crosses the critical va You can produce a plot of the value of $p_{x}$ vs the parameter of interest $x$ by adding the option `--plot `. -##### 2D contours +#### 2D contours There is a tool for extracting *2D contours* from the output of `HybridNew` located in `test/makeFCcontour.py` provided the option `--saveHybridResult` was included when running `HybridNew`. It can be run with the usual combine output files (or several of them) as input, From 9729f55850ad6c98387017222d85132e2a2b4376 Mon Sep 17 00:00:00 2001 From: Nick Wardle Date: Wed, 12 Jul 2023 15:05:36 +0200 Subject: [PATCH 22/98] Nicer figures --- docs/part2/images/narrow.png | Bin 11873 -> 11881 bytes docs/part2/images/wide.png | Bin 12273 -> 8456 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/part2/images/narrow.png b/docs/part2/images/narrow.png index 05d66437e2f16f8d66b83f6caf2979e18f585cf4..3d578cc31b246f44e60530a6691069ee54fbbb8b 100644 GIT binary patch literal 11881 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 literal 11873 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 b`_AQW>(j-C1#w3p0!Zz_L!}}G^ML;ajKGCn From 565f2409688150e661a86f4cbdd67aa50cd31e55 Mon Sep 17 00:00:00 2001 From: Nick Wardle Date: Wed, 12 Jul 2023 15:42:03 +0200 Subject: [PATCH 23/98] Improved figures --- docs/part3/images/Unfolding_Comparison.png | Bin 0 -> 7805 bytes .../Unfolding_Regularization_comparison.png | Bin 0 -> 7907 bytes docs/part3/images/masking_tutorial.png | Bin 49033 -> 8681 bytes docs/part3/regularisation.md | 19 +++++++++++++++++- 4 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 docs/part3/images/Unfolding_Comparison.png create mode 100644 docs/part3/images/Unfolding_Regularization_comparison.png diff --git a/docs/part3/images/Unfolding_Comparison.png b/docs/part3/images/Unfolding_Comparison.png new file mode 100644 index 0000000000000000000000000000000000000000..a91e0cf25f12d781694dd8075fdf3840313a75ac GIT binary patch literal 7805 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 Sg}y&sWE~Ad^$%)KU;jU5bR}v4 literal 0 HcmV?d00001 diff --git a/docs/part3/images/Unfolding_Regularization_comparison.png b/docs/part3/images/Unfolding_Regularization_comparison.png new file mode 100644 index 0000000000000000000000000000000000000000..8ba9c6c4b1f56b66e9cbc3fb53a7155c864c1678 GIT binary patch literal 7907 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 XxYSuiF^z^B5IS_wlqlGLGU~qowJq4g diff --git a/docs/part3/regularisation.md b/docs/part3/regularisation.md index f287c28eaf8..51751211a5f 100644 --- a/docs/part3/regularisation.md +++ b/docs/part3/regularisation.md @@ -58,6 +58,14 @@ Notice that one can also perform the so called bin-by-bin unfolding (though it i Nuisance parameters can be added to the likelihood function and profiled in the usual way via the datacards. Theory uncertainties on the inclusive cross section are typically not included in unfolded measurements. +The figure below shows a comparison of Likelihood based unfolding and a least-squares based unfolding as implemented in `RooUnfold`. + +/// details | **Show comparison** + +![](images/Unfolding_Comparison.png) + +/// + ## Regularization The main difference with respect to other models with multiple signal contributions is the introduction of **Regularization**, which is used to stabilize the unfolding process. @@ -124,9 +132,18 @@ Alternative, valid syntaxes are constr1 constr r_bin0+r_bin1 r_bin0,r_bin1 0.01 constr1 constr r_bin0+r_bin1 {r_bin0,r_bin1} delta[0.01] ``` + +The figure below shows an example unfolding using the "SVD regularization" approach with the least squares method (as implemented by `RooUnfold`) and implemented as a penalty term added to the likelihood using the maximum likelihood approach in `Combine`. + +/// details | **Show comparison** + +![](images/Unfolding_Regularization_comparison.png) + +/// + ### TUnfold method -The Tikhonov regularization as implemented in TUnfold uses the MC information, or rather the densities prediction, as a bias vector. +The Tikhonov regularization as implemented in `TUnfold` uses the MC information, or rather the densities prediction, as a bias vector. In order to give this information to Combine, a single datacard for each reco-level bin needs to be produced, so that we have access to the proper normalization terms during the minimization. In this case the bias vector is $\vec{x}_{obs}-\vec{x}_{true}$ Then one can write a constraint term in the datacard via (eg.) From 5025755bdeccd8fce30ff00868c3629eca352ad1 Mon Sep 17 00:00:00 2001 From: nckw Date: Thu, 13 Jul 2023 13:51:30 +0100 Subject: [PATCH 24/98] Update bin-wise-stats.md Add performance from BB --- docs/part2/bin-wise-stats.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/part2/bin-wise-stats.md b/docs/part2/bin-wise-stats.md index 86541b3d95e..15aaeba808e 100644 --- a/docs/part2/bin-wise-stats.md +++ b/docs/part2/bin-wise-stats.md @@ -70,6 +70,14 @@ Bin Contents Error Notes ## Analytic minimisation One significant advantage of the Barlow-Beeston-lite approach is that the maximum likelihood estimate of each nuisance parameter has a simple analytic form that depends only on $n_{\text{tot}}$, $e_{\text{tot}}$ and the observed number of data events in the relevant bin. Therefore when minimising the negative log-likelihood of the whole model it is possible to remove these parameters from the fit and set them to their best-fit values automatically. For models with large numbers of bins this can reduce the fit time and increase the fit stability. The analytic minimisation is enabled by default starting in combine v8.2.0, you can disable it by adding the option `--X-rtd MINIMIZER_no_analytic` when running combine. +The figure below shows a performance comparison of the analytical minimization versus the number of bins in the likelihood function. The real time (in sections) for a typical minimisation of a binned likelihood is shown as a function of the number of bins when invoking the analytic minimisation of the nuisance parameters versus the default numerical approach. + + /// details | **Show Comparison** + + ![](images/BB.png) + +/// + ## Technical details From a95934af6e6a87c2fb2fb6242cc2a62c3e088754 Mon Sep 17 00:00:00 2001 From: nckw Date: Thu, 13 Jul 2023 13:51:58 +0100 Subject: [PATCH 25/98] Add files via upload Add BB performance (analytic) figure --- docs/part2/images/BB.png | Bin 0 -> 10699 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/part2/images/BB.png diff --git a/docs/part2/images/BB.png b/docs/part2/images/BB.png new file mode 100644 index 0000000000000000000000000000000000000000..bdd8788029062ad0b3bf51d5eb439019ca7264b1 GIT binary patch literal 10699 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 Date: Mon, 17 Jul 2023 10:41:02 +0100 Subject: [PATCH 26/98] Update realistic-counting-experiment.txt Fix error in rate line for tutorial datacard (`0.63`->`0.64`) --- data/tutorials/counting/realistic-counting-experiment.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/tutorials/counting/realistic-counting-experiment.txt b/data/tutorials/counting/realistic-counting-experiment.txt index 4d226d11968..cbf7b861ff7 100644 --- a/data/tutorials/counting/realistic-counting-experiment.txt +++ b/data/tutorials/counting/realistic-counting-experiment.txt @@ -15,7 +15,7 @@ observation 0 bin bin1 bin1 bin1 bin1 process ggH qqWW ggWW others process 0 1 2 3 -rate 1.47 0.63 0.06 0.22 +rate 1.47 0.64 0.06 0.22 ------------ lumi lnN 1.11 - 1.11 - lumi affects both signal and gg->WW (mc-driven). lnN = lognormal xs_ggH lnN 1.16 - - - gg->H cross section + signal efficiency + other minor ones. From 73256a5af359972bea3716ba560cdc5ec56f28a5 Mon Sep 17 00:00:00 2001 From: rkansal47 Date: Tue, 18 Jul 2023 21:09:49 -0500 Subject: [PATCH 27/98] add regex for floatNuisances --- src/Combine.cc | 81 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 79 insertions(+), 2 deletions(-) diff --git a/src/Combine.cc b/src/Combine.cc index 9456e43808b..56d46be90e9 100644 --- a/src/Combine.cc +++ b/src/Combine.cc @@ -589,14 +589,91 @@ void Combine::run(TString hlfFile, const std::string &dataset, double &limit, do } if (floatNuisances_ != "") { - RooArgSet toFloat((floatNuisances_=="all")?*nuisances:(w->argSet(floatNuisances_.c_str()))); + // expand regexps + while (floatNuisances_.find("rgx{") != std::string::npos) { + size_t pos1 = floatNuisances_.find("rgx{"); + size_t pos2 = floatNuisances_.find("}",pos1); + std::string prestr = floatNuisances_.substr(0,pos1); + std::string poststr = floatNuisances_.substr(pos2+1,floatNuisances_.size()-pos2); + std::string reg_esp = floatNuisances_.substr(pos1+4,pos2-pos1-4); + + //std::cout<<"interpreting "< iter(nuisances->createIterator()); + for (RooAbsArg *a = (RooAbsArg*) iter->Next(); a != 0; a = (RooAbsArg*) iter->Next()) { + const std::string &target = a->GetName(); + std::smatch match; + if (std::regex_match(target, match, rgx)) { + matchingParams = matchingParams + target + ","; + } + } + + floatNuisances_ = prestr+matchingParams+poststr; + floatNuisances_ = boost::replace_all_copy(floatNuisances_, ",,", ","); + + } + + // expand regexps + while (floatNuisances_.find("var{") != std::string::npos) { + size_t pos1 = floatNuisances_.find("var{"); + size_t pos2 = floatNuisances_.find("}",pos1); + std::string prestr = floatNuisances_.substr(0,pos1); + std::string poststr = floatNuisances_.substr(pos2+1,floatNuisances_.size()-pos2); + std::string reg_esp = floatNuisances_.substr(pos1+4,pos2-pos1-4); + + // std::cout<<"interpreting "< iter(w->componentIterator()); + for (RooAbsArg *a = (RooAbsArg*) iter->Next(); a != 0; a = (RooAbsArg*) iter->Next()) { + + if ( ! (a->IsA()->InheritsFrom(RooRealVar::Class()) || a->IsA()->InheritsFrom(RooCategory::Class()))) continue; + + const std::string &target = a->GetName(); + // std::cout<<"var "<argSet(floatNuisances_.c_str()))); + RooArgSet toFloat; + if (floatNuisances_=="all") { + toFloat.add(*nuisances); + } else { + std::vector nuisToFloat; + boost::split(nuisToFloat, floatNuisances_, boost::is_any_of(","), boost::token_compress_on); + for (int k=0; k<(int)nuisToFloat.size(); k++) { + if (nuisToFloat[k]=="") continue; + else if(nuisToFloat[k]=="all") { + toFloat.add(*nuisances); + continue; + } + else if (!w->fundArg(nuisToFloat[k].c_str())) { + std::cout<<"WARNING: cannot float nuisance parameter "<fundArg(nuisToFloat[k].c_str()); + toFloat.add(*arg); + } + } + if (verbose > 0) { std::cout << "Set floating the following parameters: "; toFloat.Print(""); Logger::instance().log(std::string(Form("Combine.cc: %d -- Set floating the following parameters: ",__LINE__)),Logger::kLogLevelInfo,__func__); std::unique_ptr iter(toFloat.createIterator()); for (RooAbsArg *a = (RooAbsArg*) iter->Next(); a != 0; a = (RooAbsArg*) iter->Next()) { Logger::instance().log(std::string(Form("Combine.cc: %d %s ",__LINE__,a->GetName())),Logger::kLogLevelInfo,__func__); - } + } } utils::setAllConstant(toFloat, false); } From b560012806099f7c7cc654e6148acdff93b2afc7 Mon Sep 17 00:00:00 2001 From: nckw Date: Wed, 19 Jul 2023 13:29:54 +0100 Subject: [PATCH 28/98] Update commonstatsmethods.md No need to use the `--noDefaultPrior=0` option it seems --- docs/part3/commonstatsmethods.md | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/docs/part3/commonstatsmethods.md b/docs/part3/commonstatsmethods.md index 2445ae81ef9..f21cde92f67 100644 --- a/docs/part3/commonstatsmethods.md +++ b/docs/part3/commonstatsmethods.md @@ -149,14 +149,12 @@ The output format is the same as for observed signifiances: the variable **limit Bayesian calculation of limits requires the user to assume a particular prior distribution for the parameter of interest (default **r**). You can specify the prior using the `--prior` option, the default is a flat pior in **r**. -Since the Bayesian methods are much less frequently used, the tool will not build the default prior. For running the two methods below, you should include the option ``--noDefaultPrior=0``. - ### Computing the observed bayesian limit (for simple models) The `BayesianSimple` method computes a Bayesian limit performing classical numerical integration; very fast and accurate but only works for simple models (a few channels and nuisance parameters). ```nohighlight -combine -M BayesianSimple simple-counting-experiment.txt --noDefaultPrior=0 +combine -M BayesianSimple simple-counting-experiment.txt [...] -- BayesianSimple -- @@ -173,7 +171,7 @@ The `MarkovChainMC` method computes a Bayesian limit performing a monte-carlo in To use the MarkovChainMC method, users need to specify this method in the command line, together with the options they want to use. For instance, to set the number of times the algorithm will run with different random seeds, use option `--tries`: ```nohighlight -combine -M MarkovChainMC realistic-counting-experiment.txt --tries 100 --noDefaultPrior=0 +combine -M MarkovChainMC realistic-counting-experiment.txt --tries 100 [...] -- MarkovChainMC -- @@ -261,8 +259,7 @@ along with a plot of the posterior shown below. This is the same as the output f An example to make contours when ordering by probability density is in [bayesContours.cxx](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/test/multiDim/bayesContours.cxx), but the implementation is very simplistic, with no clever handling of bin sizes nor any smoothing of statistical fluctuations. - -The `MarkovChainMC` algorithm has many configurable parameters, and you're encouraged to experiment with those because the default configuration might not be the best for you (or might not even work for you at all) +The `MarkovChainMC` algorithm has many configurable parameters, and you're encouraged to experiment with those because the default configuration might not be the best for you (or might not even work for you at all). #### Iterations, burn-in, tries @@ -288,7 +285,7 @@ If you believe there's something going wrong, e.g. if your chain remains stuck a The expected limit is computed by generating many toy mc observations and compute the limit for each of them. This can be done passing the option `-t` . E.g. to run 100 toys with the `BayesianSimple` method, just do - combine -M BayesianSimple datacard.txt -t 100 --noDefaultPrior=0 + combine -M BayesianSimple datacard.txt -t 100 The program will print out the mean and median limit, and the 68% and 95% quantiles of the distributions of the limits. This time, the output root tree will contain **one entry per toy**. @@ -304,7 +301,7 @@ For example, lets use the toy datacard [test/multiDim/toy-hgg-125.txt](https://g Now we just run one (or more) MCMC chain(s) and save them in the output tree.By default, the nuisance parameters will be marginalized (integrated) over their pdfs. You can ignore the complaints about not being able to compute an upper limit (since for more than 1D, this isn't well defined), - combine -M MarkovChainMC workspace.root --tries 1 --saveChain -i 1000000 -m 125 -s 12345 --noDefaultPrior=0 + combine -M MarkovChainMC workspace.root --tries 1 --saveChain -i 1000000 -m 125 -s 12345 The output of the markov chain is again a RooDataSet of weighted events distributed according to the posterior pdf (after you cut out the burn in part), so it can be used to make histograms or other distributions of the posterior pdf. See as an example [bayesPosterior2D.cxx](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/test/multiDim/bayesPosterior2D.cxx). From 84b73f76796614fdb02bedd6f5f53961f82759d3 Mon Sep 17 00:00:00 2001 From: Andrew Gilbert Date: Mon, 24 Jul 2023 14:27:33 +0200 Subject: [PATCH 29/98] Update impact docs to explain multiple POI usage As suggested [here](https://cms-talk.web.cern.ch/t/correctly-make-impact-plots-for-models-with-more-than-1-poi/27399/5), this is really not obvious. --- docs/part3/nonstandard.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/part3/nonstandard.md b/docs/part3/nonstandard.md index 71af28eff95..c8ba2324e91 100644 --- a/docs/part3/nonstandard.md +++ b/docs/part3/nonstandard.md @@ -265,7 +265,9 @@ The first page of the output is shown below. ![](images/impacts.png) -The direction of the +1σ and -1σ impacts (i.e. when the NP is moved to its +1σ or -1σ values) on the POI indicates whether the parameter is correlated or anti-correlated with it. +The direction of the +1σ and -1σ impacts (i.e. when the NP is moved to its +1σ or -1σ values) on the POI indicates whether the parameter is correlated or anti-correlated with it. + +For models with multiple POIs, the combine option `--redefineSignalPOIs X,Y,Z...` should be specified in all three of the `combineTool.py -M Impacts [...]` steps above. The final step will produce the `impacts.json` file which will contain the impacts for all the specified POIs. In the `plotImpacts.py` script, a particular POI can be specified with `--POI X`. !!! warning The plot also shows the *best fit* value of the POI at the top and its uncertainty. You may wish to allow the range to go -ve (i.e using `--setParameterRanges` or `--rMin`) to avoid getting one-sided impacts! From 934203490cd26102c1404cebe900abf0941ccb2d Mon Sep 17 00:00:00 2001 From: nckw Date: Wed, 26 Jul 2023 11:11:45 +0100 Subject: [PATCH 30/98] Improve 1D Bayes plot --- docs/part3/images/bayes1D.png | Bin 44775 -> 139288 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/part3/images/bayes1D.png b/docs/part3/images/bayes1D.png index 0915d739b6d5274594eb71c3a2048552a20d28a7..a4cad67d699a2d810049aa2597aa3cfa7a85eb17 100644 GIT binary patch literal 139288 zcmeFZc_3BY-Z;LGW1i=kBSU0J87p!~=0p@lISC0Mz#u~W*5+2` z5Q+%}S%N=^F$R4yi}F1TLAJJ#Dg;675GzU$LIVf|{vebj#PS`6ASaa6Z?GFmj_a>8#K!Cp-fQ9}ejC{a6b=xqU(`9l%u>&~3mk$YvGh2Jmd)p`CUB2Hb=~d;xYp zU?xtVaLYXa2KAYwJwiAZUbOx0GkK;?_8bl)$&7!ea%-Hi66jGzF}6o z0W1#SvtFTQjz8<x6_mtd3t1lsk9@T5JO_zy%#~ zIK+Gv_tpBz0igi;jypQf$Jc80SwIJLS(wjmAn~j8LAQ9ge;+@<1^wD9(Bvmg&=Fpt zdsoK>>N8b&dTloYFu)!C$t!TrD!!}jAi-hVR{H|aGIIv|f0qqV&MfccZ?Re~4`7|p z2*;n#GCPHZ>|QMg<77S@9A>{tLoiO}<44@B?EwtN!+ZhS0hvPEAvq`j~%YcLKquBXk^^g91UF(BGch_WiCG6amU9t`E2;F9_9FcJ!x}DXM)tq%5vm~<-vjOuC@M#QAE#^(kn}6Z)dwrG< zEL|+)EWIp5mO-3vT*%+h$QB|3jDFD23()ruv|wHf+SFy<#=I4@4q9dwWtN0Am~}uu zCd^pSvo0t#{fXf!ResILA94B(1L*hJ_*su*0|yg_7>6;3%HKZ8tIDhU3*Yaw{v#!S zjP=lO^!_!1KllIp9bd>3jML_~+4wmE^jUN{x*gq!eul0?S3`1W0=fqM0{vta{@K6z z_u2LStv847{jU-)|VR9zG zB6!JJ1$wMkm($vyr42!=_GPsW1bq?xZZ}Y(&wnpFtq(z4&oCH_y5GxeZbMM{J|O-* zzn3X50UfOXK~Hl%!b2i{w8y-9VF6l#4@jB>Bnv4(DgYlXNDnfAj3G0~8nT0SL;D~% zz^^`l&qJU{C>lBiB|s_A1tC?k{^Y6r>zwGVX=<&6qNg`=WTr%@@WbW}F#2C5KM zih6`n<7eHa~rjzK4*Gtv3zVstH- z=Wa9+J&RsqW@Q#)mSffc9Bj$FhuMSqD02++Ip%EUyUbP0EzI4_W6UIGItverG>aO` z78Wa(y)51=kt_);nJjl$Dp^{AEKRadSXo&`S(RD!fh_K0J;Hi|^&IPU))LkR)-Kiw z)^BWVY!Ym0Y+Kpv*xcE|*b>;TvfXDRu)SfMWJB1w*fH!{?B?t)?1AiY?3wKM*z4Kf zuzzG<;o#>`;@HAr$KlCwj3bTX7Dp{dC&whm3a0?4GUry#-JC}_PjO!1Eaq(Ge9QTT zi;GL1Yctm_E?=%#t}9#*xt?;3aV>ERa;tKia_{F3=RVI}z}>(-$o++fhi5I1F^>yR z7|(g0LY`)x5gvqBh<81&6|W~R%$vho#ruZ$Gam<^5}yg58{cuhOullyPQF=w4*s?L zru^>wG5k6FkNErfzX=ElY!t8)2oN|Ya8KZwz$ZaA!L@>Bf}VnB1aAs93r+~3g%pHL zg*=2#3*8cG6`B-g6;>9u5NhC@nN92hJQ4}q@R@6$=Uo=g$ zOtepQSxiREM9fPpNvv4xjo6~Nl(@0Dmw2*xiFmL0vV@$3nS`IjMTu&OcaqGKs*<}T zBPDYsTP0_ugry9mJfxDP%A|&*nWR;v9i&f4-;{nK{Y^$z#zH1o=BiAy%&e@atg-A7 z*~_x^vQro#j1k5ca~VUxOv{PLnaKIeU6E^%Bdw8MW4R`L&5bp$)~v`Y%kPnolP{5f zr@*PON#U@b z`Re@|+!`ht5gJ7rW9voN?^qwVzIy#^Gg;^mH@J=53qd&2^iXw&-mM+fue=-ax~^&)}ZHCqrdJFT-1g6I7QVa>V4m$>(hwwuNk~+_q@C#q^|U!*=v` zi|xtVUzrJ-?J>(X8!?wR_ckvwCt2uPoUmxHWU;idylB~PC1d4bRcJ-B*0(-s-D1OS z<7ks@GrmK0N63y^TP9m;+e@}@cPi}++*xf0*;(0LvU_K*Y=6}L@h;X~_PcU+eQ?<5 z5be$7+;RElYUY~ZI=NqWf5QI01Ih=Y4m@*{bn|z6g5$%vE`3^t1CT@MHKp`$0lQ&{eF^6KBU*UcGRYn(dR_ zo3kya(e&#w&r$|cEZ!GPwSp- zdG_e}rsvfidL30SbYE1y)O}g`O7B%wr+#P6>&>rgy9~SP-(cS~c5m-)>#^$T=-t`d z)wic_pnrcqalmun)1dz#c_?CNWjOXN%iH94{O>YHq(|~c*Nv7C^@vZ#wvW9ScN`y{ z@R*o+ANrm;dFBJphs=+dkA`eqm=l=0_F3g~#k}$S3({WF zBsql4SUC4Z;!D9-ov%&b?7xjr0w^ns$%q7UcWKj7`?B-$$CXGb8}$lp9j%sbLx0N% zU@(H+L)^dn0%-8bbQr|n3k49w1AGUe*T8>p{Sp6tukk&${|SK*={xk}`Um(&jQIVY z9t0HwVAYK`ZGfPM;9MK~Jyd~KUHIL`5RSXR{Pdalgv7H+$?2CaXJlqwxtg7S^VaP<1$PVYm6caiR#n$Ls%>g+ zX>DtN`t13e?w;Ph{(-@vvGIxblOH~QnwlmreEIr~vWP4#ui^#rAV1Lh4YR+&O90@- z#LSFlW?RJz#S{rnv;Z^9nvJZ2CcD_&j|$0aonjZ>cJW4OBZq>v14-miNEfH5qRyBS zc@?$qnEhjj#r=;k`wg+*@frr9#Sg5QP++u7Okk?e;9v$QfP;mV<@*8Lu@^3w=^OP|#4OLF~_v8h8< zWWI!Ntmbvyhp+C-5BL=EGC;3=!Q1{ZWrLT6)2`(Q#w^0lo%l-qIa`u8WdkBs64OPf zIQ)byu}*DlfV*Ez@LFA3XI4-UW+Z$3@REEI%G)D$D`a#!pODLd5V?<3(V{jyY42Br z@E|I!QO}L5yAE~N_rjEKK&Vnn_wY0>z-z@SSlBYfKX&QhI`y}xWEz=_ORm!;;<%>W z^vKt#l5S}?hhCmMc_M5^ShTP2lV`TC=OGb69fub!v5?|xR+0{ zDj-GDIRaJ;W?+dMZ|d5%+|-!q2p6`kEJ(C@Sd}}b@oZ8tdwU4`J7MqS<#Ia52?oSw z8NH5H4*RSG4Rlh|sw_#bfUG}W|HxyE!29W;?n`<>;eHE0 zzW~8+#|~#?2uHkMu#~ZdB6^%jqSmtOfCp2|5f9+?)s`R-%ZG>h{m)tbGJ zVjs8GRCMp`Y8bIW^?XxA(~i`+k|W0~Vy$Ei$VQj)=VmA?0~)2@z8vt2Y&Oy%MW*^Q zpo(azqJ2jwwCLe=6W2F0pd)(jxcBX2L5Qw0ohxA6&u3m&God!{oR?J9D3WNkUYj-+ z6spHpy=zn?ejJDBiP5=kkZLW+yz!*GQK=34_xp^j=^AlAA1Vz8o{um(#g9J%F`xs> zYSi;oK7hF~!2B$Mn0`FIIFW3(i`;iHf9PrH`Yf`P%_Bnh9W$)D{o5lOuR1B5<15?W zwsFxG-is&M;t+#wiV5w`d>A2~P}P^gfH*^27yU1+zptn-D_N6K!%{4@*e8`!*;J>p z`9v~AZ&11C5_r47Z%cT6>CLwmk-m|Vw#=lO^vxa@SS>6Z_GDa+V^`!4QJsT?cbR=Z z;oK~$jO#d7D5f7KIcpA<&^b!nPwH&Z81faUH4iSj8&%}2$G6VyT$k%`%bpyANWG1j zor{e`&C^)UdU2{^cMKX4Yo=_8JY8{pb6Cm&*-ehKNuH%kZYF2r?w`BLD=xESP-ay^ z)TDDR;H&@@9>Lx@@4P6DM~kA37P!Jt-?Rl!eY=clBXqIGVqaC$IX-#>0L~}{Rm%;J zu82jiH@OpqZeP?NvhTiRv|ThiGqYa4TOsKNW36_^%EnUm9t*jr*}g ziYC{wT%WMhY$lYiQK9otM$x&L&!aM84>qTfo(Xe)$Q=d0DeRBRYZsrLURL zTtQ7^mu;0Gm>*B_fT?FkE7E8%;>v)`j$|zF0jet|rpHJg5da81NE^eQSwGbGWxP7c z|0`Fyl<<)|l}FbXLA6!;=I-a`P93a@+r?~f!6GBVVc**f+ARX{I-ay64cVkg zNhcBJo~+1Iqbs}XoQYB=_I|UfTgOw^|3$ZMd}3!!UBdfzL&0sP`Bv(RwedT~<M7 z&e2sH`WLvsME4@N;+P=}$)$79l+H0Tft5yXHjVO9z4KfTOD&6+1yy&cFe zg{)F`pOZLr$=|CfV0}w0?9t=AaFYS?pO0x7{kp$ip8<_o-C;lrxoOCmP|8{cls`!( z03o#ncP@WL(VTbTo~Kc_ZC(+AyFw5!tMO}d7|`?M*l~f*fgE~DRvQDNuG1N%JHBT7 zcEAi)uXUzM2CT?_3axyVO8zoYdF}jTo5t}}BR#ci#EdtnHVbPi=s#{B+$c(ATM43W zr`<7BBD+rXx1HQFOzdn82x_QR^EFaQR<7x;7|h<}Ri{0;Q+6_rI>(>HF(sbIH$Rk2 zKS&rC868ZdpVz0vGN7ia4hEE=1GlIV%K2#0L31cD%z!Kgr0RoSKABIrqKU*uQrsEP z%~V<*mh_;E0ZrOs$ei=D%?!vwYQ-2Ha|NpWc{W7H`;?4f=v+WuGjIH^-sizs1E`j? zQX{VDlSu!)sGPg~DjUhJm5-m^g^_jdF|^9_t$pw!g05b%*TJu2@5hTC&Trnuv4#k1Z$wKdelf=M zy%eD~{uLq&=&Un*7_+=-bO;TmXIPWI`!(Cw6*G7P?k^C*{snnZG@~xu$8vHSoqdtW zfD-Yf{qtuCq#dbZ6NEOaXts$?lp9iDPr$d3t4d@hAN4X>Fn4%X&2X%6?{lt-SiCt-_(7%StAGqji4$!W^pC(`*KB}5OVad^gy6y4G2B0k3=&vz|(;&QXCl*^Uq(-G+ ziD!WJu;^q1R@4sm!irJDkZ`?g44D{JMCZ7Dj65^31rakv95Ltf2zJ8T zbr1L89Lvi$8n!(h&VkpDz3K|Y1Ur5>$Zw1#99R3_)9mj{YL*6$&f`P7>aSB&^a=Lq zOluuWdT&3XQP#G{N`e6;*^d*}VTot)Bs0xKz!455h;mju1MmHRBKZE5R{pMbUWol!0Mq_LDMPSb#a~K92_E(XK5IWw ztN}OZJRa1p$sY51ROWMd5DVhy((iwxj(nhK_}S5dy)Q!rca%+jN! zZG5|TzjaZFOx6MpMH-@oCj?!u)ay1D7?BOcWqSGg|B0m*zF^4ALLU&SGRp|Ejj@Iz&) zKuQCl(vB*Orc}``)8(kgke6O#^Rd~4#0mz)_jYPTIoV+NN@Y~g`)i|yRgPu~>niQk zn}y|=hEIDQMAIOjlD}yB@7aQXPWfnIgGLekAY$5V(F%XG3+;BjEd4bsJs&=bLhPLS z{pEV1odc9^Wr>QG*-7ra==<<#SEjMJ;@Ot4gU9Z|L_ACi1QrK7^q3-p*skn|Hl^j! zHxK&N8)NBD(NU;8knHbHWDZ_n!QGpU)@L zv9KqM=#3IF?VW=bV`=R;@l{ndR|!iZc4qx0H_FKe?zvio7Vd2hSKU_To4%#3WDUE- zySNGU_Df$i|Ews#J3;>(ww`(Huom7FF zjTq9d&bU#L7=`FS;h-;}^!KXjmXi(?6;!5Q~7RfiA$g-zT+;(*x_N!M(KC#wj z=2L*DmQrQv{aa@)WVGb5wwXv{dgeiTrSSow+~`5xz;qV2!n=Jk{lmz*y_zZhO$p)L zN3W|~^CZ87V28_pX&e7F-XavE14gfj2sMMi0Lu`bNq#BQTl;0nLBUm$J<{tLNOp{{Qo{OSb~XXFeD2sE8J*La1UMC86Ay~ z$(Jnp6VHCrz|7JyWW(TnOQMH_r2K2kYA+r8!aMQdAUR%S1aSa{^-!#$l-Ar7{mnrRat%gmn=V3RYer9_AAyr_eag-k>K4L&3z!|(M*$MRW#VEdpdQ>@iPdwE~ zIW_#4=6Wd`r}M|MUp^QTpiBi9`ll}3*-!ioF`#YM|5ndBy(A4s^6#9TCsh-@Q;pUl zFy$=rO&3J6IvN(ctIkifW~Oqz^!8Kix_?Ti;!ykrR?g>^uhrI8zdjqRdyLVa_eoRo!SXy0Vt3_cCR>fG zanGSFRig<@CFA35y~|(zjhy^Hmz!lq?ru^;Wzc0jHN}~*b)a%iDX8Oy~ zQhaOYka7cXH8k5@pZGNxarILz3K~z2KX$InoU!gMcpR^6Sut?SC)@J!CM$vDbo9DL z2r~fEFhE5#ZUka5s(Fe5RaaAmI>+ESQ*sHAH|@ugjL~?9RT-7x=#N0%KB3z2Gl&F&4A7rP(ohUVcm~v^v=D`?g~GgI~ABcY!zpg{^6^| zlnw1n~4^L9CnKw z9=61LR&s_uY-Yc}&3f_aJKUo_3dzMdv+8cCndF)6#!UB4#e!}6Y!GK=o%R@J&R|8K z8uO^W43U|b=ZmVJu*tMJF`#qOx{u=L>mDk7u~S;hpyg9Tk=k83N*-S*Ko2d{k}FC2 zcrHwhz!mk_uBtbz19_pZ7kN>UWGfYJC4WI{OYYbyR>IYJM8%FOnE}W;LMy4rVL(FB zP&anW5*ZJ8V|r{1S@adOJg(7p;l)FB_}iy|vxe6j0&wSy6(WWfX{tec8 zb&h6oo?!=r_W%+@hGq=>!QW3&17rp1?6|uz9XOJ8Nn)-HaONGZ@1LTp^x$@s9*}+EW_|d) z=+%@WE5Um#GLhbj2g4O+I%9F=?G5vT-eZ9|Bu7dFsp>j$o^wjotSaZuwudeE-`1t3 zWn1n4qFB7|UH#!h$4WS8)iCkeXlVgeIH+lh@+qwUC>z}5bvr78JpUEJR_MwYJgZ69 z7BZr3`7k)Da12 z-}pyQ6&rQ>9*NuJ@g-1p->soMo;L;?r>%6~%^cUeI=)qMzImu;+X(~2vpQGHl27>F zu6|V$2?ui%wvkxu8BJs(fxbOx$bwFwYJjXsr8O-Z=+c|8yPZtT@F>aVr9;q}+OXQ{ zWV-nD>!{i{&jqNpedFrdz_wK42WADNbN2x*>itH+PPtg_M zFrY)7%y5$gTgt7bR=1j$Ze`D7_b&>kJ+-#IQe2_D8>(!(0PE>h%*C=iv062>d4|4o+5U(aGzTk zDRiD`u+}%Ya*P2DwnmjOAZyQ(sfZdpTeLQElr(+PWoB$K@#{Oz12M}7934*@y^(Ty zQh)7(Ytbdab=k-GG}S&wd|q7v|GC~8gN7TsFbi>n^YCZHj{!LZs1o)OJg`f^M#N(& z%09T|ptvVl?Jysejcn7D1(sKH^7lrinf5SoJuui^mAvrgsMP(lN^xFMqki{lKRYHs z=Z%Zg+uGV~N)vZWPiIc6&C=PQeSR~5OQ4a{+X#~~un=~(BnntpOPyN!y_vsL{^|RJC6m>3UOHGN z+eV*>A1Xt%x6KW=uIgfXYECFz$}tcw5BSE6OooGsPPjR>D1(v5L_I z3{O~)>=B&sSD4Q?GgrB9&G{h)B-%$P9w#ve7#XXeuTH z*V7w3vL10K^^ddOzBwbil|;Gv;2jb%7xcAoes0a9^tQQ;RpY&r=00BgxveCe#Al3U zUjCd>7FY{QGVfg4(N7h=L~p|}gBI79;=05CvK*`yh5vjIlZ_|s3tHOVKL=RL^J5FV z9F$!IH;REJP(ea@BJENq2vVoG_bh9Vk?(9%6dm!t({i+>vpP z-M22<3ZF{1d}rn4#LRCgmu$z4csIvzk>=9Q7|Ik3`)=8Jl{um+!fBVHD225BhDWma zP0ow?DyTii5H~6rdi%@OTuKHL^$LFO1ru{{6rHF}24wa1IQ_ccSu&c0(suRp6jC=Jeh;GNZIRpeqfYF2Og2j8u3C;M(Y>XG8#3LX zrXIY%OyZCgnt%Ennkj_W2mR=G9nVGQabZB0oN4*kSpxDH=&!JBI^Hjlq}+^280ES@ zUooHHCfjXj5L7tQQRrrNd&u-~me{3u!M86S=5wsQpgMoCY_7ud8YlGm*A_>5FrdNA z{L(h(mb4X4B$5H`q*T(l5N-N)nlil(3-gp;;BwFN*>^VPV2#05)Ni z5(H>G^<_`VR4(CaS~6~-3f~;GqMrmb%hJ96ubto3+p3Dgbl6cP7$EDQk`lBc8$L>7 z9U>GS8KcWaZv?6=t@&mXhSPBCohT10!DpMw-UO^Es}g)3X-VJBp7f|wec;(vznUMK zgOGtm3?}HiT1g-2&qospUlVtiOqbOJoy7oS61}&JNLp;g@=oO{J*;|kenBe0>5bG= zk4K3{`=3dFnl4+rvmYJuo_OvxTj;9je;5Df?Xw*WNG&v`3#OQV?W9SJEz=8U63SO4 ze)PNIqL~CD-n<+CGnp_;8Ln54l@{@0f)Qt@l`(hvc0))e1%G{4}@GlPibd zXE&*iU{8waexNBiiWY3>JV3i&7K!Fwjsm>y5a2{`h5hZ8bl_x|qT+{NHqni-f*XrR z7vf4z;q3$&(6sHn*KG5>zqGf{4*MtHJcv&~7oH+03YR2DBq9e6iPaW{5X&`~mM`v#fI2X@~A`6~)TO z6}72{Mv2=x@)*bXmT9!1t- zX&L*lUzf&Q=mftd5M-S`4>ajIu#Ey zKt4pbgU*E_l~3T4>$k>q_DSN-&*}0US=m>f)3jVu*)wQHiFw278Lw;$R z=t;drPCZ(8GOd7i1<3NEo%8?=Z$&Gma}FL+YslG6I{9Tt>r_uMKE|8Z4u?=p<~lK- zB*ufdqP*L(W!e)AJqlc=hXRIXbKg*eb2*$>N~BL+Oe|$3@WTFJF?NE^p|P?*%Fo%- zNZfan&(Q89bCGXxl$EQEpKGFHm4`=Q*Fa}Nv(__|x)yq!K`a{?urSLtp#ML{v|}oR z=J-fC6c7`{1t6v^qkJ*CQG!dwl^Bufh(4F-tjwp$4_)kJGT!wMQO0gYT)Dd-al^2Mguq-oKxob%gm&R?k4c;%-nROcm6mvoEcPN2`Ml z9wTWKU@_xvSrpol4H}(Gr|Fy(u2&9`+LIrwF$on&Uwh`Q^&G$0I=&$$%OZ8{wVw_s zG9cR{|LyArYD>VEiaYD_7LRPvq^zkCsLmV_CyVo(j&ta6Qb$c?FbjQRFPUB-oW~>U z^=Aif)B6de19k($l<>Z2$8ijcYt*G?x~g+uomy0t*xeZic}+^DGJnrE{c^ki-W9#{1PE4kj39Ln(zvoAn!PJVFv{DBZ2RFl zxw&aM{;j0h<;6FR-Xgho%l2DeP$=7W?vtcBYIj*&h&g;q^@or7SL6Rv83Ax3qFB;| zPc{OnhB%P;Zro-VG=bweQfrhlp2m-CIUr?UU!FVCzw10#z;0{GCCe0RePYKIxFNM2~*+bs8NasC=oFt#`Y(9Rg zp1%U&GRiTk$qcQ^5gF?XR~GGz5PG&Rd5eA~E=FSK26H(7-ak%nJ`}B};(?424u-QSZZYsdcl~d%ay8U0ih^MA(l5BlpZ*jf! zM#NAa_ceRAc^WK7ARVo9umPHFC*UBDvpuC45hZ1`Ax}`#Eqnu$-_+=zKWQv$(<1*GC8Y_!@ zzXkE?)>VfX##jvBeB2#ZCU8-J8zsZ5Mmsc>-YQJi(N+ly-jk7F!WPH=nFoS%lxKnM zWqT0QU(c~(bZNyodOc}AEkKBUu~z-dr^uGbNIpu3uXy;-#cc(5EL`Yk2;OOkK|9!? zOpa^XNOpE4W15Dk5ZNz#NB;$}tvB&jE52&wLBJK;t_0x<(uIXbkSt`jXt z8lHCEr*-7`b~ZDDH@0oj#n0774b6bI?rT59K2EqkIuuIhzD~=e9-ySUQf!dY5=3=! zVaj8i%SX3p>${s)YgUBG1uHwf-RIxLV(~%9Ca}1&1X6kBV0NxWZ>AMtiTK*+IjEhn~z8y`b`C7uO}Z;c^y2uSb*Q`w?sa= zz_w?BKFU%NXIK8#Wkl&gxBBC49Wu4gTdnpOe#YFRgFyIn7u}F5O};$JYos6ZoCi2c z{Jw(6w%o~q$GNT>eO?DWb7X0|;CY4^hfbK7F~*FhiXg*4BvJrQL-Y;|$(g`<IsREYN##kFykiC%V|h5+c=b^*WJGIIOh=Y4oRT*p<=3j8;)ZAU%yO2cY}#H@C#)h zXO)37rwP35se8+WyGQ=AJQjQRKX0h~58u$CTM>w3@RD@_RY;%yJp3d58dVq9_Yzhd zB?S|xw?RTahXHwQ`2r%Z7|A@onZwDyt6Dxr->)?rklc$K2bRkjCfw7vIJ8(tbE$UB4pB8_rYmu1ENkW-Lx;=uwIv z9|xq}k6nEgM+c^;(k_8laguSBlVqf8!bZ>P&GQeKawKHP>;0jY%o8sQ&b`~5)W%Wm zXpE7B8?WNZ(#})Wz^g68Qtde20#atmgo@4q{l?le9a~I8J4Y|1ZQZDY@yZwR*llswi$@uMN;(PXhpQ+ja5jji$Ym*FXVoCO$ zOZ!48LJa7k*f|jV_nyS{=)y7>(*B^qrfv!dqvEDx+D6M;7gG#Pi9U4}Kxc}m`Q?h# ziAp{xSaqYz{X!f}Brdd05}t=jl`TGn=&hehKAfhnxkE~$$@G7Bn$N-1cnhkj?HFd+ zpkxSSX}H80&=O}X_V%*c%NXuxy%b_+<2(lybK1El+BjFZ>%LBSuWnL(_uWx0sjzA> z{Y&vUy$=Doo^JxAZXNdL9)F_xU#r&tyvO%9^eOqcGOdV}Np0z@-u`cxz+}H%NY#DaQ+92BH znNHef==7ToKTgSe!NTge*2*Kve>Zz4jZ(l!vv|14fPa ze4$03UN)=fq-R2#BbavuFf`*n~p zN!oB=#MKHiRQHW`nifB=mFBBs{EgdWGX&o9x~E1KqqDCr*fr5|VPXl6r#O#9tES51 zgrYYGN!Nl9wOC0|tF1+OSY2t!wl!xnr>jrY{xcWNKaJQ8-}?t5?PCCo1o(Le{vnBaWTw4%Tf`e!mw*{Y8Z$LHe9j~lG5^uZsRAu|^$b0MR>uej*pBj`K(V=6n z-olsV=^E)|VzJE$W{Dvng zt}I)_Qs4Mc}~JZ+9!N zUu{k809$enYgMNYY^d{+UueJ%udP2$y90ZIg{Ef8Q^eyKDU^~+3cNaj<#W5auBykK zw@aJ*Sk)J9o1hJJ3HPvzcB?P$eOVEJ8z+E03u@zG>ex=J2n%o=(@cs}edp#n+)?x? z9lMRZ_1=?NleCwUPs*9uWc?yJ z<#|A$$y&?-e<2>k&hNqNiBhicvSHc~2w^zM4CpC%m2tx^H$RfcSOc<|bfO7nPbj~O zoQrZcf7r!0j_VIX2V>%d|xKA~s?{@W@2h7U*xfop zvIzGLmufZ?l8btu+URUy&a!Wx6*IpH8!KUrks;6^5KK(NRN$^-&x6elp|-U-if@r{ zrPqqQa2j37!Bs);m_hHUttKS{U`HDA5&;n%>zXc-cB$_}@U zJG0q3no+NhXEl`|n`h`;r&l!nu%x7DQ}Q`CWLh85ehJL*~AM04Dk=^q_(?#tG#sjANW)OPV$u0wRvg8W@}5%VqKB{zTU z%lPi9)dOcME)H%qCU^tS4?jCv7}JfdxN}3P{*te}%i!K2RV%n~)LOjN+gqqi?fKZg z^B;C^cZ&4dqX^4Y<4IA zZ*aLN-v8XS5EN}@7cK)!vg$rgaB$pBpt$B2h(<{fZ%!5&yJ4viJ z?wH=bUHKwQ$S$bxWM$TzQo}BJjWYCP?5*-(R<&h*kntzOLu!;bWY>ynG%p!DCqi!D zZ7bE3%l|OTz9$f$u5ixXL6=xp_Gs_;x#%~R&y%?}h#)dR)HVXzE=4`2a|w}4#)Fz^ zj$`leabb9tf#GS%=q{X99u8$uV4k+52Fi9w-n{VPgo4hZH z2-$`(AZ{adsyZ@EoWY&Nv({PNM#_z!NL2S!oTv$Upd^h+kCK@PtRs?*Wl#TFE&s!n zZD|T_?5$TI>(525iqPuLLt-{XtlKpI-JOe4x4b!P6O$`L4=!YUdMWax&TL9Jxq z9W2}uOO(Fi5rZtsu_t{ve=*7G=6ShlV~pcQ70f;psvnKt2Th#;Yc3IbVAmrCG0<+u zltwnam-LP`ghNl>=Gm`exA>y14d892DC`oQZ+U9n_9Kp({uzB(1+{ttU^9tdUM_76`X$ugCY#3);m zR7fF{%9f|~iC<78&e-mmLkp6mME zUC({LzvunyeXc*Qx*9WM&U3!s@9{Z4$LIJQeL)Z(=$if)mya-zgdTt@96@SKOTp&K zV{)PLhS7XDpXtzo_w*W2kTPn1=U7a!9Q3SCf2e9Ko8|pr?fDbsmx5%i*|w^Iq1iGxG8a?|ip!jU^-_ zLX@wbx~lAp#1@&2t=)aXI>ztvqta!IjD01WP1mC2?|eZ?PT{ip8Quu!PUcMn$Ie+| z-B)Y4pA`k0YSoZsc4(6#W-M!ML?3Qe-n(RXO7NYK#nH))0Y~oVy%9Kc2U?4zwZ%}$ zEC=orAiANd*WmIbs$&FU3DeFUbo;$?)!H=)kN5_K4gI$E*%mpO7$4erS7})GhsFxz zfhGq)kBY@tI>*m;S5q({;WczMC3^ns)(MQ0{!qSsql~ z0z_61Su)4L0nWv|>_D;Us8MAH=TZ9DvrsP|Z<**QoPUsyEz;4;P^pIkhx5T_ebaPrg-39H?*MkW&B$^ELu8*%JV5GqJ*!AE4@e)CI0g;cqOb56F*-m*qptcxWHM z)-+N-<17R#eeWk+f+LtA$oi(R7aQaq=hX`fcpj zoxe+G(EsQcS&mBpky0h-9WR*>4INEfKju^8d21jBJ#o{Zv~_wmErHcxyl#jpS)j5{ z_4aY~+h))MziJAsV9t>!K~_@+rO4rccGZ{>9ZwJsxmKnK``$W$kTg!t70*i99eXP> zu+%QMe`pghqS~~Lhtmw5kAZc2ShetpjucUDAwlvv;Z)0D&*tKSVPrK6lVKgsbdTnD4p$8QI$MVBF>{v^cIXoSD!%HNn@E zl=8}h^PNJ=rZ9~AVFhT?dS})ZwmPwsiVgM6IyIoSs^7LChbVoO@JRE3utH(*@g6VF zr>H?y(9QX}?W&Q6$Btu?8&|#-(dU1*ii8^oV~ar*&Y<^(^p-cF0FxV1qiWHrUmz!g zY5V4WbH9GOc>T=hXz5--{b7@_N=nYM&K!LNwjT80V#{%ilh_p`e!DN9M1da=;@Ow< z`kUlVjdAN~TGY*iVB6>W2X?J;^5N~% z9oPB`47a>zYkoU##p$ZrWl61)-CZ&5VLn*MiA767U1+fHTimuo0sX5GDWnM_psU4D zp-m@qfd`m?8^g`UEar)3UH6pg2_qq*XH|nn@|hLIMi&p5D3*NiHf+^3O0$P=*@T+A zKtc&~wI(YD;*V+%8_R7s{wT}-%Fh7&;x7P7vleGV53*W|Edf21eDgZxvwU*TU> zon>^yb7NeS_~x@;t9p-qy7EZ;mQI3NnZ?kqjpcPWm-<;!;LbQ9Rs9UJ57_D?+@v)v z20kpyyq558qJf+7(jDu1Ys>bY#}itX273k42lhOjUd+7{Q#!`82+BU8dmtJxVB1Xq zJVHh76JQ1P3OPfe^#eSUISDugzJuK7W$GLZH#Hx<&e{!!&Q47{<}WhcM|E-eknnAB z>Ogko+pfUrS9ABLaNl`wBuq{nXMG_{kb7I#XMhxjdxyPUcQ>E1X=~lBHn2+`#4JQNvNMj2^4~_GK;IWpq@_$6FJ%DxKh2AAdS+$o#+uqKyd@m8fe7B) zAih0K9wjiTvX}ub_b)R1|MSG@|4g+0r-{_>w4Z~>7WjKrzaVGD8^ST>wHWbudavH- z=@0m}lI#!ZW*QkMu2yedj~Yr*fe&)?fCr$|Hex3|ri-6$daQqs0U4&6Wu+wFH_b_u z$CSQa2*2qS@q#=x$jWFfRe4SPOj?&0BRyfBHs>HCh2ce++Dx4ZB?`lVr@85b(=^=MPp?e|vh~8$M%wn7iYB zn+t>&#HT!iJ_Mjd#7*l|n|7K2)eRTeZPFUhF*2HLB@pqwV?q;%0&o4vih=ao#R<>P z%tzaHAIvSh@_my%`NvPx5pO=cR0UR;u-kpPVB%kE?aU$TUqx|NZCe6>Y6_Sw#KAWSR_K5LDic5LSE3x9ZNqVb*5|m#P*ZmX4iedcFQ)XN*=$P?; zZfBx#67)IL`3R`-)X8>h7;|=g+PGhmmk0h1m_IqaJp@yx(c}~pxC?}ODZOVNmGS?Wm`GN3XHx*0*){{iJZZVe7E$2!4KjHlVF zpLycty`^>QHZMhkF0y)#OKd!z?;*{yP2W$PXx0m*ejO%H_R;C zxrZ&8AVXPBdFIj7OhoV{TZ+KbQtCN?3DJ^~1vQ}XcwK|P?|=?D6XUgA@5f@2-prr))zYX?uZ+0^&SYWdxlaV~nC`AD7gL2mbqL;OGS%YQEg z{C85p|1CeaoZ~Xt$ZE^Mm}sn&?pbDpIrnXu4*n2E)ZI@z&NWFXY`C!X8uQAQ`;#4) z?}XAKbe!}T&a9x`#y;KjD^Zif0?2c|bB=&Cb!a(F%}(a1fEFz<0RY82&XkxG21~~h zL^NUtJrx$FTGMOarMh3w&+u z+2?^j=3BK%mm6#=VjWTJtL_DY^0hcPsmd;R+9JZ_-Ug3`D{fc3>LzC&sIU6Qd#uIz zh$pG@RUH!@l7|r=ljz&PJo{i%O5)3&2Dck7zMC5PYDzykB`7;xJ~5wsUb0{$N` zM3s6wz+pJpU$_9co1hd$*o;ir3;TOI4Mc5UFfK~y6Fy_Q+48Nf2s5G0+V547N|EuG zJwV3@%2KpAK-+p#m5|l*&|t&NZK5P&Gz?w6@kiH8NT^)N{ZB}PmZB(sx0ffgWXhaE zoTOig-24;uqOcYig&6^Jx!V3!1bbRj2qt&5atc#zQx*X^X8|Mu9CO_;)Y;hGyq1kUmhuOWU9c|C$a4a zPKdZ!<+@^zr5x6LYB%RQyAC{W8Bqa5Jw`<&Ai5mjr)E{Rf!}HjRj6zjA~xa#DU8@= z%A)vfY`qRWGo0ey5371}#09H}Sf*-{J5dLY8OYu~coL~E#Aj=8^~!syXJ2{64&>*& zE0lEc^UoQ6G_)T(x!@qmaAMhVA3-j>?;}_@U|)L7ifroL$9O;EcP-VgL=Hml48&<@ z+0C6Le{0kE9r5^E+s^O*jcaJ)Y*0rm?6`M9?+M=^maB=goEQGp!zcLXg@6CjzyAN< z-`;=Rqd%?nEp?NJk`WOJ(Bkw8s!)d}GaaDurm8b5xR?IWTJui{h7!(lpHnW* z+_8y&6T_qopo2@L{QM=8sKP!Lxvl9*nmVSniF<0lJbSO8FA3ZuCBeRZpvuPMz_MPw zk=R0EB$Mj|G_V`DLzO2qS945RxjsaVZ`?x9fls-g*!%bCT;DJ###sj%UBN5bexkl{ zUr=W1A|V)%+o#Yl-f!7x%%F+BfNY?GBTybhQM3r4>c)yVdSELj9|hIyBv94^6|^bP zWI|$-@+G)1GX`juj95(^X>)E9H3H!*w?~DM=Vif;3n7+ce%K)xh;Ehv&6;5tjF~PT zB!W~m!%@y7BPLJLb57hiO>cOAHb_! zSikm$ZE3&yQ1_E>7b)$;vJ+nccEfggR8!kCLv*#6r1Ik6v=?U5`Ptcpp?RM!rnp(j z1GS%>xZm|HXV0uRK?!xX|FcW;Pm#rcgDP6V*-`_qc#X6{40~KxCk-3I@g2Yf7lQj2 z!a0)z->*zGbI$5oW>NvFxVz z&J)~0IGW?80!I9G5ojy`e5!3~DX<`}`rdSx#LrP?WS#8HSKIIn?_!kG;@pw{D5^H? z<$?I(gPn=X@Z!Dl$mh|7*oOGl*fSm@zIkJhnjWG4wNNls#XWpfji~%jVm=HTkxC9?#zg;dQh~qu|DpO*Sp-oy zFq%TU+h2g;h$RpDRmFt$=kCm*d+Ie+7E5;|`b&hW?VNJn^T}sa&VY4GC&PKW@&4`l z(jp#9gXB>;M9>Lb0iRnx!w4Orw+6Po#Yiy^b*bHSg!-b$?2_A|Z-@5>HgsL`S{Rio z^s>8F2WkR_*a0CNtisO~>KCRk0H-|rJO&N~Es~&?bXcp(nLSPv9n&aQs9bqQka{| z04-zKfJMZYZ?8Lw0}hqY-4N|H=7&0AFF3!-0PRqp^sgU!mQU?A zsQT)X1Xl`xBiKp}s5xHn43fJcL>M4FpuCa-PMp%9a}gJc$e3opr>m)kIrs$Xo76eY z4^cyw>qF!7@+_`~9tx-zs5SnM8@I$&#gu!)2LLTXXEs!j_|mwKM_Z+8mZqPi3RVr& zJhXjsXhg?bs{#3FhTtBRcn$YPUU1Rm*8Tff^sAWuSE&CNMD)9j@PGBQ|8c1Q`|Kf= zx%(^taRW@iYCHg9aax(;*HS0;Ma}`7q&sm_enP|X_efj2#z?ThW8*QyCw`aY`D%?G zZY1j%e`*@*-LPUdv)sHZ0@MQ^QZ6cRqll~V*4Mm)v%Fu}Ku!mGhp7*JjS@_&wIqBR zuO7+PxI1#X@VW#Fg;jwDB-G$7M%=YcoT5_mpQr{KE|)y_7JQUW@KHKRQqy`n@qw)6 z!hw_fF1%k=G2iE6Ur@M9*!G5;uM%pVmdw^TDjzI(u=@!n{0&J1E-08mP0o-r@^+DWdPAce|Wn2bGAm5d;;UZ(S7A?^;u|_fCWXJUUwzzA$ zSqGOQoB3nd&vjpnsYqBcF`UhO;LUU6FkueLrEn3W>R7;l2HWB3Qp8xC87Xf6UBv6j z{(Xz54$_Ng%inT@W*)@3 z0U(0q(%&EgKDn~c96*F+;(;EOT`6{9&uc@83dyMMe+UTsnP_N=2VjH+Hpo%wXZ?U? z^#wTlfVjpLvxKGmrXtLuAP0c4hOpQOWtAQV$5DU}(6K=_&nYk9H{YwYHG}W(Eqr~{ zOH=x&smirGWHrT0k9K;kk-X^BVEp-3XU4xjivFj2?EhD<7vq4^4A@K}qfl zd6*u{L2|$(#}u?>?i$lp3ft-Vqj$fT{7%(Nbd$4A0XwFmP*Q(mA+&$VLNEdBTR^^I ze?U;4IU;5Wac)w?u(YQT!yFfieH+3N!yy7oecCW6m`V&Laul$lCl2cRziI%5A!lyH z>8}gih(^Czq?HvkmlM@@<^~%W-F@Bjhsx+b^@9{$%B6mIJ21ckHar4T1KEJiEKsU8 z)|GgL4``mrgB5bxygqj@KMkt~zsrAOiLTukI2Dd60eIIAP8=Ww0#AYd7)VqXEq~8r zlhN(@@zxVe#y@_c9k;KXFeGTmXs*pwR9B=lr$!ESg`ndGy{y zZT`q>5xt_P!mfEWs}S##Tz%w*R`U%q_#2AL*>2!ITp??4-t7D6hV3HO}|xYK2V8f0?i{dwnxwSxH)*BeX0dbn(jE*CS`2821ZNixZl>F+UY!}Jgtbn* z4>i$?A2^`B)H2duQYZgXs35wkLn=(7U)NG$S?N;IiUrQnw^P;@br6)8tDvw=^>SR2 zF{3f4E$--q-ic1F-91#pptpjOU>f$TF3?0Gf??QtcY9ai7@zJ`puzaBs`%w)C2WjwHKp+hewS%~3tdVJse^Sq}d$@=t}HSl#F&6?^=HMzOro}Rje z=kFht8K)k!?xLX&qMweDM=8ka{a_8fVrFv059q0VcaUS4B?kPMLAh_bplxGo_vwlT zYbmkEn%H8;w|;Ante({xQ!U_k=85QVuEN%Ab+9ggvvyQ*sWv)DSIKGTvzIvYCpm}L zj=kE`Bv-J0UzxL_GH-E{ zpC9(S=DlO*Ot4YcaGaIu#oS^)sjb0QkL(#KuCei}`R7mmzk-!NxPE>fnbZczfBRwH z)h#CSkz(sMI6r#GKy8l0uPllY;OH|XVou#42)=P!YN5u9N(nxEbHsTrZ+}>_*X1iI z?=@#*I2)RflONdnP&a5KM;=XQ!INNrOHzg~Y;&m7d=;d6^){CB*C4t7i&ouV#ghNL zP519wN|nVtu&8KYQI+}O7}n^BG66V~za}2Ou8T=)%8n0w9)tFg!uqqo&<2}ZFLJIL3dPl0!=6?Q(ax6_+e+rjlO?{Y-=LuMU{XK4%&}+x* zxhQ<+zq}=e$+H(6_eMGxWL+k}roK#2WUu&6Vw_%CUB?)thf3ec=`i5{F(aP^2|?R{ z>r2_Q&XX}izp0hwMr}oZ^f-`Z&uy@9>edI!<+-g((9ImN@l{KVsvaUL+podZe}TOisru6ty` z+W)Pcdq27~pcmzTtoo_HGe493LmzN(fP4$M(bWT0?0{&KO`C}|{et)0Qcz58BkO_2 zP*W`5^Nb8~Xx_&G2hv#UjqA;Y3QjJPL!;acSsVuBc0#iWJ`hpK(pE=nw^}e3NQI<% z2k~G(ex#cikA$?LEEm5LK!0-pz_S&u5G@bPOfvngaBD^|xWyQyhXh4u`lh*Qy&SR= zH1*z{7ILh4MGZMA^wol8@ zhTL#ZtTU;*s+y`4H0{h3PRV{{`sPF1^#zNBE9URIG+#>y3B1Q=d^*JcK&Nw#@=GO1 zUl5829Ih(1V;#|G@b^B*5sN|^EG&wzdL-#R+1w{z+NzbOwe*c<;(t{kVc$r+PTBa2dwE{0aR3>Og5D4B#RO@vev3Hw9*@n~%nLN`d!E3GPps8pz z4Ts**;l(4*D6~Qh1BbayVVF=>Hqg|BxXHEHO}@80m&}7Zj@6uxL&q(gy|5+qw*MHN z*YryBUd8d#3+Q51BOien|RoGGljL>5I^7ubgB;U49Acc)yR{-XXxWibSN zg}=~wz`4udjU)V&021MVugFK@8m3VVz>aq;B>H5S`x5K4FFsE?(0BixK)OZr;!u#| zT(?24=+d0*>+X*5^^Z3@Sewd11I%2B-M8lA}*%ycvaV0 z?A-iDyzvBRaAC+J`Sy;mzKPD zJ~ezkKw5w3s+j58SH`H6fU@Vyc^lRZvt-Oa1-4?4<|ts*LFKr|fQW@E^eD6hia7Q> zI#N5c##{zz1@De%Qr)#Rich(w?CVf!(_r6FcwhL~!C=F?k9?J@g^tozuD4!Abm!jr zi{<@Yrt?Qe_xB7poXeWy#u4nuv0Fs>)*AufEcgASSYiE!ZFT z&{PS~A^z4C%j28;eusPdj)C% z<|A+*`yl5qJPy=@=G9%*JatKrsWB|vvM?6v;*87xE&=?q3Wfc8^mn)A57Jmz3R#oE zG_`}3zzNX?W|o*&&L!Jh8Zu-)Xhu#L@3xncJSDJ7Cq44@ff^`Jt4O{GC4`%wM< z^j#mq4TGM>ck#x{$6Tey2J6E>^NNKXNT6{dnIclQ4}VGZhl4mX`~9s@<7>9kHkHFd z&pKt(%*2WVL_H58i77Cu0zzdaM8KSG9w1&^st(%F`tH-;di50xU9t4gQ+h0I3I(;PtVrr-#?wO;jmAJ z2RcgbjG^Ph3;8MLJHI=s1Qi*4+p7s>20;mR9O)~}o^mJ;;)tKFEL+Vb`3m~uY#2r% zdC;1^UYqx^5;ofL!(9dIw`_0p+Bsl}8dlh2*mXe`dU@cV!)<>vcv?ka;L(%4OdQ>) z4tED)SeV}x_r`Lz?4i0AKdD!~kWDSJ+X5 z5DyG2Vee|Hh4in}$TIUg)ZsalM`@j*n?`s%RFHB|P6giiyY_7_55(P;*$TqZS%?b!-QgJE5x{F@tbmOG~V)pzT5-bH$VJ(qV^ zE3!t5E-hM4D)0`Z(D$^I>fjfa2pH<7=qE$pOeDid#3w$NW*+RLPBwfKnmZ^n%HB`7 z!BCqrVn|hD^1Q3oUDeeY^jGY(ZY6ea3?7{9yb|U#=Ok2t^ANgS$6u6!Hl!@}APq}Y7@PxC+wnr@A0ycFXdzdXAWX2C4L3n^hpd{ z47|OqpK%o16%B=^tTgr_%Hh9^=V8|z)(#1mN{C8NLC)yvUcVAmA#(ULQ%*Rt+CPmA zg7@-t496K*v5z!hrpDUAFyd^vhc7m@_H{;D+VU}Z2kymte({ycN=@c%xgvSOkI-FS zjV%PeXZ*jZb?@847h73v3=`&K2N93D7E$);Gp#`-xKM)%IkS@dIl%~g&d5wp-egbF zyA{Y448s64w?Y-0vyojBq{2>)c*vj%oIGG(o2|+s(Vv(bcKYJWT1&39&D%!!>kSAN z*)Ils(=pg|yJgk+mlCXRSlSq%c(xdC#B5&8gJh6Iq1jjIAhOs|XhE1Chq1FGOf0Cg zgS6^j9^zRjG-}VAf{gP!uZ11yNPL^lFkZ1@F!r$Ax!Z_e98zV77MGIb25LEe&_hq0Atm|z7G9Dbmal{9S7Fb zGan2jO+Suvxl@CuzQ05k4NaZeR_UqNXpo1@EjBN2tW}M$6TPrh`)hoj3-g(gvxz|VckQD*L$tCmQF#0YAst0l}g-P&sZEiXnkN#~{QbmfURUpMam zGzqouqy$r76^L{DC(4Dw-l-=9668cpZoTDDneqj^U5O_C(&qh+^-tdPA=$Ysh#wA- zd^FS`7ERJvOebH+a|n}74F~n5`L(J4<@NGs7L|WJ{`Y(IOQFtL?xoIOm+4VRf$Q&# zS^i*-3oqxZ4PgId$fyIxuCN-L4`gl;7A>#e=$`i7nUMvo!D6$w+ID}6yOG!Mmb~fp z?D`R^~UvH+7xB|E*6G2>dU=79do+lgBHz&BLl{z@BF}*IHk&vS=BP+E9wBdSUSHC!iL4Q z%x=A}m74q_gl#{@QwJ@#gkSQWvX+=Kp_8bC$QmhnKEwMi2Mx(&XTm-w;`ZlD<4y!F z6l80hD2?EItsWGouP&gVJiKTt`4~!jLQrFaArD3rFvw8ZrBaR=!7^v=@z`7NIo93A zw~|Xb-Kuo?Xw5Bm6W0h&&uBpd#g5%2w~awL(wf7$o8Yxmnl`*aZ)QoWeCRNhFhfnu9AUC<`#X;rPDe^V^Sc zFD*>uWcdwwgHI71WBW>7K~F}v`YT0yG4eITS8LeqcAE(ITjTq4 z<^g*^K@LK>{oF*%Drl@B2^m&_4}i6m2-}R7_X|(}P~dZLPrUh!imk=0=qgKlVKUO& zoBuvZ{mK<3W}~wGtk!k;&V?XcFx=AfCE2}i5<0ykSbiqq-~;%Mot+z`}U*~ekeS_mcnIWDfv0tCAlUOF&a_TSui@aP=yi5hB-cT{;9JdU# ztAkwZ?^-8rnLHSFyOyYf79*HN+Qvw`t50CMA;)$Nu$-Lco+mc2&8ZS!YPD|c9^JPQ z^%JFk^AAQ&zcZCx9Ap*23y$m^#QLA8b$}nTKf1yXeY;fimB+|8=4b)QL!q*!%|}jF z|Ks-#NG192&*@wVlXQoFD9V19mnR7TRWWU}^lu1@Y+ zu`?@8lu%cJt~>(ka=?$30zTSRa9-Z@tC|T-gmYVbJ?vGgan2Xn;ze}-_&-MGx0T7n<4l7!!0PZB<1OpcE-gNY&Yu11?K{-pnX|^G(jvof+Wyp?(|?kAk)1OL4ho{o9Mu@l^#jMpDipbaGN+=4%Adn=hSRC zncturr?d7|_|t^*2T|*ft1M0aL;=Qdnavq1zzYIi$V_dS=z(Wyn-*oTjJkPj5dnPm zxEoM3?iq&#wB1JC$lc;z2NHdPUJc ztXZh)Qx5Mx)vh)*Ii+|bzd=CGYBc3YRClxWgH;L-*6$NT!Yr_biIZ9{`>LLgQzT0T zuUxtO9c1wXs=Ir8zlfbRsMt~c7`0!KB8T0cj)|1s43r&t_t4uNT< zAlK&eZ^pVp!E3=H&_dT-c?vwgqsd^&%t~K0#pQEfPqI(8irq6E=Jx(X?d^MP$;vT6 zLHA}jN)*PmnFVkRl7JzT3vgH<2O&ztaxBBjJjy}0txTC<4@)s`RrkqvToA=gBqavr z_av7*T6q_((PEQZ;(20Eb&3l2T^8WLSX{6_NyM6Eu?NZ)o@3=Pui0oMg+h~!Te~-X zKig)rdrr{Scy?I7+|4e1n=yK8+@2K(j>J2IrHw${O;zGVepoe?__bI(B-3Ds>K5yY z$j8-FcQ?xxB=s4eKiRc)g&i<9r#Hd-z;AoSVB-(7LKx(_pD1zHmi0}~`(0DyJS3D# zsM+r-tFJ4F=$xm#po9V*lps;As%D*pz6+sB_20NnbcF-%D!=8q&dd>akuGbkT0Sh2IEG-@! zL15IZxH-!R#6b+ci5^nX6xJtH*iJZ{?p8dV+PAjN2{#$$P1A~P^tp1LkbFH-bhl9W z8Rst>oVbLn5pp+{Rl!Y$yfA?sSQ$V9iCg1Ksx14JNbWVx0q0h@?tFT0N5|X?*}PM! z`*=5>3n0e-d*+^U5B;xsHm;Kki9(DkxJrM}3dIqZV;zHSQ}JXghC#FTNGp_ zPuqW@ZkuyrUSnygxVMyGEbSRK_Y*8SV0L}5>Z{GhUU;TZ`_diTdU;*s-zVrr$=(or`F!~6?e)^?fc4JzXt+mOE ze##?1d~9WwT)X#j_Sl(uQ;IY(EjrtxUi4u z=r-vP2^~FArK55`bXXvY1m1Gw#!@a)#F3W0kVHnub4FBZU&g(!HP0TEwjJahJn^7b z|5EVkUhJl63M~|xeME{Pu|$|g2$C(UuwusGPCe44M6kQlGNc9IE&auer@2g$3zhh_?0RoW z>BG6lLMZ6z@bA7;%s<)zmNTC@^C*m1sWL;3wh)eJ!PAFDLTJ4*Y`eD2PAVRmJs&<- zyF}iN9H4wmq#IRYdIAv8-=rc?s>lR06zU&QCY$d2aJ2dP$)ojUIx7InJ zPl4KcwB}ntOFgy~Xb1(RpMFOGqzgESG~d(;=E)x-p>+>V#735+U*Gd-D{8+&nuVRn zagXJ~RUigY;OuTj6gfoLEX&NBKO(;ud$8@=P;7b9K%IHql1_dYTHZjRO^EIDgq8xj z8z$Atf%SS7B4ElGt?bx~+jxO#RBeB8-|f=U;x>|5VG?e@HTyNM*?O1hG&5zMtiscS z{rM0_@)4VtaD;K72l?c%jmcj{5>s^eI-$j5)$;f@ZFD#N}mmbw4hBcX3Cv-V+4O3N+Vmn*F%?hTJ1IR7 z!^K)#{*VCZ1K`vLE*uBo+XXIV{Fvqx7QoSS-raJbeX-&-hXC)V!9Q>k_+Xuf`NH~M zGm36;v)76qZyZfAP9!vE5nk+$6k2J3FXV_zAty=9TS$2W_$a$NM{Yo9i-tX$Eo4f} z@=uQ6vd-+4oB!MtHg@rwX<&`xK+Ew5zWLKhWsRiv!e5+Tzdq6|pqszEX}{YNfBpRL zM;#>J|BC?*GJ`EnfjKS0Q0xq6!vZ3Z&jw4kVkOqgn5c_6SE4T_?*TrWgBcl*j%smN)oEoBh_vcOz3@3v$)!a;0PIQ(0mHJ-mJDTSi&?ycc_ zq^Tf|cJMV`SVcCwE2)iFtJ32P*H4T2a2)Jh?~b~^pxscL!U2E@Du4RKy?B|qaxl1VG)Mz|H{1V# zr%ii$yYId<*?_ku*Rs5&*52^B^hNub;Rq$46xz@5YT~SO8b~Nq3)MAa@Ej_5|ETcY zxWuO57}Noxl}1mN>zP~IS4`QHDzLCDg|m*$B6L1uVynDw6E|tGK9hy0#os(GDjkl$ zw&``JqrLf-2dnsbHv>2;N1;(M!1JyS>fvGKe5KGbu=#pV{Jj}7l}VW#`J28Y*&|XU z(eE$82=LTBgxQ`7pNOz&Tjd?$TkVJHoxog=qv5N!6a=Ye$2vu8t_gq2ca{f*+J_Pe z$oL;a)+nbzPnf_gT7_Rx_bV@D(~D0@v>v0#|V$GA)nVhB(+P2++2W9 zU5$1NejrADyrYEOaCmfI?Ye}M;gQ1^#=p$m+G&|x8q->@!n}`29{_$~(NzOrN)&df z4XVm4+Xc!jT?BB9Re(@xLjl1%KNr2k3&ESsY3Rvgxk#WTvI0Acy*Tz}c}hdjG-n;{ zfM|u^Qbu2qUaX_1vtk+%ac&>%sm{r-p5dITwYxN>-+IY$)`O>5&oDwb zQEw@~F%Q@*?=BK@tci}{hTY^xlAn?@RYtJ?@(_oOZK3^@m;WbuIpPPolHo1=Q##D5 z!NLgQF8pcM0Nh0L*8<#TZJIZoi?J$+FmH8w(hy;5HCP(8eq(Nd=IUKf(ZDiy-Jf)F z&I3ooG#2=h(}M}1x>7L=GVL8I%rq8|4FudE;JAU%vQXzO4`|(f#<|5D!eu|mRukG6tlm)oPTNUKRSt)WAe{`wrPZ;7L!@cFqSdL zy2FjtQ{=3N^It}ZRslzr+N@0XoA*6e)>3a-i#=TtIABcW}0RRR8;$|Yw+HXDp~D)yBV8+ z!T&_rc}L@flLyr*%r_EbO)D}nVq;0c(K|mAU2pf>ns|>a-nvh0WEV`^4N6LT!1|yl zy-Ab2wEqQ`5#x>6fl;1D04T%SnaJv7ri4Mr$&NB59RASs2|+85n;9jo9j+J&nv@~0QNBp6EK;dhc53Wj+A6YjAdfGs1=c*_VB-$O# zk?R49UyT)94ZIW>S_dvxonyj$6T|pkft8x{p3f#O^_#sduvf7@tl8ccA+$UA7N3Ed z-1gyz+nVG>JXooeyZzk@h)_|x9zW+M!>BenhPqevIF|qWl2<{82Yv6~WWV=UKbV+a z`)PQpKc`?+=lE`1Z~PyWFU#te-~O|llLm+hz~I2UY2d?L#J3u9?^B#-)>JSB2mQii z!+qbq7j1CKsJqr@|1?SPe6GE{UExxe)lgIcz58wRYZ5piL_x0xj&ZeflFuoF_!TN7 zm3vAPrQ9ud8);k}uWfb`#Uxo=X>zn-#`qglT? zkgEouMezY_g&J3ZWKfBj-3u0J=SOJV7|EubhZfbbcOjO-7-q>UfRemy{K&vT)c$fH zuJR{y)_a=*J0nH-1~&AEy=1mbSbs+itsKg#$e|8+3R9cTrouf_FIPM+95+ zC+gE9jvOfKsT~CJ)oWr15tA3gc|*#Cy5{NTT%#X=jn-@W@g9u3FaBL&&|2IGP z|C3gS<&0Qm@d4N@HQ>nk3}71Y)x zT*(VzYZ%+|-iTQzhb`V{39j7N`KApsEAe~rz^`w+nY<-+IxDMmwoahP zZqF9ijHHPpj!N6Y@;;5o@}Fd?Bj^?2vr>TKC1s(alemuI`#R=fc3!WT7q7ea%B8!7 z$Lgd_YL8z=mCHP10AaZ*cy5+L}%`t+=#ooN@$PSsXQW6u`KpVO6Ky_BvL(+%o7aZgJ{WZQDN z|30u1GVfMH)(p}FdrfK8iJSN%e{4LTXwP{5+;XbGV+&O=*kEyIwkapom7%{~AzIP* z^wKZVL-!k6=IM&5J@r>iIlIkeV@n{0m!YWYg? zw=keIc(^1YR8{s?R^qz4^@-P=Zf_8ZGk*#ab8)adV+E zvFp`c7#r}*l2GtzWQ_~moLX0hdrPW@_>d|~A1i`I`!#q)liXpBKIls^xU zg0%q2|5`mBs52M;I8CRX78eJ_s`R_05dUnf($ID_L1qw^O+!) ztz#<^)EF}nn%+Ep?kQ5tgE6*WGiEgfaf$-Z^^TFMMz(MK?^BBUC;NM6oa^UX?a|9Q zMGPWsz|2LW8wUCjVIZFiIZ3z#s(uXr7O^-E^>Rq)wi^OW>YT3w6#uSsyO5{GCC&N17RjkBjjz7JJ5~4ha6}Hz3 zcWj%&8LYJ(yS}SYxlR1=CAsJ$7p~9kdYu7$%npnqTL{Z;`(qiPU6RxNn_sjdQww;E z(Wk-rz;`VI5oqQQ^_5_-`>8h4XXDfgJd0Y=+9V5tW@n}AMfAqz$%C)^tL%DKzAQbm zel#v%;r_ytsYT4UBBk)6z2_!&s2Xw~+w~WBmPpx8jpiV4unZP3f%fBWCRg@zRDO6P zrsQH>U?eXH&s9>rqY3DjHs7_u3_oEO>4nwjMDfDwh1(Q@@rse}OgH4bE7o5BI(@CN zCgM@11{R4kvl$CJI663u~f;Q#RH}?c-lJ${UV=l|<`Sx`Cwu%5CMQ zLsr~mdr4h}uKr6Dc16t%f>}k^Ue_JL0U-euZIEyO|VlR+Fp@Nw53$PBOZeTQ=xMsrbWzPhLaSuK; zVrt8Z=8LsyPf>RC5h^=(aYe25hR1ipIi?`Hxrx2hv}6p`;W(QC%QIVl8~bv*%A)5l zeiE~s9)1StAuxghzY<^!kRQI_S&I90eRvG4X0*}NBf!g|VE`%uBLJ6fZ8_+@9HV$= z;U+dBUl|=lF^hS8^bZ@K1!fp8fJp2TlQ-NLnN(~KIF%3bawo50?cL`7L{6 zc~pYI1m$jMXsj+Sf-D&%eVQpdWLKUAr_?Uxp7GSMwtf>e(@xiJdy+2U|2Z&Q_Z{a7 z_c1Uw{fHBpHPIk^8q{d7kRB>u&z?55e-qm+->bAgeDB%>z3uVOoLbjpf`Nz{v{qOT zJPr{l*vJ10I)c2Wco#qI;eFp(NtnrJQZPE*zX5VawjiRp<_R{6`ZS;gtxeo2+oE{)?qk;vB2tM)TK-G zT%k$`@2{aa?QcBdp|L8a!o= zatu+3AHuJ30_%1)qT>7+=dAnMHQcRxv*L-4%-4!%{X)L%;=Za9Z%lbFq)Gimg|`wp z@_B5OCscsH#X+&xI(jN>hGT}WZyUA@olXr}@;xb4899_Z5wJzpHC_BdtsMU`5543| zk3zY3I2Q0}M$fQHDBeVl?=hxrtrfWdiRpBLQiw?UD18X{daE3ZK&NR77OeamOJpC zgQg11E$Ah6O7caJ9o+ZK<_X+5EYGcaxpe(QfS*K}S*DFbYU1O?gcHVnGi&tLD80*l zF;pKIG2H|(B|pc28wt^#Dxd%ezjXcwkMI?(b>|5h#NDMbpAB#7F?LhtKb7n~<(~H0 z^iK1f=FINKqg<4Iv$F~JHsnH$B8y!>c5)8ESQ=H-zvrN*UlEf(=ds5^YNqhH{^?Y; zK3c%1x5K_>ju$T4^WQK@B8?UzB5j~hqvk)1)TX0Brg__zyS3*5=LD?J2py(|Tr`mh z@?|`W8^($_Rb0kC_3YMLin&b^id1wfEwkKwCYEpOHmjE_Pet)8hpSKzXk;~-mpoZ( z4=y$O7?+CslbTa5KAgN3Tvv)=7E!AeIw;>^tTI%&)k(c5O{QH|R@OD1Vt(8!uWj>f z?Q(-P8R~WEmZUFZ|4X{7|0vo((#sKi#N7d63wuCIF?(=*d61HVF}$8xGl_`o4W-YQ zhF*DZyhZoAo@t(D+GXGA$f2*B&#{lky{~zEWGRe;pU=6~wU z$FxQ)Q-BU-N)m8@PryJdL^uvS1{sbZP>x*>1m=mtR%D%}-5h_MB``$Fng9)O#37em zr+@I2qAQ9({ml^Fx#_2>%KwsW)&KAR{(sw+>nDTrpO3?T_PyF7IJ84L!D9~~yI|Rp z#^B7))VJkAJxqPD%f*A#dI)+@^%=}ra=3{M^IQ%saNuYyL3RD)HKlZ0E-7(khkgRL zqTY1FQpQUX6sDp&de38zQ+7=gxuR&1_%|82<}pyccr|iuJU?Q5L>vYIMC3UPh)#1i zCisQ?ik#(i<5l@JA}9~P%MQLKpG4FDGzZGU3ko1 zk@174RskKWkYtW8{~7r2O;38P9yu(@?K1U2%!o zVws&zpAMUe?_1t(aw_#&i(8z*Z+Pi6hD2Ti)`fZ)kaHV(H&S8a!lSYP34nv>RY<>ImD(6q|oirCr%QGS{w zCGQm;i>mJc_LDJ}9(ku*2z$G z3pwUDoCAcwt1P+Y&;^IqK0j6{^WcMFXw_Flfz0H8`uu$Ij`|#j#Bih-f|9@XF#X-2KqqHMj)Ny+vE}fy_in1??j_;) z9j8CPJ0>c%c5Tn%3gjKN^emaNp9-rwQqknoWQmg;TgJonHqYKIB>SZvnUvA!$c*#w zTgl8V=~>few$Y!{+kU()I9`7f2o!Di@vDJgBN8I$ z!%U>7gjcPDv8HgaLJmF8uGPHIGiFQuCWq+p_CZBO&CIFi@(pzHThbd9lDHP1{^=Ql zdndq=$U=@bvt^*(H*_FG-c&}KME;z~x2z_A+gSts%8xHzGyql0E!s%svE{NQs}f|J z)QH8GKR@_OL^1N0`~GoAwI6Xwd6G(|^#Z~49@1Ol(n1e;eq(3OTf$c8{Vz;3H)Iy` z-MWViRTqF#Z z_IlDB08SxuP<1;-<_TO&NB7Pmf;o98VRwSen+FHFIi44?mFKyil^VT8?#<+uu-bN> zWn1y7=a)bBALf0^!vz81mMYjV_le&RSE)cW0@ySkz!>E<7uS)L34XE+AgvN2o_Su2H^_q7Tv8G;DvYbsw_jcAoo;vRbyrq&v)x3#RJdG-r(y$U z1)25+&9LfKgh_N^eY#(blVQt{*hF`Veu2l6BbTyuSg$HG1ip&ywQbnH`rRYcOf+qb zBRvFC^bvR~)31gs4Z5gjZ!KJlxLF)1f3907XL@6`Qn#d_w~Uoy`{9ol-tn!va^_7f zUo&(}BoF$p(vT2@N>@s-qOjWxzn+KZM?pGx5 zG6vuUdO4-`S7PCmZN6iEpoPu1$MpNRD2@w2Dt3fV=SSKOvS<-**P z3AQtzJ;#%cXS<+(@azUanJ;3I_!iR};Kmiu;;ewa5Lym9#(|x_mg=we_L@rQ6`Lbt zj&Is8XyiWYBspAZ{&Hs@P+v?Bp0G;s8Hmg;t4a_qdSGXAF!M;F3|Vj z(vv9eYwidrJT87h9{;;c_n$RWlE(B|;3^_@zl9W6dA%i|b#-svMA$-MR)2gt#S((uP)!6gYIhQOI)Si*c|Du@Tp6 zw5*)v)o&nDv>T}C2%wv-Q*XR|QBwtZ4|KCn0?4j&GczUJtZBi~={};e_OfpFvF%SH z!9VC`mkT8jGp-I-xIEo#IHe&@;6OK}H6jR=?=;@=%+JhU{i%ZozrmvNHfk8ei(|Nz zf|)zCvFXEXtp5Tl3m$l8nqSQz$ZvNqyH3e0X?`)$FzMAsusgsL`!k>xi54cRO(k(ZMy={|LrHoovo+QhuXKKdCdgfT+EdC_TKnt-J`1a z(uqDB%>iI>Fl_Dm9;1S5pYh#wty`^M?Om#Dbl}Yso0IidImt_jyPmSxwrAxf&ry6Z zRH`-Q%{~A`a1A(Kf(qB|Ke!0p?Z^^mc6SpXeR5$&|Z-X zOT#d<+Zcu;cS8fNP>;*EyR@>+WV3s6{5rd8R)* z{VgpZnKDWKsDGA>A?N=m%PZ=k3-Xqvl;-RwM5LX{%^(dn~D9Gs~&$L^Fm5I z7q@`(1JsvBwh=-56MJh9amk0##REC${7v@rYr6Bh^*6|CAI8BNz!z3L3)p~|sKaVQ zUb8g;CYy*-9vjX-8PP3xD&)O(6s2{#pq%>f;=mj44tX%tL7y}NX4@YH*;q>uXfz0U z=wC9)x&zDSnKJt6BXxW5`DcTlwilPg?A?dYxE;AE&35ng7aPAkudUy-#{PTO|4~DI z)8$-*KN+g_;H=MUdg||1eNyta#;{jTV5Wa4HcC)nA?eCi^=FOjwymuERvM8bBMCM_ zFq}d%J3E~th#2xfY*GS_~7oB1~;}tua5VJ-#OWTaZO8=%X_uw z9&%wZ8y5J<5$GFK#x=cYAooiNH4!pr8?-*tkDebe+9w%NAHBWQFzn;iL3|4L&I1lv z`|3bbxzxKBPj>7dA@rZ66n~x}{YU>5b$t+^;6v&N@1eCE75c!@x0LX#WjSkcvvdgV zBxu0W4mfa0;NJ5yc$R$5-$5$fPm3)(Zo1w*lVNZ<>!9ED%AWkx@h^n*!?@c-#w41e zhQ#*MBal@pKnVewuo{==k7bm=j{&>})MC9otB2Ka`VX+`1b|h5oZ%t<;Mq)QZu=cs z!CK46s@ThJ%&}}4S&ep*L?$1+-x%rQ85tL#yv?a~VHsH^{~KBTbDN0&XCf>xpMw<- zmfA)_9}yrc7$B<<=pr@RWM#YYugEH0zCE8L@i$~8@pR4VCj#erWjMbvL-@Z$RwV#g z1%eKwC5zUEIL_Km%px8aOJ24^>KLX@fn#ZvJ@*D+VWwq=v2nxom{un#1`Qq3H-1IOCDca%A%wb!EF&l-x~P_ti(?|N<3Tk zpnUEEA4RP})-yPJt(zuenwwr) z3`gzk`jUJ?E-Y5HE3Nm&qn>XObTqsxl(n*hbDnZAm{Hz%E%s)@U9WxlX=^_Q7mS*p z?{V7{@saOC%%^oCmw36UZ8&kH8lcKUI55L_jTvJvI*#~?cneeF8?4`l_sY6meLc%5 zY;AW>@|0!l?%dTIUm2#gm1j3!&ju}3_H*Lw>riz!DC!Y=6X}CF40NsD$+3E^4er{O z9@(W4$pbq5*3TU-B)10oYzs)pIE#swd!D-{MP$tl)OdFkF!`t5$1pCtEsw!kwF6GU zgA1tT`13U`RJRZ_;FwLvI<2<)S*zs)0E=I7Ui>!fw*5SJ?Rnzai+P@gmK`q5R#?{acpS#P8(TJ~6#!eiT91GV+Fi*| zsX+bE!K~8P`&vI{Yo$JtaPJCugrZC!f8lm> z1FAj`jTlo4vbfRdT7dDBeX(><7%+eh8;~kfAVxB8@^0ls?jX)jWFZNy#a{tC$H6q; z_?bt#`7h@=)aQ!^RMxsV2$9?+Z#jHY8wWce4{Bs(a%C@pXp`CQ{dC!06^8Z;L z|NGzlACuiOF%*YAOmY<2P3x9|6nswEM5(hv{{>}yv*13_2jjUT)_BcxXV;Tc?LCtZ zWeF%slfEUxphm$z1@;A~=Sv3dAKU>KFi0nv`}3KZ8rO6DN&70_>}XtA*KCqITkP|8 zAech#u_JH9(4G?+4&+`4c)esgjDsfHVuu)fL+V|$dk075ajwtA<+{rf0ksw0l>S2D zCzcN-YXdAd+41mks24D_zE)UsCh3yqcXEjS)%IAvdb$=WgW&ms&q;t|3WyB>K2RH0 z>LN3qe;tGE7h(a_N6{}xXL1jEQS@HFx>y4e!Y?tG2s_q4IY*_wYVs7k=od|Oh z*G8Of1fis<8*>`iL%L0Y`tm9Xrb=+0v2}KkGgjz5^vGdwSHkYH!AQ+K-|mhgpNG5K zZen*hYziMvcjtraxbYYo6%T8+*3MFDha%#tHU?>QP8G?c>Qlk20Y^)^lf=HLmhL5K zxA=rzHUl*cxmGU<#OhP<;TDO;-Z{N3!= z*S2se`ItRQb1S$|lCgP2q?9I2(*uQm_qMt)I|9K*Ju7 z9bx`m7`Dl1!?zY`%6GA?%JrSORcA|ok#O^93J89`&HgqdPG;Dfs)0o?fG%vGfWJxF z!Pi;W2X=5Xtq_xo-m|!`5b&V~7<{ES+nyt8jfk9v0s39p%owQ4dP^`$p0g?rr|)f0 zr5AWXrpfz_-|Jk>?=FuU)Gl<{g=y0yw+gTx#$*C$(Zf+K(==x0`1`iT?HTg79z%M2 zme7X;zJN{%BNmCNGUWiSn*}!l>(ri@({w4{o9(_2ZoW&9Z9YTSFf@3wEAxh<^j+50 zhjOP7kjGa)Ml);xR7d2wkvP^896Hpb;n}EQ(nXps%GiZ>jNF zyXcjsbeGGKOBGxaSZ9|im%t^Yf{v*F;OQ#8^_>^P^4n$GA$J(qN3SFifZh18>uxdi>M@M%QEM{zcO#y|(F= zMmZg!Xg~L`ZxZE|aa8FY6W!_f{-(x<1jvOjnJ=3;+Iuz50Eu&PcdK+ z#t?WNh!;EKWYl=4$vaRtskkm-k9Us85vzA`Th4A~sYQEVeJ+s9%q5ZmS$9(|7g=Y>Zt^qNgAtYOoU>cN@HY;8>?Uly%eC zAsd!F+{w|W2aCMPc49UaOu9+ zr{13B!Tv=B)WjC-7NGJNQHRz*QxC_{OV_*AxY{|KV2DOT!`mXJ=D@}}!hLPLfo+Mj z%3yElqzTj#HWYlyKg|@b%q#A9>_6|f5Zm@Nuj}(UZTa?98kD>iBNhRosIc6;4hrk_941;-b3Qv^FYVG+kXQnWZeQ(y_-C)2uWiYo0o;hDLQ}tnk{8}bYHkw6py z)K?;+&%RD%t4y7I7CFj&&{|R6NU8Wfrw1V0k^2J;z<|E$Cr0fL2J}o6#ch}n#?~gZ z00Cr%F;<$0WuPO9G3y-nWeKZa^U6)pkRi_Qj62Vc$Bk?PXGQ}zqzVJ>9WbOi+$tSp z!F?2DbHyuTajee7uxDsn&kl3nspMptpv#L+DpA5CsldRE7@@Ec z2IT+B8W=42*&6R%4cXcLLe35ritIV8{OwofqU?9?)`={V=q||GC)^i^Sdalc&Gcg( zW~P1CQ&57VJu)Y*@!nabAM+%dT1?4FoU_Pw+vr}wyCV_k!4aRTRMoRIsMyGv8A&vJlmQRL80_lHyQcN=vs@ApY4 z4~d5Xs1s-gg8|7?WMm-*lN^TY0dECD4!f~+p}uVlJaS+CD<9`QN1ld?!!RxaJmXn| zh;-?ib$W3ydBrFu$5&JTA-x0+)TgGT6r82d7%WC_wD7WKWyFRWO zTN1{C7^lk(BkUl2U=aG!rQwvv{qU+>6RKZeV1O9PrC7)k? zr9BH3rA)Ol)L50UL2eK)H-n?=MkfnS7A*SN=|@?7Hu+Lu7_X$gpWr?clf3VuZ7^v> zzYfQ6MRPVZ9%kZM#E2?o&h8FhKd|Lx^>R@%7Vp{LXIF+ut_vw;;HP)9gXuz?CnTv`dZLG?S@}P_(&DWC*gh3E8M$Nm2WO3HY$HkW*t^P zTr|7(QbW7=q2rnEncok$llg$frWUMgjR+R9y@F13B8KjToM}tG z?P;IBQYqw6oZNV*WA=&Vbbeme-h^76BP-%$A8-5cHbg|2hX4X+HJQpdtkoCIdIfgx z1&$`eJUGZKi{eij$_gt2(+(r{rXHW3ncmViMK9K0!GG!`<;rbqx%c;wGdCm5Z4oCh zEecB+qxDSJv&}dgxDn9VzvQp%OG#AIvNvf%tf3f`lR zA0&-=9Jf?>ZbgjFLjxvd{w3R3QBkGUtx#FD_u{S|TDvwrL zdZR31ZMuU^QIhENnbiVQn7343Dn}jO3hq?6VP0Eh8DlguYuv|C;XwO|esduUh^p$q zB#l`AqbPkIcqaXsOfHi~U6ebGnf!wJo*7gs2b%N}r9qkY1vIYCc8*dd&DL^ye^!Mk zCaY#eK1wsq2+7U;Wwr4-^Glv{g^u7;SuF40Aj>>w|L7C2b%u2SWSpY?dhU}>LV@3= zBd2nbm4s$dS}9(CyXjKz-Q>-wNhM|2xm|1dy`pPM7{#tavmYqr&uyILCwl=5 z|3vjsS(msa1WArQylKb*EAsVPcaqz#`KJYUGTSY)ZG^P(R}FSNcV11ip9jgKh#zxu3O5T$$KR{*J=5tbq$2K` z(Qkw5driGnxF%qW{gJeQY%A^ZBOaA@GfSM-wIHmY2tp5$BFI8Nc+NvSux6VM7i|hp z(s!BEbQ@2FP$)vjA4mF$Ub^*ozvWJO&!q>XQAI@f9$*#&S%AbV3}M8t(F6?8^7%V&^-Mb`1g zi4RMSVfoSb`$UDj$8;ZJlS^LTlnCaryn6SE(MHpdjDtk}$UICcGjpV!WoOV{j&dN}Li5TWdBu)xpFRH+;X0%hUNaG*+Uaod-p zBDs{*f&3SEevwJ*qtdr1P$>u#(_i>FHRKC8Sao)~ntjFJuX>Q5`^p&aH@pw_VSO!f z>-3ri{p@W2QirFhbXAx1p?egwjJ)vjZ-%O${VCPIb?Z^8?*+gc9vq!WO&lj z)XX}9)Uv)RNEL*4&wOjemc+IQ1!!uVVPCIKP_227PJ88e=iQ!qh%{S=?+awP!S&De z@|ZqD)NtdYzBDzPoN)>J_H~9Ude$3kyzYq`B2BRwlC;|QD%Gf-tzWGF_Tj+xLdycXNJaKg8;>GwZw} zC3UX<-O2~<=nVm{le#e)D~UjdBtvB!#lZ%R!}w+Qv{g3c-~tc_1A}(k0Y1}iVaSi;;qzMj%if~lg)csPmZsW<6+c``8Z>DOP+G5!_tx7vr|hZ; zBb)!wDADc*Vvp^*zX_j%MnH0~k9*(5#GibSxzGTu^l(=0F1pn&tJd^&<*RBL3s>9y zyLjTGQ9ii+ZDyyj!Usj~4v9S&=!cxg%p9Fg-ia|x@G?I;7~N4Yie_AB$M-KMiXK`Z zyZqkc;^wYX*lioHKHKapplJL_;CsMd##Iuin}Z_ZV_;(tKYJU!@a@;M+ZLW0Dqje@pR^f7+;}7{6ScTX_^nVl+ny>zFXG0E<-3! zw|k)T!?%40lAA&reD_I-?jZGTQ|03jD*T2)U!+0F@Y|)2XwkT7km9c%?)|Kp!_9D` zd%Lj|HweWQNuODND=2U9G?a4Dr@?aw)2m&FW*m#*pRE^#s&!CxB*T4$3IKeB`HAH0 zpsc03urGCpztkREG{JLq`Z=~pH&v`k!JQ~+BJCeHWFC1oRbIbt$!RpvPq}d0$Cu7E zKsa8Q^ZZi2Rk9t=@Wxm*rWOm}k`N#8fOdc=JZQ6_fxIq{ux-E}e*lisfweRVnn_fWw9Aah&t1fDXaXCbo9g z6De+^!y|>v`W@43*LeZ0wm*Q zumc?xWs^5y7&JQg&5O^bvU7?SZ@Jc_XXSpukofn(BV)0TZt!wIAJ{Jt?IwnC4BwAt zF&SC)T9l@@1Pul$+$(60Cmki>pV+w0>BQhbBi`_{jf}9V*FbYu8&2J%ag9SzguB5H zp5rGM%~_`0*MJb3?Qb1=0~fHB{D%)R^J6yT+H0I^Ns&l+{kdR(^0DBvgT>pk>TQn| z@2noJ%Kt-J{ip2^f2mvgGcVDq#8BvqH%MeicRS3Fm4nnJk;?vTmXY^<0Zt$o!2)2TQ+1Q7; z@PSNE8EySO2Ug1E43NcIaLG?96j>+WVNdo!QJka2kfrrR6L!J_QSO7nZKU}o*2)zcMQpz}4^}eM;vd>C3It(bbAVGo zAPP+&(;h1*_4umYn#Zg=uW<2cU_g%Jdy$x-W+ls4g99gy?6*+-Two@)!}wLn*=>!@ zccAABz(jIy&+?qvl~1`DI&s3p@1^h+Iv7)NVspo6!aklWS~9QVd~om0IZ|VEGGDFa zv^dQ#S(RgbDM&x4pg`e5_x2w=?)yH5W?Q%>nZ|$maDPITZ{8jeG34eE6n{<7qh$1} zWxc%3>$Gm^mEnR_$OY&2erj|rKk+8ws+_s{q2elw&re3M!tW465WFJD3_Kcm&C^~I zc$g6lF@cRPL#?64`T^V+5C1an&atY_I!oh%-2L=EJ5|NxE%BV1?YDtkw2#D*?PG7p zOo0PvWf-hW^RnunqLh#`iDDCb!u!@PO~qW7x^vY(ZzNn4rP##t4V(dNjO#8_7AQ@G z`jBa_uW8k2MHzxK`wIEr>bI6Uvd3G>xY1kic4CA8*UOXh z3ZhLwaxnH+f&UOF!Lf&2lX%zXfX-vt;+-DU!IPfPvRb@jcDAb4@4q~9@Zk(QkmRJ>@s4Z!ge(OH zm-k|daa?(79rgnn(TszyqNeRZ_lh5L!?y@v-$|M#Pd|jXyr2fN0=!m&ctD;!LjEp~ z=B&tC)>;1E!6H0C5Md}p4hehOzV5;6tWNUqNNv>*0?{cgu(2ziMIm z8|>!&M=Z#x1`mu5eTgTuVpvj46q4B6^QH3#Pf-d7SojH&+2)*!41p<|p9X!NnmTxP0xVC?FXhXiz~oU5=9x#8f`0`{__Np3lP4R6!-#vR3%YD#^%DI^4?mC0Kpky$-4kWLFI1GlyH=QT?J(PKLN5=&NyDo~XJH4XX)o*7vaTD&PVTQ<3Nf=go}FhGDi)y)%E* zjF%PV11+ulxp-UZvic0c7`0#QA>tsS=0hNXM_G*3B;J2XY3>q zv*ihzt!+`VzpU$u#O@mXM5B?QSum)_WF`%lk}Ajc!#vKIBvtR0CE-B zhqMz*BBtEftNhjKp_jx+ys^AqHoXZiG@TzhGuU$~!rJbo;!!*Yy0Vqf^TGJW!_RhiI(0 zKB4-PBUNe4G1^#^@g@)TV4J~|K#x47-OS3i?rIk4den4m6jqFP5oG54li)+~K<9~3 znBoW!JZX=pr4bRjsI@S*#xTA|hig>#sab+V@)WwCm+w4C6HFeI{_we|<5bJUi>Qf~ zNhG0o&VGu>K7}-sOHtL6=s5JNo@n(7r=gtL#Ma_7ud2866iFVkknjxXTz7KoVYw9| z+xK9s{vY>4{|#A+a{#kh{RtFX!Ab|j=+tSz$h2D_k8_x{h!Du4R?aRLTUV`vPt#^s za%8)Fy|zu(mSryVpmLkM#qe@>0#5Dsnw}B7@a-~B<29JN?($M^ZfX@8rQo5Ho8okM zfgpX(cYDALdP8K2`sRWD@tLCQ)ogy~eM}HI*9s(S$x9bX0fwi=W4@(PDbYwBZVfO~ z+tCxi*5T-OBWsZs9GF=RC%bFvYOV3dTeamsEm8ku%+m9Ac-JO*?9A`(XE*llp zLct2%2Rd*4pz~Vn^+9TYjcCNB!;J?I4NYuM=(0jD9f<3w5YCZ#h`setzT-9pC^qQO zNpLHmt;F7;pLQtkzrX*D!Tw8T;a_EJ|D*rt--AB>KOgh~`q5}~a=5cP+z8^uEp7rL z3(MA1B7$|DtU&|!I?uA>NBulT_UJT^gl{A;*FU*HEE}yv#2#j(o_@OOYL>7OyUE74 z=OgGh%90+Ddfwug-H|p}_A3l-I{LRZ?lVX?`MV!+9cH!@!?_HAu-3FE0Kx%GK7?xu z1O{qsPqrH%UUy#xn;WDZ@6n)>+W`Mt%Ml1O?}&wWf3u-U%?hm$c;avF*yYxP_x%kD zf92iv8x($YHX!krlnZ`a$|jbM>$Q6wUo?!jvQhB`vEuMQ1P2_5G}W7-5hHT3B==U8 zIN%aoNH5ezAXo`ZpY~%tS&nlxgh3j7DOdL8P}#niAMT`zk7fD9OpRA^&3GcciW*Bsk9G&Z|xm(fl5db zO&ObT{V6y8H=O(pP6h*sVD$zvJ}w4`SOJ<0e2Xq6)scC@oVPAbt*Ib`XHVM-+iCZk zlrt5a^Hv0S^A&rGUNVq=zY*QW{qxBs`Gv?PHh4&h;8?Y&QirJJRK(eSxM#W+oULr` zQ|L4v-bS9{2f32|v@*SwverKX*xJ1Hf9!^viYqvus*=Wn3_-uGNd?UL2s7JSil7kkwDwKA$Za`j&9s5Z7{ko-LQE6|Ju6+aK7bwPJ;Cpu3lw zrvLhg%Z)rMEFPi0V8O6pg=)47tX

CZbmM3VAS#@NcMbxX?ciACwS>-=21HdLSINWoi-BpKmudqf zX!v#|TC5_x500NOSaOl(ihtPn*OuHa-{R=^gZc3r(&Cx|SK~UIeEr0%t#vQGxy>Mq z>K#WR^N7mkglasZ7ctk^53W^-`{{x-4i9L6@ZURV_7Tb}ze23Lzt7HC>Ey@oA?wNU zgH!u?M&P-nM4S$bL9D8Fy|JrSuSJPzX;5v_n`|+s!{lhM;2EQ>a_e72IMyS$o9EY+ zrxpu4(^>8=?Kh4=Qy~C;v$9OG`Zqw${|?CcZ~r-j0}sOLyb3)ZDDZ%oh1apF`>Fx{ z*fFDm4%;bbIe)L+dZB6cJ6WaAQ~u( z>IkcU`T5MXw$7TA5h7Q|!~TuT1wRfDMtC;hp2aeP!rLAK2%~Li91lr$_JPd!W!Q4p{*7 z@^)Go*;dzdDPVyq$fa$A$^_uubX1_^1QJ^b?0AN7_rPC5j{8qnd#zv8)l<<1b2(-j*G7bp@@-;^6wwW*2VnY;U zbqw0faCWvM-ib}V18jBIaS18j`F0B243tR(5L>7;kSchw89c53V9#XMY<;;ET zIQTtj`kYX?ADLv_8#}|kC=?uJY%sr!Oy7p*jI#BCYoWW0xP#?}2z+wC1LO2z9%EqI zWzF=81*^rv_Ft};A* z{BhjZUf@uepl;U5!K<6F^9G_wV}4c zdC!`uojO|)!j3q14wGqtp3OBqvDH6=4Vuk=ZY!<>=NO=`35gReNH?EA&jyQWH24Hk ze`3|YU_ABO;z7JtZf3}w zhm0`s>ZSyb`BadfrEY$A!>LQ3zDR)RuwgG#_F3+i8l>*;1;PCMeoT!YfQyh3&7mAz zSW9yQ0lmoxb$@;8{=00^nI|LKhC4|fn+a>zTcGrTQNfp2SY>+STs=R<$?Y@O!u;RZ zzUWc7lKbG>=gTW0t@gT|W?DWLhsHa#BxUj~N_nW_7U*o-DfcUt0n*C9#;Y7_YFTJ! z6dJW2n0H9Xt(kfcpQ4^0`aD$*3A=KmZQjxVb(b1POjqi_c%Km4M%_3sbFa_Wm>Srk z?owzqIItcneMpvZ4d;Ra9a#CC?P5m-&7+Gw?!u?(0lC7cOi6|3xhMS4FpZm!mOaja zrH2d~qo)@XjArw1MK)_>OP&#LaHmKW77aExf>-whq>btpXpiM~Lv};tHy(bBmL3Hj zBxw-w;HP8r37CYPn;1zTTjKGHXYzjBPYxHP2V@ovG7Q?cN(l z-61!|x~6T5^F}6Dc^FUcTaB!~2&$eR-0q(_PNfv0o-ECSspp!3t0-<0UW@2(S5IIH zmc$L!_ZC&G4tW&9epsqkdOnb$2gll-=;DmVGvjXS*@3!tI z2CZm^TR(z0;s!ddvc?T85S`ToL;q>Kn9K7G?zA@_(}kobYB6^^Vkh8_%8uiZwvi5t z2Jg<1o$iWWtMTeETKg++h^XF^{XnKo=;@ktQugCyJ;^0)f)Ujgl=~bd^!T#%vX6v> znOU@6VP(kTm!$z}8I=WCeJ=nc5hy*_HIF%TG}E;^OPvH_vE8{*SSgDvg+KpIqjUsm zOiQ4x)ssn@w{C0dV;9w(G6_N8Km;vHCdx$}c8SP^Sy1oZzt1$}!>-imEu}VlWL}qC z65`CA^3U?YRR1{u~R+xxeU?xU}bC(AO(dk1E5D?K-k~H zQ2$R=tN)M9-~O`(@Xycw`@K4V7SiaR zMm7OhK}?%1HclPW-;JWTQWsAwb2|!9d9A~$Tqr3!l~636vb(9vP!?J{EY%o#tcP-7CHPmKI65#h%V}{|P4Cu+klf$^=koIynY*>~H%&c5 zbR`^6_n>`l*WuO?Si0-i8wuWEg2(Da@S8boN?qEnoPWN;Kvn;<2Z?#hB~+%nB>G?z z;I0UwPN0uE^8{w?#3RHekAws!7xW@b$A=>ZQbjw=r7v6LFkJicK2X|tk~<*%Wyp63 zfn7 zm9TATW#Xz|yq2bIc{O?{-2Ces8PW#9ouYnVe6IHX~*N;xN;e>Qs$%1y7w ztyWAG7EZtl$7JNXrm?YCKF^k-i)0;Tp5<=s&bgyXskc%o!|=``Fz(|aFxQ82u8jX0 zC?qDA{YXprv?ZrMB$VKMf!n92l3HzpU0-wd9i3P!f1M&rIYkx*{%&Au(0PMO7Z`5L z1$^?G%jFmKrrz5bKam%`)e(L{pjIWdiJdLI@zVQ1#7a4kvrH0jL*cZb^UR&l2I!7D z)(JO~5RG{DQ)%QPR1tQ>-F3aK!D?Q3#W2;yVs;J<8hohzfARL7QBA!6z9<$1K}C8M zl-`lviH$BGU20I8fDi#`0*NBMN|zcDBGLsyFQFq{x)30Aq$iXRAjC7jz5n~Xxa;1v z*WTyc{c2t$Su>M)=KFlhr}Th!!1Tc)3f`O7)0c_j{ifD8gPxfD=`R$C0}S0p$G+zc z4RCpCYs=T1M8_^rfAmz5HDYaXD%Mca7F*8E?musFhY);7AtvUh9zj~bHSfaOO?gP!U>f;=>7rK77NK%Q2^rJ2tcGbx~Qj(NC-rZ#F-C85anMYb;0P&@42pxKL%VkC*9o9tTt916Z4^g-4XDw7&0$B=;{A%#p9+(9r=vUSv zn8<+uIxk&>@f8*#Yl-U_<^!kib#hEpseQ<>rv3Yy-32EulzX-?F|w@=)Mp?R`QbY* zGC>{{v-_Qiq<+IWLi#f-G~F|A%W|z^|Mf9nyi-H8GQ%@Vt+I?gYHOM#o6`sO4}o!+ za_Yr*SbIS$1A%9mnkL3pxDngZ48I*D?eneFl89+el^HS;nsj%cjJmySrEO{cfbAi7 z3Ek~Wq-;-v(fp7gGDIZKnWr$aLR3bPM}0CnLe@gqdMsTyU7{IzvNM|$AJuyRute(6EQ1XB%+Vq_@3Am%YJMbSR?TnQqZPbWqpl>>{(Jzg&i#4y4~Cr4U>-aFD()5&boVePMXe94*vHalC3`UEm3EcHYzT|V)xqb!1ay54Y3jNb{fax@^g@3!X ztM0OmVWE_>=!g%`HP)?CN=H?yPnwK`>9`={*a5FI&-T9V312U(g4CTRc}yRC0aXoz zx4DF9LKeN1+PC7)o8*GyX_YAm5nJ6|4dF9YcGn9yk^q30z0dvpA9rmpXMv*F%2xAY zWSDo-&B|#^?>{YLp(yNUNLac%Jq_$Ler;lbBr3$YAt7PKc^6axXb(L9bJN}D`|pyJ zw4JA8)PY*2unCL8l#WLcZ&*w_6%%3fB`3NhO6o%Yc*tyT*DNBW?;?XDY$JZRCkQ2_ z+hk0YiyrP3!BG9)2aj-2XP6I4zm}uEpItoWg%U}2#rygO*9A|G9Mf#lcPheeys>qI zV~5zDKeZO}D*jPOIi#5>AML`Qot79_Br{dS^$XKwKoBt4d5qI1-7)9}@Y=|as*R$q zQ(9+G(+5->7AlwU@5v;R$l8`$LkI>~-6iI>id#S~$cbHxh!DLskNe$GnV}PVEwv3J zvO-vOg1kFs6FG;_Brge>`fM7-I-Ix)fm)|Q8za&yb0_Q{;oFkC%n;|48@d6r*G=BY%Im%Jy&#jsg?bGk zhydD4dgq#ieiC|V7zJAdUn@ntetRKq?B+EpbkBBci;gdV!|P{NfbK7$b|=E{{gqgL zJ$)zfCBNty!STgSb6W6YG|vFQ5d-q0i~qHMF={g z6NNPfhP;&*SpccMQST&XVO>Gy=A#pJjRrN|iPFKWp`<6Qxl=45J>we=1GkR5ggFhq ziNoCCvyYd}+riAlTU-psLslJ7v6}i(*~n{!e0>M#)%p+oz5#db`*nC6#0&DnH5@^| z5{T?JK>P~5$UwaWCfFp7F`W_&z1ajbDuk|QnH|1ytM|0$6wD}w`oF3m;q<&C+ z(a86U>uh%ZFtQbFGv@mCVq06l3E6mrO4~?H#F^16!YkkIDg;iYHI|9DNUSvwL!kqh z%JAxQ#Tj^nUjBkL0rM=;e!~7-2IbBhErhMb^ps4*kgJ<2a>0DJsAAD0dx>E?-!Eh*$ zXCl^00nJjW)`L@g}G-NQR$S%aL$@?4p;wk6-*# zFUCHO58$psAW;@b*v-Q}?i%xV?g7!rW+kyimLCmR$Wm*EzhP6{O?$FYJ|(;YlKR*U z%j;%5#jyHAJ`M{DA0~%RrQ4WiUc5bp-|SYQ2pi%r(b1Q-wDGY804qurVVLX4{f`)A z-3O!u+UntCv&2$U(}3>$BkBPQvGqWTPak+Rg(L1u=UM2)p|9++w=t5UeC5r|r=Bfr zR`E_9ayJ`2dCZf4qeO^``FqTX|8_dike{V`Q0%9r<{k@=d*`V&p$qA5{;j#Wt?z)*bO^?LT)k8g235lX97G>J^47k>ExBp>RNGSSxPjC=Kd%N(4}h`8fH^y+ zBY_~4&_+WrSx|0pXSW`6bi>eWd)`gbrLMIpYgMVpx>^#JDK=0~Zf83B9G3T&>=Bql zDwhIBP2Lp%Zwa@?X6NrK2zB@7@S#Lp`b6qD9g=<3vf`u)vm8wYU+`v)mZ-Ap<4KLb z|B?ynoN40a$5q@)q0=C0Bqn@Y2zRwrbTm9?)j>;KeTSdlNHVT0d_FPO;S)KuCP*77 znSh79SZqs;D`@4w!ouGsFmD!PnkJFEFZ-!|jejA{4=m?|uIyi;B|8#TEQ13Ao|+W| zAqpa$NM|eUMGMd_+iWZchPai1F#h+v%}PA+w0lPW&-5VN)tb`9EWeVSZuEy4xJTy6Qp&9E zj;dPjAArW_qDhYcz|P{XM93_x&4%8hmGGi?3q@BD%U^=%^kGa(;Q0P#tTSkNIXHJn*oP!BUb$Dk&<%$*T8gwj|97S+u-08c)hGZTneXe1>5?(ng`KJS?J45 z-LpAEukSh@Iv-o98;%|8Nn4ML)s!)8GRC)^|mbo!Abad8)|sRf&62Y?aE{LdflkgLMB z+K!1oO`bfn$cQ8ZPy$YBsz7El$yKS@nZTmGl<-lFahh~@7TuujqeX0y8^wBNdA?x_ zps=-NX|lh&-e5pb+Q!G=(mUZZ&TXLTjc~`L*@0#83Lnp6U3SJp_qProre@j}3zFx$ zg-*f(olqZK0lu}`2QZL8h5Pr0<@Z?Ij~Fo`6vhy&3YuwjZ@iM@3ecHJ+A>MzL36Xv zJIfML3Z>U1wiHD8liX{9kE=E-NwG{ItQU$%FTYH&v$o8|O8BvD#?~ws2a))=x6{{( za+&CPS)0ogXcpISlV^a{bS;GrP~ym$s<2zk@#^VW9@lBgbws*Ut;FNv4 zV5<2{C-#Gd*+GH)b(zZ2{#cfL2NALWV`O;ypEnPWxKYy-OT9bW=Ym9+i-aI%?1l-! z?Th?-$dRrHTH@B+?@m=j=KOxxS%*yngXB<_E>j(()Saq&*>YfpfH`KK>7cG=$HJWZ`PL zn$B+)dfsEQ5}$hF2%`;_M!hNn(Ry(mn@9Zc&I`}Z7q0p~t#WFaVwcaf!cxS?f12g4 zsWpSy_h;_p+G*CDmZUez)DwAKF+DZ=51MwZ=PfHg^~r9=8I7 z#kE_*V2=mkaZ>%w+Fe!2U%xF;c?LBP3n}UtS)#3Yvu(!R0i(KRzz4X6tLkE;BiO2& z%{HN=eYr^sKl3WxQ&6|aDvW!JKS?%9L5le|;pY?kSkgn{{fkH#kYNgIR4-#@tIg}j zk7_6R=gAkoR#{nL3~oOUWh!Ctx*xtELwj0qe=bjIcU=mqZhithyQ?RJa5W)PH~5x{ zBVM7D^~k@BjfK`eQZ+_4Uy7UD#Qc?R*cGZ<6gq^3+k+yWxguK)Lk35N9{UOCX*9HL}+BZ~6R> zpnnCax>j*q*hOnPVsjMey80Q3KI^0dq}Us%iYdI@4y1cv0C@1XKnGMHxwA1CUsIvZ z?(Vj$)G61n|Iw3I>ON-)D@AdVVg--P2=+O9ut#wizUhKSLUQ=WXWd|@uW{$q+am-) zOqhz{3i!A4azsQBTLOQcc$g=*Cady-f~3sPFJ8J&;`3lJ3j5$SfpZt=Z)Q%`Byb3b z!pWs(J0Bm2E(xl(NdPz*y2_TeNddth;=0Fz1h%-IUiC)tr$4$NrQ zTM1+>bHI_uN_DEmFtq1E?m5Rj2h)H0Y~6j*PV*z7gX=ehbo2g2VUP%RjBA#C85W6r zPPzxS*5-@EX_-w?Q_NBwsm678*ANbr!d^`Qx6?2&;9! zY}{MkWQ*%G$**JjO9YiIJ)piMu14iFfJ;0=xH}E}M@y*Ra$=fYf;jZ{J5pY7VT7vt zqfW>t8-b>sNzx@#EfI1DkyFY;+kHcakueZUVGKyNB)Mh1 zSAfXmx)>`B+4rwz>Q2oo@ut>HSCn%wCpt+Fx;iz)23VQtk|>@e)i&m+0->fBUiM$@ zo&QIV{lDKs|Cf5`|6F}=Nj(5i8UlFhR|rDba}z+0N8T_&=hxAzrzhr88&pz^rY4R# z^N}X%^wt?*bYLS4`84R30Ha@=t#CtV1(lpywA{k*CA@MOtbD5H}XKahL zd4Rg_n^CS2^QFbqlb5_+TRU>aX)_Xm8=1c?SQk~nlLXV zhPNp9sn@p|9*@{q%Ejqrs3=bL#>kb3viERVk^X&Tl9~Ql8T&CPla$)Z>?uI8BDlu! zF#Ii|v{6<(sz)0+b*{RXlc};We6X+I1oWK@QWtY6=rnm>n~qMbSv)@_~pd(+z5q?z){V z0U5YIiNZgZ%F$j*MC9aOef#RO`G~(_bk}3W zIAMeNq@elIw1oYt(^GgD!6veTV@hU|D5eH^f`kPFb9U)7fr@Yxz(-=1#e4v)JO7f! zU;w=&I^7}{C=2RbF!Ax%0TrjKiJwAPG#qZ3#NMt~VLMN2#;kC4z$t@#2ztw4farDm z?zu+Pa*Ncqc5AGiWXK+WRDaT~=}T2*lg}?JGG27Io#xVz=h)#gLKXjv7hTr}4N>+f zN@VJBjj_xc=dgBUAv0Y-%CBH?!Hg&SyZ>x=a~A;Vc`+Bxa7=TB`104@w_j2TunC!-GF`clcXqW|$aRrv+Pi3=ApD9Jxpn zUbdP?A#9e49~SMpxx(`Ni0sn1-X1V3Kzx_Wq=|I^L~}c?EUP~5l#^-@-F4=WoBmZo zKPyrD`Pp0AuirPpzkFbHFzmy9f+z;ayLg}j=BTRlU0G@(Xd+17Gq^a;#(hsbe~P#M zb9F)GL-qm2RqZN98w969`nnmr0oo6Q^`+U7V2-;LNAZE^A|A~LymH7;xqJN^oOZSH z07;Fk{xyseBnBJm9n<`iuzbsVStB6ordA@kC;{ekd`vEeu z@qt6BK7H~1*QGb5R7aifKy(ydt%^_O$uR|h0K##5v*zS z^mRFvK5}JTGNVH9X9mg^1C(C#6xaU=05%k0fV5kI78_yLf#s8x*#)}ROrI|i59PP9 zDjRI{tUnMvs&};RT{(Ey)LVkL-oe9rw{)MR4J0CL9uwQWn* zWO=q=M9XgM0{G+wAV-xT*21QR;MzHZ@&o75BtljUBH?xWJrD-s!!&Ilb6i@b``vWq zukmAhy02c49Wb%H)JpL+z1%8NarPEVgAekDykFuFQ`we?m!P)<^fL?Qver{PCPb%s z?E}?&#$5Q(&Id3$|BOtNo}r~Jg-2oqsf}t)^Q3<#Bv}I!r*HB^rliBAik;na$soRo z;fil_>_0OfKxADY9(QNFo!uCV9M0KxZyhRN1k&P-$Tet)`~D>zP+_bMCt;E%bh+{V9?KQ**a?v>s(jlQUI#eMtEf6tY1;=by7iSm??L3h zlBK4lzb@JEP)aKG>b1G+SBqE9%L)1Cve02Lhs5r&L7Xia785J}dfI{B?VV|E9)bxY z%azmL6>SP5y)0{lO}if{0jGBg(6uc_Re|n)(|M!}|C{G3uAcHVh9if~-g&#r2z}a+ zWJB1E0yLOzQe7-FXxbP2yO7AVu>x*$r^eef68Ki!;5CFMo3zO)}xAp}MJBur5(WHrb)bx)a1}#MBOx36ptDJAnE}ULrgqTz)hxw`vOJr`(ouo@uH?6xPQ6rc|P#Xwf z1Hiiixx!G_W%^{r^pD$|$RgdBf8JE>dQZ!tJ^A^9O!NT=v)@MZ@r!Bk-a}Q#} z=$JEo4~C!TncWq#!Su-QG@aAB*>d5+M!FMbDa-RpyM1_O(a79)8IR#d4d9%e-t|~c zctGoGa?;C@e`aHKlFxUhzGfDT#nMmd&x%ih-G)zg00Ag(coEEP*)t<{B2})zu5~I? zLVbD!2KvQCxVsL=(cqmf3INXY#}!F;{c$rKc`54m^cMdC`O0V8*jJ25>*UG|lwLbN@4=1tR1|t%dOoX&En`So^Ko=f zh5xCT2L?_e#~+Wr{KxD5-#A|R|A1tZTw#mLT&IHYAJZ4vkWkQ(XT_%F|DJ4s{{Bl- z_kXUwpg2SW3-20XqpQ)NgN7_fZG7%qdYNl_x?h$*hA-Bzl*-@)Hg>1>i0|RnS5*9d zJcd0;;2cC$X&^)_AE!OHcLYqAj7DVku4}cQf4_BIw2SQ0)*G5LZdm&RKm+F-gf_sx zYa+aWcr%7KI4Zd+sm`^1UTKQ5c%);(M5_}&+CaAZGr07b5Qz))3iCU8Me{@cgc?2c zm+j?=7d0r&x3DL-*@}_7>9cW=_#@1NVqu~@9MbsGb(yye=YyI>)T*DnQ5>JpVIoP9j7@L&?=HJ=<8U*Ux%-`E0OgMX_5w8nU}V{`_U#y2 zHPEXO_vNOGYdzj2n+bTU-aD7LEjK6_`F;7-JaC&+$ec4Sdv z7j>@e55Xs2WXYOL1_>=w+hOfQy)A#jMQhU~h1B%An;dx)crQyKK9z8d)l+xQ$+10; z;xB$tB3NG}_O8WvrsqtR^oqoP_L4AIKP@zH@cNuG4MZXQqkJ-({e&)stz|`?SxhFz zQZCbZHF$)`-hD2ECfHlljjPx!vmVF9SkUWbZtjM))U>n4YuiVYyO`X+l>Tl_yXO|= zDK+Uj_}tci8_z|!C<5L}5XiM^);2?~U~0<13)3|2BSbmNI7~4k;Z<6$_F$*#hG>#3 z?D;XV7uMdDdzHXrpHE<4mJY8aguzs%3{QodJdguEn0xiBx9!rjxQWc&Lgj4&mpOaJmJ9dB)!=Y0JEgbH6F)E@;a;7 ztvi3|CeKu7j$&vwVe1!M`q)2NzGR}6!o6glXzoikVDHWOJV_hW2*>Jx2qLKN1Qw#j z7|aPan`}s$kLbDu02(|@pEQQ=b2ZjAI8yOz|NNbF+mY@QOI5A$)0m#8*Q6OaWEPhO zce1L@4|fTtzsCh|1{Bd<8lj6zLtj0nP;mRRu!*BGX{#UU+Eeadn`*M%lUNfS;(GH% zE>oUG4`Vk%i6V>J^az6HQ{-4#M&0MvOYxKgoY&E8-$(9v+K@Az3wN2A%<~EKAJ-hA z^3ME(TSgA=17&2aEa=Jz(0a1MVIqk1OWUef|KQ)5u!YvX;vtQ;HdM!xtY%W|0tUs? z`0cLYZri8v!aH3_ouI`H5WouR>LE0P7V|)q$bcFM%~mbbRIb>$FtTdKX69}P^^D;| z?pa;OXzoS#xaHHIhfJshrN3llm^^28M+;22qU_W1I#5-?baPfT z%&{BMKT5Rkoe6%e<_<<{%#FDRd^@T;ZW&ns5#*)uX}I(@z&sifM&jBu)|zGR`d%(0 zX7)?+U@p?39tn4zmwK#Xca2AcBk8@yA^fPO;vfvjl>>v^T7ZK;bP9F@^%@ojr>U_q z@7Mw$V*64;V&rpD>U`OC?}Dm@JH7BdMvwM>Ta!z$-kUy4yZ8=>D@lZK-kLIhc#+)7 zWlI?2qjH>-EgDXRB;`eSdQ=Xnd=_wVQOUlqU}i1(mrNe?3Ni|bQP}R{;D6B`;8sSJ z!r*Ks74or2zhK-br64KAet_%Uuo=>L)%U`nQ%$_x@zkNne(Rt{jJ{=OY{trMe)9}I z4d4wspzVM*NCJ@F>-zsC(<3}Q*YbBV2xptBP(oX{g59jV>A zlpl3vN-rrJ>Q9pYE*80eEM=X{n(=aTQEJPm#4_J7_HH(UAFm_4TQ|dMUP1NDM_49l zzJ*RLxgr_l0ht}|;QFz#Q?kM}>(}!vxR&dtMMP~C&05Xc&fX78^tDdLL#MZ9c4d|F zYGVx3i%(EkU+|7ot{ka9W(gC6c}TZI8vRT5kbY-arQHo5YhQoO&hw9dg#fTzuzLna)PP%SW=*mUb%Db5vo*%sIM*UqzQ%b$K4{w^L9EqrMJbZBw+VPk-@1uH?i1PE-C=BbU45T*o={)mV^$;TJ$yA8P5=wjHf6%p?mxPqD z>eIT59M@*59`ByP`{n=fLLq0o_yKbV3LP8&x|NMMiG6p+oVD7~vTsQk?J6??S1XH> z0JoYqP3X6!WEh@0*=bTA7;7qlZo&&l&k(6_7epl!tR4+szW_7K_7)<{NU!eZ1^6Ju zMJC!@-gCVCU^4}j`_}wIZVH&dJpd-d z!qjnOVQ*vaDFCzt#um)Gy4cGAH=aYzY(cICw>na$n&c{}S8juzzao$B=Xlid2sRGUx(~tFtV_n!s1N&ZP~r0v99ml$<21TD;cgtBR!rd^50Azd*+Trfy6{PkQ+R z!MuatjLA|iOWEoJCFovb8h3?CDA`bb%FPo-b$^?O%P0f79@wmSK8lPg)n^5 zR&0nki9t51d#-b9QOqYYC@tRZWF+v5Y?7yS(rtFcBFOQ`=~1=ZvUgmYY6j<03Wc<( zy^N8)Mum|{1~WDMsb@N_XXVY6Nv%U=2H#HwELsD(652J(RJ$#KO%G$|gn_!)-PMTLTp@D6Q2ffYWhe`de{>(D>(wD|ql zM+O4neu^9L_LGwOc_PN0_C)lV(5>@<_i#NBk^S^sPCkmXkSmF!+f+UYPPkwgsyj!$ zI`AZ%TJ)l1PoeT1I~(#@L)fDgmMITcm05(qTZ|qgSoS~@&!l;TT2!OVzePDDX)0{m z_DIIj&?u-nRpGlrH~;+dBwR}8T*nHY2*+v|gpha%@N@S+(EH=do(O+o)??k%Hf08+ z0eQ1kW!!=8-Fw=7PrTGNd+{h+_Hz()2%rd}9QQ8^bfQ8sMc-+_QA3}@T?Fbs$Fe#D z5J-+ARt3YbXT@ZkYv3_XjyG;U57xr68@{1aGH3Vt2l{vu4$?QxR|ZucEvIKK6*ayU zYB&Cd@bEBM6L+!PR8*9Am`_ceF9(`w!JEX1fA6VT!xP>PfvvFOHTnKf17Xr$$2z<7 z@O-s4y{LQc@0Yg%O@{TyWU$J}{N*?@Hu2Wxj|l_%^khu2`U@OD${*t$@esI?#N z8g0d3SEDE0oNpUg{qKp=B;9lL1!thwf5S)Qdr<^&zul~Jj^;D2c1(2U+D5FzlH;pm z>e@-M(lJ9)qgCL(8oeZiWL#Fn4gI-mknSA%WsQub7QfC`nuDW#1}okvY|I4Ti-y=# z$Hc(Y^M7qvz^fCu~LaE@e9&pLN#ldgYk~c%?non0W!C z7m-sC@3I8M_M3OsORoBhSyw%|GhQUp9Nar{S|>PsQRA9X?r3wKpv6B9`KnuBP6WY^ zy@97u18rMSBkV3!+$PPzYg=0vBr<&Zct?-)ED9Q16P|q%o0v_@=k2OK{bq;lIwu8> zN#2kIPl5hXMahEysOX|$0L3;NVtdt-pQYCQ#6Fqo_2=UZ^Qnqb*yyP`l6=+8NaUkDSy&v`9|(3XX=H>^j`M8hz=)$Zjc`bjNAe#lCsT(1lXmO>t0onA$biW4 z7%+~e#{+AqIu08_ikH0*`QJA56o3Dv^ZuWu4FC7gZ>0dDI;)|bZH#2*+Y92MuPOu+`xs>?<8m&tP z9K@Rh`V|6EaWPKW5U!uL-Y=5~DXdM*W0vbMO?&9AR58S>87O$QNmxYU?2dmG#=IF@ zUg)xPa+tVGcZC&vUS;<^kRi)Q-QXV=nCruA9QFjs>yv=tfDhRAqy~xP(<6yf5J#M}g-iWO!mJRwkr?KIH3g)=!ohGy^^! zp6PYTCEr;oM9JR#!OTk#>2&eRgy3^8=m?B4NESz?><`7;u({JeM+)ykzH8n=vzEbA zJlFJCQq^`Mw|^>Iz?92AIqL#0M2TY*P=eXp-0b>w7u2m`{`V22HZ-txkly#>vmd}APj_Q{3k3|STjTX zS=lug!Zl9q(Tal+l-f48iK6DCj1xqKj!tO=O%ZE&hNKy)zz=$Wrloa@7WF zE$Xpg@|is)yq(j*eq;LDI*U?bMFK+5C^lWDEKp=07-sPhx&D%w;_5Am>t~JPWTvHS z`#11^$vvzq3a-0#6{4l3y1jX(uc&ieCE_zZ+VHT z`7;%!C7d!pKB@MHRGn`rd$;)EysGi-_Zl>h!MyX(Ht>&{{n(K%tC5eklXK=~(Z9^)YH`}90S=MK@uPma_XkknU z-Pk|`F0Oq@DL45mtX-@|H{i%k3V&i z*iZw`_}Ytbm@DY_$KG_cD;N1He1TtCHvGkWB!n<}DC(a{!&t#+N5|72ls*)b zB@6mX=1>@&!BKBO-{D=F9~e(^@QzSWv(-CGiD~8{yFckzIK4o zyo2}r=iFmJYq!deNMC{ChY>Ja|l1MGGNnsQ$$vyRY_e(#!eE2i>uIR3H zZ;I?W$(O4?VGd`01Znf`AQW{6Q3OmQ>dS<5Hq|2eV(CPcczBE;-}WQob0fcs1*To^oll*&3x!f)@sjL4b<8Dm?SNFyc75l)nrey~7VKF)dMTbJh>%RJi zNdzkwZ~pn&MqOh(lo2OEo@suDe7U3+g$8Q?%2W-&4h6f+mH!{8ivKG|9;xCq`}c~x z)44=zLjDp>2#8um6PK_|-aGRaMD0>%Sw?KpLC-!J*G77#2^R<-3y^sMhZMgO$=1N+InWup>r1&)@kVw=x7dGxLlc!5!Y zKkhk%ikOOH9bD(qD+`kn!3H;x+4~`$>#50*g=n2=KNnEcikd>_>aPT3Ov+l7rTb*d z>(-}#$;^H`hpgX|Z7PkNXVtoUL0NGK1AJ^5S2*CA2Qrtik$BH>Xy|N=`ZM z^`}l&=;uDvB{>lvc;l41w9fl(KvPe7&P7PGFy#J@)k+DB3p%VOF`=TY;>|nF3`V9|6OW1cG1?rvh*ygnwt-*p?bsBB zN&D)$KsWzIb=^1nZ~k$*DoFm3XtGN;P=81&zhHre?01N(2B~MSGq}BQ)E+|^!5T9w zjNTYVha&g_9_I>AvirHE8{_swa1`edv9of{lzim{?ZAOlfnXymWz~eitqUsPw8lho z!0rt|9JD_mu@SEk4qg0UOJG{e$j!Bu?Dbjg8)nIRbgT@_w8+ZhfgkxhVl|ULIuEB% zSuJ}!xq4M{)M7x+E#*7Z@c(OOoSg2MQ-DPq5#a@ot|v_3c->ttxm zo?(b!@#f=QL#L`j4#r39w+v=iNH-s1HDiM8y_Ye+r+WvMtf>1kAAi}#4)~G(c%4&w zQdtQfu#HaE&J1%iU=ZkX*VW4LaDS_81+MV@4 z*XP+A3$e)hREnZkD~?wh0DN38MJ#GDpR0~JUPV_R+Q%Sj_M&v};qA?7$cxus-d^ti7jQ@nRC?0Yg{dF~5ka=XWuLaFMBLiKJhRqGohk*NjRS%#-=MUgh7-$ukd7 z^yInPyYv~u;Wg(@Rj*~3v!4ADd6JE+J%g;nzRszht0&m#JFG}ir#pabBI2Hnn&c|}5dtwiJ@yY%rgblRNC- zO{KlYKoK_Z>3PaY_ilrzFX zzsvbX;Z>+47X{(NR2=hTXq}mD`Gpz@;Dh7O}BJhRg>Qd%p=@d%Xfh69iK1)bO*m&u17_pXoG06$!%xwE_f7Mijqb| ze%my2x_36OXT^^`rOCLr^GOHjhGb0rpj`OfK>E<0_g(3%0hq zKgHkvUb@}W+nCnid>3%06WRrLI87or9r|lkSV!mv1d1OSM#r6Qha$^m)@^ z?dW6z2p`x;P&^m$x3r;HQ7iv8yJ495s^Ybb)}1#VcNNSsan{rwLtmcmD;U4MdL&GKf2AWta;$SZT(v-9{!E-qnaPA`%H51CG zwp4YW*1Js*mJPix%e)T1(3Fb3)h$3=rN|Uaa01sRQxQA$>&p$??O97;bT%nl9xP-{^ zTlx8$oV>bGvWl!Hq9M$$_%5&PzR8jiE|M!fgecaJ`){8vpTUkq^}>zs=hA(QQzk z+%AaCS5zRc9P&Lr(-7$(rZZb@Cx6=)v(zitUmIT?J@HSV@hUY1m+8>hSnBs-1`7Lo zW1u5&GBsAxAo%)G#Ygb<(zx6N#67YG8kvKJ!Q^2A`&wdy{dev1}45>?}5 z_)=tS7Cp*0%H{be^q=lVX<8Jp_gk@r{THPS{+|iMe;=0lFN=`>*~0Y_cw~gg0Ej8I zd*e{OXYgLGnG!?f*m0cA!nV=q{(vUL(`yx(Y&957vQDZKjc=k(LjR%@IlK0?6&B?W zCeM07DvJx7+Ris3P1nL}1FD=Ehj~*;Za*q5LP=>4!NowZ8xY_v+9EVi&X+ zo&YA31m-V6|+X^lHiElmboRRf-dCh7>#k&T>be_ju+>V5vzNpvg9hIy=ITABkLq4pW7u4X%@@`lrZe`i ztWB{w_6@aqrU#mb0DES;8^{iPbNi##7*Rc7nerA5`lv)ccktsppFP*-`c;(|lOOt% zZD(-wUEsmF)`|7mSXYSXDjgB;Q4x31U=%bl zNbOeEk#G(~o>&h+N8B#1lA@ZKyVW>XyyKZlELp?pvgco`Im1qC?r%*Iel= zRWlot;!szh6I@)aH~g*43C>unUZtt9rFs2B!1B~yc}AxE{n!4WLJ4{$JFOyqb}E+E z$=+Y!>U|<34So_Zxih?0gCJlGaZI_qW({M<+flOAF26Xct|+T~+9Mr_$8BjXqtpZ| zy52ObONHhO%Q|w}lrF%dNK{LQuT7a*jlNITRs$Vk#&dDfuZ7zHNBXLN;7VPH;g{-Z zJ8}HjeHXEEZr^Bsj#!6Y?y8R;>R-Gki$2*R>H`7qn!i;yC+9^N-vsd?d#`&Lz?5$t zk9q568a?~FD!y~~_EWVlxyR@BV05#@=ZPN22~XKngdk8)k8CttKsxKUK4;$)RX5$& z5keiF?lIo%ZfThlgS?I5b#FJn^x^EIv7zmm?nC(wj^C@<87kNg0}b7d{Dcn6mJx10LWLZGD$#wzE}aq zJ_1L;v4*?867irLKHq~FaY_sG?&abeVTd1-c~QO{=`pNynxc=X(kbsWS5~gPsr>wx z>{r6f=uzTNqRR5z<7I8H7nLRxcXSoKbfnf}0NPT8$*f*s|3XyFX$p$U!p~?_ua;-&yT{L zO#Mva*4z57v)4UvtH2r%*#Kw{Im5Jy8)w*xo>hk>Q+(A+cRk3rM$YFd$oqVaKX){R zE7q>er`3-T#8CgVZ-RlRVn^gAs0(z)`B_Xi8!tPdYNo{ZpK7~!O^Mt{P?7tCDC=_z zQ%@NFL^QVLUtbDJ+WNOB`TM>m;}NFa%uX`4!-We*t<46f&u3fAhuG8gB%lmgQzwE63Cl zQ)5I5Ja|d?;NhE+$>t23RH(DbRr6DG^MW8wLiGyj0~Z5O8 zUdA+v8&~Y&e*T`_@_);x|4^0yV}tg!UM~A&a6NId%z%}pRi_#*l~PuSOb|{G2|N(2 zX|1h3!E#DFQPUMh#@fgoYg-QVVPM7=DS{O@v6$UU*naNF-ZMLg>*=utwDs zf5W85*V?+8c>L9D(dxlIwq2UoBx&o24hgh3UWstAtbv8JOGMi;;%t8ugLjl{%Ury@ z455djl0O|B@64Ed*ajaik-n`D=eUk`>UAW$dKr31y7>t4j@4y>5S&s;Nij)HGhnme z#{lwn=+3?WBP$)~by&MTY!Ss(4ZsC3J7 zs{1J=6t{cnYcZ{(d)6f5pj*JQt$W#oi}mF~!a5#0ei>|&-H3n;p2)4J>eY;CBnK}0 z|Li3@s@N8%I=khc-^I$|A0yI_5T>&pZ7%9Cjz0F5Tt>rNsZPc|n=Kt=HlaN*_(1p#Bv_s+{3U0Phvr+l<6M;`oI^yHY0n=N0y5%&D? z)yFqwx~=T)k~=$SkoZX4z}gvxVU0(a{l^S$6Qm7)sR$wVF95eE#ADCf5B%x$0ygvq zH5VM;UOgzzkDdeW1PB>!72)uj^j#rrXBXFHl^4#-BUc|UzLF?|c1!)Not{3KhPh}j z19MY|*Nc$p!EjS;2H`!x>`4{&1N9K|WuIcHUgTyr&en=UL-{sBs2IDBcgy(RZk&m< z)K-+|^l+NoNdiX#E>gD?SJoohO+5?Qty1^Doq)q@D=(ahM!-eH5arKb!rB#Eg-OF) z$o+71C+fD(5TBS#)(B0{*ye0#oTy`H;)qbvukyK8hg1t{#!hk#(o+!trsV{=ArS{m z*=QmbZUig(_)HRY5fBK;Re4ZCEA@imW8iZmHe-5qEIsHDJ}i@;l_()i|ev!k6)-3bHtfojl+tUxT=@ z%(1)8F94T?2U$IMUt`{)yiK`6{Tld-VRT7EnnkYspT65+m4C^^6x&EOGGf$Eu&q(f zOYoZ(orRmTZ)wq%vuN(_8@Idic;Xd)kv~ztWcq-NjEtpX(O_2S2(x4>{nO=51jU5U z;+6(Nr(7!5o#FHaxh$(3x*5@*q|G}&kJ7~UzL)gB@uaeTt$){{JZrk7HW!|ESb(Xd z*#Ud5fC(1nT$DkK0+EA%$y`a3?pO5XTcO_T7hl@f_eYfLoK?5CfD;0c&Q)<|xP4_Y zHM^y$qG|q+fQWei?o0p=KGWnL^?|ww9-#I%=l^dU@z-dQCTuYej5Xhn-a(2;k*G)) zPBjnJ&aED0Ja~oLnl`#CKKfrRaNxKk-?JD%-NATs0o;x zw*-b;E~W8)Y_1o9c;EoCQAh-UP2Fl&=ZFrHM{}5Wc!QpFmivm9IN#^{gj#8cp41v4 zP8g$+#*}t}7xOXMz!3vD^#zCw&Jz9J)Gq#On+d+uD%WLOU`N@})`~~#(-&JiJKL3H zU-bu`AgT?w+uzYD#8-S`1t1sREK}1_!zI{7K>qKHFsKTpQ7BH8(25qdQQg1$eOSXV zUp{p~FwWY(@=EqmRf~5k&Z622|M|V!UB6IZU~n&S?aQuVb|14tjbdtrYyL5i$VW zSmZ!!$yqXou^VC7akR63GnyfuGkT*=Q`y6|G+Mv7nnjI%C+$<}>QJ!3XAd7DA zo}8Ud#oN`&GjXP#DbvG>xd>hskTx+JrIypD-d4?8lT;po-f{H%U$eLz2-K z=V;mzPl(%RfyV~K>i}>VH?I|DV8iY>yvWy_4N=1$No|y*S*NKDoTk)SC@lQ}eb@O* z=5U6s<+F>RHT-M{cgicpHLkeYVKqM@<`Uc`d8chiuck>}FUJtHU~4-xSP?)~1A^-q zOaaG$YhH2#cEw?9dz9s&fa5R-BIsv>c{`=Rw&50= z&!ph^&P^(j1p9meDHHFONzeDg6Y9*!zkaTRb zD)8_W+U?N*>4K(i5a4K*+#~n#7DN^#fYy8U^Nfaaa>Ipv&>%&1u23AjcO2-N z(pa*rdQ(1%;=;3F+d>Tq9#b8p!OFvc94A}R5)jbRL;&+W+v48~lclQ%ulCaC15CB6 zrozmkkD3{Ti%I-up43mnzCwdRtdM&^njUGpEc$pYuliowx(@xX{%?*MKO+p%Z>cgF zT?4e47OXc_NsMpaFggXA3eq4`H~`ysvx>S17a6}v9AIWHyH8#Qf_4#qN4M8eTj3)T|UL$_S1HcRk*`&&q0ue(=oh@%8qFH5e`l0f=9I{q4Whr(t)1 z*0CYKk)}V9#o3Yu`0$<)`kQx_HfaX?l0}U4BKZikP}1+VvuBPmpI&drzYRfr8heq= zWJ~Kx)OZEl6}x*7b&*KG%7KKf4LI5tcL#-O{H8_c6zjOr<1&yG)cVp>>SXDSlJKX7 zBz0C@68M!bH5KG?0j-Q$0BlWku2_M8GKC-l+35shh_z9$Pzag2wLMdJ66R~o^rR#a z@wh_8=}RojmXGThzUt>S@OUYXEe-IB(M2EQBif$;!-&U1XF3=>aQY0$FbMS$cKtUP zfKZ()osM5j2dP5fE^+DUG7Mwqx9DE#m$b_B|0>@4C~tJa0K95|Y!^a+0(3w(!0N^= z7G#&dSk#}DUb(Siq&s!wQd#vr_CO6TFaN9bb7pDuZR@+AZtZ>n@>oLwjNt#6U3&Ll zZrnzvCBR8G@u}@5n-)UAN8ZR6B3uFk)0iq|R8~A~Q?lcBtUP*jEnkE?*&wa$=JTho z`k=~J_fgNPb2cWJOS0Dlt(@fr-d#zTK^K(H+(;CR2T(e9 ztg*2q^fFqF{LQwHho$)uB{NftaCLck6JV17A+4{t{WLM@s9%{Hj;p-2aj|SlthB=? z_FX)M+$jIIe4e|)m1jVhDBXD%$1RW@GI0Gkf}rS^{uTv|^rmp`a5HFG-lK1qxK+}# z`_N2u<%jv_%~9*9ZUVa95rE@5@F76kudZOS!4Uxuu+&fj{rcKk6PAQH#H1)u>v+|t z437uN03Sm*@L4NCM)Dg=4@oz~B3m`!K_V@v4{?{BnH7$YhAGutxE!-6u!ZCchBNde zvnlsK2}fyOuf|4j^aSnXl39EBeUrOe{536m@gNXBvM?nNZrZ(M`;3>ulG0@wji0>B zYw%*V;8W4lrk&SZX)KWz@bawk)l%nf@Y#lnL1yz&N>Fl~3viu=1p&*yt=ADxtwMnAesgsXc8FWQRL!QSUX+CkV4AR-+L?I7OoHm);{ zaErL<xu9(6=t zu_I>h&$0Si%H*LA6I%}Lvek)#rA&fm@SsY`JJww0n0@#B*5i4>`BvmuMp`pL4ONbD ze~a_TcvH)$F#5~xt}Xv;uXax1-Uw3Ee*AsD%J&~%E1g%weuomsrhxB+E<|1v^h*g7 ztUM*XLX|hzdpgP3bQ<*aLBm1V10M^OMcU+RDI_fCU;Oi%y$B0H>a%xs^km2pgcoc0 z#NzD4@8W%+7JjEcSztq~WgDHppI#$xx-OfEdZU(+0V*K^_R0YYZp&Fhs_{}4@7 z089u;ZThi?tTKsTON=OV-33Mm}dUeoH%af2RBbSl1y8 zkmXJ})b4WZ+kvik!6>k1amgwqb4WZ*8F*J+BI{W<|57AfC z)qrHu4Vbbb?ML~WnM_LU4ySf^T5N^wnEgxAM70;o#p zT=EvoPzJw9w5w_P;dQ>t%e0Zy3QMipYO4h`DT-jXQ951BhY$udBJRBw zgWhK$ReR_+Gc)b=&OPIjB=gWE;;es&gkXzM%n`l}WCd6pJweHI-zG3*Z&D@XK%27! z3Oi#)dd!A!;}W_C3={sg(N)*m9w==~sI^7*$gMV4`ehikEZ|iA6$_yLT$)eD$Kr*j zhX#d@xsu2F&H!f;TCGBzxuELjJoSQx>XYkWGL?A+@67XtD6mk0iTXg>azh6MLl&ruJ=;u2_} z-O^`|6=|_%s_e4ZG=Eo7GflI^diY+A8cmwWpOLyp7m9y;ezz?u+Bu{Z*c;VlVcj+S3S`-t zOA{mAHjFbWSXL_}41C~Zq`Y@3n4|6@oB?^S8(gP!CqHd!3fgdzzxaKFo|YTD%FRXr zWw*?T5dO^uc=5x!r4YX{C5%dretNp@yRN4TRKZqMoo|l6S0{YX3*F8U+tMy{rBSDw zc(TZI;s`#5jU5Di*aR}!bJJ6FK6*Rx>T`pi&)9krE1Xm%8@|-_BCmXAD*=kEO`Fx=( zI?X8SFmrmk20c7LFJaQqsbHGUYkryrXrI~#=1Y6&)7mzMj}emmi#hu-*ax>Lu^5c zfDfD(ww7WDMd^bhK+HG8Hw1#7Y=W+L7s4XPmb5cH9({3(s|8q3movVHt!X(zb(M{ydZF@#gl zS}c%U*9OD#E*$0s(QanC9O1k-+G@+O5zg&|hAG zH|(Q;)hrX`=_)&J)9aKjCgP=${H>&vo9mXwo!Ho|oK1le?(^2hm4Ao=M{o~%=0|_y zT~Xz30ps2-i=`iQ9UXrWo(tjq zE)p57^gltP5K-Veg!?!Xv=l)Sn_X#n0I%%6II8~Yzr|G-vW0w&6BI9dOhk@LOvIV? zZl%rNxr;B+v?yQX#QwrT z+51>&FBY1yMwm?e7aR);p^KGXhcY=eDKgBzQuZ$88O7%m$l4mnJ`~!$Lx#DCJ?Y%u zfVp@BwK!?)u_Dc$=`PT7So>~Vyg98}%aUQ%FML`N>*B@e`1EytZlSg4vpy>;f^2{0 zSE0B$+3nBv0Rk<7qe$tuO|afm1{BA-v;SqI?Rc^{k zQ`S2A_J;je6@f>@IOHOu-y3nFUn(j*L>cDlirjEU`)v7YCHHZLiE~# zFa)l1i&hl@B_LV-461EZBRKwC~D{X&OkVngKlc>eGUci-4(HQ7ueq8r^nfqjd+`tlmI z`yOa51qPVNFJ2LD;nydz&x3?)H(3x-rWTFo(T$Y>(=4%VOI>8?x7m!%x}6{WiQrFQ za6OrP;K=kgbDkwie0E>|mG?$Ys<)Gvb7N_G*13+gt!yRbei)xLsi{CiqvQKFuus-` z3(nq;cc$Nmop$D3yO%fBQ7wI|$QI_et}GAnj;-GQhX|bq`m8kjrvxf2KBXPJevl84 zU{)pTvIZvgY6$~B+ozh54;9L#=X$<(|6*n=iobk#N_5pusKcrfZUKAdjZ>6P^d{OT z8a2?PIg}kxiR|A#>->PM+D#`;=o$=$!=4=;BBid>Dug-J?g!s{ycz$zkTXuOEDiu= zuXWL{qrhQjHO6O&gW4kfO{s3qovkI!FEVU~*1=R|>mIR8aak@-z@PD>u0yrJl=q15 zp!@%6%zO90ggpOJ)tvsF^xOs}Loe_Vu*1!u2mcTi#X~jbaI?Vn^uLAJ6a8Cl1pQB0 zfdmO0)pwluENtxv8jS%r3#Yqy+XCs=pfL2oSIM^t^Ou47hiF+rQRBud-qoO9kHmcX zzo$XS<#)MoV63suWe#*^W`v*Vt5P#Os28o)%4l-VTQA3H6Y=-WZYdN#Ji(U^501wW zLI7znmZ$m!Cb5A1XkSS(se zezmo`qq8VPpaROi5Pir1$K7`XnIK;5JF#}~*O&FboLcet)k=|^DDh;oL2sdM*62AN z+KU)>gMphwAPqb0+!`$0k`Covjbz%e;OHSdK(oFwS?U-%^+YjQYVAEYqnmQ(F4Sv^k{CZ(7kLU{H#kv`ugaaS@^p! zWV6nDJ-aW@8h20d*%mWy5UUD|N`X;E_dUXG>@)`}JV+3F+Z_HQnc_pBK5SNaDtJi5 znS1qRZ_{GBGS{~+lu)d6_WE%jA`*&Ho{UHbh?3I|H>!!rifdjY^EbX_YuJH?T`gg{2!V)M&a#a6L|WueLqV z+xyl%VBsv$+Sc*cp`%r21J72h=^_ytr@Mu5@Bobd@N^1 z-#@x1XsO_vH?>Uk<}~Gebqw* z+I}4zPhj@5=_OF0AEi}*y9*Z8MH~$L4UC?Gevh7MB=qXn56lXNYE-ydHz-D@?Ux&gsRO0hX`7*vr8Sb$P-A;d;n+E6R zK{!ZXfv$k^q#H1Z%Lbve5iuFSUI4OzMRK5`{POjtOQuBKKuyx|N+04*yS=y-4GRLj z?i{7Vc~`%&x^!7l5MPEq<=B0Q2I7lQ=0AY#a05#0=heq9g*D+r()0B$7SBil5EBXJE9Q1nEZS8^{r@qQA><7e==ok9etQ ze$B6$G`%>%A+JHRkKG@h^%E&ew=)n4|E?l^+QqR89*@Ma#oOA`;Ar&*>y*g3sGNJ3 z!-2YKNE^r${f`fn*zK%1Wk2Vvf!#E=ix=25#bbcgWp8oQcVu2*(Vp9p3}@2Jqp z#MI9yi7BfWL2GR1hnuK8(2WDr`uz+y$>oWqUrWycghLoPhi<$np?%GcCyI#(>J4fl z#nCFQA&?}S6vxqsTW6UHG*wQzOvfU96keq|LU$~c!=&6OT4X(|hIBZ^)%mum0Pc7f z)@>7f>%fu*U!?fJ$tYc}qqr&0D3Z%U(HPgiwDaMs8^}lUT;WS8NP(Q)3{42UIQl1i9ehorC4%vKX%CNtyoe5BN-F`gayLLRZDA_i%yK1EAv z)jN`}P@}6se^I(g>Q%TiI|JGm-XDGzHtKOZug9mkr77*xr<4JMw-0kT1dS1l?#^-5 z;h=Z0B1)+k*mpg#f%v&>-~!9U26K-iH&_%StpK5(AY3z%TlU-Pq^kJm#wHi_A1xT-GY0h zB%AdM$y@>0=M8hLg$G&;sGU)jC+350G~sJ)^IxggEtMm<$hoa@>Y41GcfEf)*a-EZ zC%l7F=5P3hw1ZvHbZd>{<6k@0{g(7&Hl{xQh!;`Wv!%dU(}@U%3vH8%cABh})mV`v4oK_&GrwL+fl%qXk2-= zxa>;}A)zRVM>(CBvf|ne))1QKRFI2aoKDENfZPv(Q=ZnvYJGr8o)DK3C7u~BqemgM z1c?tQ`14vhaJS*_h7ECntb$PL$G>_B?U^xyE(AZgM?e_sNR9s*!m6Xq765WXRb>{Gty>1Tn?j2?~e!< zgg8D-$a5;#lBjuHy(bZaUkX=D>Ab&XqBK+&x6vppT~WXU^H%%>y~~iw>b>9-M34;k zTvm3gFf3pYMY>HM11K8#gR;g#KYf)evm-E_?NJRmynX%?qa~I3|K;SbFXcct#D&P z9e%eJ*byJ!Q&_lc`@@GX%z2Q6`asRF=~Q1}L^W2Vmu$eLORcSei_z6H+V+jl(lB3e z5gYV7@1=C*V-vQ!CLjRc$2cMvG`$g9(A!X&MjcwL*8np#4kzN^Ci>^r#vHwmLR8_@ zyu~!xkTs*AOimT4$9xA3CK+Gc`H(OVV?4`GK(IAtdRN~*(9PsY8a`Q1E@s zH|Y7ioEI)MXOOM?iEU>9~{DQ|aSWfUA&H53-Q4&-xlv8I0m&q* zl)3n=)5y6o$WJvEZKCwuFr+oPF>iT=<#g&YA5JxiW1B-|2D!fzQ6zUdUayvSfPJvL z(Rt!^PUsUc6~XS>!_j#%=heR#Fzk33K+A(-`HgxmApC%8ymw{Lmb3f2V{_E~+4mPY z_g=Jqlnh_JCcr7*hqX%3sNvZ12A2X$7C3|#n0Ve;2W)oMea9(VBSL)(_e~+?Usbjh z;Z$wo_KfeuRj%H>q7g58_Z(-HMF3qYLq;d4D|_kDtfY~-tlo?*&lRV=;_cbYxy#hy zx~9tg{Q{=@OCMkq*p_(XAH5Hg-)|kRByXS26dnZrhL+*!30mOBa~wS>W)a^M z`1MsE`oAq)sU9h7M!z=-i9b&^&9~MWs37hOl+o7U7%xS*BIGYP_CF{?NFXZ+lsowF z`xPfn00oUvWM3Rc6Zf+#Ou2aDB~_Y#XxcW`bVR9BwuW8Vo-ox1lNSwXG(8t(1QZl3 z1nPNw**lyw8=|i|oN#wGNVfeVJ?m}8yipsCR0~cL20sys-Cl2cQ@8I!t8D)U0D34aTD5q^AvWX>*2=|YInq$oQ{{B&BhBJiPA3f3u*()yDHPEB_@i?}+U$67n^MYxZVjSM}alqwYW0*eFv z1*tW_(U~ZC(%yLsjcR_ns$XvZmF@wXM5Hc@lF!yvFjy-CPt~s1H&>~Wt{m0D=V(a{ z(Arl#>(aAUMarcx_B@s{BM%ryjH3>kngNE#MgA<{hqZ_UCY1NG`>ey)Z%!s z4=Fp@qR}k-m*uK~a`wj(&xrepX>kvBh_42};QN6u-v?+D+(B>ivHUcV(rLjZD2|vQ z$x@)WZGBWL{Ej5`R%c+jW@^v!Gk`s3tf9*3?a=dS@Q==ILf9%Fs_9kz*sfrzgQG9g z^P+I1t6z_9s;_C|+dnRnW229c1qKW+JK5_z|2Ppc)Fm-?F+emE2bLdj?(n#J1DWEu z?G2_PjI^!{_JSg7UQQXakf@!-4t>HkGsr-tJ~ez^**2@Yp-Y?foFYF5W=n$=1E@!_ z7<+U{Q~8Dt%L+~vb&<(@rHWRFIGv26{h{QyUR8;3eJ&yUv`=#IJ|k#4Q|B-r%|VwW zJnj8WuWEDbn}+T#99Nf|$eFKcF>p2P?3P}=dC!1SwN^u0-iy2PVihr$_@@q=f|g&O z?1qtmacbE5s$YI?PiJnc`+nOuqFpk3UL0<5GGy=!7)ja#29dY!8*PRmP#zh$J5Dsr z`K0+#3@*1bhUJofUk2Arc(g&2cJ5B1$wtm6R-ON4ck>(CZ3JM0Au&N(sA?dW+|m*r z^ysHlAj|sKvFFG0ZdP;_3j1N@!%lS+&yu^@cpv80-GPz_UGn`#UI|EyjYbOWCQ0{U0K8L@ca1 z@eqM(!^ojY0Zx}+#Av_bO(3MAJ?2=oC1zcWXZ1nMya0X7t&$&aL!EEys`LhjCY~1H zt3hkcAk-^BPqi>`9AA(u-H-xMg<%Cbr7x8ACTWSc};4~DL|#o-OaT<{l4Vl>hirG zG5SpW5lXidBs>`*u7qU}`w`5EV~Kb}XK=5&c-9IHigK$u{F-FKa(LZP^DewgqQa;A zu2Y2s{Zoa7kuyA{-xYxhjW0XP|CPUPk2JfI-;?x9G(_`$%u0;HN$+qXma-$01I@CP zKYh#Ou6KBmzIHJzs!<*(#DFw808}uS7S3c>%bpahV-5e%7BQ{1tw06r&Rh6S2$$cqSmf$mtjs2p zwBy^8IA7)`D}^ssZsj?D-i)CqE!X&6)KYyMOCSR{L^sms0rUWROFEx9=xx^O!3H?N z5OJj!@6(3vIcaQ>K$L z@wg%xUmkxAK}<-Duj??(TfQN{oTgj)l=7`XfQv4e&ao<63^eM6+v}7Hx`~~+lJkQ@ zBSCEKBHyu^X3gBvU%$KXwAF>iqcg6(1%O}5q;wV5^4ng3;V?==2g|jKB)Nj%tbckV zXt9thC9IC42mNYo^{Nv0Z43ASkPRMM18&d~zxiY;xhAw@lDwLbo0T40bikiMFE=iYd?WG^P?XNm=1d^F2s+rS}=lx;qi~w)v0miMtgp} zEyE1sQ*8|~Z>}?8Shu-|utvFIeJUMHr1He|7^PNiV`KZ(MCt3^6i-J-tMF@O=I|FU z7!3>nhiGx4HSz``HXsRba8bS42l5N(d({3{;V8Qi8oCMX(fMde2W1Tc!dLPm8~R;h zMV7N)CWfq0TV!yG?bS?FhXxv4TOLIK%l6yX?7R<;bT;#Lx( zJN3Mq!x?;m29E~mY|e`&$h`*=L@^#NmPW3I2StV!uwrPfB`slmIgzP%)}viBrmR-_ zONo=~!+1qoZ;k*7&*at}UyXBhZ|HOejsY)Y?L-)3y)dCpt)t_?p+uH@HY^xkHq`hVJx;1DP>ZEJjS$LnKF!7m z{C%r9GW;h6WtzV1wxvWyzs?&1)CK;`N^VZZwEkjrB zD+w-8YHu32GiD4sX^R%^xzwTlokcPMgi-RYF0k1|Q{On1%TY56DWz)EsDyM827!)G zLx%(?m7c-YO4*rF)kx50ybj^Eh=u^O(Bs^!6P3mU&7=|~A-44N>c(GcA8VFh>&svC zUe#eEfm zQf4&Yd^w{X);??dc3Am{AWi0qs+O*nNr#J1a`OkhKV>Sid2BnfZ@C1gHN>(H_sWb6 z-OQYA-2m-0?WJ}~nR9DyQ)J=NsDGfp;IkXI3;b=gG>Z%tkpqxx zQ%BN?v`gtH(jQ!{y}ih+LxHTCS1P}_-PF=hYAc~J_a)p>>BDX? zALO3P%3v2Ot)8$~-y752(+6&ivPi^1s8a{}0b;c1j7X421!Fuqfoamz0IbA`=--RspPvN6zn}k~9{(el3|05W z!J*xY;FEAMc7SN@+>5yM3i${s!pjq$p`Z)Wgy&TTPyWB>|G)9p-x1fpe@IbFz|tDW zs$?x7VVf>o8?IRyaK4zs_elnyZR;X_)orE;JZX<1>%FPf6&eZ-M$|(O?bkRK zoBIQHV-;lmy*@lDy~?%*ao9ERnD?LLsPzxL3?u$XM7$$HNZ|lFJt|ZwW(#Fom9{aQ zuY$gr)^;Un+8n1Yd=1?xV8ip`XDv~xaIyGE-F7{e9x%7Oy3(zViZ5x7Z5O^Y$_#!# zy;?yqgrGl~)*TPZD@=DZpI2{-%B)#(7RB}TinRZJ!!tJR>~n0F2S3}d^aWg69^=yxaFdbzL>& z>^JZY)i13+udEqn>DiO=09}9H)}&FU&LPf4wBQ2Pfp*&g!-<7>5JndZ@YtzRt~jyF z%gzD9Q;IEx7WeBId>QD%)&J-F}_-Q6Y|e>RY_Ej>Ds;@S9OD@%7y(I8N47T_#BbHnm7 zBmj&c1`H|Ib|aBdZ5olw50{ER&l3{ZZV3N;COq{btadw*uM(P1zTD5PvLW35^zG1> zRN}{1T`rq21#bl-j6HBS*$3_>HINY*L>(b}tvc2;EwXo9uZ!8XF|4V+_V&usQej`p zB2AXM1&Z?1H%EhLkOXdSW^KSRve%AYvDQHO@gn%e$_&tU5>78tf<4V$HRIw=WAqA` zXDJu6ZZV?jylGjj)8|G%@hgQeJ_P_KAgKjT8{}8oe``HuBfCS|_CwMtkexwm zT03z~tTu)izei6*;1oI&>s{sisbE$B_sj2Tp1;h?hTfTU@pa}LzcKZAq}}s@;7ISM zXZIKWteWMnp))QkjVG2Cze4&yj-!5*<4p_G+N8!~_zOFfrv58A6jz4_TJW`aXpJxO zyi$D=8rR93{Sy6lB#Q9hr~MUm0jJ9KZ`lGo?OXih%zkgZU(p+1i@|FZb~cCnIF(y( z5Asq7rB`@jTPiL4xXoL8+(PmDisHA;LEAqMrB;Mr+$~xx&yNDv0m0M&OX$W5J_YCK zf@aYE*(k>9oKDBnA3qs$RMf6%!X;~z0AHnWHni%JXs8()>7o~OKA|H}1FC=!oghnW zHkz4cX#wN%lMl_1YfX|E`+h}^H|xUkr@zl-%=6$p2i(U`FK@d>zftX0;^M=2C_}E+ z7iPE;JQXF120o9yMSB-8kTTb$772PbOWo_-a1jvIPtMYH+|Qrb38Kx|5SQqBPEH$e z_1$59aR0M)@;cq%O*q+uP~s4>gB)}W-ts4GEfL(9Oz2jW!FMP?3oNjK zs;CXPda0vtO}otbe4RPBuS^fat38+N;#S5q4>i?F-`M^`G*bl*1(EKe{ji}j;ZnW} zz0oSg^N)5=kAJU1CMDg^RYVA1 zNG#ZH8S0YV|KxnN1XSzqsBL2|D?H6hUTL_e842c1jnF20mC|^UE9^Z!ZEMI&(jJF+ ze?)17$*u$}FK7t~nKTv!v@HcXKx6Ur_#co31j>mzZ3E0~fo;PGp^;6&UlH2VRK$HA zJf_b60hMi=r2A3l{?lAWitr3?@wG3>o+7k`7v#8_E|x` z)T|*ubChY!?#K}>GV9;V81(H^QsY>Z3C($gJSGjRrOD~vukgM^FMU6zRN7z!L9FG; zHVVF-`)lQdBw2mw|cwr@Vku{4uZA zR4{WjS~AUmwe~v98>P1=(34}|E9DnT5?e~+Ay?xS^WN4iKvL^#ss)laIk_P{?gFTi z!q7ih&1+^t1AZUkx2LL4e*bxlxQ>Hjn^6nv&^Q8>AD>CS4(hn?Ms1>HLln}iVWz~f za&Bms>}c8dMre06OZ5SS2K&f<(=Z-bFLMh)M&+th3xmVQmC|h%_n4BV5ju@AZ!^?Q zWfQ~UtBCbRSbCLwD1fVX>Nkx&YKL0{}2JUT~f#x zL3nPb9aS1E)+mHzpZk?W?DU4_(ZdOHuIH1CTw9JMgVf4?cKM}<{RPxsfc_ox74xB5 zB}xrTb#AZ5*YwYX$JB_fB|Be6&A`@{IN*H12|}EH1z9!JID_K{U*#LSQE6|;@=WnW zaL06?e@a3WsVrPGPT&#mT)YXmM~P#byW0iy#LD~A*0p9Uij*f-50`Bjo_NRUzugqf zR@PZ{ltc`9nnNU{4ar4HI09A-W}367_q=OyjSI@_Znv@dy{5J8sPHjNbMvF~MX)YFH9W}mMG%Ao=D`UxbZ|!r+(fgk0RIZ@?q!9 zXj7_Cta0(8{MbRARyi{%C6XN&;4b#&Z~zY9v5%`s)t~)P&4gSmt%Ticp9m14Q+{#cWPNk5B9rr zCC(-lSxV_K6Tc&4jP>)A>>f(+jdnhlfOz6lp=aq!|TCJp&yz+h4YS6=lD>|$g<{g%P4fHV!usbNkf_1XHOfB=- zGuUJO$t~c+E{q()=n2-B7M;G1#0;J$(QmXMemcPW2TTEJ~zD!;5~%C2lnBd1%Ppzft2+|4{lUP!mrld z!i2?;VpPk}-vPOp0w>IyE_-$>V^Qubi_FC)aqKAr$O*ELk8%?0kJVwZz(!*D(O=V` z>jy1)Y7L2Z6y}?K)CPs_SSYdeSP1^1JfOJt(f5-vuy+7_XqsRM16F&q3rh9gnS;h5 zz{%ey3zF@|R#|Z?*=LYa@LMQ%4nJ$Mb7l30whX=`$3JS*6!*G!#yH?knBzcL@^@-A zS*fio%d6B9KK_$Nh}n-y$knxVI}6qu?tW?G+)F#A@@0)1DiTGC|2MPz(1VIw13fBE4> zUbqIr;*QdbYi2!MCw=4C+C$`dh20 zs3M-sXd)t6?i_L!);CLaB1R84!GDE23t`@3?0#^}6M3~MWN}-2ONKmW1ds5c`>n^s zAFpwvuJO^I0P48cG`}EXfXhA5wcM4WX}ZWWJZ=~lC=PG+STe(CI2TacT{;&7&6tohknhd(u`44Kb@co8t~|63}7V3jwz(BJZ^qF zGbfVU1hQJwA@zFM8!d5|C{?6K!)lUrx@mU72`ZdLl0` z@{ifv3Vb8#N9GOi8T5BMrM8i72sk*iv&k)^q_SWi#25suE()Oy9e@k#2!ENSoxSno z%_WABf~hFHibwMEjjLC(acbArSgk%uT3UdYIdF8F>yg2V524+U2y9rTP0|Rd6+N9F zHECHB`x9Jr?^^O6m)>f)CZybmTR%avfZ^tJj2qE@DE3mBM9vM#KX3YaUp#)4bo(zO}*mJ)hJhy z!&d{iXxg^AYw1&W4HfGIX^)dyMXKN4fRbzcr{R#Bfi1e60}4o|e)!Njn&LPV`SlA-KTFsgj;^20>omn3_?ddJhw zo15FJfvh5;MBEpFHL^f56AZnu*;%kbWp9q%MQ?&7Ef5+DMwjsiClf0~?7bAM4&p>) zF+|tf`PLWuU=h%U$lj$&&E9wnQuKJDwyinWN9`Jk3HMV^nF31LZR7V(KzV$didH*l zDb(ox-eQN_KSaTn3(cAwk)!=Dy;Ay~hhPNY7~iX7XI#Q4f#Mjr!iBNwo7GE8gL1xy zV%5rN4xysij|h5tA>Y zCmjo>p7OH`S>EKnzf8VEZ*jYyLkYYOe5$iOzuF}r|I*19!6X)yxea%S9fpdqjc06g z=*v5JAd#TnJeS=!?V#S*7 z7NJ{@j@|sMb)a)t272z)`dD- zVN*|sQd?X8dh_&idT_A!pd#xbr*~~t{@N2X6M@YIe5IWM;65_|Cv}`XO|IwbM0>_JP5+CO!WOD3@~v8jDLMy!Op#)218daSvAZcXsdm>EmRE)pinA>u~2n>e`K&{Bp029bTgU+u%G z+oeJz@DpDoqT895i)P;$*uEvyJiH9lvf)cr90P|ZHftgdc{}nk?&AkuWdZJgy3ut$ zrv!tr6ZtsHf%p>3r&ik0&mV~_-P{-y;#m@;$ZbNLmJ{p$CVQ3m0rWlUP;CQP#04s& z>E9qKya!}j^dQSS*;&NS%^QnA8OoX;8BwZqRmX8z%Cg#=Ft$o|PYgRw^vgbBxHs8~ zVEbKDpA@uUfz19%(BC^MKvNm67Du3Fb_*fI2{3#?= zU=C!j^9K8xBqr#B;_pi-v3{XCz>I^$1~MzM63VuV+{;HEA9ekH1r_R;DSbO$_Sndv zHV4w4o7W<95eR7Y1OlXtyB&;Iw+rp3{7rx8?O!UN9UZ#qAD+YjtU$o$fYA(h4^Int z*};2`KV;eEm9dG4RUvajMMY^SN9w&sUcVwP$mQXCgAtwMiRf!^M=%Z0L7HI9dM@D6 zq8T2aW{pHz`I|*2y!f7Z{joLi08;1*v)6=8e1v9VvzG5=Un1UIc&9r>mKjV$Xf}yQ zR}dHT+5j!YXaE2Egzw+411Ng)7r;16{GW$mUmo*PIv}I`q^;lEkf-{49=2&m? zHXEDSgLnOP!9=Frt-wABa*NlJCU$x*hiZ*&Av2k|mXc*$78MBT_dna2L!>Yb@66Wx zBSRF6_g2_6Eth>_Aqua)-$qii)<30lRowDhy)YY`g<^EjcmbOHiqUV75K4>yO5hd< z_Wm`NaK2nG@S(41Ox1+bY`NA9k%n#eedo(X#b%gYR@vkrc&d6*V|KpOSARWTCsYDbVr|vE$=OZb&@GF?IL-3luPGuCwtsj1t8Zidt(~C;AS)?ccOEP8zr{+AV0U$O5!- z5C6Sl|LJ?C+)C#QXw+G3RWKx1%(e1WaBOsuvY|qO;n6{`@K?TkZ9w7Yg2sz!9MWQq zdgm@^4~|0sEm)kPjNfE8`yK6lSrr}8G1hJ*N7$3vugVtaWSD$h<1g~0$@pgww_(Ss z<%W}n%*(mAz$8JH2TR3fM4kM#kFjdp(Cw@GpC1!)n+FHUdlfoHm$Zn@9THXAr8U04 z2gwEjrYm)4^?96_1LmoHjJh_}@MSn8oc=Z};7i21VB6J*=&R*!=lZJ@1ZG;?C|-J9 zQ@qs-fs8*h60V!guUyyg8Cc%3x^`L++Jw^bp-AEI0Smzv;9O^DR3a`JtKZ*7rJ12t zGiTo*h&5SFe@{#<__PKl-JtrT}kQDVKR&5)X$YB`ra+Ga9? zaQOx2C9+>ghTc5QquJ>Fgk=<({i2sztX*WaUVi#Wq)$srOKr4tXwuKwO!GXb{W~!` zL=5YJE5;%t;5ND7K8C#@<_fszEPy32wC8$AMsFpX)ITdrOJlv;F}2>S0&&Nrlm6*Nnx zH&c_{tmR(-rI9lnj$iJX_SR$U-!b859g9#L%PC6PDleFkOKINrb`t;7U^D~_81(V{ z@`sri-d={iEdOvst6fp1g`2F{U(3f&ClXAG8lplla#D>-Zqy&Yt=e7)9ApAlNf_}f zNhP3pXlFe=DsWZ*CSOx~%k;+OgJ0@V+X*X^&+nabdLnp4ZPJHroJg}@5&Oc{SGMSS zgB=tVtO*UKXKe_N{t=+d_sXv=jo;s*C8uPxv8o8REru-(aW0ix1pzguJ&N-#Sz~f54cTBx23|4fP z8(KX4x?%*&@Bgb#K9z_Av#GL&{DlwvN-)MZR6Hrz4YKseTX)UVr~D8@rNx^^cbnO! zgK4jh0Ci7nfyr@pHK+g7&ujyr|UwwuK( zBwmV0jWYE+{W?M0EZ2SNR1C6B9*_`jQ~x?pKSM& zPW~RXwKoiW)mmZ3hc6!uY}$f)dHWWQxQthPukOw^*Jvp}xKmY*{usAo5l-DMR;-bj+d11=defGE+PA5Bml_4>^lUTDaOsYVF{f@jki z!r`2HD8+40Q@gkv&*@UuSF?jqEb#V$7tnNSoK^+yk z2zEn;{pffjqD*`mVz_zoOm(~KU}->jLtE-rEhfM@z!G|kUS|`Qo4(2&(cMk0?^pzY z6^MsN{~p;07W_L0`hUlJ;Qv?{BmVQG_bXY!|A@9H|9kSkOTGNB@h-H-pTIPSlf{BN zJWysY@Zmml*`4ijz>b?bew?15+>$f=#&v|^Xj98lJT{>u3HAfS-lg+C0v z)9PQ*5!n087W0cPs)|CdO2|#20ajK~x-2v0bnHudZLNZ_FRcs^Fq~AO^J(_0lC4cz zSk|*m;z>)5@Uue8Jvh0tSwTa)k$Y5p=>s^uil6C%aWR;ZuOZy)ny3wpe1jOfT4cjx zdEFAI(yNZ8qEdxh#Yz6;&|jr%iFkoO2WG3s42U?D2bihHQP1NE1IvfuWgI))g)zDl zUntUq3q4%T*5L%sZj7JA2M~oSJH8M)xiL*pEJ5!Fxm`Sq!Se3YK?ce1=V=gv6mF^R z?eHKah689yo}|Baw$G{CYf&|>TNVLK+HDu>+FguRF7)v4I&y5nO2b#%K^HY8rHbm5 zxq_qW;)cW-!8)O$?6~vP+$PtfDndvIE3p8^5)v>;T3!vtxKH@&+o;m-gZ>l_0#{0X zLnmZH%X14nHsX~G+-pikl!Ted+(E^0ddLjL~i$z8uUyRfMKg8u5n{nch zekADopKfqCnhg$kSlF-oHAJ#qD-K61EshEdjr~YzO63+VU;U`3!vMGtvw&R?5uj@% zZYMyCtO6A+2yT2fHBNt=@Kfq92?cQo?cn(nCNg@-j=3#a4CBrxf$p(4KejD{CtOTh z57FOH0R2U{;^h|=XHt)Mdd{$}ktN{}y@i1Oj>nWn*XFYaKyrIN4rf{efoPEP#hFQK z-l2JXzpwjfMDO9rF+j%lO6*yLGVl;QFxPW^3kKgF7i3l)@eH!PtkL)3zw7f%{pS8E z&@(_8e*{U#Q~nM;l(0qV*G&=-?xlb9sKS=DJx#pk9gVYEU#X}GYU>ng8@?!q^rI9M zMHE(cN!4Ew0(fq0%NpX43Dd2OM`AJzb&a0PterW?P zq5&d?n7Z&HVKn4LNzqrW%gH{ThNR~-T5+1oVOjWt?jFvJo6#2~ymU;esJ;E!*zJkS zaVjFK!lmL6vi@Y`ThXqp4{>_4rAw@AR5d}$fA0;B7MDgWCNYwRKveD|(U2EyF2Ss< zYFBT+{Uh&x>!zmI2LBVy4u(O>aw=)zFpble4KQBe$$AdyUZ5%$0X$jdW9KRw6yI~Y z)SS33K^Jj5iJ;8kp*uR;iY8IjV1Lj?BbiBec2{U;?#`&(3z2MI$(OB(im{NTDq9aE zr$M&V#gPR8wPvfx@Yn09ls zGuO1B)D!El=eifEpGfPlnoGlGcF67i zs;xa;wNh+yp*Wl#@DzLRq&Sc7g_|R(R9W#7tNq<=pf!i?7O7VSyMDtiE;sl-#tz!s z3@cZQ9t7I+<>|trSLdPvPzq%mHS90GZ+RIc&zi05oi&64tPhtx^jX1xRFfRFo7~hZEWD>m6 zx5>uH5C#Rv&p+~*hCLa4C4G2rs+IxVlI}oP_@^ZxxrqsT=f?XpveaBY`^*!O^WIK57wVVnSFVkK#!Hi%l9E~yYWwdd0q3Qq}%K3hfkdM2l;ah z`w~hcA1`+9i$sAk*S=Tp^h`guTGTmJz&1sKsJTL(PMc-xoPr;ToWB4HR)D9_>82{M zo6q2z{|@~_^rw@l65q-E3SfP%6B`@*=~Gd`ge^7w<2cG_N@Yckk6$~%?JyQ%Mf+9K zPxy5efRM8Ar?1)ltEfy%*@|5bWYD&YMTmdI=-eA3DAM9n{+=vn)$AM$n*ez9$G7m> zP6QE*?LB0rG-L4gFzV^%>cQP@|M4$3bMA}|AV%?jlSz(XpBF|9EE9_tbF8C9Lce7n zx2J1#VoQ`kAL2#jo*$L^ZLt)mwa@7igF#bfU2wdp+2LwwW#1D8g&TB0-S z(cM&sk}bMX(5xa0TK3!m*lAC&;{+xMiK^lfx*PymMRcVJIVgfy`tamKY&fGbDRv=<)BJq~{-BP;87;?V915}H}rWayUHkb=#n6oyo*#2l6Y|JSe(c`&F z<(tSSyvj*0NA|?*Pc{G-tuEkmRrs+s&zmjOW5u?U?v%NntMBo)$a5>Z)3tJ3t`>)Y zZrEUb-hAC+lA>&7cLyZ>amnucL?hEfL})i&+xu%F3f|KFJ2jjgMOAAU zedRyfV*JM(-G4(Xpuea7TNTUyY<6oc?D%R_Hv%QG=3a$?ujghg`nbIoOBT-kp}z00 zAqot;HRrDzh258YWccWJvxx8+w<%4UT0otB-l%ko=twoIsG5p3y*tz0=|aAPDZRbY ziPCcLN7^_r#shSCA9_k3+4?Yri}Yc$%?tjXDXl{5p_VVmsfEP!&g#0{=MkAo6`Nc) z1Wr%ar@?f^c#jH80(ZhaEMxk%GPj89l|^!4PjyU_RAkpt-}-fz^YIwztj3G)T^o*l ztRIFZ^SfbrCyS%)ix!}rzsYWI*Yr&%fLOF8D|3qDsl9e?P5lObUG_1zF;AAfejedFZb3Md=NRgYk`FR{gZ=B1g*MbImX%hd#n zP%DoWuqYxqd0P1ELrf&$<2IMAoU!SH#`omwcA@m5^`YtCP7(-~6^3WbBwEg0wDM2ZeMl{whFb!ry{1o-}3t z>*hXi6tokUe&IG!9$)5o&rWVAKonQgIx3t{R8-zU9`WWKbP^gtFjzb02=MOjCDFIW z8chCH;BBgFe)qm#=Kfb(pI6h8icA+8x3EBJN9QoPQPyIW5mey(04Be_^ESt*mWGJ1i(VwsGtGx5?*64iAmsNx3_X&su1(=7T4la8n(>@dnIk zcigX-Q%&0iY6{cZZwHmhI)Pd(g1!E3E_N+iq`Eo9^<$O*n+{c0B(^kOVr@z$SDdA> zrMdBCk{bQ38fmWX(+3o?gd{w0TQ6Q(Ikn%@)$a|Gi1O8y%D=y$;qjoxb(}{i{K%lX z!@+{$tLzHAQy0Ekv_b<6tZWmn?t&?cLS^fg_15+2_6!H8M=P^@yjZ`4HqtK+ot{?@ z*HTE)FaeH?@)a9;1}b-4)!B8&DEIH1wwH;7ppeFO)kJ96#T9HD=jE03?dfSpvwYF= zspPCMtsyf@ne*4@kbjICTdIF2_IltIc-O#DD%uxjU7#yae4+k_H2JxPijtc*6qXqu zQu7qaErESzUJ-k}U zT z*Ix%9?Nu=77vOS9~$E=G_=-uk;?5|eHK#KfCIs(}qz5J56uLf7!vc78AyOkK$*LF;Tc$FS<^=!66KCMYA1lUMQB^&3<^S<~V=iu~pP>;shFxL6-0spWq zG8Hg20uvZ0)`2lXqB>wU19nWozv(8iXG+xmy7O2r=IG)CoJDcMLCYxF&cCwiVP|4u zCpt`o0?;G6bLmdRpk%&Dx79KLjl*Y$Np}Fjp|wiDVNSriT)3GfJ@O{BW$?)^6@1RY> z+LtV2da=4n@9VMNyyT(@RgubMriLz<_gzqo5qNQ`vt3Z1*$K^9w^%k2%j$8YdsyL6 zp6!x&pA%%udhnw#Zf4UKIORKqZV$LpFL2Xc%r|_Qg&8+$@JD z51|*+q%7c=X@b|8#eyAx!EWg@yf5bB#7)^8|ISx7C*yf8f-B!OX3jZ5(d^?eV<4zw zd_V!Q+P&cb2=x)Ga#`*w4k29Ub3RI;?OglNCpEmU^N*WM&iF8}MBqXl1vZ-vK%>)N z%r?gRUP=>`@vil%{F9>JjuH@s(TF2oxyGlLI+m6<2I>;{8kWVkGc&Grt2d5s03QVM z&mzmdIg|J2*M9pVwmj1vI9{qD6?i8RTD!EF9BO(Wjy{Ca^|8LVu1sGOGEC>Hth3Ms z=1faF+dH;CK6ZJs8ITuA%kse@Pqpo9Z4*!Xy-Gx>t_S=lk+CVi8(a(S__ZvrK7G%M zs?X9hM&sR()Z)Y?{P)((fOWMBzJ6|9AWp(( z0D*v5ggfnzE1d)If!#N|1n#ZoZvvj1ksh*7&b2TC2ZfiC0q-}Wdd6vBW9X}AY3~oG z__)OisIKLHf3@>sfaQu!w3fd>asZn>+23SEQQ@u9B>^H`K*o0M^R98N+Q=cYezC1b z?0uOJ#%9=x*Q^bG6T~H`1^A; z+oimWl$HiN+vLl{$pHVb?~1m$+Bch2tCklxlL>zTaD0Pm<9`|WDv0^FF6#g7Z~WJo zEYtt(nvMS{!lIzUGOR^)=f~!8WOSk#eMD$)?-_Z|Hb=Dj(>VaH#t$F9T8O-{e*-~< zx466o8vtJmQE!*P+hC5>CVvC@*)0$+(Fu@wp5Yf zwXqGFU3vV*#Np~@y_*Pe2MdS_DKto9U|Nz2Y_grE9y^xKYln$*a;SJ1lc9CDy;VHS zHDv$omlL#i{CS6fETJ7X2>yZW(O)?3Q#xxt{-8SdWvD#e@23=<-iWtD`n`dKr(}YZ zdfu?tWaAgWRoM9q{E}J%hsCQo6*x&dTQ@@p7~cmW>Zs_1&!{X~#5+$H;2E z#Y5M8ntNNV`7V`~y6typdN%tQlj@3wj_BSaSrs}*Lz(<5oN$I8#QDwvD#Eo-4qvz* z-SwKrTK!FS2;5shKjt|D29#eMBottT%b)R<04Z3c)*#Vc&IQjPH9KzcHNGoienVIH z%H;H8!_Yci24V-gc6{i7{e^?fO#$FCRq=~`Il5I5-NZURn|RE4a>fm1cbj>N=TcCS zPk3D=yt9d94Q!_GD5r|;yz$)16#({lFCn{yXQd;Adux?23hpjpe5+BZEc>KaoT71| zz`=%-_7U2hUCcTfykh>lOa{M zpl$QS8fFlNv!rcq(ICI{b)k<1s)iPM>lV1~9 zb3aTo7E)m7{Q40RpQ9noU-x4 zom|x$49CVo1mTsF>z{P?9Kny`UvAk3Ru9sYr?i?~ea_l9IxU&R4`SRqB#p^?Y#_+(_j($3!VYhSynVG+5qz1o>u9F}z z7jD3N5~H}-Ff5(QWg!wlJ{30Wx~62&Z&W`|Tv73hliqyHvAyyswHifPo(lvk=dlpW z!A>6612RMG)({{U94f2*6pV}L&fwcTf47|eP~XI}EqcN4>VaeY!!i-x6zRtr( z?YMK7X_D<~;sT;KGyN~~)^R3%Y9niNSs{7*NpBa;(&h%~ni+vFqz|cPYZM3n0FBX@ zd>~f`!5GkuE6NpX)mjyN>9jIIXFJQ=cu#?SWr@ka)AkC#$s&Ea#r+TF0^9n%<9Knz zVd#bgUE5sOt`CyJNwa^jUdN|BH$x?G>P3Z!EdrX7MA`eA zQS$B(RTo^tuZGNi{oP0FGN%ihBG-=9gp_iI7rg5yokJl`m-Rc7M{?j&c9C;FyaBL! zzlnus)P52`@5eFGs#cT|Z92&Ry@l<8q3-EZFX9x-19=HcVg?>~G_P3@^I;sMAxr&3 zk<~yNqshi=L;N%ejN!zbBcW*{%p~Hlk!jrYeR$Bl!94 zGvKNyD8yeQqaXYv4?N(7cfHO_amdBn&%Z3ljmGN(_m(()OeHu1S~^@B9eue!yM^mH~k-miJRR z76$q9$Bxi4i8UMO&+;GGt{a~^O_f?pnWYM88|Ik#v)ou&4&b7ne@_j(Aa`N5qv(;+8 z4d*qp{`RY|NhBxm$TF#|qu;CYv`&<0F>8HJP?u}q)?aFD5ExF=f2Ne8Kmp>s|e&dnJf zn$HPS4dEeX6K=})B*wEZDRHGRRO;}(%hR%RJ&a*3qy`2hH&HQ~&&}5!@t$x&@e(@+ zm3jQ6(Znv&y--Qj@%nSqFV#~4;Y$u4Fo>VBLks~R#fH6wE#>hO8&$a-VM6WoZW6i^ zKH0&JwZHuw4NuhQtw#Xj8qBC#--y#|CugqX_Xz>I@lE zY$s@8JV`W}HBZJUUA&+r++mnKG;`e`yWlTI|EXU0zzb>|U?~o=*J)9UYui;U zAI{w9?-Z=u|EcGZo37x-pP+Wi?Vt3Me!w$o#?CM&oOyPUf_9I32{h^`7rC2 zTy~Mx9g3?xR3Cfnj2rGUyjTtq;J|-L7;~B|Ar2HD^DXBfki}KD$8P$&=)&U(s;B^3 zhS;7-?KX?CvmKe7y{R9yem^qgH$Xw@z*t>%~%^Si`cC85@HHqlEnp^=aQTwaS>#br7HK7?(|i= z-D)&$atZvLIB=hyS^93qjnR{16l;0%utdZ^%;H7fJ}&;mt|0ktTKcMk#2TWAZewjU zEm0%L~_-=SGet<3AgJ#yw>8AM2;?9=ybBOmysTLX(m@VxEYw_G? zt_Nk0w54bFPm*;}l=3sEO96jh!b?25!&)Biw62p#L3lDLA@jg=dL5#(Ykf20XX;1t z_w#4GA9X{^E-6SING71gg+^z+ep2#cA%JIP&32|P)1a{7g!iRwBPc9-}i3%@TU)% zOpIS%`PwRbJpXTns6~=Orpd`k);(BO}_9yOs9CRPc42 zO!B}(0cRnFYYB|>_Yu~NpZATO)ZAC1*-Wb_J$;3h`CEdy`i*6Ejh_8H8_xBxY)qIO z8xzP2-1g%1Qe#i|_kRtn3w_T=GB#PfmH>fM?2=m|2K>XQ+giv?Myuv?;?sNW}p8>|nZnokxFB?RLSjdR3LY##>Nt8K#bqxxv^g20Gcg5ueQ zMz@F=Ru+{bb1rEq@oiSv`Uz=2;=vR4ONyQ#iU_bH{JnnB{!N~}cE0ag3?sTfx@-;j zJnEWN+#)-V9*AI-THSgYh0m&+;@7l29GL1erq(Up{IbCUWxbg=<~kK?C2XmDUHY;Q z+U?s^==fD4624jnqXZ1wm^O&|xZqdodw~6lv%lQM$S+~bp_JtT>>#5ay_0;!U-CDw zNpr=44hIoy$EaWC_~sI3T5Z(0_ z)|*oYDnedvzN)GwF4@ECF`_u}SN7zMaTjK16aWk0rtIal5J!Lo(B0F1EwcN0X6&-ee65qHD(_3VIBGy4mG5%Mly6t2zfpNU@ekdoI>|G?px9Ng~$}?5a4w!Cz zE;?Gy(i=U4VrcV_|DbmoxBy~?jFybVJ1)i_n2WJ54tf0dt@Kzv-fK#2oh0*q=y2C| zmGXi)M&#IY-qQGGnL$jP>7a;26UZT|+o<@OUaFx^!34l`hh+aR>F)oD0{>rp4>Sr` zF+Ta5jGy73YPcpI6GcjpC5o8+Kg2Ce|0~@R7@}PHd*;6@eDiM~o%f_^@bwg21Tjy= z4r4qbwu$9R^K!UadepDXEvf8#Zu-19%JT-|)D=I45vK}$^BivgWVl7+h|CAQZ*0Ck zrt0*f+hN-cWz%ERzgo6KeEbW5MN#^=Tf|f#$3ccOQ_ta}3%FD1zor0(V2Ody7 zf5U<9r5rv%f<1t?b1$$8qBQ6cT0Zn=vSZ)7igM_gmr~x70$}b}an1(}R^P+z;MDkT z0L2vh)4R+ra!Jc*zK4p;@a|^dGeD`?l3ol)KCXc%2-Dm^ncr52tA+?@@C@0WW=VZ5 z<;za&Wt^JJTr4*=wQO71#EkJuuA(F)BeWhDWhXvh(`Mpj>+Lhma$2ZjH$|I{57I^f zfhMd33&1O=K^25X?fVslt*dy%Cn}`NU72Y6M81Nw1ZoxVRRAjh>RlK&X}H?SU=&Mb z{oM+Xo21r&Q>SfdP*Di4VroT4QF$W5j&yL)A$u zlWT6Jbef2(E*wfq(wt3pZml*+S@>Hmyj|B?4?Q{Wk zJt`tSXVt9&318QDZjOl?8k7z5%ayC|>6=u|B0RvQzug2(e#+|P(!QuqAHt29g{`mn zIBvz551MJHUr9@QclGuS-s=sm*H$H13D2?VxtPl}Qm$N8<^GgdTXAvoQ6QhkPqO>bFm`M)B)eoWb^Gpmc&RzPmj)m@! zU+E2fe|ZCF98`#rFoDi>G^G>HGCkhA>w#e(#4%*AD*Akusx2=>RP`hRE?Q4jNQob6 zm3ka$^V{{s7NxVPTi;{@447Q!2R}%}@k$bF*z5#{X+;x?gim(247|(!cx@SO>RW-N zEiE4Cs{qM|{=Mj$KfR;y)wzVio8VGD++=Zb4Pgfg+v*>&9la;i+}WmW>v&f`h-9I0o;f zn4z(MDN{c>+w;{dc;mvD)Xn$#PRz-5TlEL`yX5csqe6w#;BG;HA*>NDSbu)y56%!k zTs{1KRf0+heDno_eyB>p!8<)MlDD+KVQ(0}tyU%r>AMfwwprgH&~M;2@M`NCKiyj? z;OjSZ=%|n0b2!VLd{tOd`Dh!*)#W(Rvcc5ZtIA~GWGghC+irPq0dfIg zt|{L40nPRIB2=C_YUiNBD)=c3nN4#7vn*RK8@6M#>dMalsKI{0dI65&)A2Ys!|#Ds zlS`w;@zrCh%4ff9lQoECJ_kj2=T$mgV_**V6D2ns^^^2^5eDTj|m&MLSC3fo%eEbdeupuJcn5#s_BhRA{skq^{@&2to6OkFnETj)%3cO^RCon11N)ev^XwJ5<^5o^P2?omAK}U78 zMNIjt=y*MC{X{=;YxVk>r{$KHT63k zhy@@P&x}AX(3^jSbk~CP6It7`Nd4y7wXL>@#t53#)|Q@W}m$=>C`O`UrVuC zgu9cnV8!o=zsZDB&2Z$G0E@1Z9(J1$hz$M{#d@tTSEkbYD5*jn zBb{tfUvn>rXES93Oom*2n@53}i{=I_2B_EnVDD75#%$$KH_DG3^v)CAw3a61oL*qr1ZB5*C&UFV(TJB#8UF+#TtUg&)q>Q)vxgf~mJd^lwQ zbDCY4?y-v}es;vIaQ&=$UGx1%gxKNX7d6d-NZA`n1%i}c%gHFOld&SmGjPhp6bCFD z)(3ryAdbpR8Iz~bsui~#JC@8B$rx8|#|4hUBC?2FsZCroZME8FW;0@zbKh{m{@_mm zU|hbEbL*Rtx^Z+$$r@kQd$&FYT}!O#i@jg7@-sk`BnYDh4BYjh_#`Yawsw+;xwxxJ zHC1_3<%35Qjs)e7F6p}6o6n&WYxQjXGEXRZT;3AXjxGc{=Hu`3m(&1S=i9K6cG36R zKbq5WoRlVqu!|zLhcQRod~t6v6?|%MFDIq8kwxK8qpy0sEiWXaAtV1@YPP!o4_8!E zX=a1*aN^ufU5^g^D$gwWUFr(J=>ge${eAd6;i{em6OW3rK1t)+97bM$#_6HNm$}DP;YYLf74YErf>Z=34iS$!uw9gEZ4o{aR46e8eTTiQ17yW?kCMJDIDpx z`ps##quUjaW6mp2XdE7^t;pHT>Zl-?K(40?I0& zbQ1PIh`qe~D;Y1*pH($hv#u$ZSsTjC)YKHNFmRf?BFLj~_aN|TwkEeGPpiZ;V8J>< zsDOdB0O2XV2J^0TituWUn#QHOz}Y$0Gr940x00K^*5RbT?m?+1>&jP)Hw1wdf*%GP zugbp!$ijPmI+KK^xm;SpPf38>I1?>BwAyfdlRrCfDNyAUO3_E+AEs3YE!;Hr*3+}B zW35v1ZTo{l6>bDHBo;qTWj0S;N^v_%wuI+hnv+feCjkUrO#eV1d)a$CK-gtjqq8}8 zDVDk%A9iCcGLUmsc+@Ijd|c$n z{seV&9FiD$XHKy+66H?8D?5aLL%MnMGK4e(zkUQ9eJBlR+pLeE?~?*&fBI#eieJnn zK>l-qJpVACT)S~~FGDn+InLGg(bm!Vr|sW0BiSS-mp(eAe3QRC>&jlQTUG7_#AF)7 zY-c79sCL%0Yi&5t%d@)bfAm!A{ZD3mRrByV*qSwT-=W;48QwQwF8v~Ous$i5{XWF; zW#^0Q^BshucgeJzX5%DE;6KipG==`h?R@e5Gh+TXf_s)gc4d7BlG4KH}QHck)B`D)Uj!4n<>spR_DHR<1YDQQ8Dn< z_~yUK2n;Q~V#Nd#jPCN-7Y`v#l}G+`O+T7M29n2K7F@d;(m{6bxhGzc=?~)IJ-`Jz zBNhS(8kp7GY30_0crBWGSdb-;yY<~<-wHptRq(J@UyxJOAi4L$l8JXW@rEE`R;r!0 zn<@TcOqxlkzXm;(bs3}vDtb+jOb}rC9cRj8l<0sgK5i%gFusPh{zw=tLGCAv34dQg zKpXQroISKW$Nl7RgRbngREDd&&2qFriq#gQ*@1DHI^FZIAC{o6Q>CnGkA(+;F4)xk z{~KlRe;bYZzet^){SWPMc~C-O=^itKb5<=DwFvo=Y*F$OxNrvT?e7YbmkIp!oglQ4 zcrD;)@Hd$J7qjJPt;bety*%9#PrGz&?XwO}Kb4;p25R@UY$E)JIyK4^n4pI^&?yRh zxeJdcgA^oLSUuq$Pze)C)?pNBx2Jrd)$#eJ;OE=wYOe#LdR90w3F#L*F~6zY?hlE2 zG`6I1N57ep;HH#5awK<;>B0Po4pCe`6n+rg6%tS}$g4c94^x(4o_vsN(27$|RHmSK0NAfMXIp zf(N}G5rq@TB(>Gnz$h6>#Vpm~o-^ zt5a4Ez2!1$?8|xi;9DXCv&VqCrO;^(WN5*fz^j2w_W;43e zAd>Tk2?syuTt&oik>d?K3PN5^mrU0cs*G(rwf}tmL2h8fLW@7cIcjs$owr`(0#7Ug zude9dUdESiSP|1&tzKQv@D)+ov%V|c=XU$_hjJrtqf;su%Sg1jxV&;s*4aOKU^lM3 zT7|RD<4I!m|^VmZ7qTx`oi?k_xKz%x!tAECzOZq)vsubF5*4c9bz?*e*o%TVUJR8RvMi-%$-dw7^%xW z&CYf(i3=3FEMvSguxQS7;DR;k0lFhyWVGt->4Y|nPH(ww+_scr^4Jh+6=B`=%rO{U_oq2fTpGAfOgS=FN~+4}wq^M7T@ zeu2pliwXQy1X}#w*Z3zrB)Yl;+>~K15*}RYe)4~?_ugSmeQnw(3W|V$^iC8|P?`z| z0umcdL~Ia>5S2~@R6rsn5fG3rD4?LAQl&+@(jvWy2q-0#B%snI0Sz0HY|rxj&dfLG zeSb4&zB6;qnd|!I9|ITeowfFU)>==wpZorbi9!ZhxF3po{H(4kucGI})GvAj%!g)j zhbV#^rwzXkv)!+yeP8EkjIy|#MidS)@GBsmIu=*j z=Cb)1ul_iA>-VO(-81KQm!=)C3()kKpWol;;HXxXITT1(U^k@4t`)uAX2ogsywy~> zxYk0ocz$s+d+{h!6P`p?B9_D4_dtr%W-B@}9`{G|9eZ@DSv(KWX<+@PqnlTxP8C4WW{t7I9zS-bB`Er|I@D$q%DG*1_UDSW zQT>S73}DycDRtQ*A;x9Idr0SQiB{6-^F@=G!|k#omFIeP#`q`+ieBh2w>qe5klZL` zqV>zpJ+`Tp@2LCb=lbO}G1}j7-He*LaqocgpHJ}*raA?cGcVnIEuV(T955Olaqyn% z{Po%x&y~%Kq?D0sJ6nh%`?b7 zKEko}7b^yQR)Rf0Goauk+R=!|)|5eFqj%bm_4&_iUI11l$^a?{GPgESq$!(%h_)}Q z%+2wZNDq8Cb_QDL-P(Dpb3M?ENA6^n>My`63-+x0xR1mdINcv7;?(b1>N!wSTX*DD z9RJdx6p21-8~-%*HVtU3Cgo*I8V6GfE%VKm^qa$`6?HDO8uhadwQ=RwVOXR0RzPEv ze9`UYB4XYkv5OfSyP*hFjOswpHD;KX-LWEJKVKJLB!BG4u65Lhgmv5T_XGt+zv!EV zH*by+)FIH&x6O(jX=H%z&Vf*!X&K%>y&SrRQ-8MfY&SQp6KeaqGo|R;J+6n`I`h`k zvRta6_5rU7#-E~pydz&SY(7bN^W63|qwd|Nh%wF!ihz09z)e{MLFHFk-g;Zy-GUfa zZN^~F=E7&)>JQ>8d<3T1QqwO0c@<0pPrwg&{U(NbhWL~#ri|>R49o5~UG zxG(Cy!On-ToY>9HeIq&TQuq!-+6nFq)~i2$6Q$-iNBPKmr04`z=49xpj?L1?rTim| z!zSK)k_DvrKlDqRotQZoBT=ZfqdmawF3h*h9Mx`pA#RL}KL-$HIR`(!d1CKXqwp%; zX$tooHeJ#Y+wf)X17Wul(j}YJ*)~iR^e-;%=fh_GV%0ku*e575FEMPDW4=Z{`FYvR zT#{DwWd=#RxB{uxBr&C+_z(%mG~WRm*XeZ866-6~o|chPh`nDdg-SzRlr@pt`qD%jUG2$NC__7+Y*Jkq9nX*v-2y(&>f)_LHAQ8oXI;)x{0c^@g1@u ze8a!rU}?s@bF}x%@YX9HE7qMaM#nJI=@yI{_7fb>q6L*0XJquLir@U6Z-wJjTly9& z6OUS7>!Xx693#b8k!j_7I2GuQrUXl8cqxE=0H;_#RHpbY^1%XU+lO~@9k&f)e{-m> z$cKbN)>I2-G2wx{+M95w-f;1jf70!b=WHu{Jnev~ox=!H0Cls&Np>`DZxSM8OT*`1 zF-n)VE$1G3qDHuSblcvwp69*K2h6`6GHvFFkD%TJXtt+Wy22^Vy5_%7Lm!vzV8rZK zmuL7V*B6Vg$>eVq&#wg`-@`3Pz(7cIAWE{1K&izn9(KyLO1mm^mx|9Jr|wFScGSnz zbjv+fXTDOnYMqzrg1WJ6`N9D9VS!~8K7%96Z>1mhn$jM*(coI}h&j%GriHX^ch(sT zSGk4P&enVcXw3!ht0Aq4X%#tl0>Zaa&U(TuIF1Ddt z!s28%;`F`N?eR$gF=|!SPiH0rZr3md70PAOhCj=OAH6sbKU<0mj_$9#(kf?DrY!d> zz;bEa=F8lxs?^d_K2F$>bGtZzTx}j;n@GC^oSsygU8GHv)Gd6`HiM*&Xt{ zkX>^qTAq4q-W8adFY`Wt=X&5DTW;rn^0Y@2WLwianU0}C~QPHBel!Bp-C zd5QP)E@j$~s$4Ou8jW%z6F61uDXKe5R2Asan>?pFEOxVy1(=aTwl5m)4BepLUWk?7 zak>A1Ygn)8KGPs3@U3}drjte`W{T&Ca%H}F>LD5{-dRX9*;PT$MdW0gmetPKb0a%n z#D~8K=l%&&NL*3if!<_Yfa>Y3$JsBNR6J^>t-=~K{p1UL)(5mrFV#iQ0=(Q!zLu12 zDdq>yN3M358{i3uSj2WC;gA~x60LZN2AzB;t>ehV!v&jxiIN-mSmYsdll6;&jkxEJ zT*tEf9`{|Skruua?<}+5ghVcD9NwJk|8%%S{94AhN`}o#?pLu1007Sp_)$A@iZ#mG zPqh-kF1DpP3DN+S_v@mCOKRdZY2{Uwma5MVD5xksT1Jy=St5Rni;e7uNS9JRDl#So zxy;N@zcd_v&|jh!J1MDnAfzx&&z!4RR84?Cl#}*|;Rc!jISq$c(lnbo+NvHUkx zvHNq;KdN4abfAsZlf2fY*Bg+u!K25_uVbvTa%=`X($O}|xnM)F_k3!Fbg_cIBc=J> z0l!#+8A|MUq>Fij)o%`-Tp}Oq0O>Wz>nWR6uI+r+|HLYFeeL5)W0qgWrnQj53E8U$ z3f}{~$J{pkSoV=9;Z#+oN?zzv3i5bPWZpUW<9>9-8_>b~$p`eK|Fg#Y|Cc}iWd|?% zuZy_Fo}ovaQMngVuxXDMY*CM7oD6klXY}+8iv9y6xAezj?cg>swDj86@G6cw|CAYHJ%e zJIW9b7Kb>LPGiEnWapVu6yxbYh(W2{oPAR|-MXW^c>ax(k89(=F9}zs;ezviDIqsq zf9LP}C>+SkM9L4%jZ+e__$8N5$e$&szCXbxWwIaAMb4-UHSDD{x(V*W<}JO-SUfvq z=*`G%d(>-_9#ExK6<3vY!bx>gm;D;=LLSS6c~MNgu@GhU3;%i6DT?}SN8}ZzlCIWh zX0o`3dTTeQss76eJ}!TsF)=6Pwm0i_^zC+Rn=)Lq}O+deI1|Oy*DS|S{L`vXqq1t716}SQlJsugV^|%Id?Qm zCTDam$mL?!U{_jDK%Ij_aTi(ZO`^`WB&Agh#0kDI22XiF<|8`yk78`tm4?Q2=V`%q zLBs@<-!b4uKUbJ;bMORiO*?MqcEtk^MGvICy~#0;{)}eHv@%^;m)P&{lvIQutQq1{ zpMII{mbsS^R=9BK`5?LGsev*7hlG3frV+iu<=uBry*ug!rNe?-LGr-R2|qgX5&-vu zIN)R$OtM>!mdy?;LH>NMO7CQ3gJFdtoe@B{k4QINc4c~i+$Wu--(8V(hW4zkx-T(0 zr`gll*JIvSt~l?#=eNioN-i1Nn)}&fH|lYnAre67$AF4ta@ykO^-*!~IJ%~PX&o5E zCOb=qNOESR4x`Lz@WXnAn1kzq>pnbDJs*WH_ue|hb>J%pr$I$W*}@jq1KbF@0vQh8 zJQ);EN0#2v5in16@xmteeOM1F57|GBj~-e;Nel-*Jl2<5Z^1iJRq>AJ?rK%3qVeIj z3vZUH*#oFma2j%rupbgV0ni+^9GQ=A_9aqsgDye0htAzAXkLj<@lnn39CT@YJ++=_$mYQftA4(4^=XifFr4G zh@#iGXICe6AYvKzxV+rsuq-{QUWf7M=-bBFy(zYGV|LT(OErrtUJwX*XbH|14jpmFDeh*USUlIu@sIxtC|>)8knR^O|x;dqQ|)$xh~0>8I% zPIc4yRg=XL%9R2+^rB?Z{{BW1u{4ADVdGhEM8yY3wC{u5XZ4fCn`6bSez0Po{Ro!u zT1yJ9RUa8fbXgI2LxchX_Z9FzQ|b*UJatRb;`?=+=Z|ccivnMbzjY9Aanprn0Lo{U z(%EL03p6wqTg6c*rH5;Goh&C%{`QfZOBN6Ac4#gNZ9LbYuQajwxd zrq?U@s8VXRg{4@=7tewX#P?#RGQL^zry$9ckxcs$P21jiNrEAf>?K0Ts2FoN;X@^1 zqEamm?C03oqg%e?@P};|*ae0>bW}TXXMpckmTopvxs6}j%*oEBIz>~#+EY}2ze`B| zglxd>Wb}eLt$7l>|G*Y zyH;34NEs=55#^Dtm_>tQ7WOF?eO4!lccS)}O{Aq@%v&mQ&bC#W?i0DICU=5lgo)AP z)GaWH(yfGnVI=-p!wFux zVtd7&KvMV46FN&g+)n&H_B{HVbK)1aQ^*jW;>;4 z+o-cq#{2XxyL7aRs1=qr8)~@6zekm#)$iNKRbIID$k!sTzGB32**VrOtVB2z_P)Q}S@sWZb5OrpM{1ANyrhGgbPkSvGthN5`r}w+$EnJ!f+1 zO>#v)OMsUziiQ&H*>eQ5So5-T=j+aSVbYd*(ZNU0?1Tv{B z+fQ5z__|OrPalt~AKM*J<=|bIf7v|NT&wJ|!sCzMFQ5@%>5Tn4aH+LHd)Cq5wTVr2 zR^qs7pppB1C*EADG4CWe$$_930zju$&+^t(9W$xf){L7_9U8!>fth!Fo)NgH=Dm@XjMR_98am!BgySA#5BT^l|_&4Y?_)!!U9BxwRkYi9Zjnr#8T=niO>PY&q zmy3zqZw{>F;jE(fsn^1D!}){#mD4VPRwBOxVlLI@lPW*PYk!f;7d~a7cW#q@vZ5pf-`6|5<8dSCt&55qSTD97UlJK4} zmON;?*zZ#p^;&^PykkwOb}Ud&dio^X(G+d5ej`H}e>pO^MLfV~H+L z_k7j~)iSSoGpt?z)MkQgh2d@U_0E0#VA%Z3ceCfoeru{O58b0zyHT&vh_Ghn8KLTz z`=)9p@mlutV~b=1=_j%0dZ~%!?plXzvS6L6>f`$5Z=a?qaHCUWkS#p#35$v_ zPabd#W5rO$YlR+Gh`MrY}-vGvR1l3!ZvT9nQ^?Oj6z1KdyT0gm%V(HcFs z-mNncpJ$?Tt8bt8oK$uV#4Oe=1wWCkmjE466>NKL&(bT8Z~REhX#6$tn?sBE07puXOGq)7nVJAEz! zR11msFFB6<>U~?X+%(~|qPeFz(DcKZ2Zw(&b6nn*$f3iY3vmR~6~ck!ok+-8cpr^2 z+#of3$kSUJQ`ppHmuPPLu9dles6&SHrk*5&#^P!FQgn(huH8QVM&p={f1OfF6L5g2Y%f_v zo0z+-k+P82g^Gcnjwu#&P#C&Fgm$Ci47JpZRM-z@DjNm|hjrf4ekRF1dwnyOE5$Bt zoI72Wb5G23!y2W1-}a!W$VlWL6v+4r&=a|2JRGtg5vdl&X1pwMJo)fNzf0Knr~Ua| zUB48M5`MJAZZ@JE;BY6PE`?-MVMFy{zu%v|LC=x|B9ODUpAxvGZiiJuQWbkH=;K{S8*=`XCn^gwYv*; zN*`clXEE}UZ|Ux_+O|J^r68^LC=az?*cWEkO~XBIa)Rh8McRzld(So~JT^xIu^p^V2h%d&Sq zRq@K}CZg5K#wao;WcnwOv3NuiD9|>4%BG$7jj|^$71KGvBH@L(u&3H>Qaq=C;3AV5 z$DChMmUsLh-YdJF$2A~fa!K|^&zX&ZSsk|Lh2sbra04XqIw1_+*p23SW1cIV4=aBG0H6Q zMN{bh6iCL0C(a}IN^o-XS+YkqU8eX#Py9OanVL3ia0^Mw$9~v8dPU+uSi}1#@4EyB$Fb*qL>70Mu})#Cx|OfATp0g%Y$K^UT=YVn)Pv zW<`@n+?~Gn38P)@c(XsC`@e|U<~4|!R*-=zd_Hf6%;d*{llR=s^V~o21^6x_!Oic) zF6*9xfARCbn`q(xj)>u3{(TJ;^>#y+GwRn2PfY^}qj~AFmy%n2eAQlLx$>FP`G!dn+t}`BA6(u{il^k@aTVTzh|gERl?PrgJz%X@TiE7?&Qb%4Q(d zLck*6x(e(d5Q=UWoW9#2vX_tn1D5QJ$gkohekok$2S*E-<*A%+#14aRmLyW1%}ExZ1E9v*5gz94kWhQT^;exQ+F?9bNGlrHS!emv4LXbK+QL z?6>7l6wsEZ2D#E6nHb4JDC(qEt9|ehM$O>zo~j4L_1Kezd5v9tfsZfPU&@m-HsS4- zIQQ)8yQ?MPu`0!C|MKnrSNZubciaEBMQk?s!3N#N4l~lh18NIOHfeV0DNVw5pvp23 z^~Jxp^%lX9ZudmZhwDe=@{4z=S5hy&jgN>I-qOc`tC=US3P!;12&-bZi5Yr$5DP&1 zPLgS&?3Xw}>Tyn32_;ATfw+io{o|JmA%ET^auaE%ZvE!y+2nxJR0!X*VX1yt;OTFU zoJi;xuuqvJ7&Y*lW9KY@!~opiKnv^7F3jKgn?rSubJO+}F%B7*Er+Lk6O16&5?auZ zGUFYcKus8l!D-HuI`Z-t4tl6FWNd$8Jbm&V5{5Avv$hW`lizep?Y?dF6X=@xfn7Bp zKS#w0;we!e0g?K13tR01x(~_H%4W%F0YwTv8rWgDbP+5<&R-1f6Zg+@W4tyv+dkrH z{{3uO&E^%>t_l2VQxfEkg!J9vL> zf(-3>`wh`@|3ZU@v=}T1Bonw*03&FFGHtz`EDYVFgqi2c z@9&uBd#Ks-O*$FGC}jESe?0VcckNZCg^^iH*3B*Kyn+9I-2XYYvbu%ojZK0D+}Tk? zSF|*47`+R3l%@LRr!SXn>8~$Y&tG);K_H!nI~+kxMQ#Fwz$S6?N75BtN}{D^JEiuJ?oB(p9(rSsgsEdIAQ`~T%N zyQp~u0w+1Q`JDdV@9%CgPq21lmtLgYvHs*fVWXpVyf5nT@#%ZW{2o>4Pj%Oy1&+{& zRFLG(t}q4F$s2-^*)mNMbN0$HdBj*gbri@ZNxf;v=oXY<1r}w|^QT@f6M{k3N@PB&+AlFj>i7{2M^)u*Jxl?w~dT8;er$ky1 zUuZ_(PptR%r)8{O?a;E?10ubsquhF6H>>LT-^yJ7Qy%!gzD=kBFEI!GH;)(EM_k$f z)CKfQf8Ir~MYhAx&qLmM9%}9)UK-sp*+w6gM)PpKnMU_U{(B|-KZz~=VkI~UGA{r% z#O9C0ih?CF=*dBMAmoiiz4Wc_`Kz*VtHb>#(w9X}6ue*SmUVKC-N(4RC-9)uf-wi) zUKF*8VyfByxj4HzdTE@3CSjV1;9}1@t0aE|^*bMj*TKcRT0?n1B=>$Bt@E|MDuWTq zx+!?av-zx_7FN15= z836BaMw3LQ-C5#fh9kQIfGkY?XzSGcu<3flE-&=}Uzu^MBG2_BjG~&A-C2&SW-p!$ zgwLuS-%j-Q_%}qbSQfy6qQV`-D#UUQt&{S{e{v6%KIXO7jF4(LG|j%IR99QI%TxM> zZnvMFuCR%c%1{TF$JvDJ)N=wz?|<{j7;=zPlJ( z-yWoI@0oVnioc>)%kimA?r4Nt5=N}h?MxbVhk1Nyzd0E0?7XT6KarAiy855fYc4pRz?PSO zFAfOc5pgg~J~EeQvSB-;r?)$no%C-Il&aD-VIFg)G!W;gSYI|^qC?D~fgIDkIUt8; zw9jf9x${H1&HDD0bACtd?Diy+gaZlPDyZ2!9O>T{nnc9lwzCuP9>*kL0WNy>GP!VW zprBRGnX)7=T>WL+mv_m(T)y1+k-_Pu#5@@$sxfsfURiQ7WgEEfzYZ4@gVI4dL;TNu zktFUvC?auCSLFTa@k@{=M1DBL`tEdbZC!0x3H9@`+VyJJC_8bx^#{jp%iJUdbi=D~f~)DBvCK&3}T7wc5j+AzG-)$;B_)Vt_?_&CNupdWqwMThL7+MRkW@) zcYc1YzN#v5|3eEtLm#ov30>`0=gkPUf3cL1|6ak0zb$A&7Xkvj&!WMMd@z0-z6DhG zcMdQQLB)(jfaa)WUSe9nLTOFtCEqupkGhzqqgAC=un|0@oK6HiQ0JL}Yn7{&d0jOn+Tt#RORR%2k=Jfj^!Xt^b{2ir)(r_;= z^W4(v77K4KtAq;e6|S&hvnM;crZ{)uCI8l-sae1hO`1V;k~vul^bwXw?KCRf-%1P{ zadzOBpb)ydM8;8Jcyqzv?k}FUCh2hGfni8-X-eE-XS=#NFeC)se1A+u#8*?Y43!K8{!w*hWrpIs!Q} z^|69&werF=bQEjLYyJa{CJv{~?HQ|~DY*&XEVyzTE~X4UnZXXKAsK@7pm9_KWHlXU zB^Zs_@Q?dkBQ$&W>5E&ESN!Vl97^;<_erp%W^U#50ow@MH6LjR8TyvyQJh}+YJ9ne zXEfv|(b_pcNw?V$*2aAy)6V%qs*RwkE)>Xk2_+S=u7D2O5N%i;!b~HDdfbO!CJJd; zIQtohdtTmKN_uD;d1Q{B>$yJxS!@rR;3);zCh(-Pk=K?DTAl9@#G{KWZ!2(r5O)Yr zuyB5!DLg}vL#mQ;C%k@u_FPXj+?*RkQzYt(7a!;w?Hj{3nBC~uwm@k zj&s>XDw>H$HcBOD6WRjX@u(pFkI8pmjyXahIkpyDzBiniQR3&FRpE~l&ZK)tK=?`_ zgKVoxdOIFcK`&VZ7Q%xn)*3#4@lNHDM%c z54!;GONR6aGs;V@FW^C>2)qk2Xdw#zBnXd@u)65RidqSIr&P`t)#k%o!ZNkVW9JXu zO1Z1UlwyJcRP!F3I^0P{0BH$qJ%a!+*IqpzhZn{g3}*O!rkNH`%M=flRGd;O%bQmA zcbC=GnMGHVSu(XuMcg>CMmY{7LkI~@TJ**=!gQ|;{}D^wR#LpaYlegEc&LEExC_uLNmF$_lGu=&pTnh&-eJs*c05*85|h#BN~Cj-YW z#8W064VsCx^O|EQz^V=~{NX~55c+W=|{LAvpVx&=^e>!Z@)=S2?2cQJ=U z$M!tuN`A|5y=sgtSjI3zY4FQ3^BZMCW&Do?4>;uPI)3-L zjgC_2cd>8TG)q-Sw@#R+lZhO|CO8J{z{x-tG}5j_i)bW!De-3o`h4{Jh@k>gf=6uY z!GhWs5)yY3<=OG*>XPEekjGz2vTomEDeV4M@BI<`La>uKss-~9n4qHBd>ydx^#XGz zFSj!-Lo9%NAgrh}oI_#ry{~&c=$|AwrZi~m1qkfH%V!sw}K)E4&TEC9e4AIaz!5 z&5KPEPlGP-Kz$uDOW2p;n|@N|Dnh_eFQKyFSw@H|a^`#V4dA@FS%2_$nCu+^p?LY6S@#Ox|H%lsc&zGgU5{!HHl~B!b^EU@@Us=MOj5hGxZ{vET zXP47)Flx0cxrKUYsj%hf>9UI_W=z-f^{l*G;{!~Gi%=HpgrPs2nlRiA(zH0GY z+B^d;_Q#Eo+?Q9Ff-D_&+0XIQZ+vAu=#!45)9o|0O_5V1hNyGOMb*MQW95_=?%X;f z@WhC|dOF}th+1ollsFgHEWbNAM|ombS>{cb$*e=QM;U|;G^D*bVpsb&lhA*38D;DC zrQswab1g!UQQedB6h`Q{%y;;KXPC1Iix4T<`118-3^+clASUx7^r#&HCf9+F9>xpe zR2Q=lgFpKPu^H?egMB^)*a5}hgmN{DKO~d@AJ>k*qr+;)M#KD<0o>hp1}zt2N>6V? z#wgm+XCDM0g|7f3!iaAMiD-ZyLLlBFVa2WLa32apS|cj1Lxy8*X?#o?8i1_Ccrxe!L=rX0Z~7 ztR}KV2rwVdG#XOKURI(pUDiExSX@P^ z)-+PV&QW!9_W$JZ_@7RtU?w<-h#c@Iq$u7UA<9Cs(+piDTFD5nGqT*t zE-J$lnu)tE&(y)$gJhj@_N<9+A41-e^;CB_Nc_^_k!OM=C}Ip!olIn8GP zFxs)=-~l5Y_G==gf=ENHAn?t)IFXP`bnX^J7-Ea|qMf00A=YSiDX8gP(d2{vv2CQU zZL$4IXG#dd>?{=at9!iio}wg@0}QH@z#@`D_#u0oCYCTgvNXm#=|!f+nO~d9Tv=8> z)k>;w*ww17dw;iWe7aEA>02EMyPmq7Qs`8_17yi0nP7-kAPy+NyvQ#DFsGTPr(eYI zXL?O398B#uIC5Ah@gRzn4hzh+li#Dqh$f#pR(4IW9EXsVDF@GXir4Z^IT`u>A_$)Q z7Fx);`R(tqIwihB;~3p6d158)TMNkxr~#!_) z`L-~TU>kEnQl0}FmB0;|6POF^zP>$}OgGd8(DyYfEC zJ4eQrj-ES;?iOUpt^elOmrfIbdtiW&$(8uU_C3D^-EGQ}P(YFtXTV%58E4sXMj|YC zdS{Cq=d{gpLTAwgq-9q>q;#k1)GgTrS>aCEGQ-AuzzEA+~@fNe4_;e?M<_ zPtANyY}MR@ge6(09KF2X9-eIAnNgRS)(rdU`@l#}!=HVpgM6X-Fn`&#x)|4_o88T% zRz*W;j)l3u3vpF9g209m5e(Rae3Ncp0a|pc>?)iZW=gpsFiX{H`@*TygW8PSW{G@( ziP%Y0Se>4Ct@96c{Q2sQNwDi21S3!Tvtqz{9-Eq-!FN2(U|wo;tEA0FdrRUyFhR+P z`kLCa!n=g?J!4a21kBu261PAJV0vW`o9T(`$flvtf2!N!M6Z zs^pPIDc7EB_{zz%D@rA$GF|aXDQC@jtAa0H%-QTA%<{oIUW5Cv*ts{14g(fg-d|uq z5;5L5{SZv8nYX{##n;qqL3sW}xysmn1EpQ6Cg#|j80*oVwJmJE6Ja4n=nzaYQmLW&MiKVzuuLLJ2?rN``SQ3&-geK)o|94yAB68AKKha# z!8=-+E^teBMN~cW7Ot0AO>9RC0ZL}SyuN8~&yW+vIzJ)_rUe~7n%*7HRjwCZH}!CS zn>KG-c=E*?|3y5d>AgL^`8tu3S(p7_yLJ+E?#Fb(Gq*i=NQn;=<->ZPl#|2eJAZy- zp1(3zgRV4fv*;HVb=23~xv=8z!VDLyc-&oY=nzqHy^}%%b+0@)RF{kgwbSS zR>dSr%)3_0n3*3sQ8?DO_xaCTU(%+U>9QI=~Ywi|J>~bRIKAvX1at~Qi z_L80hj$-MiE$~2krN@yV-*_J*a?#xSyteoPZK8a`W$gGfF&U8+PMyJbnGe4BS`EF-ebLy)@ z+Ym@&rfz^eYg-=_L+7OGvV>7H>21D|K|fwnvv||2fAaXH zyFB-7cWFJ7y?PI?jVL!|3HdUfu?vaL#7J~iK@8HTKZ)e_lFr#;ulu0v#&W}jpij+5 z3S7m8+NFZS+l6uuW=&yRtv3X&aQ@DGl1&R|H$NfqT$4q7HeBiH+!s z*&D8&Mz@lyZmi7Z(FL ztlF0;g5nFCAvGk_gTXJFnU?QvtzL=qloEE#o^a#X{KQQMrNnIq*$)8`7ZK8(rOL;E z-?y@3h@ROGoYV&VlXltKF2ej!WRV8J`E@JS4tKu1ReT!dyoEcX@VnV}lO%qSwKbw& z$1>mBD<|eur?m%^8j)BImTeE?o}{7GH$%GXF~PC$pAhvmzFdcCJ+0&#vVo+TPM zZHTNX08I~3n_p5tR#VlDm1)y9lW--d^D|id#G2T{pp8$8%+*v1BQ|KI>GyR z5f*}8OErx$(qbKZHZdo!F?gf8^zii~Pt{f^7Efg3pNS_L>-CFnLC=`BTkT}=LI%^I zu}SB8hHgX^hJBlz&JpKrH2K3#QBP`2ssl@ynSpsWm}0o$Y~VCU)FrV*a~Nan7flK* zqd}JYYcD zjX0K_qwwhq=@#Xf>!|6ojr~4-M`xhZCwlRf&*)CpAPl8X%#Gk_#{FZkBiGA&Slngr z=Z0UK-r4=;KxiASgnZ)eMAA+Z02yQn&3!qL-Vg5}GjBmP=m)ri&_4BFXaQ{58q)Vm z2=dMz4-&1?py5HfO^R<|%5is(DU;RD+4G6SWJ1*2Klzt-csC$y&|C|RqlzL(@Ofr# zd;ZeeEtuV;wb1m1ef!ftG5Y@buoSXq z++%-pRCzDssj{`7a|W}Q2BQy8uwU8cUpZ}U()Z4wE*>=o;J7ptEvbzNI`t#bG!!`& zO|$+9R!-b}(?0CQ@m79n#56{7xXZybPnon0v>|pllE?0jG5k9-*Ax3Q0U3h@-H-7Q z%4SL#)1x~Pf(Yt*JKwVK<{Z`p@OXT?K2=z&a@1eNEUGFpXbsHE_wJCJk zK)Yz10`aLB{@Ua7+-pL>IKHwI@!o*yI34KT6Y$OMM9M2zFo_!aCF)*?DsAn3pP$^f zAI}S#=zIIV79NbZ!NjX_C4YUJ8h=Z{1hE-rxa&bqC1IFA;&)d=C~djJdKV}*D)VzHQGx{ zESAZfGzi=@n6N8BC5YzXHr(UC;)|Tf{8&u}3Jl>nzS)^b$;svhX{D8MCe(wUr6g-Oy(0`*u+)Ph! ze6>oRCXyBb?16R}0qFs$4%4N`8LNBJvrCgSUCR-59ir?aPNn|Af^N$YR@_E>T5qyh zphH)vLh6oTf^=t%)lwp;1!%&&h-o~jpHi@-KHUgd0Y|98Xd%}5fvZEiX~S{a7U~Vj z?51J9`>P~OfP$)s7GVXoZOg2rzP)BkzbtMHO*?0y8G)}!%g{!Pu+Bnw@$?xBRpZM? z>=TRgA5@Em1)eD!Uh9IgD+D9gFyJN zaQ6jrhZ$a@TFec0{OGxxn<2T25c;lxtr4(?P}Fy{6p!!gIc;=j#u?CW~uFa#kuHV#9w?4`iu> zhrbNQp=+d#n?i6k@X=2(&NS5y0eqqWT~=O$cB|e$R^~O;<7?WdUgd6?F4_sTb6-ur zpMJgP^7VOU9+(pXU5#A!1jiycr@|kD3QsyqWc_`1#gS54T-%gU72HgZjt^j;(fM@4 ze}gW^v@?3|X7Ql*<&L4Q+u8!Ibm|~M~@2U8XD#apc}xvoOB0(WbJ~= zMo9N>d)_Hm+ZE?AE}l@Xp}{fLXq5@^vT}z07Gv94am+U!Vun-Sxdi zE%h=;*f)LEXti6cloEb;vSEXEbON(^A4H_-{m|Z#B|c^_3lyotQ=m?m4_NNDlb--i zmJTEhNP&M}BCqbb7c8%}rNt4`8uUdh!aw);yhT<(F+lesNhjpepn-ifPG``OFFgB}%ckkjS*fF*gjK_x4%qI8<<^lzJpDbgFe~pE!~K$MOra>`Mdi5HA0&osYZ5 z)ag43X|{=1SPfJ>s_=#2Hx#3Yolf-ih4%Hc#N0u{gSFtOGWBz|bjUV3-lFym6h+BBBwJmwZR9w8?y6zVX}g#t=lLOiRsMC!62Cp0W{dcf zd-ujuijX@SglM4o>bkmf^DV4I$C0W1iF88?=R$Vn(!+`4yH`IPnX==5M zG~W;NkeO~cGQL_OmSz452DOsPy|eEvk>*w5p+^|A=-T1!FSSz+ck|{Rp-F!5;`C9P z)oaIh7d_i{+K5 zrj)mC-7$0G*|P(MoI2J2_^8F;5QHGh0L=I82p}RN0dF!12sFk1%8s8>8RCe0PttBu zcr&Dp<~?2ZA!_(bPQzM3{4VFGV`sXY-1zsK#<9791-JE&0$wiQ^=vZ&*m>kwh&H zQgL7Er#7M)Zl7Nc8XaUQ()o#TESY1iB^N9MF})=1GTt^dySoh%h6rY5-H zEjphox{AyXNNzQkLc082UFJ_=9?wgrSra1>G!&B53iILxV~h^KAM`srvd8+VHo5&& zB)1*LCc`MTKITo#s^wYD@c`Z8Jlnp=90jbrnXaIFkD*5id>Pd}u( z(oO(m2+f4CBy+kIOPJhTlXVn|){Rm3Cfv}xYCdDRXW3`!Zg^u~;m*pux`>8nM>o#h zKGx4zfa;mfAtLO|=r-c$5Vg9t9W86;WG9o&ZxtvP_O|@CF<=)~GB(eV+~0P8mCFb7 zgI9%f<0>5lk7BbhpC{d~1%>A$x@C{5w#y6CzZY?i9~Khu@B z`*x~dIA!}O!N+hIzL}Ruc`CmTEYmBvb|kH+>44WmO!lq@bnyf>vmI6QW3`pR%uPJR zb-Oz%`C6>f&aeEdPi1!=B#e>%k-UP?K^R|SOo5xF!QBY?8_w)3P_N<3P9*bcYFpfO z|Lm`BFLTVPAH_88nKX~AwwVIze^XGMh^Llwv3O>Jm} zs+o{oA;A&}TBCM?bNe)U7t~MfzhB~y-tL)Rq%6U086{(Z{l>4fr~eV+X!2nbKlBUj z^W3fIN{y#pLY_D03ajag}#@^buk)r1Mg$HZbC;UE- ztl^pB0DjLq1N`8dAr3^+uIW4GU6I^eo))g5H6!I=>LhAXq z+jIH*<&Wok^ytCez+`6K;T^Sr`e)c^JH(`C!n`1_yG@{?>Jxk@Bp_?Yb=tRQ-8bt5 zVlZz`cq$E47Mpd8)!jgaCXaVGHgpD9&1L*wn@2hSy;3s&6w&?v`bpRg!fstihT#s0 z%^*mM)0kdFbc5h4GNvx3_WYU*W{3P;aZ$JPs}(P8Kfjr1+ZjJX6#xkgZbQH`(jV@h zB+TNVX|@sKr1M`El)c8kf=rJ)o?JOylRW0EUlQZTzyv0Xe6St#ys{sCaE~4bVqjUU zA8Xo%prt{V&eBn%KR_qXvVoZf-1~p5Y}Iyw%8RRi25T9wm}tE9&}N1M41F@fFD zGte~Se{6>$V`+R1XoN!D^RLSO!Atqx;u_%ic9YQ`_e&JdENLrekpL$IRD1{hv)wYzy78RylwpChwr{k$9$!Iw$~Y@O*wS0jv7jaqm{CB3v6X)+fMnN??r)_Z%o~ zx;pq@3l+Mb43Kahj597BRHgM7`0 z3qC7xSw7A)p~n((dd<`vy<)4W*6NSeKzm_AS^GrLvNThemSES#d6AABSJ6C{$M>>v zU4!d=vE74`P@=#o3XHJn)i6ESfJC(S;OCg^f<^ve%lB(#71WP~@UeLOB8O)4p&G3wU6l9lI!0 zim`eL0enxv?;2AgZuzboj5!tt3v(m1@`m>b2ty@4BZDcQ-8Bx}*X}Bnmfov}E})jj z8TFZT7`f(YN)9XJ#QoQf-E=lDNjy33+C@n+-T{Vxu{Bq0rzJ)gn3YlOU6S>E%X%CI zg)m$dzzn%5+eZ_#a$yj-0XHSIZ|*Wk%pV#NRrGR$$}{4S?(VA?a~$jMm1u9y6R>@` z4}6#?BV;eV8#MBWUl(X>9=WIY=d8(QDkJFJ9*9hYn47Mt`X}H$m^o;3dpbt8{2WrJ z4oMAULy<$uyqc8p$NW}PHZZV!t9h>lKX^Cz9BsUDbF|~9uGcRD&%(7^u_O8jBO{o~ zGJFrg0XbEFp360s^QoI6ZzwEKrYM*~8e4KNGvEo(L^wX? zoSnvp}p z$6b(6-55ZWn?wby;F0LB_~FsPeSgfHEwf={&&HT3{rGORKvgqcSQ*gO)x}$y^~|Ib zs!RZ+%KPN{e~VYicdy^6DLe@_q=Yj$8XLX%d@p@@d3n4+P3>?@aj@Ig{==43SRT&W z1)8tr)hH?<%Wbtcd3)Pt@4baZ?%?{}>6|Ye?-#<@EZ>u0z>IeJ-tYOJ;Q3*ECDu$i zEV9H43jxzcV^$S)sa_^(aY{5mRILK}B@Zz#9e+zz*r;mt(TRnXe8}M6^Jk_gu zZ)j@T>O9?KFjup)v9Zw_MiFMKekOfE zGpWpHVKWDECRL~HPBd<}k!eS#EVpTF$&{UI_4e|u?*mf4X@jrsKiT-0(tRGK6~v&= z1VMV$+G&4q_jX3}IF$Eq{CY~r3i@B_j zCbdZW{J@(st&e*er6v{vwbSx>Enc=|sx7V#UR&OV{SbeKT>jRRH35JS9n9oE*QQl{rK4>~NS9P$>yfCT8D{tO3_|VM z^zs&oo!D+bPVh_&@-cC@r`?If;gwEZ7ex(vZTv=4JSr*H)Gd+Yyc_^W=GMn$&6>|R zDfDU!Po}O>bpLT1rLn$d68EO*ZQjWMo|R1%bU?a`;nZFqc1^jeo`=$TN14ACh08%AHe**YluPYx-wT%dwx=JaH!L0gTfr)1? z3od2tw{-9GU6w<-+ny0(iFRUYaMe17;vR?d`{m;MT_NwH&Zq(3DyZq0aqZeelSfhTuWcc#t=P3mcwexw=Q5 zH1zvX)ai#5A%8&u4+s($F;jf+cp13a1SgSKRX)z1Uxh-hsTXDKrr1CrC;ik&6X7{8 zy^V9WkZ^)IV~{SJ-q^T^tGTf}G`G5q=mj9cW7X73b; z84#KrRE!_97Ld=d9yO>-c+S$s2NTV>@y?RVFy;hPKq2f`njhKhm5>B-Go$CdTSAfU z+|f3Z@Y}7nl{6y)_HWAr#_VqcS$xRbT!xN@!((k7G zDc*VEo<#U^Gy60x9ft*ktL&ERPJ1P{-z@9Stw|~2mVPEVq(!fFZ~*RzG?sgOg49v& zi!dI6cZ!HHE&3w*aKcb9kF~fC#ywlOB+o-7Y*?Z_=@|5o?&&^+u`;?2d9e2THad|V zv0BDtyWhHr=o)`Kgg<4`z*oH6J!Xy|H%iUq4Ci|_c>bXgC!_E^4xTfk20j)B@;S1$ z&TbD&(#<(Rp0$m;e*1MpXk!sBz>s?fvjO#xDX3Bh8Ah~G%7Z_5BKS?se6OG88j(v%T3aqp1#Z&b?G$%K;H4nAH0C4>0 z1X=2C(pp-NPX!AA_!54g2LN@Yv#_b}M1F}606>bN8-)f)EgOuHg30f13jDub2kx_$ zJ($)&2U3Z^z#^EeSU!FZ0L(%El@A3qTUuz0^M@@_F3!>CVo(T^+~d}=jnqt2?U{q% zxDY*x1?vn>{jJ(qWOuA7rT}z7^A^BepLU|&8D$d%Ca{Vn?_$4MNHs?a5)(dcTF-J9 zdwIuw1Iv3R`FN;je3&AS=1AsR3QM1-td9_2HMz25PVcXpr6094PO~o%*f~O^_tVNg zg`~#xE6FlZ9h+3`V~Rcb8C-cPV16Pa3UbI@waUh$dOiFUcxBF>mM*$S6-MJ0$YGAo z7xOgRq;)Sw--UbB3*&kF)iWZS8u7tv=I99`%VzEkdtrMuaplvmhn2(e$Lr_c{~3Ha z$RR03uZkYXX=to9`46^DPFg#c>v9~5D}KUJn(3$rzBkYs{T8PvmJpJt7&L~O!s@Hy?B^zMN;bMHE? z5@{dO%dVw-AJem zJ5;Q@u~7f27OVG^3=O#T?EpqkobYhEy1BA4Dt&r@1nCrNt2SZ6jk8tXYObwOIr)_- z1r%P?&Mm69j!dU*T|=8*mUjs)g3CmdzxJ}NJ3@9*-_DxSIIYAmd~~!88{08{mn1$K z3=U;azms5hUA>MukMov~6p+F!=+ll%ZB`Q6V?zhxsl#&0(L_pZbh?{OzmPHZ(ev#+$QNgfP`fylF%L4kBtw(J zynp(X=OzRg%pY0f|C_+^U2k5bChbGGzz+;>*dHr)GYkM!gmJw8zj+_D`!`7)u1dFnsw6GW?9Y1j$u?-x5#tAYlY>fIX7H9IQm0Pt zZ2>3)4O!G@+4Q;4^$*Jiy`8~xp!N3boAu9I2_(Y(7oeaPMBIouVnkXBCIGy6T?$K~ zTz$Ye$Zs=AuI99l=Xc;^xEhyz$Mfmo%?SABZ==rKKxQDp92uXr?v;6h8DsHnq1C^M zVZE%{=NSNSKOIm}tuo;thh*T{G0J!BW+7OQo>Spr?Ki7J=r8ld%+mzGbe!c>$HDTh zBv=s+OIn)=z+{~*D^*}=&el9E%jOu_Rl@?}jYVc+Ngvd;^T&dEO^l8FS-UfF2n-YO z4QXNAO4Iosbn7-3{Eb%|Qc^pO=yI#Y*<(-hh$oi)B{pCHzeh)BYh$AwyIf;ipuzX5 zY}yu5_5OY()*4hNa`@nUQ1Wt6^3-1vdNi!r3L#HcTAiu)D1x7DEG(qyZZMpAMlNc_ zGGB3Qlm#~_QV|aqeyy$4Ny+h4=M|&+N&U_=~Qbwk+doYJh?1{QNwQ3!)K) z+}XjR>-!K{x!lnVYd9M&YVpkmrRv#v!}Ynx$xd!jALkYt;Mk3^56?zb34br zg{8x;2YAmuM|qIt0ZMSiyD3nyv9X{AwD0L}UgC&=Utc1-uD?p(!6QZ?#Lz&b4>SzE z-gXiJllI!m7rlJHw>;a~beb#|4yk``M%LuDX|LPsO1XP>T_pl#mzxb&RtfWu>&`av z0;DCt5VD}~xRVX38rf6E1AN(`wO*Jrbk21gZ5t>z9z@7xL~M76P-Zu|RK?|yS*!>sa(q<} zY$mXCagq<7_bUOu`%+5^n(ueZY&_iDgijElP^F^W?SApDuV~zQWs(E{gfMCaP2?IZ zGyHt8El%D5z{l6FcA(K>?_wuqxOw_h5jr25rgIC3{#H;>P+tCo3Pl}(SXo(NXIXmm zA}yZwqE2)i>zTGa;CnZ-+yg^WY>9@ZPCr{CY;?13b~Pv{w?f^x$$F6q8 z>?`X}OSf%)Nlk}zlzjp1EqmG{QzPMz`Q@ai-`LlL%I*L}DR%5Of2@uC!a{^wdY$LMTIsb^hGVf)vIqZ3|zQ|Pwh&VRKwzKQo{i1Vj`?uV^ zB}(41!`b|9bD`|c|D1{lVNdI3^@{J*O*vpLJ3eXqagD2gQ={mLg?6mg7|i|v09MrI zM(`geQDDIK6k!LrItb1Wi~^q6K>V`}9YLagt9?k#QS*NGa;z)>)F@bOVj*|%35Y4K z4Nn4JE|6Cc=@Ey!TqMl|LRwm&7@I9QS?XUd*&Kw zfak_h4c8S_;CI;;A!vPXFZ>e?B7x}z^mU6($+wvgnFIi!mgv5Tm7-NE$Z+~Nrd*4_ zJM9-P(8w;m%ZFzyL`xlL_|2?#8dm80#NAsh9^UG6DCcw71-aUfYq&6-c=b)HO_>U4 z?9xFDR%}z%k|yzxlzA=850E&EbWesz@2V-zF3g_S&z|QsoaJ3K7~GRI1po_hNhBCg zKN;@MM^j-XJS?C5=ezn#;DB-!INr8vZPaiel5$neSaCK%EZYA(Jiy)?vgWU-B%X33 z935iLd|5&h{-6N^p+mXW*`RSvPvzIAYe}<^i&n@I7=ymT8RW$hVq$gg=bzolmaViS z7i&+sMx`k49XA=I!c)hs-66lN1(x?fo2<6b;@d{8=dTGoK;_w`_w~kb-hS-ZJAU_i zeUWT(Q?Wi;oN941&&i>^3fhT-^Xb{kX`v=A@4!4)xhb=6M9XUvw6ik=?u39H^JSMHFd^{lC@M^mc6Rt_O2Os6{X$*oNJh0>g zq+b8J^9IZ%y$%y4HhI$$hZiIXQ?+NGB~he|XU&oq&&P#H?TFj#rmF5o1)rrDvK+!S ziHayDmwxp9kXy1p#6gpyu(-M5i~^2Q_82?*h&4!I~mt6I@xQZ4}+zgfPRw0wT@j6UG-yW%2_vXkNR@;hM-$ZrwY7( z^n4Vsz%yv9`knn3o=luYg!T>a3}$nLSlw=#w(k zG%z2nTzPG?9DvmjC3&TFyxo$NGWKqxl>%~i{uQk&tz4jBzryG7M5EooO59WsSa^s< zTdimBMnsYhXA5xvQsgEYE$l3Yah$IURwOMcvlEY>lH6vktGhbeOp{xiZq{Ib8~xc6 zUK!k*GKHz)aw>iLr6}q&;nDj=5X!VOByTO(%rtDG21t_gBLXv?`On@=(#=pZobFWE zgf;cWLA-@`Ie6PKOWE^4ArMmE$T8>TB|QtOwulS};^3Abo>B|GzsNny%0Y3rfRFez z?vA419h$xkb!8v&h-u6qLo%mvv780NPq0SZ`t8lgfFBRfA_b?ZmM7r$rw$vxPt0Dn zO**WpVwV&vvoF^AT*GPoE>0Jtz_Toq;0RYdhB?!=m9p>I_1BYj4Vz}G+(X!etV`Ex6Iv%@oeo!#bY^Q6!K0~vjx-gnLA-Y%?EN-Rt?gVXM)%(o!eWZKneXv#1PA8E4nDE=4r$WXOk*%5amX|c!<#ewp$(xbJit*o zfBU~suQbpZ1kFHITS|7s;r*5W3~RQowY%kQQLb|9$;tY@=`5q0l5}k?sg)MfX=}D& z*prJdXaNcV*FsR&<7uIe4OqTHrDY=!geypFqxRc1JpkOpFJY8s8GGfOvI?t8{0d&aejUt zfsn1&k9(XPWKkfctlEKR_VLdrBO@ad6W??PX5R4&sA>DbOqXg$p&Un!8%hlq>h~Ni z(F|-&bQ;|&5)+Zfr`zwG95>UwM}-`UlJdN~w~u!Vj@f1tET_HFHZ9S_LGDvk`pBT? zUQp>v?S|^3eh*2H<908*CqYE zd!AyRwpF5ooC=Q58{QWzrceUh^d^;dVAfC@Rj8*7 z#W1a(zC}OlQN<#FTY)@MD#7$kBi|zWNI1{<_<_qgWr?DP-wSBRZOyyWj6giS_TAmX zuC+qvQV$F)F_r;dFfvS5!N@3o+vED1JG`rmOR~?b@nEult?iPqZ`AeOWY(GakjLdD zyV;{v+?$K06s-z+p(zu3mmYX*OiO_DV+mdbJ&C#mDZ-@M_gSfeNdGP%_0wHksM${s z|GpM#Sh#7ea9w1j=@7`)akxFu`ixm>1!+?>wq}Y;W0csKT*{5Q`S z3jxvjQ;d*&;HL$+jI{Ljs~R`+Ca5&OJ~v&tou^ynrTn+m6uGmbH_lrS45<#`NT$`} zf%;~X5)c2;glQUm%Y9{ZkbVCOy94g&oWdkas9A-FKf8gKSmue~Sp9uYa4m8Qt*xMD zbso(Y-}#3eUn(`ge?(qd0gtlrz{9$TgTuoM{?B|{$HCUhU;pk9Uy_O0S;Bm+irU)5 zXUu$5$-JSSjA_Z@;vXQMl*hMxLpzHD%@OD1(`CrdYX=tO_VTwt9QwfqPQaIO-)we+ zX>ISv+Gtio$Lb8HXi_q6R?yHtA}>LWCydk_bqzNzWZW} zcX+or3yiMAe$l+5O!rTnYMUmqM0TKQvM_JJO*AhrcDEU4U;C@YH^vI$PoT2OZrLm5 zJD-To=>b%<2dCH4BF-=OhVznMTnO6oBkJ`-S67o#^6-_Fd@g1`l#s4Q7(yQJS=%Lo zj>_kw$vT(Zwek$<#-C ztp6li{p;E$y07qiD731iLa)I#|nV5`j$NM6M^9dV2Zp&Jqp^p$j(x{&8kyFjI z09lF(uhsO>x$e&_D?mde%8*|}Ko(Bck31>TuV=NhjgU=`b78&1LLGLEw|MIF$K|xp z_xs$fTz!63L|Vc5V4iugHVYJ?w>Sv88xKt_&TdKMVKqpbkL;;o`O*%3L3`QEtqKo( z0bfdTlpyG{PT4zDV=-r((?m}YEsH3wL+0hH?`D7A!1=LWk|qbkZ+h`e370kEGgB2 z=9DHLKVl+3pACq5kvhXapO?P<*!VFn#Qa#F(IOGeV5dVTh<&aa4)>1MU=20@!R2g+ z@6BOV-3?_0!%uLz^dgw&<+yWV;h=#1Pqj8xbRar+2p1|pWv{e)tXhBIDM~#(b(S;x zByx&P-ErOJB=NYf!EtYaeHE`@_gCq5=>}A1=ZUnn063S7IFDTb7mZgJZ05y3CWo#qu3 zhSrORhwpMV$*x+I)&IU+Uz~TuMNo{|O4dz!FL$)ICiI3__l@yemjtHp0vV=0K9a@n zx^{MKLtAwt?RWy8HsAj%ORX!Mam))DHmiwztll@2T{wtjw60p5B?ermlJ&Q<~WU|v*j6v2xXX$b-|z!!CJ`5bcQtN$mJOPpXfdU}&g z{vmS#Vx94CGFF53&F&mt0IA_O0VgB~T6qJTvBbpHg(t9{xY&07K{3fYT5(@vK?A^G zN3X`|rT9BaSxZbYafONM{Q2>9mA9MAtz^Nk&uNJ}&_}juATu@%F$>H_^KF~BPX~&M ze%#o!S#vs*44v@>S>@%w#*H|&hjzbU=F61648_cU&K2}A?q9p$!7_)j04)K2Gxr~d zTG7f1Q~78k+(ffcG44de#`G6%+{#wZ20je`K`u*uN!`*udtIhK7b}oist%xX=F*i#O>C8WIw{OOg`E zLGUeiWG4@-Qf$g|ditbrLXM|}gow9yN)I*gSF}5r@j!0!&nEu0g+yW(>da10zp@t> z)x5G)s$8ust27ro%HaLP@6vEK0cEX!gZj)c&ny8JC8a*?=PW&wHpflM&_`_jkKEGE zxBrw83|N&1&Wy$u79EO}jak{@R1~e<1DwWz)Ub)C;En%kZy((}!fPh-f-7YYD)I30 z$V!I?+xPy58^3uhtNW3%TyT9Q8FP`iAKC;}SH$n*25I7&pi172%bhdC>_w&F&~cje z$q~Qrw;4DvfqxK)mH2}9!nv1Ye_6koua5bjRdZMtQX2b~`SX2Shv@#-3=n6xmI`k| zK@8ee)%_Ho?>duM*Xc%4xs6Rsyw%Y;;M4=1l3d85B0gW*kX5|f_rUCtLzfvn+9x>NKnIxyau9?{ncNoBKun1-q061Iwsl=ltrmaa4A&lJ}T=IyJ*B8 zgb{+w{6){z6`XoCuz7xFM*myf-d7$g{!%t$7v1LYoQqF{B>!j#Dd+AsqhnrB5c;xXT_uoRNCeGLB73sy>0&?SUo)wzGVw=Rr=xyRRls31Gql<(E>^iNmQSKK2+S~pu z{2Lb2`yXXnrF)KKAvxpL zoeifkR|OQ5$I^< zIVY?k6G`Ng6}Z)$Qnzy())f>KHa9od^-Xp2k|SM6?9=QgnDS<6Y3s(%=X7me9L8Iw z^q*~l2QoZD!~zIB%sfYj?8o@*!@Mr}gcVqP=uLi;6dl5)aB#i%Kl0wfLNu^{aR1o< zZU}kOdMNu(pY5Z9&lvC8&UHrq0mY-EBY*W~1k}#XQ()gdji(>#D%hHLbIFBa1De1=)>E%=NpH{+>W9}#)8!_}Ab%d6o$&1E}}^!~LYcQ*mB zj@QyIH#ZwcENshn2glpuxW<|TdS`;x!k=0H`cAy>#ZMfdo!lIpI0JJBqWj#bj~I>ks?%jY}g=F za6Ro)c50<<`^2_eCtgu(Zfv{EJaWN<7~-So;_s17pBGitbp-a+#@d5QC%_!c;Po=y zRJtPjTPRh0A=TJ{+URwzMcO{e%So}Y{&x@5CbF)61N@mYJiObe<+mNnOY#fz(a;r7E`cJep!Qo4c-8%KbQu{=jlW@e^Rc3Dl$x1E6fq9w-K zILBj;@H<=}#x6YbhZrym_@bDYAVs4$ZKyWmA;EUmzbB|c>+|$J@sT@w7xj2e91kv- z4nT0_l-qrN;g4E5XX0uGzj{-(QQ~xHHt2LRX5AS-5iPiW`{n#w!>j>_w8aTFM*AM@ zI|N2F4}DP#-mqb`K0Kz`D~VitTcM@gtYMJzUsheuqt2AfQOrMlWH(3Q!tGWkO}tVz z%9tN!`Rn#TIXAp{1omx1p;}J0K-SW9g1~ACKDjzmBA$QdTc&d`%^@$h#+gnq(^%TQ z?Dux)T?HiN_byWJ-D-Gzbnb<+8+ArbRhK1b*Sq=VlfmPsY0N+yJhMI(lp3;xa5j26 zYoE&5BQC>_^8I$H6}!Tc-}Q^mW2L~V6lW;*&zASmQ4*PBQ_>A(sk+s~m69xmw*PvpuPnx~!$vgkXzOS;`aJEV{g10C z5oSe(1Lj&h52eK$NoJZtgp!gI-d3bRI1Y9f$8>FTg65JO`CoI1d=y=e;k5O5B0=tv z2bLq#dmaxL$v)i&FW4x0+V`%uwtEC^z4fMf%|QM^rf2l9B&i{^A38*TVzo#uo;6W5 zLUSU!NZbi)nu?aJPuNlH5~h!mUG(>?*3TZ-FtNY#E^sVA$ zq(F}a43yHo6Ft=mr| zDo{p|CtZk>e&tm`VRj-)^RZblqV``9jB;dz<371si8z9QA}pQ-RA7!fkQ29Sg6VOy z$+jrrg26LZ-06YVIHA!$c7A!xUJI5KtxTb^Y1?|>{-{3}$Ls87)#-cdo?ff%UQHe* zoD>H#jepivXjT~&O>aApB{LF@-x`lXyQgdNy`1G{1d4jY(QSP!omESie>jw`dO+M@ zgZ5+V4a%>O)SpAeanmb5H_C6D>N@y=d}`%_BtD)q0K83s4RV>8BhO@|>}gwbr}g62 zEh-ra#%EMUce&EBwWA7u%n{Aj|xH zkf^V%P;Uw8!cvOFh+SFI_!|6bG&Osb`p)=eZNHo-ya>@V94X3eN=vc^dnVZVp-6BU)nD zg>909Fv z0(r7}b+k6wKhhIbSS6!h6OkTITaVe5wUikYRbV)L+`I5|)ZDHW!EhBYOg^7-{jGKS zEW%UOsY&_Go&~OoJ87ASV}xh;az*^TueuDPX91f@*DY)HsQGD#SgqH4T_vLs3Ap{` z<|gurp~~j7%Q@~x7`^nPmu|PNjo`X2W|ELuVF$=AU6VWf-5RPj2sV3byHdXz)yx$U zASZ3?PdAfVIk9BllWRj82`iNQ7JaTP_o59MatYQ8-3>CZv z%IVw{`fDw2xD-C$3%PzO!4R@xvjk4EWQP&@la9|=qm+W~i&eRa{!Md-4lL4FIsLVWDjb_{IY86 zk09myi*EPR&QSMG))cpI8_$38xU1q}R8z{O52uxMz7!>SdZb#BuT&DBTv5?pTIcbk zSl7EB+-~97=&Wls5U&Vkub1~he+FMiH*zlS`FL47;&c%*Z{bG-p(+y*6nJM7k=$ae zBwbI}wb}Pr;~Kx3%RMSJeB24-?$3X9eaT|;c$j8z(P{2?4yd&1s@> zeo)vsiy*YtOGR)e5;US4cUv2nV7QRUkL_xfJS18@I3dBap6^=j_EAL4dkU3}Ie z>|uUX&UAvRMfx}_NnGz7(Wi#vniQ^uC$`9!4&6U}0=rw?q|HKa&MgAFK zsje7BPi2OoB0ty{AIS5Nng#*&@=9_MyIPr>>zTn`wS1n|rhXni0?GDwT-Qejl>@@{ z)vX4xFJh-hYjT?Fq*SxiVJU?T_I0{~tuRQukf3gRaOIrTm=tJUEBb79+loeQ}bo794 zIAM;mioPDY@@$@-gW#XAU6{r`>_)W;z6t}MB{}u76-b;}1pB1xF;Dd!J>P)+%<13A z_7O4I4QsFzevjocZsKLB*906)hR=JJJ1ytI63xsc?l;#gdro7F3`O_!)i@DQ>VU0j zft6q<;PccoYo}dO?P=mB;d7e7JWqr?x=@!AiP zC)v33WXOmv9M(~}k2A+&#c{!jV74kbZH;Z{W}N7F#GLlFrKrZ@8?Q+qreyV8u2U1& zj42^pSj%S-!`Lurt)!$F^aIa1k_q#Olk_Sok+rEa$z9yn85H#^$LLG&jQPXPq$PcP zTm(V?BBt@`S#9r?oloLXW*(NK_a12I{E7^2BtO=NG;njDxDShKm4c1#W`sw&eJ7~{u{c>bCL*JMO20&bx)@d@1>W&1 z;nmf9jbh@OL`M${o0Ji~F<1==*eqVgN)ERTe5OtaWS$@*W`ve+3zxf+oc8?EO!`Iqpp8BK&DbdN5H@?zn|ne!|Db7f^M#&-l^ zv(4@-8><=vs2_Ew50Am_xt2by1j)R#Kj#1+{8~sf8&gAY5SN&IQN7;B4}b30)aMFA zZK47=(46RNw7-bsE?&~L>fVLqt~VBk)bICgyOC98plzZ;1Li0oAIPy04}>+SPGcL* z!RN8ggJY^1_!D~?eW@FI9)G(m#XP=vmUvf!BInp|#X;mZ#RP^V(Vn{S>hXtMg$;)- zl;J-&@_{45dh%hKMjqMahsVK=B6JH?i$ZECWgl%JGy>$;N)ozhQFfA7w}}%>1ggwU zMOZ#NOw1uFpTxLw?k=>3v9YlkO}_bu5xbdTJS=d1wZAQR+oUX+EIvS{3P9eb>AJj9<%&$U_@1%Q*3k${5qo)9rcX*y9p^OW zxY8BKf!6(fOFRD5(Qjr+_MXQ_IGujWuGyTXo`W%JxWjwq-IvK2tlOKYJ3%+jL@z2N zNf9CsHpN>;4?a1~6nwX%gZ?PWT=UqPady{X%qdm=6%ofUt)W&9!TEEQ^pN`BM|f@= z7SZ755W87c{EX5`0HDaY`MUt$#$g-c%-p~3pSmeg*PYf!pRSVXwMcK%e9e#(awb$Z zIa}i|p{Ro0Z<{5^UuC-w?#?XhlC{YIak7$MUM`Mg7r!VPR#i~UZw=^k9*Bbv;DxwD ziSO&O4yV;~gWR~$9qs^@$!@y9L{}-iSLRxgr7H?9Um=VikNis4h|fMGc&>@k+5gB8 z7po5x#2~Ac!5BICO8U3?%8}yYSFF@&D3SSV6f*&Y{!uI4cdq#Q%i~F8-9aSuw41L_ z?4X+u&afKxenFk5i0y0jLv7xGLUT&6M_-Q~oUy<^CJU@+j-uq+#&7eQv3rK;?vR1Y za_84omi`Ob|{T{-k;dckgAe01PT|Sdnl;F>H1Q z%GKA&rS_syP6&7VhY|}}?67vbI~Fnq%hHqGN2Ej&LS@i<Av;>$ow^oUsbccP}}?7E|Mp}Toh)%Ux6nNGXw&ats#W+H* zwmg4P0@BPcl%jjm_=)pc^k4A*l0`^Wjm1T3i`iL=hAe z@kiTvIg|VB{MLIfr=dll>XQvu^G+F_>77xNZS-1YJK6Lx5@V)TP5-7~8)5k{!Nw9| zK;d9TXW~asH!wo3P3|TTXCUp#pVsrLl%1NOgS(wSciOCa>v0n$i^u^@<)1Qj-~0e~ z!0)-Zy=~kkF2aDLi+z0WCUHskwS5s{o?hw1k63n7X*z7y%zZ0QH%<{)1qCJ8gpu?l zA&~w-iZOw%JhtwZC<+>SNk)=$Qm{P<1@e)lL97>dnz-P%&QVW$(T}gwIeBEmhjUy! zMIH2+(rhYhKD{weyMHg1nQ7L(QMi`IZXf_*kx#@@_D8l9bDRny2 z01m!$6f|Au$Zw!@oVu8gL;PY&D=FDsLmU-N{(LDNUUlAL_ij;6{W|=uz_4Wc)n;=) zg@;%a*>W^7yg_+Gqo(Z)LBA#d8L-jYDc;K|J!G)t(#w zX(5QBysX`rrRmyR+~SJ z|1_4y1Y!;M78MO)J1(DByR_Py$>ee}QTELws~-tnB3@bZ_lbE!B}PDrYW*n^W+VV!HiBKfbwZb>u0 z5LyG=*wNcm^zPnoRY{-D-g5~F7UJpMsGBMEQC&TfK+^9wGt%7glm9&I_ON8o(NS0T z>~LZ`NV^g(6->D$UmxqSaua{yOJhMCwv2i0ajiqfcfx#7pRZ3l5Z5RA{SgHsJ3{7k zyc)24rIA|MbVupKo~HY;{M}`|)9}u;wKL0*H`x{Dw0`Bq^`^loSF=}MpSJUg`4V@B zEy0KWwjL|!sTcHy1pFwG@gGr{vi!77WtM`3c<<4-bk9CsoZo5A=Hyd1>ekt9 zft|V*$+_+@d7n;5{Z-w z3X*OyE$AgNaZXb?N@Ba*X7f1w(ZjdbZz|z0pb2c(UDs>+sO;;}^~KC6u=nIt&gaHcIl0PC0sqXw$@vA5 zcIso%SJsBzH1kSSfk>fJ5wuVcP!b8&RV8cAxvo~Pujoz4*J`hOMjI~auUr`!1-y-x zk8tID+#Dz2?+@ebuIN+#Pajtv5B1u&=g1&SW0EZzMYbZe4YFk{#Ua}fg+WBJO(S6# zAv>iwB)ejiJ;oT@bS#-1kv7ZNvM*umyLoS__j#Y^J)h^F-+%Yq-~0Z}{r!Ev*L_`= z|0d$K#wX0pCcj#Im3>+SZsp~;zP`gVGLhXf%`@x(sknwW4HGW_pajKu=qp!t%38Zx z-Oj)JpsEho>)N9_r|Wt?)wz6Dy7GPhuc4zQgu@M3 z@~fhzc?1T(L{{fmn&*Gp#=+wBy*2L07*oS~IC3+|=Rt zfTJ$OGuE|TI<=UriwfkE5~=g?zHxjgmIZhfn3st8-!Hj~gU+H3jX6ZKIovfr02cV^ z^*HP0+8v&I^BJ3E8cl~PD=+rnuF=tQ#ihu6XA{wsrAmLDS@wfURIv3Y7$$!qcPSR` zL=_l9M3^aEUWQ3ks~$T|Fh+wqRhTl3tjk@IfU91-p)gmD9B_riUn_rm+D0laIP}=@437h@ ztv+Q~w-?RfHJ=gSzm2ZLrxNoLbA@Bs-EfGT(o`h`=N@pH$WU1dex)Vvi-uXdOQ8y8-1 zppJWM;r?I}>~3Cc%mBBf;Q86}Hj81g_Yqlavd8SCZ#70uS?Ms7GtGS|t@bz{wID36 zaT35kd_sg~{-m9ijcUV=*wE9UqJ?#*bIX8)ACW%DXrkmW7ML~%$0`DX0_Zn3ig(cS zOrOm3txmT&ew~nR;9k!BLuI5=N}DHwC)8$iVf2l;FZz$q*`XTSMGAiOKA>8cll2O0 ziKKkNLy0XA6LYU615PY{ovrowaiZw8;ZMk~>JgWCBcEDx%*uRq$?BH+)>m1QpMdo- z)l(*gH}XaN;GtkH9-suh-aG@-uMe`4*o++^v zAkCC0k(oGRazqP`E|Z=c16Br}wBobY8$91cq`~GY(7tytrIm@nH;wifhB1Rz^T3Y5E7%08V|vf)7u=-6zD;qO{@Fd!C;&`9$7K$_YJHl1GJKi zthn@lNhg?*I{Iv%g{hV@1v3`J(IG zJF(R$Mh*()6}k`C-c*jrd>v(oG~gV4-y-dbON$`ht{ZjtCJ^8Aa}bkv9&)_?iu@cRcUNYT^`b^74dBdli?E!l@*lHvdA+J5f-F;OTE#77=isf z;e z<#0bpk5sM`HH}FHO{Z(lr5Fh2eRg`jt7&ziFV%Iev6;crMWLj1siA}+taA|aXx^zpAk zm%D(W5>v`t>%t{lp@T#v*~573-`X<}Xjp9Ct$I4>G@WIwe3u%r8PN-!K{%r|8%o#O zSsDFNuekFn$8Y%X=rMuf{#G!$3l8t9@1LILXJJvFgJaI0OR#VAaDNaQyQW%CpKK^y zcqBlG>NRt=hrvK3io0OhCuP9UsePWXkm+cd=osmg1L)bOZl(7bm>sywf(TdQtLQbb zKJBx;^88zW(KW5GFqRp$%Qy;lMe6DfW<_=u8$`IX-Ubd@T?1gcW{-?D9&t2|<&q%XTBgu0qBzd)eQa5JX=}`83z7A^tZ_Q~%z7m0LE4EnW`v)Q(KT@KkyJ3= z=|a?Mo%XJNIGop~=3&Njh4{on^@inFpm7vff=DT`wiP=RP#-ll``mqj%^;({%?Qo&d#U`awl?f{keQ_;{?h#S}yh{!+Y- zu=76f@YaNS_bzw_$8G4ZEHQ?0e>ckTdd+F*{x35{)8d+5V;O+0+SaunMTo9l+3K*-*v z-&Ka;lczoTO;7BF z8(1Kj;^4fSx>JM{7*4c`Jp+NTG$1=?vXfi|R6zxxxzXU>1^G^Rn9Hh!gaVDQ(wiCm zpZ-dKmbmM0#xE2#{M-Fp&rK5`(g4mdzn)EDUeb^chuqOo4!kycnterAs>LOM(*Gz> z>1!T=Kw6nVO?1qf9db65mc#^vC%bksa#6};i-S3C0zK!6A1eyWxlpuR^RbFiKvF#a zLjS)`!@jFm$`hUmL3{Ollxe@|H+h=m_BQc~Sx<%IhHL|j=9P4623g+fc5)@$fWL>8 zvUT)7CjS}2KTae+v-0+&Oh+QmF*|mMSHkv;KE){8Iy$;O0#okedRyHtDeU6>f9LsyLV|UPy1AjLEG~>SRf1Cua*~^8EdJ1ZI@pxm+~s zDJ&_Im2ctb>>$`9Pt3+wwRkRTxzcQGY$UP)DqYtBG!(%9NG?m+?NZC@0(a81TbT{z z=;SbW2*8%Fbe(;#A}5PC8PzuU6yqG?<1H^R(p~=|Rt6;$wUNn`oGX1egAtxMF(tnK zLCduEJ(Xden8)RdceitkBgvuj0YmdZ;R#7*$~%^jptVxzk(C!aCfZxiBC9QI3@-ec z_t?=HWh{~~HA2XLs$O`|y7supvkf<1uD{QmkaR(%XIyutixq`cMXd(Pe^;{1|1y+% zMhAq83F(c9WL^*V-MSZvthiPvtW%nM8>}#Hk(Kw-mY1(?jvjuwUcLNgndMs7_d{+{ zTiC_zEYmPFEtvO60P&*P8|U;j-{tLEzWH#6V*^8b3({MwHlkW!vh$PZs6}rZeOj1` zIw>MO!{J%(ns<^NceMs6)e9>Nh0U>^ z9U3Rbp$U6YbC2X2J%Jf$rGbsIO%gZW{Ua%~MXYaRg2BPOXFKyUG!NQ*E{J{8`Y?j9 zuzsr91MITVAS-Xy$bLC6BRj)T+y&K^A+$@Qe~|Q=rxrC&NKU;GXRQNrPmXB!W~q!m zXI_-p>9YJhoiP*$R8D;BgTs~l9BQGMVkwvSRxdMA5G2-kI3auI{OWePk5FdfEqXv8 z_O_dr81{J+D{t-tRmwrUGh9K8RInZCCPl|agDFT##Ic-nlAnU=gE&B#@DkM`HB)WgM z>M7;DO5=gpN>m0&|FV1A^=|wxC-+hk6T|>~I(GF9_gesIeD4{}HEHsXzyF`94P=*t z&cthpj@=b~F1t3Z9q*G(=;^DO_Azwh-!zgH`26*+tgbY5O&)bA>n?Y@Kr|hn*pqBP zwkL#En3uMOG=YtCSp2^y&nLIer)VSX%zv%2G)ocj{}a&H^`^Ii@UR0A z4b;p2IxqCd(M&*z{+CT9ztG1Vh=%DuYzjtYFPZ<$vOjVyXvgDDK_SoTXY}V8`*b#r WD{l_5Fn|LP Date: Thu, 27 Jul 2023 22:05:30 +0100 Subject: [PATCH 37/98] Add files via upload --- docs/part3/images/masking_tutorial.png | Bin 8681 -> 203594 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/part3/images/masking_tutorial.png b/docs/part3/images/masking_tutorial.png index 95d1231d5d9716a1e0b75236f4908abd0428b4b1..aae9a2f83af0ff86128c328b68c685487428961b 100644 GIT binary patch literal 203594 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

ITGYG82A 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

v(Ot>ba1q=~24=lUTLm;Uc|UQ*5_wjlRB!S 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

  • #;R{@vh3xu7vTib))ATmq~{3 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

    Nuisance Report

    +All numbers shown report the +/- 1-sigma variation in the yield for each affected channel/process. The Range shows the minimum and maximum effects across all channels/processes. +You didn't run with the option --t2w so param types will only show the line from the datacard + + + + + + + + + + + + + + + + + + + + + + +
    Nuisance (types)RangeProcessesChannels
    lumi (lnN)1.0001.100 background, signal bin1(1) [+]
    bgnorm (lnN)1.0001.300 background, signal bin1(1) [+]
    + + In case you only have a cut-and-count style card, include the option `--noshape`. If you have a datacard which uses several `rateParams` or a Physics model which includes some complicated product of normalisation terms in each process, you can check the values of the normalisation (and which objects in the workspace comprise them) using the `test/printWorkspaceNormalisations.py` tool. As an example, below is the first few blocks of output for the tutorial card `data/tutorials/counting/realistic-multi-channel.txt`. - -```nohighlight + +/// details | **Show example output** +
    
     $ text2workspace.py data/tutorials/shapes/simple-shapes-parametric.txt -m 30
     $ python test/printWorkspaceNormalisations.py data/tutorials/counting/realistic-multi-channel.root                                                                                                           
     
    @@ -647,7 +664,47 @@ Dumping ProcessNormalization n_exp_bine_mu_proc_ZTT @ 0x6bc8910
       -------------------------------------------------------------------------
       default value =  88.0
     ---------------------------------------------------------------------------
    -```
    +
    +/// + As you can see, for each channel, a report is given for the top-level rate object in the workspace, for each process contributing to that channel. You can also see the various terms which make up that rate. The default value is for the default parameters in the workspace (i.e when running `text2workspace`, these are the values created as default). + +Another example is shown below for the workspace produced from the [data/tutorials/shapes/simple-shapes-parametric.txt](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/data/tutorials/shapes/simple-shapes-parametric.txt) datacard. + + +/// details | **Show example output** +
    
    +  text2workspace.py data/tutorials/shapes/simple-shapes-parametric.txt
    +  python test/printWorkspaceNormalisations.py data/tutorials/shapes/simple-shapes-parametric.root
    +  ...
    +
    +  ---------------------------------------------------------------------------
    +  ---------------------------------------------------------------------------
    +  Channel - bin1
    +  ---------------------------------------------------------------------------
    +    Top-level normalisation for process bkg -> n_exp_final_binbin1_proc_bkg
    +    -------------------------------------------------------------------------
    +  RooProduct::n_exp_final_binbin1_proc_bkg[ n_exp_binbin1_proc_bkg * shapeBkg_bkg_bin1__norm ] = 521.163
    +   ... is a product, which contains  n_exp_binbin1_proc_bkg
    +  RooRealVar::n_exp_binbin1_proc_bkg = 1 C  L(-INF - +INF)
    +    -------------------------------------------------------------------------
    +    default value =  521.163204829
    +  ---------------------------------------------------------------------------
    +    Top-level normalisation for process sig -> n_exp_binbin1_proc_sig
    +    -------------------------------------------------------------------------
    +  Dumping ProcessNormalization n_exp_binbin1_proc_sig @ 0x464f700
    +	  nominal value: 1
    +	  log-normals (1):
    +		   kappa = 1.1, logKappa = 0.0953102, theta = lumi = 0
    +	  asymm log-normals (0):
    +	  other terms (1):
    +		   term r (class RooRealVar), value = 1
    +
    +    -------------------------------------------------------------------------
    +    default value =  1.0
    +
    +/// + +This tells us that the normalisation for the background process, named `n_exp_final_binbin1_proc_bkg` is a product of two objects `n_exp_binbin1_proc_bkg * shapeBkg_bkg_bin1__norm`. The first object is just from the **rate** line in the datacard (equal to 1) and the second is a floating parameter. For the signal, the normalisation is called `n_exp_binbin1_proc_sig` and is a `ProcessNormalization` object which contains the rate modifications due to the systematic uncertainties. You can see that it also has a "*nominal value*" which again is just from the value given in the **rate** line of the datacard (again=1). From cc6baaf1f7aeb16d05eee223380035ab93425a3d Mon Sep 17 00:00:00 2001 From: nckw Date: Wed, 6 Sep 2023 11:38:06 +0100 Subject: [PATCH 53/98] Update settinguptheanalysis.md Revert change of png to html --- docs/part2/settinguptheanalysis.md | 53 +----------------------------- 1 file changed, 1 insertion(+), 52 deletions(-) diff --git a/docs/part2/settinguptheanalysis.md b/docs/part2/settinguptheanalysis.md index 1bcef4be641..2b3aa2c3017 100644 --- a/docs/part2/settinguptheanalysis.md +++ b/docs/part2/settinguptheanalysis.md @@ -541,58 +541,7 @@ The default output is a `.html` file which allows you to expand to give more det $ python test/systematicsAnalyzer.py data/tutorials/shapes/simple-shapes-TH1.txt > out.html ``` - - - - -Nuisance Report - -

    Nuisance Report

    -All numbers shown report the +/- 1-sigma variation in the yield for each affected channel/process. The Range shows the minimum and maximum effects across all channels/processes. -You didn't run with the option --t2w so param types will only show the line from the datacard - - - - - - - - - - - - - - - - - - - - - - -
    Nuisance (types)RangeProcessesChannels
    lumi (lnN)1.0001.100 background, signal bin1(1) [+]
    bgnorm (lnN)1.0001.300 background, signal bin1(1) [+]
    - - +![systematics analyzer output](images/sysanalyzer.png) In case you only have a cut-and-count style card, include the option `--noshape`. From f72e7c0b75b856d26c9f530a875654b07d4a7c33 Mon Sep 17 00:00:00 2001 From: Nicholas Smith Date: Thu, 7 Sep 2023 11:45:04 -0500 Subject: [PATCH 54/98] Silence newly created linter warnings --- .flake8 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.flake8 b/.flake8 index 6742d005678..5b45d35fefd 100644 --- a/.flake8 +++ b/.flake8 @@ -15,5 +15,6 @@ # E741: ambiguous variable name 'l' (too pedantic! get a good font) # E711: sometimes needed for comparison to ROOT nullptr (better to cast to bool) # F401: unused import (some may have side effects, need to clean by hand) -ignore = F403,F405,E402,W504,E203,W503,E262,E265,E266,E501,E741,E711,F401 +# E721: do not compare types (new, could be fixed relatively easily) +ignore = F403,F405,E402,W504,E203,W503,E262,E265,E266,E501,E741,E711,F401,E721 max-line-length = 160 From 77b1339d0b2c9654b418d6f41ee483eacf71c4c6 Mon Sep 17 00:00:00 2001 From: Jonathon Langford <35494417+jonathon-langford@users.noreply.github.com> Date: Fri, 8 Sep 2023 09:41:26 +0100 Subject: [PATCH 55/98] Adding physics model for (STXSto)SMEFT fits (#855) * Adding physics model for STXStoSMEFT fits with specialised RooEFTScalingFunction class Co-authored-by: Jonathon Langford --- .../decay.json | 430 ++ .../pois.yaml | 286 + .../prod.json | 6024 +++++++++++++++++ interface/RooEFTScalingFunction.h | 32 + python/STXStoSMEFTModel.py | 689 ++ src/RooEFTScalingFunction.cc | 87 + src/classes.h | 1 + src/classes_def.xml | 2 + 8 files changed, 7551 insertions(+) create mode 100644 data/eft/STXStoSMEFT/CMS-prelim-SMEFT-topU3l_22_05_05_AccCorr_0p01/decay.json create mode 100644 data/eft/STXStoSMEFT/CMS-prelim-SMEFT-topU3l_22_05_05_AccCorr_0p01/pois.yaml create mode 100644 data/eft/STXStoSMEFT/CMS-prelim-SMEFT-topU3l_22_05_05_AccCorr_0p01/prod.json create mode 100644 interface/RooEFTScalingFunction.h create mode 100644 python/STXStoSMEFTModel.py create mode 100644 src/RooEFTScalingFunction.cc diff --git a/data/eft/STXStoSMEFT/CMS-prelim-SMEFT-topU3l_22_05_05_AccCorr_0p01/decay.json b/data/eft/STXStoSMEFT/CMS-prelim-SMEFT-topU3l_22_05_05_AccCorr_0p01/decay.json new file mode 100644 index 00000000000..b9b411ad453 --- /dev/null +++ b/data/eft/STXStoSMEFT/CMS-prelim-SMEFT-topU3l_22_05_05_AccCorr_0p01/decay.json @@ -0,0 +1,430 @@ +{ + "ZZ": { + "A_chb": -0.09289383888244629, + "u_A_chb": 0.0016105082368337144, + "A_chbox": 0.12125968933105469, + "u_A_chbox": 0.0, + "A_chdd": 0.015926361083984375, + "u_A_chdd": 0.0001460009659995543, + "A_che": -0.09319782257080078, + "u_A_che": 2.676241912918526e-05, + "A_chj3": -0.05601048469543457, + "u_A_chj3": 0.0001538400384903014, + "A_chl1": 0.13434886932373047, + "u_A_chl1": 8.279683758824033e-05, + "A_chl3": -0.17699003219604492, + "u_A_chl3": 0.00020232594517908693, + "A_chq1": -0.015234947204589844, + "u_A_chq1": 3.705089156131757e-05, + "A_chq3": -0.015234947204589844, + "u_A_chq3": 3.705089156131757e-05, + "A_chu": -0.010704994201660156, + "u_A_chu": 4.3735352344141345e-05, + "A_chwb": -0.019979476928710938, + "u_A_chwb": 0.0008573477074443318, + "A_cll1": 0.1377105712890625, + "u_A_cll1": 0.00013011845490817843, + "B_chb_2": 0.4112720489501953, + "u_B_chb_2": 0.014666134356717776, + "B_chb_chwb": -0.25331974029541016, + "u_B_chb_chwb": 0.01757680236870437, + "B_chbox_chl3": -0.01728534698486328, + "u_B_chbox_chl3": 0.00029200193199910854, + "B_chdd_chb": -0.04589557647705078, + "u_B_chdd_chb": 0.0013274584681582503, + "B_chdd_che": 0.012516975402832031, + "u_B_chdd_che": 0.0013591950238932824, + "B_chdd_chl1": 0.011920928955078125, + "u_B_chdd_chl1": 0.0017192608239479015, + "B_chdd_chl3": 0.011324882507324219, + "u_B_chdd_chl3": 0.0016858739404357612, + "B_chdd_chw": 0.045299530029296875, + "u_B_chdd_chw": 0.00029200193199910854, + "B_chdd_chwb": 0.010132789611816406, + "u_B_chdd_chwb": 0.0012615925364802315, + "B_che_cll1": -0.010132789611816406, + "u_B_che_cll1": 0.0009973764735866494, + "B_chl1_2": 0.01430511474609375, + "u_B_chl1_2": 0.0032340669551493015, + "B_chl3_2": 0.016689300537109375, + "u_B_chl3_2": 0.003615796777749801, + "B_chl3_che": 0.020265579223632812, + "u_B_chl3_che": 0.0013274584681582503, + "B_chl3_cll1": -0.022649765014648438, + "u_B_chl3_cll1": 0.0016345154286387072, + "B_chw_2": 0.11205673217773438, + "u_B_chw_2": 0.0013058723390225557, + "B_chw_chb": -0.017881393432617188, + "u_B_chw_chb": 0.008995365848500005, + "B_chw_chwb": -0.16927719116210938, + "u_B_chw_chwb": 0.004732473669357111, + "B_chwb_2": 0.12636184692382812, + "u_B_chwb_2": 0.006615847075229457, + "B_chwb_che": 0.010132789611816406, + "u_B_chwb_che": 0.0008760057959973258 + }, + "gamgam": { + "A_chb": -40.149, + "A_chbox": 0.121224, + "A_chd": -0.241643, + "A_chl3": -0.363754, + "A_chw": -13.0861, + "A_chwb": 22.3044, + "A_cll1": 0.181877, + "A_ctbre": -2.15072, + "A_cthre": 0.0344664, + "A_ctwre": -1.15159, + "A_cw": -0.946266, + "B_chb_2": 402.985, + "B_chd_2": 0.0145979, + "B_chl3_2": 0.0330792, + "B_chw_2": 42.8117, + "B_chwb_2": 124.372, + "B_ctbre_2": 1.1564, + "B_ctwre_2": 0.331537, + "B_cw_2": 0.223855, + "B_chb_chbox": -2.43352, + "B_chb_chd": 4.85087, + "B_chb_chl3": 7.30217, + "B_chb_chw": 262.697, + "B_chb_chwb": -447.75, + "B_chb_cll1": -3.65108, + "B_chb_ctbre": 43.1746, + "B_chb_cthre": -0.691895, + "B_chb_ctwre": 23.1175, + "B_chb_cw": 18.9958, + "B_chbox_chd": -0.0146465, + "B_chbox_chl3": -0.0220479, + "B_chbox_chw": -0.793178, + "B_chbox_chwb": 1.35192, + "B_chbox_cll1": 0.0110239, + "B_chbox_ctbre": -0.13036, + "B_chbox_ctwre": -0.0698001, + "B_chbox_cw": -0.0573552, + "B_chd_chl3": 0.0439493, + "B_chd_chw": 1.58109, + "B_chd_chwb": -2.69485, + "B_chd_cll1": -0.0219746, + "B_chd_ctbre": 0.259853, + "B_chd_ctwre": 0.139136, + "B_chd_cw": 0.114329, + "B_chl3_chw": 2.38006, + "B_chl3_chwb": -4.05665, + "B_chl3_cll1": -0.0330792, + "B_chl3_ctbre": 0.391166, + "B_chl3_ctwre": 0.209447, + "B_chl3_cw": 0.172104, + "B_chw_chwb": -145.939, + "B_chw_cll1": -1.19003, + "B_chw_ctbre": 14.0723, + "B_chw_cthre": -0.225516, + "B_chw_ctwre": 7.5349, + "B_chw_cw": 6.19148, + "B_chwb_cll1": 2.02833, + "B_chwb_ctbre": -23.9853, + "B_chwb_cthre": 0.384376, + "B_chwb_ctwre": -12.8427, + "B_chwb_cw": -10.553, + "B_cll1_ctbre": -0.195583, + "B_cll1_ctwre": -0.104723, + "B_cll1_cw": -0.0860519, + "B_ctbre_cthre": -0.0370638, + "B_ctbre_ctwre": 1.23837, + "B_ctbre_cw": 1.01758, + "B_cthre_ctwre": -0.0198455, + "B_cthre_cw": -0.0163072, + "B_ctwre_cw": 0.544853 + }, + "bb": { + "A_chbox": 0.1212481150408084, + "u_A_chbox": 0.0, + "A_chdd": -0.030312087057909054, + "u_A_chdd": 0.0, + "A_cbhre": -6.521383598911775, + "u_A_cbhre": 0.0, + "A_chl3": -0.12124815390594634, + "u_A_chl3": 6.9390871739186175e-06, + "A_cll1": 0.06062409638554217, + "u_A_cll1": 1.73096089815817e-06, + "B_cbhim_2": 10.660707345511074, + "u_B_cbhim_2": 0.0, + "B_cbhre_2": 10.632110376991838, + "u_B_cbhre_2": 0.0, + "B_chbox_cbhre": -0.3953525068013991, + "u_B_chbox_cbhre": 0.0, + "B_chdd_cbhre": 0.0988382432957637, + "u_B_chdd_cbhre": 0.0, + "B_cbhre_chl3": 0.3953525068013991, + "u_B_cbhre_chl3": 0.0, + "B_cbhre_cll1": -0.19767617567042364, + "u_B_cbhre_cll1": 0.0 + }, + "WW": { + "A_chbox": 0.12124809023601613, + "u_A_chbox": 1.3554632528858088e-05, + "A_chdd": -0.030965202177738925, + "u_A_chdd": 0.0003736205375895942, + "A_chj3": -0.07712507795510672, + "u_A_chj3": 0.0005792405202369567, + "A_chl3": -0.15111966167320678, + "u_A_chl3": 0.0006750616346518034, + "A_chw": -0.08801473775465972, + "u_A_chw": 0.0003921627962102089, + "A_cll1": 0.12393100975310588, + "u_A_cll1": 0.000435350039432312, + "B_chb_2": 0.018812310359774598, + "u_B_chb_2": 5.955437692076245e-05, + "B_chb_chwb": 0.023728868660598177, + "u_B_chb_chwb": 0.00012561192621055812, + "B_chbtil_2": 0.017631122670134374, + "u_B_chbtil_2": 5.627506353230664e-05, + "B_chbtil_chwbtil": 0.023490463805808402, + "u_B_chbtil_chwbtil": 0.00012217485083141616, + "B_chl3_cll1": -0.011946008764434048, + "u_B_chl3_cll1": 7.335948705862236e-05, + "B_chw_2": 0.021532293021239705, + "u_B_chw_2": 6.910955873143112e-05, + "B_chw_chb": -0.037509752925877764, + "u_B_chw_chb": 0.00016851237206905043, + "B_chw_chwb": -0.023611833550065024, + "u_B_chw_chwb": 0.00012403919065032178, + "B_chwtil_2": 0.01873645426961422, + "u_B_chwtil_2": 5.9644390400372003e-05, + "B_chwtil_chbtil": -0.03517988729952319, + "u_B_chwtil_chbtil": 0.00015434690617777643, + "B_chwtil_chwbtil": -0.023408105765062855, + "u_B_chwtil_chwbtil": 0.00011334965788604068 + }, + "tautau": { + "A_chbox": 0.12124810927612287, + "u_A_chbox": 7.5735582698857025e-06, + "A_chdd": -0.030312046612131504, + "u_A_chdd": 0.0, + "A_cehre": -0.12124814786232443, + "u_A_cehre": 3.872313297704572e-06, + "A_chl3": -0.12124814786232443, + "u_A_chl3": 3.872313297704572e-06, + "A_cll1": 0.06062397746565829, + "u_A_cll1": 7.530134556922009e-06 + }, + "mumu": { + "A_chbox": 0.12124818799114975, + "u_A_chbox": 0.0, + "A_chdd": -0.030312014299883377, + "u_A_chdd": 2.379422578153748e-06, + "A_cehre": -0.1212480789981362, + "u_A_cehre": 2.3661251118051852e-05, + "A_chl3": -0.1212480789981362, + "u_A_chl3": 2.3661251118051852e-05, + "A_cll1": 0.0606240394990681, + "u_A_cll1": 0.0 + }, + "Zgam": { + "A_chb": -15.4736, + "A_chl3": -0.363636, + "A_chq1": 0.0177033, + "A_chq3": -0.0177033, + "A_cht": 0.0177033, + "A_chw": 14.5795, + "A_chwb": -15.7794, + "A_cll1": 0.181818, + "A_ctbre": 0.0977673, + "A_ctwre": -0.711921, + "A_cw": -0.922778, + "B_chb_2": 59.8577, + "B_chl3_2": 0.0330579, + "B_chw_2": 53.1407, + "B_chwb_2": 62.247, + "B_ctwre_2": 0.126708, + "B_cw_2": 0.21288, + "B_chb_chl3": 2.81337, + "B_chb_chq1": -0.136967, + "B_chb_chq3": 0.136967, + "B_chb_cht": -0.136967, + "B_chb_chw": -112.799, + "B_chb_chwb": 122.081, + "B_chb_cll1": -1.40669, + "B_chb_ctbre": -0.756404, + "B_chb_cthre": -0.0557492, + "B_chb_ctwre": 5.50797, + "B_chb_cw": 7.13933, + "B_chl3_chw": -2.65082, + "B_chl3_chwb": 2.86897, + "B_chl3_cll1": -0.0330579, + "B_chl3_ctbre": -0.0177759, + "B_chl3_ctwre": 0.12944, + "B_chl3_cw": 0.167778, + "B_chq1_chw": 0.129053, + "B_chq1_chwb": -0.139674, + "B_chq3_chw": -0.129053, + "B_chq3_chwb": 0.139674, + "B_cht_chw": 0.129053, + "B_cht_chwb": -0.139674, + "B_chw_chwb": -115.028, + "B_chw_cll1": 1.32541, + "B_chw_ctbre": 0.712701, + "B_chw_cthre": 0.0525282, + "B_chw_ctwre": -5.18974, + "B_chw_cw": -6.72684, + "B_chwb_cll1": -1.43449, + "B_chwb_ctbre": -0.771352, + "B_chwb_cthre": -0.056851, + "B_chwb_ctwre": 5.61683, + "B_chwb_cw": 7.28042, + "B_cll1_ctwre": -0.0647201, + "B_cll1_cw": -0.0838889, + "B_ctbre_ctwre": -0.0348013, + "B_ctbre_cw": -0.0451088, + "B_ctwre_cw": 0.328472 + }, + "cc": { + "A_chbox": 0.121248076543697, + "u_A_chbox": 0.0, + "A_chdd": -0.030312043795620438, + "u_A_chdd": 2.9406519705146946e-06, + "A_cuhre": -0.1212480272243046, + "u_A_cuhre": 0.0, + "A_chl3": -0.1212480272243046, + "u_A_chl3": 0.0, + "A_cll1": 0.0606240382718485, + "u_A_cll1": 9.871655541521966e-06 + }, + "gluglu": { + "A_chg": 39.34896452737338, + "u_A_chg": 0.0036136598569541825, + "B_chgtil_2": 387.08519581710067, + "u_B_chgtil_2": 0.0, + "B_chg_2": 387.08519581710067, + "u_B_chg_2": 0.0 + }, + "tot": { + "A_cbhre": -3.8088150367339573, + "A_chb": -0.11774443348228512, + "A_chbox": 0.111094283433403, + "A_chdd": -0.026404145059498056, + "A_chg": 3.2321440588070733, + "A_chl3": -0.14154198253734226, + "A_chw": -0.025550148767896373, + "A_chwb": 0.025344581352730065, + "A_cll1": 0.07134550085869427, + "B_cbhim_2": 6.242545538123147, + "B_cbhim_chb": 3.3510912804758477, + "B_cbhim_chg": 0.014628421046515452, + "B_cbhim_chw": 3.3500869203424903, + "B_cbhim_chwb": 3.351048456001841, + "B_cbhre_2": 6.22621399834023, + "B_cbhre_chl3": 0.23092237845299146, + "B_cbhre_cll1": -0.11546102662935359, + "B_chb_2": 1.0212057849486498, + "B_chb_cbhre": 3.342522454467392, + "B_chb_chd": 0.011036311030384272, + "B_chb_chl3": 0.021276106259909756, + "B_chb_chw": 0.42466410726423676, + "B_chb_chwb": -0.8322553869975238, + "B_chb_cll1": -0.010628074555237026, + "B_chb_ctbre": 0.09715364878520405, + "B_chb_ctwre": 0.06111778696348864, + "B_chb_cw": 0.054241816439559574, + "B_chbox_cbhre": -0.23090568894729965, + "B_chbtil_2": 0.011073807708891499, + "B_chbtil_cbhim": 3.3511836329294016, + "B_chbtil_cbhre": 3.342718467041639, + "B_chbtil_chg": -1.9403787529141718, + "B_chdd_cbhre": 0.05773553134319613, + "B_chg_2": 36.08012882940807, + "B_chg_cbgre": -0.013265722812744157, + "B_chg_cbhre": -0.2398682763695252, + "B_chg_chb": -1.9405225414513168, + "B_chg_chw": -1.940455801866151, + "B_chg_chwb": -1.9403220513966928, + "B_chgtil_2": 36.789955552717714, + "B_chgtil_cbgim": -0.014443708107001352, + "B_chgtil_cbhim": -0.24447798174123503, + "B_chgtil_cbhre": -0.016595938300865233, + "B_chgtil_chb": -2.656860443801512, + "B_chgtil_chbtil": -2.656987954391056, + "B_chgtil_chw": -2.6578789007231043, + "B_chgtil_chwb": -2.6561173554935094, + "B_chgtil_chwbtil": -2.656102705340668, + "B_chgtil_chwtil": -2.6570644607447824, + "B_chw_2": 0.1851187104182335, + "B_chw_cbhre": 3.341555450081759, + "B_chw_chwb": -0.5171435048897725, + "B_chw_ctbre": 0.03314207242151862, + "B_chwb_2": 0.3827505596435743, + "B_chwb_cbhre": 3.342560745111354, + "B_chwb_ctbre": -0.055806251282768574, + "B_chwb_ctwre": -0.020603491854327555, + "B_chwb_cw": -0.01282979767715212, + "B_chwbtil_cbhim": 3.3510615343607566, + "B_chwbtil_cbhre": 3.3425531353061406, + "B_chwbtil_chg": -1.9403074012438517, + "B_chwtil_cbhim": 3.3503472853927523, + "B_chwtil_cbhre": 3.341836678697281, + "B_chwtil_chg": -1.9404552592678976, + "u_A_cbhre": 0.0001056745724508178, + "u_A_chb": 1.0147176901146234e-05, + "u_A_chbox": 2.7970303863269623e-06, + "u_A_chdd": 4.545715888105106e-05, + "u_A_chg": 0.0009228754689976675, + "u_A_chl3": 9.665160542956318e-05, + "u_A_chw": 6.2492631209787e-05, + "u_A_chwb": 4.872736821665181e-06, + "u_A_cll1": 6.270238882590454e-05, + "u_B_cbhim_2": 0.01328331480900777, + "u_B_cbhim_chb": 0.026367907814640806, + "u_B_cbhim_chg": 0.014722949945654332, + "u_B_cbhim_chw": 0.026369026786247196, + "u_B_cbhim_chwb": 0.02633790701877546, + "u_B_cbhre_2": 0.01333116701390985, + "u_B_cbhre_chl3": 1.8991051055397575e-05, + "u_B_cbhre_cll1": 9.453460310809879e-06, + "u_B_chb_2": 1.7751651848669297e-05, + "u_B_chb_cbhre": 0.02639220130474713, + "u_B_chb_chd": 2.575491050452275e-05, + "u_B_chb_chl3": 3.0516314145272055e-05, + "u_B_chb_chw": 0.0, + "u_B_chb_chwb": 2.702993435135781e-05, + "u_B_chb_cll1": 2.56031005082551e-05, + "u_B_chb_ctbre": 0.0, + "u_B_chb_ctwre": 0.0, + "u_B_chb_cw": 0.0, + "u_B_chbox_cbhre": 6.4064258182917576e-06, + "u_B_chbtil_2": 1.7112840452170856e-05, + "u_B_chbtil_cbhim": 0.026400114341287678, + "u_B_chbtil_cbhre": 0.02640730917798766, + "u_B_chbtil_chg": 4.154731555870219, + "u_B_chdd_cbhre": 1.1238287156918522e-05, + "u_B_chg_2": 4.154710498868562, + "u_B_chg_cbgre": 0.013010202824059083, + "u_B_chg_cbhre": 0.23614224261772826, + "u_B_chg_chb": 4.15473155681966, + "u_B_chg_chw": 4.15473155188581, + "u_B_chg_chwb": 4.15473155365596, + "u_B_chgtil_2": 4.863630032954914, + "u_B_chgtil_cbgim": 0.014269116919541117, + "u_B_chgtil_cbhim": 0.24295821319257593, + "u_B_chgtil_cbhre": 0.0169720252320657, + "u_B_chgtil_chb": 4.863656060115826, + "u_B_chgtil_chbtil": 4.863656067738421, + "u_B_chgtil_chw": 4.863655987144911, + "u_B_chgtil_chwb": 4.863656023190989, + "u_B_chgtil_chwbtil": 4.863656023679299, + "u_B_chgtil_chwtil": 4.863656023778757, + "u_B_chw_2": 9.050329912985551e-06, + "u_B_chw_cbhre": 0.026367688732727653, + "u_B_chw_chwb": 1.8186235084810188e-05, + "u_B_chw_ctbre": 0.0, + "u_B_chwb_2": 5.748347957614279e-06, + "u_B_chwb_cbhre": 0.02649052789294373, + "u_B_chwb_ctbre": 0.0, + "u_B_chwb_ctwre": 0.0, + "u_B_chwb_cw": 0.0, + "u_B_chwbtil_cbhim": 0.026337908827162727, + "u_B_chwbtil_cbhre": 0.026366507951876502, + "u_B_chwbtil_chg": 4.154731553461103, + "u_B_chwtil_cbhim": 0.02634791511891983, + "u_B_chwtil_cbhre": 0.02637650639110261, + "u_B_chwtil_chg": 4.154731552870521 + } +} diff --git a/data/eft/STXStoSMEFT/CMS-prelim-SMEFT-topU3l_22_05_05_AccCorr_0p01/pois.yaml b/data/eft/STXStoSMEFT/CMS-prelim-SMEFT-topU3l_22_05_05_AccCorr_0p01/pois.yaml new file mode 100644 index 00000000000..8d01006b7b2 --- /dev/null +++ b/data/eft/STXStoSMEFT/CMS-prelim-SMEFT-topU3l_22_05_05_AccCorr_0p01/pois.yaml @@ -0,0 +1,286 @@ +--- +chgtil: + exponent: 0 + val: 0. + max: 5. + min: -5. +chbox: + exponent: 0 + val: 0. + max: 5. + min: -5. +chdd: + exponent: 0 + val: 0. + max: 5. + min: -5. +chg: + exponent: 3 + val: 0. + max: 5. + min: -5. +chw: + exponent: 2 + val: 0. + max: 5. + min: -5. +chb: + exponent: 2 + val: 0. + max: 5. + min: -5. +chwb: + exponent: 2 + val: 0. + max: 5. + min: -5. +cbhre: + exponent: 2 + val: 0. + max: 5. + min: -5. +cbgre: + exponent: 0 + val: 0. + max: 5. + min: -5. +chj1: + exponent: 1 + val: 0. + max: 5. + min: -5. +chq1: + exponent: 0 + val: 0. + max: 5. + min: -5. +chj3: + exponent: 1 + val: 0. + max: 5. + min: -5. +chq3: + exponent: 0 + val: 0. + max: 5. + min: -5. +chu: + exponent: 1 + val: 0. + max: 5. + min: -5. +chd: + exponent: 1 + val: 0. + max: 5. + min: -5. +chl3: + exponent: 0 + val: 0. + max: 5. + min: -5. +cll1: + exponent: 0 + val: 0. + max: 5. + min: -5. +chwtil: + exponent: 0 + val: 0. + max: 5. + min: -5. +cbgim: + exponent: 0 + val: 0. + max: 5. + min: -5. +cbhim: + exponent: 0 + val: 0. + max: 5. + min: -5. +cgtil: + exponent: 0 + val: 0. + max: 5. + min: -5. +cg: + exponent: 0 + val: 0. + max: 5. + min: -5. +chwbtil: + exponent: 0 + val: 0. + max: 5. + min: -5. +chbtil: + exponent: 0 + val: 0. + max: 5. + min: -5. +ctgre: + exponent: 1 + val: 0. + max: 5. + min: -5. +cthre: + exponent: 0 + val: 0. + max: 5. + min: -5. +cht: + exponent: -2 + val: 0. + max: 5. + min: -5. +chl1: + exponent: 0 + val: 0. + max: 5. + min: -5. +che: + exponent: 0 + val: 0. + max: 5. + min: -5. +chbq: + exponent: 0 + val: 0. + max: 5. + min: -5. +ctwre: + exponent: 1 + val: 0. + max: 5. + min: -5. +cqj31: + exponent: 0 + val: 0. + max: 5. + min: -5. +cqj38: + exponent: 0 + val: 0. + max: 5. + min: -5. +ctgim: + exponent: 0 + val: 0. + max: 5. + min: -5. +ctwim: + exponent: 0 + val: 0. + max: 5. + min: -5. +cbwim: + exponent: 0 + val: 0. + max: 5. + min: -5. +chtbim: + exponent: 0 + val: 0. + max: 5. + min: -5. +cbwre: + exponent: 0 + val: 0. + max: 5. + min: -5. +chtbre: + exponent: -1 + val: 0. + max: 5. + min: -5. +cthim: + exponent: 0 + val: 0. + max: 5. + min: -5. +cqj18: + exponent: 0 + val: 0. + max: 5. + min: -5. +ctu8: + exponent: 0 + val: 0. + max: 5. + min: -5. +ctd8: + exponent: 0 + val: 0. + max: 5. + min: -5. +cqu8: + exponent: 0 + val: 0. + max: 5. + min: -5. +ctj8: + exponent: 0 + val: 0. + max: 5. + min: -5. +cqd8: + exponent: 0 + val: 0. + max: 5. + min: -5. +cqj11: + exponent: 0 + val: 0. + max: 5. + min: -5. +ctu1: + exponent: 0 + val: 0. + max: 5. + min: -5. +ctd1: + exponent: 0 + val: 0. + max: 5. + min: -5. +cqu1: + exponent: 0 + val: 0. + max: 5. + min: -5. +ctj1: + exponent: 0 + val: 0. + max: 5. + min: -5. +cqd1: + exponent: 0 + val: 0. + max: 5. + min: -5. +ctbre: + exponent: 2 + val: 0. + max: 5. + min: -5. +ctbim: + exponent: 0 + val: 0. + max: 5. + min: -5. +cw: + exponent: 1 + val: 0. + max: 5. + min: -5. +cehre: + exponent: 0 + val: 0. + max: 5. + min: -5. +cuhre: + exponent: -2 + val: 0. + max: 5. + min: -5. diff --git a/data/eft/STXStoSMEFT/CMS-prelim-SMEFT-topU3l_22_05_05_AccCorr_0p01/prod.json b/data/eft/STXStoSMEFT/CMS-prelim-SMEFT-topU3l_22_05_05_AccCorr_0p01/prod.json new file mode 100644 index 00000000000..fa5894cff40 --- /dev/null +++ b/data/eft/STXStoSMEFT/CMS-prelim-SMEFT-topU3l_22_05_05_AccCorr_0p01/prod.json @@ -0,0 +1,6024 @@ +{ + "BBH": { + "A_chgtil": -0.05856266000974681, + "u_A_chgtil": 0.13208514344917374, + "A_chbox": 0.12124809249984221, + "u_A_chbox": 1.1952245484112354e-05, + "A_chdd": -0.014779648569471318, + "u_A_chdd": 0.0005190897879006549, + "A_chg": -0.9932899684235158, + "u_A_chg": 0.15408318257650094, + "A_chw": 0.16094389689416255, + "u_A_chw": 0.004023428141517987, + "A_chb": 0.0187886477278742, + "u_A_chb": 0.0013034068420802673, + "A_chwb": 0.0704657838014914, + "u_A_chwb": 0.0016842195609724443, + "A_cbhre": -5.087005059830971, + "u_A_cbhre": 0.027254299875952175, + "A_cbgre": 0.5260360301689833, + "u_A_cbgre": 0.022435251260335857, + "A_chj1": -0.02202425578267653, + "u_A_chj1": 0.012800783308523321, + "A_chq1": 0.026331009996519116, + "u_A_chq1": 0.0005397104552325533, + "A_chj3": 0.39084966976922014, + "u_A_chj3": 0.01192340158973865, + "A_chq3": 0.026331009996519116, + "u_A_chq3": 0.0005397104552325533, + "A_chu": 0.08887514764650987, + "u_A_chu": 0.010052837830542142, + "A_chd": -0.02939900779387837, + "u_A_chd": 0.005620043909266265, + "A_chl3": -0.15642022733558206, + "u_A_chl3": 0.0007241113661315359, + "A_cll1": 0.07400105690359282, + "u_A_cll1": 0.0003259690914251017, + "B_chgtil_2": 182.31350469658187, + "u_B_chgtil_2": 50.52551863159456, + "B_chwtil_2": 0.03153955662439326, + "u_B_chwtil_2": 0.002901030667826659, + "B_cbgim_2": 1.6392718012103829, + "u_B_cbgim_2": 0.4690393900175071, + "B_cbhim_2": 8.553191309235691, + "u_B_cbhim_2": 0.16523058764483303, + "B_chg_2": 182.83555545820658, + "u_B_chg_2": 50.88016308138094, + "B_chw_2": 0.052743411513040225, + "u_B_chw_2": 0.0031360679835295328, + "B_cbhre_2": 8.293660128574615, + "u_B_cbhre_2": 0.044433153488591406, + "B_cbgre_2": 1.6389112607862237, + "u_B_cbgre_2": 0.4690375201493949, + "B_chj1_2": 0.4017677889845589, + "u_B_chj1_2": 0.04706083719530409, + "B_chj3_2": 0.3867118211458717, + "u_B_chj3_2": 0.046598496093072365, + "B_chu_2": 0.2504372212797271, + "u_B_chu_2": 0.06631674397575266, + "B_chd_2": 0.07808904926587672, + "u_B_chd_2": 0.018657571858241843, + "B_cgtil_chg": -0.013295439518921719, + "u_B_cgtil_chg": 0.013523737846826847, + "B_chgtil_cbgim": -0.8304192647297025, + "u_B_chgtil_cbgim": 0.580714068750402, + "B_chgtil_cbhim": 4.0798888773795055, + "u_B_chgtil_cbhim": 0.7046364069966582, + "B_chgtil_cg": 0.013293492904325719, + "u_B_chgtil_cg": 0.013521803630841194, + "B_chgtil_chg": 0.36609739004988634, + "u_B_chgtil_chg": 0.39662057572694054, + "B_chgtil_cbhre": 0.19095308183383508, + "u_B_chgtil_cbhre": 0.4306923668923595, + "B_chgtil_cbgre": 0.4524007470836595, + "u_B_chgtil_cbgre": 0.8571171389684281, + "B_chwtil_chwbtil": 0.017050118589751775, + "u_B_chwtil_chwbtil": 0.0017499715126512742, + "B_chbtil_chu": -0.010793054215932102, + "u_B_chbtil_chu": 0.00945154279478297, + "B_cbgim_cbhim": -1.7326501294758494, + "u_B_cbgim_cbhim": 0.07346287784108961, + "B_cbgim_chg": -0.456687660083032, + "u_B_cbgim_chg": 0.8571725675803391, + "B_cbhim_chg": -0.11927219777201781, + "u_B_cbhim_chg": 0.4102873659779967, + "B_chbox_chg": -0.06021810714025991, + "u_B_chbox_chg": 0.009341068423207572, + "B_chbox_cbhre": -0.30839489086968547, + "u_B_chbox_cbhre": 0.0016522657613732626, + "B_chbox_cbgre": 0.03189044261367371, + "u_B_chbox_cbgre": 0.00136012124875549, + "B_chbox_chj3": 0.023694887870263043, + "u_B_chbox_chj3": 0.000722844994131413, + "B_chdd_chg": 0.01505489048555302, + "u_B_chdd_chg": 0.0023350756878154555, + "B_chdd_cbhre": 0.07710226972790361, + "u_B_chdd_cbhre": 0.0004130390537508072, + "B_chdd_chj3": 0.01360984521596697, + "u_B_chdd_chj3": 0.0005490081844450502, + "B_chg_cbhre": 3.2388139190929364, + "u_B_chg_cbhre": 0.502417075324791, + "B_chg_cbgre": -0.8502530636614156, + "u_B_chg_cbgre": 0.5789898813866357, + "B_chg_chl3": 0.06021643459290391, + "u_B_chg_chl3": 0.009340816961442972, + "B_chg_cll1": -0.03010734578718223, + "u_B_chg_cll1": 0.004670696119193071, + "B_chw_chwb": 0.034622988431727245, + "u_B_chw_chwb": 0.001903796556499108, + "B_chw_chj1": -0.0314371976408077, + "u_B_chw_chj1": 0.01443411354951926, + "B_chw_chq1": 0.010033263805674198, + "u_B_chw_chq1": 0.00031178414971256034, + "B_chw_chj3": 0.19191771625149678, + "u_B_chw_chj3": 0.014183672641928281, + "B_chw_chq3": 0.010033263805674198, + "u_B_chw_chq3": 0.00031178414971256034, + "B_chw_chl3": -0.022779078022575304, + "u_B_chw_chl3": 0.0005846086707812014, + "B_chb_chj1": 0.01777440769439323, + "u_B_chb_chj1": 0.0013123305263675908, + "B_chb_chu": 0.044318802323827726, + "u_B_chb_chu": 0.007926237404796739, + "B_chb_chd": -0.01127060629114664, + "u_B_chb_chd": 0.002184698671952396, + "B_chwb_chj3": 0.06502941274897112, + "u_B_chwb_chj3": 0.0033524712031888296, + "B_chwb_chu": 0.03371399728663664, + "u_B_chwb_chu": 0.007054782136598383, + "B_chwb_chl3": -0.010229549971960442, + "u_B_chwb_chl3": 0.0002532269219642632, + "B_cbhre_cbgre": -1.715241132338949, + "u_B_cbhre_cbgre": 0.07315439098623697, + "B_cbhre_chl3": 0.3083896729534388, + "u_B_cbhre_chl3": 0.0016523265047432652, + "B_cbhre_cll1": -0.1541949185563008, + "u_B_cbhre_cll1": 0.0008261624132423641, + "B_cbgre_chl3": -0.03189039829069975, + "u_B_cbgre_chl3": 0.001360101667616999, + "B_cbgre_cll1": 0.015945239716114397, + "u_B_cbgre_cll1": 0.0006800644960592554, + "B_chj1_chj3": -0.24209552038255278, + "u_B_chj1_chj3": 0.0939608518817221, + "B_chq1_chj3": 0.023908122180287886, + "u_B_chq1_chj3": 0.0007903431851404963, + "B_chj3_chq3": 0.023908122180287886, + "u_B_chj3_chq3": 0.0007903431851404963, + "B_chj3_chl3": -0.05560573640592696, + "u_B_chj3_chl3": 0.0016955670930264377, + "B_chj3_cll1": 0.024215863623884334, + "u_B_chj3_cll1": 0.0007598031714741246, + "B_chu_chl3": -0.012432444939902853, + "u_B_chu_chl3": 0.001367342461109789 + }, + "BBH_FWDH": { + "A_chgtil": 0.34235038069939405, + "u_A_chgtil": 0.26155643577669774, + "A_chbox": 0.12124809729663083, + "u_A_chbox": 0.0006592264026376049, + "A_chg": -0.3732587159659273, + "u_A_chg": 0.5115797559942364, + "A_chw": 0.2802051068870458, + "u_A_chw": 0.01919298381189568, + "A_chb": 0.0429678285718058, + "u_A_chb": 0.008462806641573771, + "A_chwb": 0.12839831416071598, + "u_A_chwb": 0.008297762757124029, + "A_cbhre": -3.8883530980251204, + "u_A_cbhre": 0.12910496019222772, + "A_cbgre": 0.5003229036011844, + "u_A_cbgre": 0.08131659024331249, + "A_chj1": -0.18339920822433195, + "u_A_chj1": 0.05539067238338873, + "A_chq1": 0.047028649463249805, + "u_A_chq1": 0.00245410007365015, + "A_chj3": 0.5819866364093077, + "u_A_chj3": 0.04946330312976407, + "A_chq3": 0.047028649463249805, + "u_A_chq3": 0.00245410007365015, + "A_chu": 0.2198615940283115, + "u_A_chu": 0.04421707983381613, + "A_chd": -0.039687130400648356, + "u_A_chd": 0.021690316211798184, + "A_chl3": -0.18510651621772242, + "u_A_chl3": 0.003536167540200436, + "A_cll1": 0.08466343978900895, + "u_A_cll1": 0.0016301464680827178, + "B_chgtil_2": 73.94120232924767, + "u_B_chgtil_2": 19.084395939419668, + "B_chwtil_2": 0.048849882245851746, + "u_B_chwtil_2": 0.009922330658765556, + "B_cbgim_2": 1.7948174470715963, + "u_B_cbgim_2": 0.8222783656724498, + "B_cbhim_2": 6.387354964466336, + "u_B_cbhim_2": 0.29311608303742354, + "B_chg_2": 73.97726958238303, + "u_B_chg_2": 19.082277360661454, + "B_chw_2": 0.08855236022153154, + "u_B_chw_2": 0.011140659607817984, + "B_chb_2": 0.013274640326522062, + "u_B_chb_2": 0.0030821574033055494, + "B_chwb_2": 0.016852853145118127, + "u_B_chwb_2": 0.0023445153073619247, + "B_cbhre_2": 6.3395147151832925, + "u_B_cbhre_2": 0.21047852091150174, + "B_cbgre_2": 1.7946080170433745, + "u_B_cbgre_2": 0.8222786603471901, + "B_chj1_2": 0.497595717382974, + "u_B_chj1_2": 0.12112458809197975, + "B_chj3_2": 0.474169181870648, + "u_B_chj3_2": 0.11989993755499952, + "B_chu_2": 0.3200001089069406, + "u_B_chu_2": 0.09907145127377527, + "B_chd_2": 0.0756147125424049, + "u_B_chd_2": 0.04031157557524476, + "B_chl3_2": 0.010764367216330319, + "u_B_chl3_2": 0.0004013787804424409, + "B_chgtil_cbgim": 0.24610082930938573, + "u_B_chgtil_cbgim": 0.4145194466467866, + "B_chgtil_cbhim": 1.0483828432709188, + "u_B_chgtil_cbhim": 1.68181559043489, + "B_chgtil_chbox": 0.02075432515223341, + "u_B_chgtil_chbox": 0.015856395351197792, + "B_chgtil_chg": -0.07949440094689578, + "u_B_chgtil_chg": 0.25253348780445345, + "B_chgtil_cbhre": -1.1163011406823258, + "u_B_chgtil_cbhre": 0.8528558428213345, + "B_chgtil_cbgre": 0.18261694115820504, + "u_B_chgtil_cbgre": 0.1348349935947333, + "B_chgtil_chl3": -0.020754898619101878, + "u_B_chgtil_chl3": 0.015856950866362764, + "B_chgtil_cll1": 0.010376820777598352, + "u_B_chgtil_cll1": 0.007928133466601664, + "B_chwtil_chwbtil": 0.025070554803899216, + "u_B_chwtil_chwbtil": 0.005327656654656483, + "B_chwtil_chj1": 0.031240641505885236, + "u_B_chwtil_chj1": 0.04455571093798151, + "B_chwtil_chj3": -0.04858371427681978, + "u_B_chwtil_chj3": 0.044202541175697704, + "B_chbtil_chwbtil": 0.01250135460106925, + "u_B_chbtil_chwbtil": 0.0039812235946566875, + "B_chbtil_chu": -0.010604615415388234, + "u_B_chbtil_chu": 0.015489820379886561, + "B_chwbtil_chj3": -0.010098104543650416, + "u_B_chwbtil_chj3": 0.01011498735385772, + "B_cbgim_cbhim": -1.6376968459520638, + "u_B_cbgim_cbhim": 0.26527350986687886, + "B_cbgim_chg": -0.1799727517113734, + "u_B_cbgim_chg": 0.1347603419204409, + "B_cbhim_chg": 0.7330182076226743, + "u_B_cbhim_chg": 0.6931269427033135, + "B_chbox_chg": -0.022628380374811238, + "u_B_chbox_chg": 0.031013970231156, + "B_chbox_chw": 0.016987167580852874, + "u_B_chbox_chw": 0.001163556400576428, + "B_chbox_cbhre": -0.23572773080882617, + "u_B_chbox_cbhre": 0.007826866131143499, + "B_chbox_cbgre": 0.03033157477374887, + "u_B_chbox_cbgre": 0.004929727804038183, + "B_chbox_chj1": -0.011118405027303298, + "u_B_chbox_chj1": 0.0033580081859228743, + "B_chbox_chj3": 0.03528238287775649, + "u_B_chbox_chj3": 0.002998665200753608, + "B_chbox_chu": 0.013328894507383214, + "u_B_chbox_chu": 0.0026806164718209896, + "B_chbox_chl3": -0.011221904497268046, + "u_B_chbox_chl3": 0.00021437678687335855, + "B_chdd_cbhre": 0.05893794152394685, + "u_B_chdd_cbhre": 0.001956440030288925, + "B_chdd_chj1": -0.014454252368204436, + "u_B_chdd_chj1": 0.0026038399711591264, + "B_chdd_chj3": 0.021886878282644656, + "u_B_chdd_chj3": 0.0024554111150047286, + "B_chdd_chu": -0.024906713631369686, + "u_B_chdd_chu": 0.005045673534015122, + "B_chg_cbhre": 1.2170812973110168, + "u_B_chg_cbhre": 1.6681041296408479, + "B_chg_cbgre": 0.2449058177839552, + "u_B_chg_cbgre": 0.4144193471787899, + "B_chg_chl3": 0.022628488593122633, + "u_B_chg_chl3": 0.03101412125224682, + "B_chg_cll1": -0.011313473962548025, + "u_B_chg_cll1": 0.015507021745730648, + "B_chw_chwb": 0.057221417478794, + "u_B_chw_chwb": 0.0063465125729111555, + "B_chw_chj1": -0.11592328629359895, + "u_B_chw_chj1": 0.050163980334883514, + "B_chw_chq1": 0.01694181490982114, + "u_B_chw_chq1": 0.0012923729827809978, + "B_chw_chj3": 0.3195446400714876, + "u_B_chw_chj3": 0.048104548039628346, + "B_chw_chq3": 0.01694181490982114, + "u_B_chw_chq3": 0.0012923729827809978, + "B_chw_chl3": -0.039324921728400825, + "u_B_chw_chl3": 0.0028283313544116037, + "B_chw_cll1": 0.016965859395338838, + "u_B_chw_cll1": 0.0013021397672784913, + "B_chb_chwb": 0.018699255791690718, + "u_B_chb_chwb": 0.005024451472005379, + "B_chb_chj1": 0.028243987994837697, + "u_B_chb_chj1": 0.004372260980491671, + "B_chb_chu": 0.09790305775239729, + "u_B_chb_chu": 0.02964178544029829, + "B_chb_chd": -0.015086860102545506, + "u_B_chb_chd": 0.008103181601235524, + "B_chwb_chj1": -0.01944903619148595, + "u_B_chwb_chj1": 0.013815804074840217, + "B_chwb_chj3": 0.10198773248043838, + "u_B_chwb_chj3": 0.013027734788386649, + "B_chwb_chu": 0.06629908936816054, + "u_B_chwb_chu": 0.023902798126319475, + "B_chwb_chl3": -0.018512413686427556, + "u_B_chwb_chl3": 0.0012641930780011206, + "B_cbhre_cbgre": -1.631398749450837, + "u_B_cbhre_cbgre": 0.26514835379593193, + "B_cbhre_chl3": 0.2357213838048628, + "u_B_cbhre_chl3": 0.0078271629055128, + "B_cbhre_cll1": -0.11786187959839892, + "u_B_cbhre_cll1": 0.003913527181680842, + "B_cbgre_chl3": -0.03033160868215311, + "u_B_cbgre_chl3": 0.00492974327980514, + "B_cbgre_cll1": 0.015165796260775976, + "u_B_cbgre_cll1": 0.0024648683379885584, + "B_chj1_chq1": -0.010644140478045731, + "u_B_chj1_chq1": 0.003517495727216282, + "B_chj1_chj3": -0.4574978674679921, + "u_B_chj1_chj3": 0.24334925125592377, + "B_chj1_chq3": -0.010644140478045731, + "u_B_chj1_chq3": 0.003517495727216282, + "B_chj1_chl3": 0.025568471150495202, + "u_B_chj1_chl3": 0.008056779023376107, + "B_chj1_cll1": -0.010979779264224424, + "u_B_chj1_cll1": 0.0036463763250335493, + "B_chq1_chj3": 0.03453791736961975, + "u_B_chq1_chj3": 0.00320924983133184, + "B_chq1_chu": 0.012617632334130817, + "u_B_chq1_chu": 0.002776078154380917, + "B_chj3_chq3": 0.03453791736961975, + "u_B_chj3_chq3": 0.00320924983133184, + "B_chj3_chu": -0.01164120291001925, + "u_B_chj3_chu": 0.0015825630671912076, + "B_chj3_chl3": -0.08261458993502609, + "u_B_chj3_chl3": 0.007319769865919732, + "B_chj3_cll1": 0.035923502603967046, + "u_B_chj3_cll1": 0.0033580721447662187, + "B_chq3_chu": 0.012617632334130817, + "u_B_chq3_chu": 0.002776078154380917, + "B_chu_chl3": -0.03237379029693698, + "u_B_chu_chl3": 0.006839568630441449, + "B_chu_cll1": 0.014422717438634174, + "u_B_chu_cll1": 0.0031778802642062863 + }, + "GG2H": { + "A_chl3": -0.12124940439121512, + "u_A_chl3": 7.061899163930699e-06, + "A_chbox": 0.12124789664151688, + "u_A_chbox": 9.98500083241087e-06, + "A_cll1": 0.06062398717704754, + "u_A_cll1": 4.993097923397574e-06, + "A_chdd": -0.030312932318764547, + "u_A_chdd": 2.496842899935894e-06, + "A_chg": 39.53694916058141, + "u_A_chg": 0.012915993306302097, + "A_ctgre": -0.9463183239912191, + "u_A_ctgre": 0.0004011478705041598, + "A_cthre": -0.12188139973424182, + "u_A_cthre": 1.003595942362976e-05, + "B_chl3_ctgre": 0.05741189312138609, + "u_B_chl3_ctgre": 1.7229857484824063e-05, + "B_chbox_chg": 2.397144468108238, + "u_B_chbox_chg": 0.0008033768924885213, + "B_chbox_ctgre": -0.057375265310299566, + "u_B_chbox_ctgre": 2.4326700395734117e-05, + "B_chdd_chg": -0.5992861512341022, + "u_B_chdd_chg": 0.00020084472546405208, + "B_chdd_ctgre": 0.014351525338250732, + "u_B_chdd_ctgre": 6.105934744088747e-06, + "B_chg_2": 245.31981824458572, + "u_B_chg_2": 0.18726937847751263, + "B_chg_chl3": -2.3971447943907984, + "u_B_chg_chl3": 0.0005680739635253434, + "B_chg_cll1": 1.1985723129934482, + "u_B_chg_cll1": 0.0004016864445392507, + "B_chg_ctgre": -18.873885649224764, + "u_B_chg_ctgre": 0.019073076180067823, + "B_chg_cthre": -2.4096491630162165, + "u_B_chg_cthre": 0.0008075674735435706, + "B_ctgre_2": 0.2264297527743815, + "u_B_ctgre_2": 0.00034473955728281684, + "B_ctgre_cll1": -0.02867703844231569, + "u_B_ctgre_cll1": 1.2182378492303528e-05, + "B_cthre_ctgre": 0.05766295469175837, + "u_B_cthre_ctgre": 2.4454755896494503e-05 + }, + "GG2HLL": { + "A_chj3": -0.077272145131424, + "u_A_chj3": 0.0007579647710998809, + "A_chg": -0.34376022491677816, + "u_A_chg": 0.0007465878834240483, + "B_chg_2": 0.08920602034834246, + "u_B_chg_2": 0.002778156052256605, + "A_ctgre": -0.30616472185940324, + "u_A_ctgre": 0.00044783952920928003, + "B_ctgre_2": 0.04518396767849708, + "u_B_ctgre_2": 0.0005175230970453258, + "A_chl3": -0.14740581241845518, + "u_A_chl3": 0.0011459226802975756, + "A_cht": -0.0646559900241428, + "u_A_cht": 0.00019324322104558457, + "A_chq3": -0.08579660633500907, + "u_A_chq3": 0.0005271805209807638, + "A_cthre": 0.06504236920612527, + "u_A_cthre": 0.00019436944364248257, + "A_chdd": 0.026682067910677176, + "u_A_chdd": 0.0018410592688532974, + "A_chu": -0.01639527764663029, + "u_A_chu": 0.0007800014713529694, + "A_cll1": 0.1212480720269582, + "u_A_cll1": 2.6556350106763636e-06, + "A_chq1": 0.04351537604918576, + "u_A_chq1": 0.0005271804213308588, + "A_chbox": 0.12124809916524981, + "u_A_chbox": 2.6483842336528983e-06, + "A_chl1": 0.1440137674268982, + "u_A_chl1": 0.001200103564748898, + "A_che": -0.09571539414388042, + "u_A_che": 0.001275500141850966, + "B_chj3_chg": 0.02656229680653155, + "u_B_chj3_chg": 0.0, + "B_chj3_ctgre": 0.02365756479605352, + "u_B_chj3_ctgre": 3.158144617102321e-07, + "B_chj3_chl1": -0.01195110677087996, + "u_B_chj3_chl1": 0.0, + "B_chg_cht": 0.013389511721584313, + "u_B_chg_cht": 8.594622908910558e-05, + "B_chg_chq3": 0.02064934889745018, + "u_B_chg_chq3": 8.595080253718521e-05, + "B_chg_cthre": -0.013478484994777773, + "u_B_chg_cthre": 8.641878345919888e-05, + "B_chg_cll1": -0.020840118519771522, + "u_B_chg_cll1": 0.0, + "B_chg_chbox": -0.020840140724232015, + "u_B_chg_chbox": 0.0, + "B_chg_chl1": -0.04950517773494312, + "u_B_chg_chl1": 0.0, + "B_chg_che": 0.0329021032641208, + "u_B_chg_che": 0.0, + "B_ctgre_cht": 0.01252223880143788, + "u_B_ctgre_cht": 0.0, + "B_ctgre_chq3": 0.01899126411686325, + "u_B_ctgre_chq3": 0.0, + "B_ctgre_cthre": -0.012585998909742102, + "u_B_ctgre_cthre": 0.0, + "B_ctgre_cll1": -0.01856094167251854, + "u_B_ctgre_cll1": 0.0, + "B_ctgre_chbox": -0.018560952774748785, + "u_B_ctgre_chbox": 0.0, + "B_ctgre_chl1": -0.04409150822226593, + "u_B_ctgre_chl1": 0.0, + "B_ctgre_che": 0.029304081383685343, + "u_B_ctgre_che": 0.0, + "B_chl3_chl1": -0.016123136159507112, + "u_B_chl3_chl1": 0.0, + "B_chl3_che": 0.022071378058541313, + "u_B_chl3_che": 7.733566304883062e-05, + "B_chq3_chl1": -0.012580336772316514, + "u_B_chq3_chl1": 0.0, + "B_chdd_chl1": 0.013095036166532736, + "u_B_chdd_chl1": 7.494971592294167e-05, + "B_chdd_chwb": 0.014528178660100366, + "u_B_chdd_chwb": 9.941843185636377e-05, + "B_cll1_chl1": 0.013096079776175884, + "u_B_cll1_chl1": 0.0, + "B_chbox_chl1": 0.017461543322383477, + "u_B_chbox_chl1": 0.0, + "B_chbox_che": -0.011605272298709224, + "u_B_chbox_che": 0.0, + "B_chwb_che": 0.013519774189063583, + "u_B_chwb_che": 0.00014435154044824196 + }, + "GG2HLL_FWDH": { + "A_chj3": -0.077272145131424, + "u_A_chj3": 0.0007579814318724911, + "A_chg": -0.3352230190722949, + "u_A_chg": 0.0029456634907761296, + "B_chg_2": 0.06351370540613743, + "u_B_chg_2": 0.004371239273324026, + "A_ctgre": -0.2974578923620186, + "u_A_ctgre": 0.002281757824495227, + "B_ctgre_2": 0.04455715796325421, + "u_B_ctgre_2": 0.002461475254835048, + "A_chl3": -0.14740581744554504, + "u_A_chl3": 0.0011784711146297351, + "A_cht": -0.060470126177492034, + "u_A_cht": 0.0009272202625225413, + "A_chq3": -0.08160758490305398, + "u_A_chq3": 0.0010483884863979266, + "A_cthre": 0.0608337370167078, + "u_A_cthre": 0.0009327315056972703, + "A_chdd": 0.02458867119692343, + "u_A_chdd": 0.00189615338815694, + "A_chu": -0.01640158830529259, + "u_A_chu": 0.0007800034951471777, + "A_cll1": 0.12124807267532844, + "u_A_cll1": 0.00019451209778265782, + "A_chq1": 0.03933266508049371, + "u_A_chq1": 0.0010483869305867937, + "A_chbox": 0.12124809980917917, + "u_A_chbox": 0.0001945119989243578, + "A_chl1": 0.1440137674268982, + "u_A_chl1": 0.001200103564748898, + "A_che": -0.09571539414388042, + "u_A_che": 0.001275500141850966, + "B_chj3_chg": 0.02590281322767396, + "u_B_chj3_chg": 0.0, + "B_chj3_ctgre": 0.022984780745360922, + "u_B_chj3_ctgre": 1.4941316236624076e-06, + "B_chj3_chl1": -0.01195110677087996, + "u_B_chj3_chl1": 0.0, + "B_chg_ctgre": 0.01224299550628416, + "u_B_chg_ctgre": 0.004040192239951806, + "B_chg_cht": 0.012218270839525758, + "u_B_chg_cht": 0.00027982913554089686, + "B_chg_chq3": 0.01929831849878383, + "u_B_chg_chq3": 0.000279768068068416, + "B_chg_cthre": -0.012297096674274144, + "u_B_chg_cthre": 0.00028170035019733214, + "B_chg_cll1": -0.020322554750151767, + "u_B_chg_cll1": 0.0, + "B_chg_chbox": -0.02032257695461226, + "u_B_chg_chbox": 0.0, + "B_chg_chl1": -0.04827606092661085, + "u_B_chg_chl1": 0.0, + "B_chg_che": 0.03208521226483185, + "u_B_chg_che": 0.0, + "B_ctgre_cht": 0.011133927113604614, + "u_B_ctgre_cht": 0.0, + "B_ctgre_chq3": 0.01741814470435088, + "u_B_ctgre_chq3": 0.0, + "B_ctgre_cthre": -0.011190415261097542, + "u_B_ctgre_cthre": 0.0, + "B_ctgre_cll1": -0.018033097237690754, + "u_B_ctgre_cll1": 0.0, + "B_ctgre_chbox": -0.018033119442151246, + "u_B_ctgre_chbox": 0.0, + "B_ctgre_chl1": -0.04283761123602403, + "u_B_ctgre_chl1": 0.0, + "B_ctgre_che": 0.028470714674710962, + "u_B_ctgre_che": 0.0, + "B_chl3_chl1": -0.016123136159507112, + "u_B_chl3_chl1": 0.0, + "B_chl3_che": 0.022071378058541313, + "u_B_chl3_che": 7.733566304883062e-05, + "B_chq3_chl1": -0.011977063785195696, + "u_B_chq3_chl1": 0.0, + "B_chdd_chl1": 0.012793544001965529, + "u_B_chdd_chl1": 7.494971592294167e-05, + "B_chdd_chwb": 0.014540879611502078, + "u_B_chdd_chwb": 9.941843185636377e-05, + "B_cll1_chl1": 0.013096079776175884, + "u_B_cll1_chl1": 0.0, + "B_chbox_chl1": 0.017461543322383477, + "u_B_chbox_chl1": 0.0, + "B_chbox_che": -0.011605272298709224, + "u_B_chbox_che": 0.0, + "B_chwb_che": 0.013519774189063583, + "u_B_chwb_che": 0.00014435154044824196 + }, + "GG2HLL_PTV_0_75": { + "A_chj3": -0.077272145131424, + "u_A_chj3": 0.0007579665974127481, + "A_chg": -0.3229815948113668, + "u_A_chg": 0.0018267940334176162, + "B_chg_2": 0.05826819027276997, + "u_B_chg_2": 0.008300322471050078, + "A_ctgre": -0.2195821253803132, + "u_A_ctgre": 0.0007851849240011451, + "B_ctgre_2": 0.018405255097775353, + "u_B_ctgre_2": 0.000295711713478115, + "A_chl3": -0.14740581339989234, + "u_A_chl3": 0.001145921209993401, + "A_cht": -0.03930290685350002, + "u_A_cht": 0.00018731453206765722, + "A_chq3": -0.0604111818436337, + "u_A_chq3": 0.0005249859816931908, + "A_cthre": 0.039532960856014654, + "u_A_cthre": 0.000188518304648502, + "A_chdd": 0.013993552894220329, + "u_A_chdd": 0.0018409087287851315, + "A_chu": -0.0164599565710688, + "u_A_chu": 0.0007800016931923166, + "A_cll1": 0.12124806891833373, + "u_A_cll1": 2.3256777792929667e-06, + "A_chq1": 0.01819463057550763, + "u_A_chq1": 0.0005249855520270896, + "A_chbox": 0.12124809605218445, + "u_A_chbox": 2.317394845991564e-06, + "A_chl1": 0.1440137674268982, + "u_A_chl1": 0.001200103564748898, + "A_che": -0.09571539414388042, + "u_A_che": 0.001275500141850966, + "B_chj3_chg": 0.024956936517384065, + "u_B_chj3_chg": 0.0, + "B_chj3_ctgre": 0.016967371951892574, + "u_B_chj3_ctgre": 4.6059264949827814e-07, + "B_chj3_chl1": -0.01195110677087996, + "u_B_chj3_chl1": 0.0, + "B_chg_ctgre": 0.026449575862841357, + "u_B_chg_ctgre": 0.00041596492166477586, + "B_chg_chq3": 0.01334224952742602, + "u_B_chg_chq3": 0.00010134527784331319, + "B_chg_cll1": -0.019580448373801573, + "u_B_chg_cll1": 0.0, + "B_chg_chbox": -0.019580448373801573, + "u_B_chg_chbox": 0.0, + "B_chg_chl1": -0.0465131932969598, + "u_B_chg_chl1": 0.0, + "B_chg_che": 0.030913571702484433, + "u_B_chg_che": 0.0, + "B_ctgre_cll1": -0.013311962643314246, + "u_B_ctgre_cll1": 0.0, + "B_ctgre_chbox": -0.013311973745544492, + "u_B_ctgre_chbox": 0.0, + "B_ctgre_chl1": -0.031622748863924244, + "u_B_ctgre_chl1": 0.0, + "B_ctgre_che": 0.021017088069896772, + "u_B_ctgre_che": 0.0, + "B_chl3_chl1": -0.016123136159507112, + "u_B_chl3_chl1": 0.0, + "B_chl3_che": 0.022071378058541313, + "u_B_chl3_che": 7.733566304883062e-05, + "B_chdd_chl1": 0.011267697885841699, + "u_B_chdd_chl1": 7.494971592294167e-05, + "B_chdd_chwb": 0.014605250342469844, + "u_B_chdd_chwb": 9.941843185636377e-05, + "B_cll1_chl1": 0.013096079776175884, + "u_B_cll1_chl1": 0.0, + "B_chbox_chl1": 0.017461543322383477, + "u_B_chbox_chl1": 0.0, + "B_chbox_che": -0.011605272298709224, + "u_B_chbox_che": 0.0, + "B_chwb_che": 0.013519774189063583, + "u_B_chwb_che": 0.00014435154044824196 + }, + "GG2HLL_PTV_150_250_0J": { + "A_chj3": -0.077272145131424, + "u_A_chj3": 0.0007579654014098123, + "A_chg": -0.34838396652858705, + "u_A_chg": 0.0025623411202802876, + "B_chg_2": 0.09112151033718874, + "u_B_chg_2": 0.006540649586290649, + "A_ctgre": -0.3708441813277119, + "u_A_ctgre": 0.0007677086567794335, + "B_ctgre_2": 0.05302611683077885, + "u_B_ctgre_2": 0.00047344580322681716, + "A_chl3": -0.1474058088124508, + "u_A_chl3": 0.001145924338942209, + "A_cht": -0.08535323986258447, + "u_A_cht": 0.0004154113637114044, + "A_chq3": -0.10653244387537342, + "u_A_chq3": 0.0006426626761765789, + "A_cthre": 0.08587514954694342, + "u_A_cthre": 0.00041782709080358374, + "A_chdd": 0.037044403500274825, + "u_A_chdd": 0.0018502284210152409, + "A_chu": -0.016318100524159718, + "u_A_chu": 0.0007800015479167965, + "A_cll1": 0.12124807264868309, + "u_A_cll1": 2.981097637474316e-06, + "A_chq1": 0.06417403661806986, + "u_A_chq1": 0.0006426625015105503, + "A_chbox": 0.1212480997869747, + "u_A_chbox": 2.974640291411072e-06, + "A_chl1": 0.1440137674268982, + "u_A_chl1": 0.001200103564748898, + "A_che": -0.09571539414388042, + "u_A_che": 0.001275500141850966, + "B_chj3_chg": 0.026919566575855924, + "u_B_chj3_chg": 0.0, + "B_chj3_ctgre": 0.028655411377087603, + "u_B_chj3_ctgre": 5.217527373684805e-07, + "B_chj3_chl1": -0.01195110677087996, + "u_B_chj3_chl1": 0.0, + "B_chg_ctgre": 0.01474035338233648, + "u_B_chg_ctgre": 0.0008057230073866593, + "B_chg_cht": 0.02059710180191132, + "u_B_chg_cht": 0.00017561595821613646, + "B_chg_chq3": 0.027948154901480393, + "u_B_chg_chq3": 0.0001756027528554416, + "B_chg_cthre": -0.02074576066490863, + "u_B_chg_cthre": 0.00017664095554234272, + "B_chg_cll1": -0.02112042762902888, + "u_B_chg_cll1": 0.0, + "B_chg_chq1": -0.013245982088960773, + "u_B_chg_chq1": 0.00017560273963214358, + "B_chg_chbox": -0.021120449833489374, + "u_B_chg_chbox": 0.0, + "B_chg_chl1": -0.050171033993962055, + "u_B_chg_chl1": 0.0, + "B_chg_che": 0.03334464926396663, + "u_B_chg_che": 0.0, + "B_ctgre_cht": 0.01443954955604454, + "u_B_ctgre_cht": 0.0, + "B_ctgre_chq3": 0.022280988165590543, + "u_B_ctgre_chq3": 0.0, + "B_ctgre_cthre": -0.014512158141855025, + "u_B_ctgre_cthre": 0.0, + "B_ctgre_cll1": -0.022482060657580405, + "u_B_ctgre_cll1": 0.0, + "B_ctgre_chbox": -0.022482082862040897, + "u_B_ctgre_chbox": 0.0, + "B_ctgre_chl1": -0.053406179478798776, + "u_B_ctgre_chl1": 0.0, + "B_ctgre_che": 0.03549478488906743, + "u_B_ctgre_che": 0.0, + "B_chl3_chl1": -0.016123136159507112, + "u_B_chl3_chl1": 0.0, + "B_chl3_che": 0.022071378058541313, + "u_B_chl3_che": 7.733566304883062e-05, + "B_cht_chl1": -0.012292078466202838, + "u_B_cht_chl1": 0.0, + "B_chq3_chl1": -0.015566570255032275, + "u_B_chq3_chl1": 0.0, + "B_cthre_chl1": 0.012367307178351439, + "u_B_cthre_chl1": 0.0, + "B_chdd_chl1": 0.01458737575177338, + "u_B_chdd_chl1": 7.494971592294167e-05, + "B_chdd_chwb": 0.01446522901460412, + "u_B_chdd_chwb": 9.941843185636377e-05, + "B_cll1_chl1": 0.013096079776175884, + "u_B_cll1_chl1": 0.0, + "B_chbox_chl1": 0.017461543322383477, + "u_B_chbox_chl1": 0.0, + "B_chbox_che": -0.011605272298709224, + "u_B_chbox_che": 0.0, + "B_chwb_che": 0.013519774189063583, + "u_B_chwb_che": 0.00014435154044824196 + }, + "GG2HLL_PTV_150_250_GE1J": { + "A_chj3": -0.077272145131424, + "u_A_chj3": 0.0007579660757685937, + "A_chg": -0.34757805828178334, + "u_A_chg": 0.0017196681753593858, + "B_chg_2": 0.09441925019615383, + "u_B_chg_2": 0.007062593958678359, + "A_ctgre": -0.3427008533218867, + "u_A_ctgre": 0.0007161824537187919, + "B_ctgre_2": 0.04791984586915987, + "u_B_ctgre_2": 0.0004272969349130982, + "A_chl3": -0.14740580925654, + "u_A_chl3": 0.001145920316049405, + "A_cht": -0.07499585577441792, + "u_A_cht": 0.0003377593587839913, + "A_chq3": -0.0961566504820155, + "u_A_chq3": 0.0005954378951825718, + "A_cthre": 0.07545055311197757, + "u_A_cthre": 0.0003397555335813356, + "A_chdd": 0.03185915434578135, + "u_A_chdd": 0.0018462697120466508, + "A_chu": -0.016354917140581904, + "u_A_chu": 0.0007800016298292828, + "A_cll1": 0.12124807082791733, + "u_A_cll1": 2.083182482276897e-06, + "A_chq1": 0.05383505966349844, + "u_A_chq1": 0.000595437599357189, + "A_chbox": 0.12124809796176805, + "u_A_chbox": 2.0739312895070886e-06, + "A_chl1": 0.1440137674268982, + "u_A_chl1": 0.001200103564748898, + "A_che": -0.09571539414388042, + "u_A_che": 0.001275500141850966, + "B_chj3_chg": 0.026857271961944207, + "u_B_chj3_chg": 0.0, + "B_chj3_ctgre": 0.026480762027603078, + "u_B_chj3_ctgre": 5.240896945296808e-07, + "B_chj3_chl1": -0.01195110677087996, + "u_B_chj3_chl1": 0.0, + "B_chg_ctgre": 0.015830448063525182, + "u_B_chg_ctgre": 0.0009165743277072312, + "B_chg_cht": 0.017460433099358852, + "u_B_chg_cht": 0.00012524582400925648, + "B_chg_chq3": 0.02479638716579302, + "u_B_chg_chq3": 0.0001252416214595419, + "B_chg_cthre": -0.01758222456516023, + "u_B_chg_cthre": 0.00012601945253001303, + "B_chg_cll1": -0.021071577815945375, + "u_B_chg_cll1": 0.0, + "B_chg_chq1": -0.010124423521773451, + "u_B_chg_chq1": 0.00012524155245626853, + "B_chg_chbox": -0.02107158891817562, + "u_B_chg_chbox": 0.0, + "B_chg_chl1": -0.05005491576781651, + "u_B_chg_chl1": 0.0, + "B_chg_che": 0.033267477661524936, + "u_B_chg_che": 0.0, + "B_ctgre_cht": 0.012962919626602343, + "u_B_ctgre_cht": 0.0, + "B_ctgre_chq3": 0.0202066474663809, + "u_B_ctgre_chq3": 0.0, + "B_ctgre_cthre": -0.013028333967213257, + "u_B_ctgre_cthre": 0.0, + "B_ctgre_cll1": -0.020775903220027203, + "u_B_ctgre_cll1": 0.0, + "B_ctgre_chbox": -0.020775936526717942, + "u_B_ctgre_chbox": 0.0, + "B_ctgre_chl1": -0.04935319930510218, + "u_B_ctgre_chl1": 0.0, + "B_ctgre_che": 0.0328010951733404, + "u_B_ctgre_che": 0.0, + "B_chl3_chl1": -0.016123136159507112, + "u_B_chl3_chl1": 0.0, + "B_chl3_che": 0.022071378058541313, + "u_B_chl3_che": 7.733566304883062e-05, + "B_cht_chl1": -0.010800449423697955, + "u_B_cht_chl1": 0.0, + "B_chq3_chl1": -0.014072321086189277, + "u_B_chq3_chl1": 0.0, + "B_cthre_chl1": 0.010865996991071825, + "u_B_cthre_chl1": 0.0, + "B_chdd_chl1": 0.013840617540950007, + "u_B_chdd_chl1": 7.494971592294167e-05, + "B_chdd_chwb": 0.014496759348503474, + "u_B_chdd_chwb": 9.941843185636377e-05, + "B_cll1_chl1": 0.013096079776175884, + "u_B_cll1_chl1": 0.0, + "B_chbox_chl1": 0.017461543322383477, + "u_B_chbox_chl1": 0.0, + "B_chbox_che": -0.011605272298709224, + "u_B_chbox_che": 0.0, + "B_chwb_che": 0.013519774189063583, + "u_B_chwb_che": 0.00014435154044824196 + }, + "GG2HLL_PTV_75_150": { + "A_chj3": -0.077272145131424, + "u_A_chj3": 0.0007579651033701877, + "A_chg": -0.3595545826362567, + "u_A_chg": 0.000837180127535671, + "B_chg_2": 0.05336440178638213, + "u_B_chg_2": 0.0025779816974151417, + "A_ctgre": -0.2668981331099829, + "u_A_ctgre": 0.00039660936080960867, + "B_ctgre_2": 0.024624591254962525, + "u_B_ctgre_2": 0.00014152480136857149, + "A_chl3": -0.147405816006696, + "u_A_chl3": 0.0011459183172377646, + "A_cht": -0.046157323518869475, + "u_A_cht": 0.00012893675672107286, + "A_chq3": -0.06728053282500923, + "u_A_chq3": 0.0005071570358184628, + "A_cthre": 0.046432238232085865, + "u_A_cthre": 0.00012974525861736075, + "A_chdd": 0.01742529010861915, + "u_A_chdd": 0.0018396513328014599, + "A_chu": -0.016430088121133224, + "u_A_chu": 0.0007800015117130263, + "A_cll1": 0.12124807540647708, + "u_A_cll1": 1.4302583705788262e-06, + "A_chq1": 0.02503411294263458, + "u_A_chq1": 0.0005071568701603338, + "A_chbox": 0.1212481025447687, + "u_A_chbox": 1.416750064669841e-06, + "A_chl1": 0.1440137674268982, + "u_A_chl1": 0.001200103564748898, + "A_che": -0.09571539414388042, + "u_A_che": 0.001275500141850966, + "B_chj3_chg": 0.027783031431027894, + "u_B_chj3_chg": 0.0, + "B_chj3_ctgre": 0.0206235251098974, + "u_B_chj3_ctgre": 2.911723939101156e-07, + "B_chj3_chl1": -0.01195110677087996, + "u_B_chj3_chl1": 0.0, + "B_chg_ctgre": 0.03630876710403186, + "u_B_chg_ctgre": 0.00016735829434133076, + "B_chg_chq3": 0.01704907326427474, + "u_B_chg_chq3": 5.579513957954658e-05, + "B_chg_cll1": -0.021797641469589735, + "u_B_chg_cll1": 0.0, + "B_chg_chbox": -0.02179765257181998, + "u_B_chg_chbox": 0.0, + "B_chg_chl1": -0.05178030226815622, + "u_B_chg_chl1": 0.0, + "B_chg_che": 0.03441420481919977, + "u_B_chg_che": 0.0, + "B_ctgre_chq3": 0.011880063599534196, + "u_B_ctgre_chq3": 0.0, + "B_ctgre_cll1": -0.016180445872038263, + "u_B_ctgre_cll1": 0.0, + "B_ctgre_chbox": -0.01618045697426851, + "u_B_ctgre_chbox": 0.0, + "B_ctgre_chl1": -0.03843684259763336, + "u_B_ctgre_chl1": 0.0, + "B_ctgre_che": 0.025545876525256972, + "u_B_ctgre_che": 0.0, + "B_chl3_chl1": -0.016123136159507112, + "u_B_chl3_chl1": 0.0, + "B_chl3_che": 0.022071378058541313, + "u_B_chl3_che": 7.733566304883062e-05, + "B_chdd_chl1": 0.011761902563023341, + "u_B_chdd_chl1": 7.494971592294167e-05, + "B_chdd_chwb": 0.014584378149606891, + "u_B_chdd_chwb": 9.941843185636377e-05, + "B_cll1_chl1": 0.013096079776175884, + "u_B_cll1_chl1": 0.0, + "B_chbox_chl1": 0.017461543322383477, + "u_B_chbox_chl1": 0.0, + "B_chbox_che": -0.011605272298709224, + "u_B_chbox_che": 0.0, + "B_chwb_che": 0.013519774189063583, + "u_B_chwb_che": 0.00014435154044824196 + }, + "GG2HLL_PTV_GT250": { + "A_chj3": -0.077272145131424, + "u_A_chj3": 0.0007579711810517407, + "A_chg": -0.2903124198017082, + "u_A_chg": 0.004075916324958759, + "B_chg_2": 0.3035301787690514, + "u_B_chg_2": 0.01566301022000893, + "A_ctgre": -0.49558538951721687, + "u_A_ctgre": 0.0028285176313476495, + "B_ctgre_2": 0.17723413847647862, + "u_B_ctgre_2": 0.005285784521581384, + "A_chl3": -0.14740581237404626, + "u_A_chl3": 0.001146568440979645, + "A_cht": -0.1528866339572943, + "u_A_cht": 0.0013924321624396812, + "B_cht_2": 0.010431167041247136, + "u_B_cht_2": 0.0002711992459254548, + "A_chq3": -0.17408061999901747, + "u_A_chq3": 0.0014758438083292609, + "B_chq3_2": 0.013360734740786029, + "u_B_chq3_2": 0.00027159485557136376, + "A_cthre": 0.15378544117705673, + "u_A_cthre": 0.001400256947627743, + "B_cthre_2": 0.010553424800718858, + "u_B_cthre_2": 0.00027420112144534446, + "A_chdd": 0.07082334176011784, + "u_A_chdd": 0.001966025878332139, + "A_chu": -0.016288544517628623, + "u_A_chu": 0.000780002249963343, + "A_cll1": 0.1212480716361597, + "u_A_cll1": 2.7335910853973895e-05, + "A_chq1": 0.1316926567529464, + "u_A_chq1": 0.0014758433612272158, + "A_chbox": 0.12124809877445131, + "u_A_chbox": 2.7335207406484757e-05, + "A_chl1": 0.1440137674268982, + "u_A_chl1": 0.001200103564748898, + "A_che": -0.09571539414388042, + "u_A_che": 0.001275500141850966, + "B_chj3_chg": 0.022430635127079768, + "u_B_chj3_chg": 0.0, + "B_chj3_ctgre": 0.03829343508954253, + "u_B_chj3_ctgre": 1.9949958062457715e-06, + "B_chj3_cht": 0.011813749978273336, + "u_B_chj3_cht": 1.0011288181307918e-06, + "B_chj3_chq3": 0.015126777608287512, + "u_B_chj3_chq3": 7.077414993365977e-07, + "B_chj3_cthre": -0.011883383166377826, + "u_B_chj3_cthre": 1.006870734597081e-06, + "B_chj3_chl1": -0.01195110677087996, + "u_B_chj3_chl1": 0.0, + "B_chg_ctgre": -0.19461432465561757, + "u_B_chg_ctgre": 0.011200126676787752, + "B_chg_cht": 0.027463276097705602, + "u_B_chg_cht": 0.0007846167321079423, + "B_chg_chq3": 0.03359418299098138, + "u_B_chg_chq3": 0.0007846519343541383, + "B_chg_cthre": -0.027672530933386952, + "u_B_chg_cthre": 0.0007885930556454301, + "B_chg_chdd": -0.012118639425295896, + "u_B_chg_chdd": 0.0, + "B_chg_cll1": -0.017599921520172757, + "u_B_chg_cll1": 0.0, + "B_chg_chq1": -0.02133225818212736, + "u_B_chg_chq1": 0.0007846519084880498, + "B_chg_chbox": -0.01759991041794251, + "u_B_chg_chbox": 0.0, + "B_chg_chl1": -0.04180482626736648, + "u_B_chg_chl1": 0.0, + "B_chg_che": 0.027784308187506213, + "u_B_chg_che": 0.0, + "B_ctgre_chl3": 0.012965251094954056, + "u_B_ctgre_chl3": 0.0, + "B_ctgre_cht": 0.053615911710380715, + "u_B_ctgre_cht": 0.0, + "B_ctgre_chq3": 0.06409976993637656, + "u_B_ctgre_chq3": 0.0, + "B_ctgre_cthre": -0.0538940669869703, + "u_B_ctgre_cthre": 0.0, + "B_ctgre_chdd": -0.02399747067727276, + "u_B_ctgre_chdd": 0.0, + "B_ctgre_cll1": -0.030044378096505397, + "u_B_ctgre_cll1": 0.0, + "B_ctgre_chq1": -0.0431318203375497, + "u_B_ctgre_chq1": 0.0, + "B_ctgre_chbox": -0.03004440030096589, + "u_B_ctgre_chbox": 0.0, + "B_ctgre_chl1": -0.07136893298564928, + "u_B_ctgre_chl1": 0.0, + "B_ctgre_che": 0.047433179606315434, + "u_B_ctgre_che": 0.0, + "B_chl3_chl1": -0.016123136159507112, + "u_B_chl3_chl1": 0.0, + "B_chl3_che": 0.022071378058541313, + "u_B_chl3_che": 7.733566304883062e-05, + "B_cht_chq3": 0.0240958253350243, + "u_B_cht_chq3": 0.0, + "B_cht_cthre": -0.020984147752756144, + "u_B_cht_cthre": 0.0005453921138431344, + "B_cht_chq1": -0.017628665194280302, + "u_B_cht_chq1": 0.0, + "B_cht_chl1": -0.022017743184221672, + "u_B_cht_chl1": 0.0, + "B_cht_che": 0.014633416700604585, + "u_B_cht_che": 0.0, + "B_chq3_cthre": -0.024236734841309726, + "u_B_chq3_cthre": 0.0005452242621086193, + "B_chq3_chdd": -0.011213163730872111, + "u_B_chq3_chdd": 0.0, + "B_chq3_cll1": -0.011192247129088173, + "u_B_chq3_cll1": 1.4869084325619812e-05, + "B_chq3_chq1": -0.021470158984016052, + "u_B_chq3_chq1": 0.0005420645563888161, + "B_chq3_chbox": -0.011831013946306257, + "u_B_chq3_chbox": 0.0, + "B_chq3_chl1": -0.025294355499028143, + "u_B_chq3_chl1": 0.0, + "B_chq3_che": 0.016441059624838772, + "u_B_chq3_che": 0.0, + "B_cthre_chq1": 0.017731482948590838, + "u_B_cthre_chq1": 0.0, + "B_cthre_chl1": 0.022147483846879368, + "u_B_cthre_chl1": 0.0, + "B_cthre_che": -0.01471964772292722, + "u_B_cthre_che": 0.0, + "B_chdd_chl1": 0.019452084387694413, + "u_B_chdd_chl1": 7.494971592294167e-05, + "B_chdd_chwb": 0.014260104208574376, + "u_B_chdd_chwb": 9.941843185636377e-05, + "B_cll1_chl1": 0.013096079776175884, + "u_B_cll1_chl1": 0.0, + "B_chq1_chl1": 0.01874134181178988, + "u_B_chq1_chl1": 0.0, + "B_chq1_che": -0.012825918105363598, + "u_B_chq1_che": 0.0, + "B_chbox_chl1": 0.017461543322383477, + "u_B_chbox_chl1": 0.0, + "B_chbox_che": -0.011605272298709224, + "u_B_chbox_che": 0.0, + "B_chwb_che": 0.013519774189063583, + "u_B_chwb_che": 0.00014435154044824196 + }, + "GG2H_0J_PTH_0_10": { + "A_chl3": -0.12127317742914942, + "u_A_chl3": 4.096431620882687e-06, + "A_chbox": 0.12127164833089059, + "u_A_chbox": 5.756597668907466e-06, + "A_cll1": 0.060635909031081216, + "u_A_cll1": 2.870264400012574e-06, + "A_chdd": -0.03031884954842928, + "u_A_chdd": 1.4420157588047452e-06, + "A_chg": 39.32673955371397, + "u_A_chg": 0.0018728949428923624, + "A_ctgre": -0.9382492494966725, + "u_A_ctgre": 4.460118132355155e-05, + "A_cthre": -0.12190526093262592, + "u_A_cthre": 5.762990436479557e-06, + "B_chl3_ctgre": 0.056928519453446076, + "u_B_chl3_ctgre": 3.5696105411681713e-06, + "B_chbox_chg": 2.3845601448605747, + "u_B_chbox_chg": 0.0001172856487658373, + "B_chbox_ctgre": -0.05688692985076568, + "u_B_chbox_ctgre": 3.1806581275623055e-06, + "B_chdd_chg": -0.5961399912275412, + "u_B_chdd_chg": 2.9395597495784697e-05, + "B_chdd_ctgre": 0.01423945792226843, + "u_B_chdd_ctgre": 1.870064931397783e-06, + "B_chg_2": 241.26611071419495, + "u_B_chg_2": 0.008672252944441518, + "B_chg_chl3": -2.384560485102948, + "u_B_chg_chl3": 8.303677627751615e-05, + "B_chg_cll1": 1.1922801593811159, + "u_B_chg_cll1": 5.862992059091255e-05, + "B_chg_ctgre": -18.448711950335916, + "u_B_chg_ctgre": 0.0009067427697949096, + "B_chg_cthre": -2.396999096024705, + "u_B_chg_cthre": 0.00011804252738259752, + "B_ctgre_2": 0.2199992504259565, + "u_B_ctgre_2": 1.0614589648569004e-05, + "B_ctgre_cll1": -0.028426863660551787, + "u_B_ctgre_cll1": 2.0938229762703014e-06, + "B_cthre_ctgre": 0.05717308590999514, + "u_B_cthre_ctgre": 3.3208993611887045e-06 + }, + "GG2H_0J_PTH_GT10": { + "A_chl3": -0.12127156878208818, + "u_A_chl3": 2.3128361056431056e-06, + "A_chbox": 0.12127012191189766, + "u_A_chbox": 3.2594907656771018e-06, + "A_cll1": 0.06063507005340997, + "u_A_cll1": 1.6315588885869654e-06, + "A_chdd": -0.030318504342496725, + "u_A_chdd": 8.181089753887266e-07, + "A_chg": 39.32635610348767, + "u_A_chg": 0.0011347344158544313, + "A_ctgre": -0.9382671545330163, + "u_A_ctgre": 2.6552826934816835e-05, + "A_cthre": -0.12190369926484507, + "u_A_cthre": 3.2670930394626764e-06, + "B_chl3_ctgre": 0.05693018540184976, + "u_B_chl3_ctgre": 2.072445818798249e-06, + "B_chbox_chg": 2.38456829460705, + "u_B_chbox_chg": 7.005540156132693e-05, + "B_chbox_ctgre": -0.05688847131512432, + "u_B_chbox_ctgre": 1.8823987406396836e-06, + "B_chdd_chg": -0.5961420925751763, + "u_B_chdd_chg": 1.7497408154773656e-05, + "B_chdd_ctgre": 0.014240914987842085, + "u_B_chdd_ctgre": 1.0753192296787557e-06, + "B_chg_2": 241.2663745683978, + "u_B_chg_2": 0.005922965333016372, + "B_chg_chl3": -2.3845687235377606, + "u_B_chg_chl3": 4.94895502604976e-05, + "B_chg_cll1": 1.1922842557977633, + "u_B_chg_cll1": 3.4996467555648056e-05, + "B_chg_ctgre": -18.449238500942997, + "u_B_chg_ctgre": 0.000575172329946288, + "B_chg_cthre": -2.3970073104127643, + "u_B_chg_cthre": 7.044790361781551e-05, + "B_ctgre_2": 0.2200173217271043, + "u_B_ctgre_2": 7.203477819994278e-06, + "B_ctgre_cll1": -0.02842448732075444, + "u_B_ctgre_cll1": 1.2232761143427468e-06, + "B_cthre_ctgre": 0.05717435229262114, + "u_B_cthre_ctgre": 1.9494071797866368e-06 + }, + "GG2H_1J_PTH_0_60": { + "A_chl3": -0.12127176042581393, + "u_A_chl3": 4.181472107032666e-06, + "A_chbox": 0.12127023323103334, + "u_A_chbox": 5.856378310745773e-06, + "A_cll1": 0.060635182371260296, + "u_A_cll1": 2.944310818150651e-06, + "A_chdd": -0.030318485158085492, + "u_A_chdd": 1.4720357328079302e-06, + "A_chg": 39.418388627079175, + "u_A_chg": 0.010351448713050413, + "A_ctgre": -0.9407007277913618, + "u_A_ctgre": 0.0003045863532611973, + "A_cthre": -0.12190389915284419, + "u_A_cthre": 5.8955932540202655e-06, + "B_chl3_ctgre": 0.05707175458936881, + "u_B_chl3_ctgre": 1.3340976980521044e-05, + "B_chbox_chg": 2.390506283658691, + "u_B_chbox_chg": 0.000591087433449153, + "B_chbox_ctgre": -0.05703328750317186, + "u_B_chbox_ctgre": 1.8551994475296924e-05, + "B_chdd_chg": -0.5976266371537928, + "u_B_chdd_chg": 0.0001477738514290441, + "B_chdd_ctgre": 0.014263471216702617, + "u_B_chdd_ctgre": 4.90729186258523e-06, + "B_chg_2": 242.49043916786687, + "u_B_chg_2": 0.08756275293224854, + "B_chg_chl3": -2.3905066265435484, + "u_B_chg_chl3": 0.00041795398867725095, + "B_chg_cll1": 1.1952532898932613, + "u_B_chg_cll1": 0.00029552964204930803, + "B_chg_ctgre": -18.561347895646346, + "u_B_chg_ctgre": 0.01048693744967657, + "B_chg_cthre": -2.4029763668823216, + "u_B_chg_cthre": 0.0005941709165360837, + "B_ctgre_2": 0.221332788152191, + "u_B_ctgre_2": 0.00011396017638399976, + "B_ctgre_cll1": -0.028509205882624743, + "u_B_ctgre_cll1": 9.425595662593952e-06, + "B_cthre_ctgre": 0.05731926006419933, + "u_B_cthre_ctgre": 1.8640403152929735e-05 + }, + "GG2H_1J_PTH_120_200": { + "A_chl3": -0.12124280584363574, + "u_A_chl3": 9.214398128293364e-06, + "A_chbox": 0.12124150291422746, + "u_A_chbox": 1.2966574308693622e-05, + "A_cll1": 0.0606208809291941, + "u_A_cll1": 6.488172284261487e-06, + "A_chdd": -0.030311384192933926, + "u_A_chdd": 3.246391349279242e-06, + "A_chg": 39.5275919030324, + "u_A_chg": 0.15341002737856382, + "A_ctgre": -0.9596350643780883, + "u_A_ctgre": 0.004145221074335511, + "A_cthre": -0.12187501913146466, + "u_A_cthre": 1.298776017206977e-05, + "B_chl3_ctgre": 0.05821251660139361, + "u_B_chl3_ctgre": 0.00017776478934950415, + "B_chbox_chg": 2.3923824920425245, + "u_B_chbox_chg": 0.010288138080217474, + "B_chbox_ctgre": -0.05818486735455449, + "u_B_chbox_ctgre": 0.0002512001150260856, + "B_chdd_chg": -0.5980955042212889, + "u_B_chdd_chg": 0.0025720323247491843, + "B_chdd_ctgre": 0.014534837590164794, + "u_B_chdd_ctgre": 6.297015307202335e-05, + "B_chg_2": 252.38448206781524, + "u_B_chg_2": 1.3180452211155607, + "B_chg_chl3": -2.392382175270945, + "u_B_chg_chl3": 0.00727480705346986, + "B_chg_cll1": 1.1961912064248152, + "u_B_chg_cll1": 0.005144075781234481, + "B_chg_ctgre": -19.342592799714776, + "u_B_chg_ctgre": 0.12327007941633444, + "B_chg_cthre": -2.4048619532176083, + "u_B_chg_cthre": 0.010341820095742946, + "B_ctgre_2": 0.23721015776132118, + "u_B_ctgre_2": 0.0016297325358995334, + "B_ctgre_cll1": -0.029089030829227105, + "u_B_ctgre_cll1": 0.00012570636589371995, + "B_cthre_ctgre": 0.05847008937796454, + "u_B_cthre_ctgre": 0.00025262228258840985 + }, + "GG2H_1J_PTH_60_120": { + "A_chl3": -0.12118480688018059, + "u_A_chl3": 4.035998145266853e-05, + "A_chbox": 0.12118324788114228, + "u_A_chbox": 5.707481303185528e-05, + "A_cll1": 0.06059160868162235, + "u_A_cll1": 2.8538758074608265e-05, + "A_chdd": -0.030296765999419432, + "u_A_chdd": 1.4269509782086741e-05, + "A_chg": 39.6279940898567, + "u_A_chg": 0.02218870395077352, + "A_ctgre": -0.9450756424275899, + "u_A_ctgre": 0.0008177506794606641, + "A_cthre": -0.12181640115015452, + "u_A_cthre": 5.7372362696699e-05, + "B_chl3_ctgre": 0.05732397159467195, + "u_B_chl3_ctgre": 3.518519508341128e-05, + "B_chbox_chg": 2.401269338819996, + "u_B_chbox_chg": 0.0017547688075292055, + "B_chbox_ctgre": -0.05729959401842634, + "u_B_chbox_ctgre": 4.963935495586142e-05, + "B_chdd_chg": -0.6003173618199243, + "u_B_chdd_chg": 0.00043869658840453937, + "B_chdd_ctgre": 0.014314628274844638, + "u_B_chdd_ctgre": 1.2560524421900121e-05, + "B_chg_2": 245.05248075447875, + "u_B_chg_2": 0.25838355500226706, + "B_chg_chl3": -2.4012692943693, + "u_B_chg_chl3": 0.0012408047990278201, + "B_chg_cll1": 1.2006346205142318, + "u_B_chg_cll1": 0.0008773782582580716, + "B_chg_ctgre": -18.800253353991465, + "u_B_chg_ctgre": 0.021247330607290196, + "B_chg_cthre": -2.413795509701795, + "u_B_chg_cthre": 0.0017639301128114188, + "B_ctgre_2": 0.22419055857849704, + "u_B_ctgre_2": 0.0002760395211965834, + "B_ctgre_cll1": -0.028653435133399956, + "u_B_ctgre_cll1": 2.4850859072623728e-05, + "B_cthre_ctgre": 0.057583001564393166, + "u_B_cthre_ctgre": 4.9844397467479766e-05 + }, + "GG2H_FWDH": { + "A_chl3": -0.12113705099629242, + "u_A_chl3": 6.365125327454071e-05, + "A_chbox": 0.12113536122132898, + "u_A_chbox": 9.00100785496828e-05, + "A_cll1": 0.06056756407446015, + "u_A_cll1": 4.500581616288944e-05, + "A_chdd": -0.030284836308686437, + "u_A_chdd": 2.2503414923299625e-05, + "A_chg": 39.473287021230725, + "u_A_chg": 0.058366722299742345, + "A_ctgre": -0.9457123045999102, + "u_A_ctgre": 0.001438470558887084, + "A_cthre": -0.12176821216828668, + "u_A_cthre": 9.048000203337226e-05, + "B_chl3_ctgre": 0.05736814269071882, + "u_B_chl3_ctgre": 6.180638689511145e-05, + "B_chbox_chg": 2.3964375990716213, + "u_B_chbox_chg": 0.0030854151799032258, + "B_chbox_ctgre": -0.05734090302035579, + "u_B_chbox_ctgre": 8.721807835597705e-05, + "B_chdd_chg": -0.599109470100819, + "u_B_chdd_chg": 0.0007713604932044034, + "B_chdd_ctgre": 0.014341880448465827, + "u_B_chdd_ctgre": 2.1889360547312956e-05, + "B_chg_2": 243.33532864809993, + "u_B_chg_2": 0.4500636861147957, + "B_chg_chl3": -2.3964381398839287, + "u_B_chg_chl3": 0.0021817271043393484, + "B_chg_cll1": 1.1982187858789335, + "u_B_chg_cll1": 0.0015427132424113495, + "B_chg_ctgre": -18.839119398831656, + "u_B_chg_ctgre": 0.062001801370048196, + "B_chg_cthre": -2.408938625802407, + "u_B_chg_cthre": 0.00310152658527312, + "B_ctgre_2": 0.225551968774472, + "u_B_ctgre_2": 0.0009269474190651685, + "B_ctgre_cll1": -0.02865962515208383, + "u_B_ctgre_cll1": 4.3671280401724005e-05, + "B_cthre_ctgre": 0.057624164748443084, + "u_B_cthre_ctgre": 8.772739686214527e-05 + }, + "GG2H_GE2J_MJJ_0_350_PTH_0_60": { + "A_chl3": -0.1212429613167544, + "u_A_chl3": 9.49082736859479e-06, + "A_chbox": 0.121241345242174, + "u_A_chbox": 1.3359116230088215e-05, + "A_cll1": 0.060620760054865594, + "u_A_cll1": 6.682596423213725e-06, + "A_chdd": -0.030311476430441058, + "u_A_chdd": 3.3491727025446917e-06, + "A_chg": 39.32401708628018, + "u_A_chg": 0.05625143216728009, + "A_ctgre": -0.9384273582655763, + "u_A_ctgre": 0.0016352294964950705, + "A_cthre": -0.12187500559887336, + "u_A_cthre": 1.3411901937768955e-05, + "B_chl3_ctgre": 0.056934030061451445, + "u_B_chl3_ctgre": 7.031333911324747e-05, + "B_chbox_chg": 2.376948013654613, + "u_B_chbox_chg": 0.003738064853402624, + "B_chbox_ctgre": -0.05688867571703341, + "u_B_chbox_ctgre": 9.916866842574753e-05, + "B_chdd_chg": -0.5942372848464005, + "u_B_chdd_chg": 0.000934506812922967, + "B_chdd_ctgre": 0.014224058753134865, + "u_B_chdd_ctgre": 2.5040457091925556e-05, + "B_chg_2": 240.98476333616657, + "u_B_chg_2": 0.6457819339760914, + "B_chg_chl3": -2.376947661598576, + "u_B_chg_chl3": 0.002643180975561869, + "B_chg_cll1": 1.1884734745016121, + "u_B_chg_cll1": 0.0018690291563995228, + "B_chg_ctgre": -18.463108041134785, + "u_B_chg_ctgre": 0.043512693651168145, + "B_chg_cthre": -2.389347473921501, + "u_B_chg_cthre": 0.0037575234728643905, + "B_ctgre_2": 0.22128748046565094, + "u_B_ctgre_2": 0.000665580700387834, + "B_ctgre_cll1": -0.02844835329631476, + "u_B_ctgre_cll1": 4.9973687758535775e-05, + "B_cthre_ctgre": 0.057185359935799894, + "u_B_cthre_ctgre": 9.97595052300919e-05 + }, + "GG2H_GE2J_MJJ_0_350_PTH_120_200": { + "A_chl3": -0.12126520787209362, + "u_A_chl3": 8.496688593583532e-06, + "A_chbox": 0.12126424063322831, + "u_A_chbox": 1.1969129177781861e-05, + "A_cll1": 0.060631969430072985, + "u_A_cll1": 5.991580143997847e-06, + "A_chdd": -0.030316947905311288, + "u_A_chdd": 2.996120585848588e-06, + "A_chg": 39.45963768471028, + "u_A_chg": 0.12371159699635882, + "A_ctgre": -0.951899727725568, + "u_A_ctgre": 0.0040947576940862365, + "A_cthre": -0.12189755482452778, + "u_A_cthre": 1.1983253346039846e-05, + "B_chl3_ctgre": 0.05772624328587674, + "u_B_chl3_ctgre": 0.00017580691132015658, + "B_chbox_chg": 2.403339036613919, + "u_B_chbox_chg": 0.006275000455941801, + "B_chbox_ctgre": -0.05771344560231758, + "u_B_chbox_ctgre": 0.00024829790526304234, + "B_chdd_chg": -0.6008347684487522, + "u_B_chdd_chg": 0.0015687594108401515, + "B_chdd_ctgre": 0.014418179529781345, + "u_B_chdd_ctgre": 6.215893399528157e-05, + "B_chg_2": 244.53959638201493, + "u_B_chg_2": 1.1347585768775565, + "B_chg_chl3": -2.4033389791522337, + "u_B_chg_chl3": 0.004437111008968262, + "B_chg_cll1": 1.201669401693541, + "u_B_chg_cll1": 0.003137510366672608, + "B_chg_ctgre": -19.224085520932764, + "u_B_chg_ctgre": 0.10153262040712724, + "B_chg_cthre": -2.415875780169308, + "u_B_chg_cthre": 0.006307768428425738, + "B_ctgre_2": 0.23678598024018324, + "u_B_ctgre_2": 0.003761916846557817, + "B_ctgre_cll1": -0.02885730371431511, + "u_B_ctgre_cll1": 0.0001241236538154158, + "B_cthre_ctgre": 0.05799931123226982, + "u_B_cthre_ctgre": 0.0002494366683510265 + }, + "GG2H_GE2J_MJJ_0_350_PTH_60_120": { + "A_chl3": -0.12115423634864159, + "u_A_chl3": 7.728387354073423e-05, + "A_chbox": 0.12115237118847332, + "u_A_chbox": 0.00010928661301232476, + "A_cll1": 0.060576401594526284, + "u_A_cll1": 5.46441364099658e-05, + "A_chdd": -0.03028904135562561, + "u_A_chdd": 2.7322670773250418e-05, + "A_chg": 39.141860581480636, + "u_A_chg": 0.06318240786055733, + "A_ctgre": -0.9375663285391576, + "u_A_ctgre": 0.0015178491142404014, + "A_cthre": -0.12178551958817761, + "u_A_cthre": 0.00010985701951383085, + "B_chl3_ctgre": 0.05687330976170965, + "u_B_chl3_ctgre": 6.519725659967532e-05, + "B_chbox_chg": 2.3791789627106152, + "u_B_chbox_chg": 0.004123210297729467, + "B_chbox_ctgre": -0.056839403068887115, + "u_B_chbox_ctgre": 9.213422991216958e-05, + "B_chdd_chg": -0.5947946518794173, + "u_B_chdd_chg": 0.0010308104384832088, + "B_chdd_ctgre": 0.014194858715076504, + "u_B_chdd_ctgre": 2.3042266282286494e-05, + "B_chg_2": 241.53553450898573, + "u_B_chg_2": 0.5123502682650954, + "B_chg_chl3": -2.3791791483275735, + "u_B_chg_chl3": 0.0029155612204773106, + "B_chg_cll1": 1.1895893518817495, + "u_B_chg_cll1": 0.0020616109530580116, + "B_chg_ctgre": -18.549727999974916, + "u_B_chg_ctgre": 0.04703607060133635, + "B_chg_cthre": -2.3915896425679746, + "u_B_chg_cthre": 0.0041447542262716625, + "B_ctgre_2": 0.2211618771029173, + "u_B_ctgre_2": 0.0005364768520346943, + "B_ctgre_cll1": -0.028425086881764736, + "u_B_ctgre_cll1": 4.615547744415508e-05, + "B_cthre_ctgre": 0.05712635071851723, + "u_B_cthre_ctgre": 9.254749926408523e-05 + }, + "GG2H_GE2J_MJJ_350_700_PTH_0_200_PTHJJ_0_25": { + "A_chl3": -0.12128184857835239, + "u_A_chl3": 1.8244318779804478e-05, + "A_chbox": 0.12127907727284822, + "u_A_chbox": 2.562827296738822e-05, + "A_cll1": 0.06063959122875278, + "u_A_cll1": 1.2877386667020084e-05, + "A_chdd": -0.030320297283148577, + "u_A_chdd": 6.4595811641926685e-06, + "A_chg": 38.8941728736089, + "u_A_chg": 0.25385210453079887, + "A_ctgre": -0.9385834045740246, + "u_A_ctgre": 0.005297546047367853, + "A_cthre": -0.12191306617961029, + "u_A_cthre": 2.573388308272187e-05, + "B_chl3_ctgre": 0.05696754773946551, + "u_B_chl3_ctgre": 0.00022729792729440663, + "B_chbox_chg": 2.3505224969067546, + "u_B_chbox_chg": 0.012205133374828881, + "B_chbox_ctgre": -0.05689599097529085, + "u_B_chbox_ctgre": 0.00032140901516727085, + "B_chdd_chg": -0.5876312205521704, + "u_B_chdd_chg": 0.003051312028593141, + "B_chdd_ctgre": 0.01421926855468081, + "u_B_chdd_ctgre": 8.112945782917196e-05, + "B_chg_2": 246.25145554369234, + "u_B_chg_2": 3.464347100021207, + "B_chg_chl3": -2.350524839348253, + "u_B_chg_chl3": 0.008630359401497326, + "B_chg_cll1": 1.1752614121564042, + "u_B_chg_cll1": 0.00610254883292758, + "B_chg_ctgre": -18.30836668245672, + "u_B_chg_ctgre": 0.17587034261497295, + "B_chg_cthre": -2.362785527885108, + "u_B_chg_cthre": 0.012268830187146756, + "B_ctgre_2": 0.22426038245526048, + "u_B_ctgre_2": 0.0024378305479302365, + "B_ctgre_cll1": -0.028450051317483877, + "u_B_ctgre_cll1": 0.0001611626680882678, + "B_cthre_ctgre": 0.057198668058054396, + "u_B_cthre_ctgre": 0.0003227794243554662 + }, + "GG2H_GE2J_MJJ_350_700_PTH_0_200_PTHJJ_GT25": { + "A_chl3": -0.12127012359814011, + "u_A_chl3": 1.4423788031527372e-05, + "A_chbox": 0.12126890502377734, + "u_A_chbox": 2.0337795325830444e-05, + "A_cll1": 0.060634759942439664, + "u_A_cll1": 1.0194123567100544e-05, + "A_chdd": -0.030318163491470568, + "u_A_chdd": 5.095553369057199e-06, + "A_chg": 38.60451142181253, + "u_A_chg": 0.22229305819262735, + "A_ctgre": -0.9185611778972989, + "u_A_ctgre": 0.008950309971143778, + "A_cthre": -0.12190311877799165, + "u_A_cthre": 2.0427709896614426e-05, + "B_chl3_ctgre": 0.05570375702117706, + "u_B_chl3_ctgre": 0.00038438449779101987, + "B_chbox_chg": 2.305697382267321, + "u_B_chbox_chg": 0.015661096900568865, + "B_chbox_ctgre": -0.055700469030232375, + "u_B_chbox_ctgre": 0.0005425661996716955, + "B_chdd_chg": -0.5764243166551254, + "u_B_chdd_chg": 0.00391526320304024, + "B_chdd_ctgre": 0.013907039555176392, + "u_B_chdd_ctgre": 0.00013602094014334942, + "B_chg_2": 236.74444005010832, + "u_B_chg_2": 2.7409510254213716, + "B_chg_chl3": -2.305698717294188, + "u_B_chg_chl3": 0.01107408916809728, + "B_chg_cll1": 1.1528487286032287, + "u_B_chg_cll1": 0.007830566525717045, + "B_chg_ctgre": -17.991914039404765, + "u_B_chg_ctgre": 0.16288963583572028, + "B_chg_cthre": -2.3177252730641906, + "u_B_chg_cthre": 0.015742842033745406, + "B_ctgre_2": 0.22640221280138975, + "u_B_ctgre_2": 0.010862634900064132, + "B_ctgre_cll1": -0.027857905126620397, + "u_B_ctgre_cll1": 0.0002714876827113511, + "B_cthre_ctgre": 0.05596561741631097, + "u_B_cthre_ctgre": 0.0005458150715330585 + }, + "GG2H_GE2J_MJJ_GT700_PTH_0_200_PTHJJ_0_25": { + "A_chl3": -0.121218877164472, + "u_A_chl3": 2.889168950701512e-05, + "A_chbox": 0.12121704609459695, + "u_A_chbox": 4.061518056089604e-05, + "A_cll1": 0.06060858147859467, + "u_A_cll1": 2.0341850003156688e-05, + "A_chdd": -0.030304997323919773, + "u_A_chdd": 1.0222696287925484e-05, + "A_chg": 40.75058784650351, + "u_A_chg": 0.31700171047790016, + "A_ctgre": -0.9758178334514794, + "u_A_ctgre": 0.008261018100645074, + "A_cthre": -0.12185095186752144, + "u_A_cthre": 4.090887531516879e-05, + "B_chl3_ctgre": 0.05915944141362278, + "u_B_chl3_ctgre": 0.00035330988269804004, + "B_chbox_chg": 2.3739965427869523, + "u_B_chbox_chg": 0.03736652696693942, + "B_chbox_ctgre": -0.05914802071284227, + "u_B_chbox_ctgre": 0.0005015899969180686, + "B_chdd_chg": -0.5934982236578579, + "u_B_chdd_chg": 0.009341653829872624, + "B_chdd_ctgre": 0.014777488649304555, + "u_B_chdd_ctgre": 0.00012431093163336066, + "B_chg_2": 251.20656870556115, + "u_B_chg_2": 3.4808226621347886, + "B_chg_chl3": -2.373996658536568, + "u_B_chg_chl3": 0.026422009032606334, + "B_chg_cll1": 1.1869992518608048, + "u_B_chg_cll1": 0.018683152869076267, + "B_chg_ctgre": -18.854387631215236, + "u_B_chg_ctgre": 0.42842017403327953, + "B_chg_cthre": -2.3863793923686014, + "u_B_chg_cthre": 0.0375612963002378, + "B_ctgre_2": 0.24159001229036145, + "u_B_ctgre_2": 0.00447552343033586, + "B_ctgre_cll1": -0.029602561697252165, + "u_B_ctgre_cll1": 0.0002503637754884196, + "B_cthre_ctgre": 0.05945445740015917, + "u_B_cthre_ctgre": 0.000503626519920797 + }, + "GG2H_GE2J_MJJ_GT700_PTH_0_200_PTHJJ_GT25": { + "A_chl3": -0.12126274937284386, + "u_A_chl3": 2.240688480460772e-05, + "A_chbox": 0.12126050014736586, + "u_A_chbox": 3.144915845445778e-05, + "A_cll1": 0.06063005900789759, + "u_A_cll1": 1.5826225871064024e-05, + "A_chdd": -0.030315711847930672, + "u_A_chdd": 7.881318684212194e-06, + "A_chg": 38.73101249996233, + "u_A_chg": 0.6158922227831709, + "A_ctgre": -0.929701596434763, + "u_A_ctgre": 0.01030151575955837, + "A_cthre": -0.12189426251623028, + "u_A_cthre": 3.157138517427946e-05, + "B_chl3_ctgre": 0.05635814740288399, + "u_B_chl3_ctgre": 0.00044231472737803293, + "B_chbox_chg": 2.3526230835536195, + "u_B_chbox_chg": 0.03359659804896285, + "B_chbox_ctgre": -0.05636219609399881, + "u_B_chbox_ctgre": 0.0006238189065696514, + "B_chdd_chg": -0.5881565865955993, + "u_B_chdd_chg": 0.008399157859737948, + "B_chdd_ctgre": 0.014063218667649006, + "u_B_chdd_ctgre": 0.00015783786884008007, + "B_chg_2": 249.12465810288342, + "u_B_chg_2": 4.147230582497592, + "B_chg_chl3": -2.352627786154735, + "u_B_chg_chl3": 0.02375642944746468, + "B_chg_cll1": 1.1763115466907093, + "u_B_chg_cll1": 0.016798279074112205, + "B_chg_ctgre": -19.036180710783157, + "u_B_chg_ctgre": 0.4669974950075024, + "B_chg_cthre": -2.3648974449295372, + "u_B_chg_cthre": 0.03377183100030693, + "B_ctgre_2": 0.2276376103331457, + "u_B_ctgre_2": 0.004251480295202872, + "B_ctgre_cll1": -0.028181772705764996, + "u_B_ctgre_cll1": 0.000311948531560802, + "B_cthre_ctgre": 0.05665236738490544, + "u_B_cthre_ctgre": 0.0006284287770481627 + }, + "GG2H_PTH_200_300": { + "A_chl3": -0.12126795508227947, + "u_A_chl3": 9.718866370961489e-06, + "A_chbox": 0.12126655637364209, + "u_A_chbox": 1.3717505808111747e-05, + "A_cll1": 0.06063339838834459, + "u_A_cll1": 6.856290022858555e-06, + "A_chdd": -0.030317745539328377, + "u_A_chdd": 3.4347904322677185e-06, + "A_chg": 41.79210092819022, + "u_A_chg": 0.21407085892899044, + "A_ctgre": -1.0376189944624026, + "u_A_ctgre": 0.005712707323529665, + "A_cthre": -0.12189998653099283, + "u_A_cthre": 1.3762052980462287e-05, + "B_chl3_ctgre": 0.062937732168998, + "u_B_chl3_ctgre": 0.0002449352118353152, + "B_chbox_chg": 2.5308189804765022, + "u_B_chbox_chg": 0.012736332623749335, + "B_chbox_ctgre": -0.06291203491202475, + "u_B_chbox_ctgre": 0.0003461629838479418, + "B_chdd_chg": -0.6327047856753356, + "u_B_chdd_chg": 0.0031840802211917344, + "B_chdd_ctgre": 0.01571626476089563, + "u_B_chdd_ctgre": 8.67090471604389e-05, + "B_chg_2": 282.04502287081135, + "u_B_chg_2": 2.6056420106072067, + "B_chg_chl3": -2.530818967323137, + "u_B_chg_chl3": 0.009005947013764734, + "B_chg_cll1": 1.265409549428395, + "u_B_chg_cll1": 0.006368172863339406, + "B_chg_ctgre": -22.79795083122765, + "u_B_chg_ctgre": 0.22603206335191195, + "B_chg_cthre": -2.544021035219333, + "u_B_chg_cthre": 0.01280277530396015, + "B_ctgre_2": 0.28638371692167447, + "u_B_ctgre_2": 0.0032473448106887467, + "B_ctgre_cll1": -0.03145796519417325, + "u_B_ctgre_cll1": 0.00017321771695730757, + "B_cthre_ctgre": 0.063221934352932, + "u_B_cthre_ctgre": 0.0003482060874946675 + }, + "GG2H_PTH_300_450": { + "A_chl3": -0.12063270331995785, + "u_A_chl3": 0.00047201801835977924, + "A_chbox": 0.12063032968755866, + "u_A_chbox": 0.0006675365936254027, + "A_cll1": 0.0603152769104523, + "u_A_cll1": 0.00033375268954183947, + "A_chdd": -0.03015851462720008, + "u_A_chdd": 0.000166899033408086, + "A_chg": 48.539784019752524, + "u_A_chg": 0.5648933937404329, + "A_ctgre": -1.2452236211146568, + "u_A_ctgre": 0.01851856299462782, + "A_cthre": -0.12126063584704908, + "u_A_cthre": 0.0006710021725267475, + "B_chl3_ctgre": 0.0755126061811219, + "u_B_chl3_ctgre": 0.0007937711612308781, + "B_chbox_chg": 2.9609553745328623, + "u_B_chbox_chg": 0.030712240570698143, + "B_chbox_ctgre": -0.07549379394357462, + "u_B_chbox_ctgre": 0.0011232737753682563, + "B_chdd_chg": -0.7402386562494199, + "u_B_chdd_chg": 0.007678035409939832, + "B_chdd_ctgre": 0.018856475369901097, + "u_B_chdd_ctgre": 0.0002806417080466557, + "B_chg_2": 382.4462239635691, + "u_B_chg_2": 6.43078354455133, + "B_chg_chl3": -2.960955106116276, + "u_B_chg_chl3": 0.021716843249497807, + "B_chg_cll1": 1.4804777431260991, + "u_B_chg_cll1": 0.01535615168785535, + "B_chg_ctgre": -33.560683123526246, + "u_B_chg_ctgre": 0.7142386764343067, + "B_chg_cthre": -2.976400875995478, + "u_B_chg_cthre": 0.030872423435188368, + "B_ctgre_2": 0.43416653186066795, + "u_B_ctgre_2": 0.014741395902501675, + "B_ctgre_cll1": -0.0377530311696953, + "u_B_ctgre_cll1": 0.0005611337434488776, + "B_cthre_ctgre": 0.07588068824428314, + "u_B_cthre_ctgre": 0.0011289164808319146 + }, + "GG2H_PTH_450_650": { + "A_chl3": -0.1212808577229627, + "u_A_chl3": 4.3531551398215194e-05, + "A_chbox": 0.12127928586185699, + "u_A_chbox": 6.117111090788901e-05, + "A_cll1": 0.06063885532013926, + "u_A_cll1": 3.070181851817908e-05, + "A_chdd": -0.030320448655687917, + "u_A_chdd": 1.5370487020098702e-05, + "A_chg": 59.513909934604484, + "u_A_chg": 1.0937247728504138, + "A_ctgre": -1.7528708695178306, + "u_A_ctgre": 0.06456550967046269, + "A_cthre": -0.12191264171281135, + "u_A_cthre": 6.165541364529187e-05, + "B_chl3_ctgre": 0.10633573692024724, + "u_B_chl3_ctgre": 0.0027647249118281053, + "B_chbox_chg": 3.6459610332415235, + "u_B_chbox_chg": 0.09614470210215051, + "B_chbox_ctgre": -0.10627347296799895, + "u_B_chbox_ctgre": 0.003915547692647087, + "B_chdd_chg": -0.9114910706246446, + "u_B_chdd_chg": 0.024036035066045156, + "B_chdd_ctgre": 0.02652646590248607, + "u_B_chdd_ctgre": 0.000979516676903762, + "B_chg_2": 659.0259354108556, + "u_B_chg_2": 27.123526111262898, + "B_chg_chl3": -3.6459626950752835, + "u_B_chg_chl3": 0.06798465993259524, + "B_chg_cll1": 1.8229800205509812, + "u_B_chg_cll1": 0.04807251641105181, + "B_chg_ctgre": -56.276133331499736, + "u_B_chg_ctgre": 2.5531509597961985, + "B_chg_cthre": -3.6649810182863254, + "u_B_chg_cthre": 0.09664633743492929, + "B_ctgre_2": 0.8735692985721463, + "u_B_ctgre_2": 0.08225963006362497, + "B_ctgre_cll1": -0.053129552494798823, + "u_B_ctgre_cll1": 0.0019608848737604065, + "B_cthre_ctgre": 0.10680026964875536, + "u_B_cthre_ctgre": 0.003933593193620659 + }, + "GG2H_PTH_GT650": { + "A_chl3": -0.12127046594120354, + "u_A_chl3": 0.0001091719818427201, + "A_chbox": 0.12126736302473198, + "u_A_chbox": 0.00015346679730114372, + "A_cll1": 0.0606344553812222, + "u_A_cll1": 7.715981223127585e-05, + "A_chdd": -0.030319167943536635, + "u_A_chdd": 3.8292959255286456e-05, + "A_chg": 95.70095095207489, + "u_A_chg": 8.790973452439625, + "A_ctgre": -2.7159609417307986, + "u_A_ctgre": 0.2609454058747938, + "A_cthre": -0.12190372133802746, + "u_A_cthre": 0.00015446323532347726, + "B_chl3_ctgre": 0.16474827446438828, + "u_B_chl3_ctgre": 0.011189352795798906, + "B_chbox_chg": 5.552012502231709, + "u_B_chbox_chg": 0.3169532465958521, + "B_chbox_ctgre": -0.164621025000035, + "u_B_chbox_ctgre": 0.015814484639290284, + "B_chdd_chg": -1.3880290762082743, + "u_B_chdd_chg": 0.07925599721368462, + "B_chdd_ctgre": 0.041187070753922285, + "u_B_chdd_ctgre": 0.0039491746107024935, + "B_chg_2": 1630.0068267535225, + "u_B_chg_2": 248.65773616851178, + "B_chg_chl3": -5.55206972388079, + "u_B_chg_chl3": 0.22414060714600406, + "B_chg_cll1": 2.776009041508366, + "u_B_chg_cll1": 0.15847111198203845, + "B_chg_ctgre": -149.312785558021, + "u_B_chg_ctgre": 25.85341898020956, + "B_chg_cthre": -5.581051372982336, + "u_B_chg_cthre": 0.3186493520061611, + "B_ctgre_2": 2.151165046061439, + "u_B_ctgre_2": 0.48140772011806365, + "B_ctgre_cll1": -0.08235293000614727, + "u_B_ctgre_cll1": 0.007916606864670224, + "B_cthre_ctgre": 0.16557541125286437, + "u_B_cthre_ctgre": 0.015880755956341815 + }, + "QQ2HLL": { + "A_chbox": 0.1212480978083973, + "u_A_chbox": 1.03619874439444e-05, + "A_chdd": 0.01623762593603379, + "u_A_chdd": 0.0004415021188662112, + "A_chw": 0.7285078826389992, + "u_A_chw": 0.0018805152627912722, + "A_chb": 0.08418497886522933, + "u_A_chb": 0.0009789285506590173, + "A_chwb": 0.2907154280623077, + "u_A_chwb": 0.0008620504248418416, + "A_chj1": -0.04944350982347331, + "u_A_chj1": 0.010539581008111625, + "A_chj3": 1.7621749426888769, + "u_A_chj3": 0.008612999304286623, + "A_chu": 0.3986328635732821, + "u_A_chu": 0.008158384880293686, + "A_chd": -0.1443979363796364, + "u_A_chd": 0.00562869351727836, + "A_chl1": -0.028668728399875075, + "u_A_chl1": 0.00046971870873455053, + "A_chl3": -0.15460506288359308, + "u_A_chl3": 0.00031955693685393994, + "A_che": -0.023830734482321193, + "u_A_che": 0.00030917501097375697, + "A_cll1": 0.12054156525514609, + "u_A_cll1": 0.00014119937950016228, + "B_chwtil_2": 0.14509811918378432, + "u_B_chwtil_2": 0.0025634976527875346, + "B_chbtil_2": 0.01754014878540042, + "u_B_chbtil_2": 0.0011407481312114155, + "B_chwbtil_2": 0.025793270121960254, + "u_B_chwbtil_2": 0.0009303283636696643, + "B_chw_2": 0.24457292367963296, + "u_B_chw_2": 0.0032913175127948606, + "B_chb_2": 0.02774265320065043, + "u_B_chb_2": 0.0012342262137360542, + "B_chwb_2": 0.04389122551204466, + "u_B_chwb_2": 0.0009317695734125218, + "B_chj1_2": 2.5376090272149217, + "u_B_chj1_2": 0.16947638116737052, + "B_chq1_2": 0.01960092006736902, + "u_B_chq1_2": 0.001566767615541242, + "B_chj3_2": 2.468806850457394, + "u_B_chj3_2": 0.16930131512683425, + "B_chq3_2": 0.01960092006736902, + "u_B_chq3_2": 0.001566767615541242, + "B_chu_2": 1.5628500053666317, + "u_B_chu_2": 0.2099399493510903, + "B_chd_2": 0.7311733707874902, + "u_B_chd_2": 0.08387982216838516, + "B_chbq_2": 0.020263826700728533, + "u_B_chbq_2": 0.006629125275380302, + "B_chwtil_chwbtil": 0.07572722743679745, + "u_B_chwtil_chwbtil": 0.0014051903364344863, + "B_chwtil_chj1": -0.015604577395138113, + "u_B_chwtil_chj1": 0.018982931823369503, + "B_chwtil_chj3": 0.020678272916258063, + "u_B_chwtil_chj3": 0.018951748602055656, + "B_chbtil_chwbtil": 0.029693520716580844, + "u_B_chbtil_chwbtil": 0.0019376844855453633, + "B_chbox_chw": 0.04416509810026913, + "u_B_chbox_chw": 0.00011400442989610283, + "B_chbox_chwb": 0.01762434801048207, + "u_B_chbox_chwb": 5.226098712934001e-05, + "B_chbox_chj3": 0.10683017263197998, + "u_B_chbox_chj3": 0.000522154614337109, + "B_chbox_chu": 0.024166738098481286, + "u_B_chbox_chu": 0.0004945942692611614, + "B_chdd_chw": 0.014770503614076644, + "u_B_chdd_chw": 0.00017746523617563292, + "B_chdd_chj1": -0.024837918380152858, + "u_B_chdd_chj1": 0.0006959672567954516, + "B_chdd_chj3": 0.03978700651540193, + "u_B_chdd_chj3": 0.0006802472005796738, + "B_chdd_chu": -0.04796643071016243, + "u_B_chdd_chu": 0.0010441317300179482, + "B_chdd_chd": 0.017393848561430204, + "u_B_chdd_chd": 0.0006813327811509988, + "B_chw_chwb": 0.1448264678558916, + "u_B_chw_chwb": 0.0016126553124590015, + "B_chw_chj1": -0.10628336833872831, + "u_B_chw_chj1": 0.020179624705220906, + "B_chw_chj3": 0.8264023861024212, + "u_B_chw_chj3": 0.019949026993284227, + "B_chw_chl3": -0.05290555865911841, + "u_B_chw_chl3": 0.0016630200198336862, + "B_chw_cll1": 0.04382559850487516, + "u_B_chw_cll1": 0.0001362715312416021, + "B_chb_chwb": 0.038921382253283406, + "u_B_chb_chwb": 0.0019561060566440944, + "B_chb_chj1": 0.07719436786509794, + "u_B_chb_chj1": 0.0018701494248433502, + "B_chb_chu": 0.19086521561649963, + "u_B_chb_chu": 0.012560424707029024, + "B_chb_chd": -0.07155396240571046, + "u_B_chb_chd": 0.006746962705022735, + "B_chwb_chj1": 0.0182077354833312, + "u_B_chwb_chj1": 0.004807790864593264, + "B_chwb_chj3": 0.2643325054706316, + "u_B_chwb_chj3": 0.004712995923637066, + "B_chwb_chu": 0.12785041383037837, + "u_B_chwb_chu": 0.011469077728946061, + "B_chwb_chd": -0.04889082017245007, + "u_B_chwb_chd": 0.00571357056085876, + "B_chwb_chl3": -0.02027570512799813, + "u_B_chwb_chl3": 0.0002882824431166749, + "B_chwb_cll1": 0.01838027895238751, + "u_B_chwb_cll1": 6.534998595258238e-05, + "B_chj1_chj3": -1.1117775397754632, + "u_B_chj1_chj3": 0.33916051248161067, + "B_chq1_chj3": -0.01914897809960582, + "u_B_chq1_chj3": 0.00012194590393363629, + "B_chq1_chq3": 0.03920184223636717, + "u_B_chq1_chq3": 0.0031335355425208744, + "B_chj3_chq3": -0.01914897809960582, + "u_B_chj3_chq3": 0.00012194590393363629, + "B_chj3_chu": -0.028172398367730937, + "u_B_chj3_chu": 0.0003479399822420203, + "B_chj3_chd": 0.012171494845033121, + "u_B_chj3_chd": 0.00026938700347979653, + "B_chj3_chl1": -0.024244829544721777, + "u_B_chj3_chl1": 0.00112160763806517, + "B_chj3_chl3": -0.1370529806033898, + "u_B_chj3_chl3": 0.0011034930638891285, + "B_chj3_che": -0.022056329165464617, + "u_B_chj3_che": 0.0004980532983104674, + "B_chj3_cll1": 0.10841411999095536, + "u_B_chj3_cll1": 0.0005786421813069256, + "B_chu_chl3": -0.031618248088500604, + "u_B_chu_chl3": 0.0007880326421885536, + "B_chu_cll1": 0.024811711105257712, + "u_B_chu_cll1": 0.0005582703323996423, + "B_chd_chl3": 0.011030444486600073, + "u_B_chd_chl3": 0.0005186145562570132, + "B_chl3_cll1": -0.011814545503764729, + "u_B_chl3_cll1": 2.9611228899982358e-05 + }, + "QQ2HLL_FWDH": { + "A_chbox": 0.1212480976668545, + "u_A_chbox": 0.00017915656078827707, + "A_chdd": 0.01972618830519582, + "u_A_chdd": 0.0013578660458859377, + "A_chw": 0.7172403923523647, + "u_A_chw": 0.004902588467103796, + "A_chb": 0.07987984042439335, + "u_A_chb": 0.0029694071488612158, + "A_chwb": 0.28931969493110943, + "u_A_chwb": 0.0024107108133999775, + "A_chj1": -0.467942098062214, + "u_A_chj1": 0.017247695683222843, + "A_chq1": -0.018040777478473928, + "u_A_chq1": 0.0006583806261669089, + "A_chj3": 1.3723688165528904, + "u_A_chj3": 0.01106933945721128, + "A_chq3": -0.018040777478473928, + "u_A_chq3": 0.0006583806261669089, + "A_chu": 0.40842998031351435, + "u_A_chu": 0.01520671457516634, + "A_chd": -0.07150312948226163, + "u_A_chd": 0.008367651057919579, + "A_chl1": -0.028805517286395525, + "u_A_chl1": 0.0013252161551346932, + "A_chl3": -0.1547335167419244, + "u_A_chl3": 0.0008939021098904108, + "A_che": -0.02251757669119973, + "u_A_che": 0.0008855082681356021, + "A_cll1": 0.1202694948312599, + "u_A_cll1": 0.000450282547687297, + "B_chwtil_2": 0.11101630948050571, + "u_B_chwtil_2": 0.00709286533068165, + "B_chbtil_2": 0.016922787237747334, + "u_B_chbtil_2": 0.0025638076307323535, + "B_chwbtil_2": 0.02049706526003236, + "u_B_chwbtil_2": 0.001653705056002329, + "B_chw_2": 0.20935250350597995, + "u_B_chw_2": 0.007405298867834789, + "B_chb_2": 0.02729786386102297, + "u_B_chb_2": 0.0020881838715101192, + "B_chwb_2": 0.03901002420337902, + "u_B_chwb_2": 0.001736945202390792, + "B_chj1_2": 0.8364513111745827, + "u_B_chj1_2": 0.027190282479042687, + "B_chj3_2": 0.7807540405587462, + "u_B_chj3_2": 0.026830701203517906, + "B_chu_2": 0.6355896307801256, + "u_B_chu_2": 0.05367859011498285, + "B_chd_2": 0.18888295707658256, + "u_B_chd_2": 0.030549446039607037, + "B_chwtil_chwbtil": 0.052130608976003814, + "u_B_chwtil_chwbtil": 0.0030059035910963154, + "B_chbtil_chwbtil": 0.023573521460637428, + "u_B_chbtil_chwbtil": 0.003440345755343722, + "B_chbox_chw": 0.043482015992187976, + "u_B_chbox_chw": 0.00029721476457913917, + "B_chbox_chwb": 0.01753973294691198, + "u_B_chbox_chwb": 0.00014614701768275574, + "B_chbox_chj1": -0.028368543425717256, + "u_B_chbox_chj1": 0.0010456251810692509, + "B_chbox_chj3": 0.08319855467710259, + "u_B_chbox_chj3": 0.0006710681847046526, + "B_chbox_chu": 0.024760680582571137, + "u_B_chbox_chu": 0.0009218926778095595, + "B_chdd_chw": 0.017554540611561167, + "u_B_chdd_chw": 0.0004951647855749906, + "B_chdd_chb": -0.01024545218236574, + "u_B_chdd_chb": 0.00035949973473341706, + "B_chdd_chj1": -0.029450033344157658, + "u_B_chdd_chj1": 0.0010674960377496752, + "B_chdd_chj3": 0.037847908756600115, + "u_B_chdd_chj3": 0.0010036028186877395, + "B_chdd_chu": -0.049396977957067496, + "u_B_chdd_chu": 0.001950586708805008, + "B_chw_chwb": 0.12088491600601607, + "u_B_chw_chwb": 0.0034914267815757323, + "B_chw_chj1": -0.2802988971438952, + "u_B_chw_chj1": 0.02118113013699144, + "B_chw_chj3": 0.6670790875231489, + "u_B_chw_chj3": 0.02012976729098694, + "B_chw_chl1": -0.01168979518240492, + "u_B_chw_chl1": 0.0007971886168822207, + "B_chw_chl3": -0.053601578540560364, + "u_B_chw_chl3": 0.0006277741466304103, + "B_chw_cll1": 0.04301392155127113, + "u_B_chw_cll1": 0.00035112141476488696, + "B_chb_chwb": 0.03344109553958383, + "u_B_chb_chwb": 0.003561852645128635, + "B_chb_chj1": 0.05858460020708513, + "u_B_chb_chj1": 0.0018738591931182751, + "B_chb_chj3": -0.01660841594001341, + "u_B_chb_chj3": 0.0019360266116259215, + "B_chb_chu": 0.20749825220242615, + "u_B_chb_chu": 0.01642014017222855, + "B_chb_chd": -0.02973689125900914, + "u_B_chb_chd": 0.004472934829233682, + "B_chwb_chj1": -0.0549306949388022, + "u_B_chwb_chj1": 0.0052695523339891265, + "B_chwb_chj3": 0.20748758478134047, + "u_B_chwb_chj3": 0.004835330838835711, + "B_chwb_chu": 0.13905168271517754, + "u_B_chwb_chu": 0.013931904097619999, + "B_chwb_chd": -0.02224021266016087, + "u_B_chwb_chd": 0.0038416328142401217, + "B_chwb_chl3": -0.019631689282200687, + "u_B_chwb_chl3": 0.00027183368097455634, + "B_chwb_cll1": 0.01822570915248073, + "u_B_chwb_cll1": 0.0001852504627277322, + "B_chj1_chj3": -0.6445254858229634, + "u_B_chj1_chj3": 0.055856019745749136, + "B_chj1_chl3": 0.034739101033879345, + "u_B_chj1_chl3": 0.0015439334652411064, + "B_chj1_cll1": -0.02754977818240346, + "u_B_chj1_cll1": 0.0010936736138937892, + "B_chq1_chj3": -0.01406237073294258, + "u_B_chq1_chj3": 0.0001737938471849437, + "B_chj3_chq3": -0.01406237073294258, + "u_B_chj3_chq3": 0.0001737938471849437, + "B_chj3_chu": -0.026336992831049306, + "u_B_chj3_chu": 0.000702236082543687, + "B_chj3_chl1": -0.020831385756264142, + "u_B_chj3_chl1": 0.001340148638080667, + "B_chj3_chl3": -0.10722698771553915, + "u_B_chj3_chl3": 0.0011707521287433245, + "B_chj3_che": -0.015766301561497154, + "u_B_chj3_che": 0.0007793810127142332, + "B_chj3_cll1": 0.08457285462586593, + "u_B_chj3_cll1": 0.0007593636558189812, + "B_chu_chl3": -0.032191539655481285, + "u_B_chu_chl3": 0.0013652256992092244, + "B_chu_cll1": 0.024935672872812467, + "u_B_chu_cll1": 0.0009893749571934412, + "B_chl3_cll1": -0.01182760293282061, + "u_B_chl3_cll1": 8.282622673265432e-05 + }, + "QQ2HLL_PTV_0_75": { + "A_chbox": 0.12124809770761114, + "u_A_chbox": 5.46319183434717e-06, + "A_chdd": 0.01576753101575749, + "u_A_chdd": 0.0006072557911101636, + "A_chw": 0.6583116201743442, + "u_A_chw": 0.001487308406778991, + "A_chb": 0.0790894419563883, + "u_A_chb": 0.0010146812752308185, + "A_chwb": 0.26737092671565116, + "u_A_chwb": 0.000819285636544901, + "A_chj1": 0.014645520493236095, + "u_A_chj1": 0.0055627753337859015, + "A_chj3": 1.0189924967738773, + "u_A_chj3": 0.0024430968185110286, + "A_chu": 0.21213015746143493, + "u_A_chu": 0.003950549781540015, + "A_chd": -0.09323521333255833, + "u_A_chd": 0.0037700088669488352, + "A_chl1": -0.029560699108187066, + "u_A_chl1": 0.0006142537407814486, + "A_chl3": -0.1558814239081193, + "u_A_chl3": 0.00040178020501482854, + "A_che": -0.023592676007705916, + "u_A_che": 0.000423466239003914, + "A_cll1": 0.12068645482669518, + "u_A_cll1": 0.00019485119851117295, + "B_chwtil_2": 0.049814002019650805, + "u_B_chwtil_2": 0.0008879693362775042, + "B_chw_2": 0.1385775710471962, + "u_B_chw_2": 0.0010309307628919445, + "B_chb_2": 0.014536444648844718, + "u_B_chb_2": 0.0009704120496619015, + "B_chwb_2": 0.026697069794077304, + "u_B_chwb_2": 0.0007740195143433999, + "B_chj1_2": 0.37138785804345115, + "u_B_chj1_2": 0.0020351634392058145, + "B_chj3_2": 0.3319065199451931, + "u_B_chj3_2": 0.0019580909835100113, + "B_chu_2": 0.19861876635197087, + "u_B_chu_2": 0.004840437255298867, + "B_chd_2": 0.17279429259219078, + "u_B_chd_2": 0.007877179125203766, + "B_chwtil_chwbtil": 0.027260142016647122, + "u_B_chwtil_chwbtil": 0.000551904986136963, + "B_chbtil_chwbtil": 0.010457135453707531, + "u_B_chbtil_chwbtil": 0.001652578133138381, + "B_chbox_chw": 0.03990951662645506, + "u_B_chbox_chw": 9.016666445881553e-05, + "B_chbox_chwb": 0.01620910912062508, + "u_B_chbox_chwb": 4.9668414329850735e-05, + "B_chbox_chj3": 0.061775452894291885, + "u_B_chbox_chj3": 0.00014811040066317442, + "B_chbox_chu": 0.012860189854703856, + "u_B_chbox_chu": 0.00023949832134361937, + "B_chdd_chw": 0.012714412894444919, + "u_B_chdd_chw": 0.00018991696625704352, + "B_chdd_chj1": -0.014090309726890538, + "u_B_chdd_chj1": 0.00032225997861352223, + "B_chdd_chj3": 0.0224105159007086, + "u_B_chdd_chj3": 0.0002928795914334083, + "B_chdd_chu": -0.0265678856763615, + "u_B_chdd_chu": 0.0005097215281976925, + "B_chdd_chd": 0.011923727500286608, + "u_B_chdd_chd": 0.0004829802608131952, + "B_chw_chwb": 0.09239441305425475, + "u_B_chw_chwb": 0.0006852841357999431, + "B_chw_chj1": -0.03385203013563104, + "u_B_chw_chj1": 0.0032685428475082716, + "B_chw_chj3": 0.40713386332198853, + "u_B_chw_chj3": 0.0025627026660810163, + "B_chw_chl3": -0.0500844369776023, + "u_B_chw_chl3": 0.00019892753022715803, + "B_chw_cll1": 0.039636798670826395, + "u_B_chw_cll1": 0.00011820198558623933, + "B_chb_chwb": 0.019250934347650683, + "u_B_chb_chwb": 0.001661287165119887, + "B_chb_chj1": 0.03764071209906086, + "u_B_chb_chj1": 0.0002500022913379288, + "B_chb_chu": 0.08453702534781467, + "u_B_chb_chu": 0.003271506824501484, + "B_chb_chd": -0.03531104709565056, + "u_B_chb_chd": 0.0017647618247320271, + "B_chwb_chj1": 0.010903895469681114, + "u_B_chwb_chj1": 0.0010905314339027304, + "B_chwb_chj3": 0.13948970343366546, + "u_B_chwb_chj3": 0.0008439699700896852, + "B_chwb_chu": 0.05144603630570992, + "u_B_chwb_chu": 0.0027969492416521345, + "B_chwb_chd": -0.020996738660689903, + "u_B_chwb_chd": 0.0013113809522396012, + "B_chwb_chl3": -0.01840764390505642, + "u_B_chwb_chl3": 9.248633122435604e-05, + "B_chwb_cll1": 0.016954734388028896, + "u_B_chwb_cll1": 6.500497586355753e-05, + "B_chj1_chj3": -0.06393150479411003, + "u_B_chj1_chj3": 0.005104149184795558, + "B_chq1_chj3": -0.010917472055799918, + "u_B_chq1_chj3": 5.3260980293149656e-05, + "B_chq1_chq3": 0.013326176829770189, + "u_B_chq1_chq3": 0.0005586022086907758, + "B_chj3_chq3": -0.010917472055799918, + "u_B_chj3_chq3": 5.3260980293149656e-05, + "B_chj3_chu": -0.01570175638724132, + "u_B_chj3_chu": 0.0001803921198011599, + "B_chj3_chl1": -0.01575866357511759, + "u_B_chj3_chl1": 0.0003768950316501495, + "B_chj3_chl3": -0.08177438914077961, + "u_B_chj3_chl3": 0.0003107170303452104, + "B_chj3_che": -0.012716628944757747, + "u_B_chj3_che": 0.0002570444805338004, + "B_chj3_cll1": 0.06376818129987963, + "u_B_chj3_cll1": 0.0001927463678530758, + "B_chu_chl3": -0.0172111845197702, + "u_B_chu_chl3": 0.00036020248587339876, + "B_chu_cll1": 0.013312933283650363, + "u_B_chu_cll1": 0.0002563316209965097, + "B_chl3_cll1": -0.011930909301932118, + "u_B_chl3_cll1": 3.7562684151619306e-05 + }, + "QQ2HLL_PTV_150_250_0J": { + "A_chbtil": 0.010512852962942621, + "u_A_chbtil": 0.004360658273115247, + "A_chbox": 0.1212480973276431, + "u_A_chbox": 4.104310617634099e-05, + "A_chdd": 0.018850847419796247, + "u_A_chdd": 0.001724106357922228, + "A_chw": 0.891351770179928, + "u_A_chw": 0.011198459841931113, + "A_chb": 0.09132677477043682, + "u_A_chb": 0.005140611913769566, + "A_chwb": 0.3438474873341333, + "u_A_chwb": 0.004924262827295786, + "A_chj1": -0.11521723819494954, + "u_A_chj1": 0.05273158169795962, + "A_chq1": 0.0148838859448851, + "u_A_chq1": 0.004932519075133718, + "A_chj3": 3.564644258312058, + "u_A_chj3": 0.023647022874194987, + "A_chq3": 0.0148838859448851, + "u_A_chq3": 0.004932519075133718, + "A_chu": 0.8104199009688952, + "u_A_chu": 0.04060391744991871, + "A_chd": -0.30630860927745057, + "u_A_chd": 0.035424190655498934, + "A_chl1": -0.02749542936871731, + "u_A_chl1": 0.0018339299648499148, + "A_chl3": -0.1506542531365126, + "u_A_chl3": 0.0011532243363764133, + "A_che": -0.02206663616030835, + "u_A_che": 0.0011825957189016826, + "A_cll1": 0.11975426750375237, + "u_A_cll1": 0.000553669539609761, + "B_chwtil_2": 0.3648663394529423, + "u_B_chwtil_2": 0.011931800506764484, + "B_chbtil_2": 0.04493625323330393, + "u_B_chbtil_2": 0.006885417240393679, + "B_chwbtil_2": 0.06694781278156495, + "u_B_chwbtil_2": 0.00571142661544781, + "B_chw_2": 0.4820937436105213, + "u_B_chw_2": 0.012196323679479617, + "B_chb_2": 0.0554095733709397, + "u_B_chb_2": 0.006639956693986337, + "B_chwb_2": 0.08474399440286552, + "u_B_chwb_2": 0.005484462134937022, + "B_chj1_2": 4.149768235698304, + "u_B_chj1_2": 0.0612475364158253, + "B_chq1_2": 0.03642654801049294, + "u_B_chq1_2": 0.005942089406655403, + "B_chj3_2": 4.01007058655226, + "u_B_chj3_2": 0.0604690634311935, + "B_chq3_2": 0.03642654801049294, + "u_B_chq3_2": 0.005942089406655403, + "B_chu_2": 2.6064996890967063, + "u_B_chu_2": 0.25694175015195886, + "B_chd_2": 1.8936336610789934, + "u_B_chd_2": 0.2682513351060237, + "B_chwtil_chwbtil": 0.1900149968112076, + "u_B_chwtil_chwbtil": 0.006691293749743931, + "B_chwtil_chj1": 0.04530691219031954, + "u_B_chwtil_chj1": 0.03623911537542813, + "B_chbtil_chwbtil": 0.07871710530093047, + "u_B_chbtil_chwbtil": 0.012236139200848963, + "B_chbtil_chu": 0.1012371811116909, + "u_B_chbtil_chu": 0.07674312291690916, + "B_chbtil_chd": -0.03120303575386946, + "u_B_chbtil_chd": 0.01808969207188682, + "B_chwbtil_chj1": 0.013827941631504314, + "u_B_chwbtil_chj1": 0.009549385896692023, + "B_chwbtil_chu": 0.08597015734315439, + "u_B_chwbtil_chu": 0.06707497807223674, + "B_chwbtil_chd": -0.0276868288042183, + "u_B_chwbtil_chd": 0.017145746677354214, + "B_chbox_chw": 0.054037354810855656, + "u_B_chbox_chw": 0.0006788959764088457, + "B_chbox_chwb": 0.020845430342898964, + "u_B_chbox_chwb": 0.0002985287323717816, + "B_chbox_chj3": 0.21610316004604144, + "u_B_chbox_chj3": 0.0014335783580770108, + "B_chbox_chu": 0.04913093754329933, + "u_B_chbox_chu": 0.0024615740815468624, + "B_chbox_chd": -0.018569659881746452, + "u_B_chbox_chd": 0.002147557008398004, + "B_chdd_chw": 0.01987596411319617, + "u_B_chdd_chw": 0.0009239530927616131, + "B_chdd_chb": -0.01029075290946535, + "u_B_chdd_chb": 0.0005914235215686457, + "B_chdd_chj1": -0.048987848897852335, + "u_B_chdd_chj1": 0.0030891352081019213, + "B_chdd_chj3": 0.083357124324504, + "u_B_chdd_chj3": 0.00290479345296566, + "B_chdd_chu": -0.09340773118381171, + "u_B_chdd_chu": 0.004896454095633557, + "B_chdd_chd": 0.032054100531065235, + "u_B_chdd_chd": 0.00392347547609847, + "B_chw_chwb": 0.27079205400215073, + "u_B_chw_chwb": 0.00688902557001103, + "B_chw_chj1": -0.25294734981717376, + "u_B_chw_chj1": 0.044898873826801515, + "B_chw_chq1": 0.011370214507972497, + "u_B_chw_chq1": 0.004669563020268435, + "B_chw_chj3": 1.875785911505959, + "u_B_chw_chj3": 0.03726604478585841, + "B_chw_chq3": 0.011370214507972497, + "u_B_chw_chq3": 0.004669563020268435, + "B_chw_chl1": -0.01296718447219865, + "u_B_chw_chl1": 0.0014806083663715267, + "B_chw_chl3": -0.06447132818908728, + "u_B_chw_chl3": 0.0012174479704902795, + "B_chw_che": -0.010078985239506203, + "u_B_chw_che": 0.0007182027684489315, + "B_chw_cll1": 0.05353903560162524, + "u_B_chw_cll1": 0.0007969054011770697, + "B_chb_chwb": 0.08682277049900873, + "u_B_chb_chwb": 0.011729642373617122, + "B_chb_chj1": 0.17763506718281308, + "u_B_chb_chj1": 0.0037019635956349046, + "B_chb_chj3": -0.012826383312034275, + "u_B_chb_chj3": 0.004315058933848415, + "B_chb_chu": 0.3975809756766609, + "u_B_chb_chu": 0.03235871843801591, + "B_chb_chd": -0.15623160644019543, + "u_B_chb_chd": 0.03328874248614394, + "B_chwb_chj1": 0.04221429056768149, + "u_B_chwb_chj1": 0.013306747541663147, + "B_chwb_chj3": 0.5834835659651602, + "u_B_chwb_chj3": 0.010787433737274796, + "B_chwb_chu": 0.26699409792401974, + "u_B_chwb_chu": 0.030689641564832035, + "B_chwb_chd": -0.11157524675611626, + "u_B_chwb_chd": 0.02865805908270691, + "B_chwb_chl3": -0.024148096454324502, + "u_B_chwb_chl3": 0.0004920367974696253, + "B_chwb_cll1": 0.02173639217972527, + "u_B_chwb_cll1": 0.00035158287541808337, + "B_chj1_chj3": -1.078319222016731, + "u_B_chj1_chj3": 0.16052383139644552, + "B_chq1_chj3": -0.03853740096887966, + "u_B_chq1_chj3": 0.0004760952233734002, + "B_chq1_chq3": 0.07285310212738863, + "u_B_chq1_chq3": 0.011884178774621518, + "B_chj3_chq3": -0.03853740096887966, + "u_B_chj3_chq3": 0.0004760952233734002, + "B_chj3_chu": -0.059533477285457284, + "u_B_chj3_chu": 0.0020025792780213355, + "B_chj3_chd": 0.02591117134230307, + "u_B_chj3_chd": 0.0017156462410601165, + "B_chj3_chl1": -0.05051963345966824, + "u_B_chj3_chl1": 0.003790553039202243, + "B_chj3_chl3": -0.2714533666194146, + "u_B_chj3_chl3": 0.0029653739816706388, + "B_chj3_che": -0.04027945190572555, + "u_B_chj3_che": 0.002420334155768472, + "B_chj3_cll1": 0.21660934098501128, + "u_B_chj3_cll1": 0.0018399095129449307, + "B_chu_chl3": -0.060567168000180326, + "u_B_chu_chl3": 0.0033471989349265242, + "B_chu_cll1": 0.04815472180819932, + "u_B_chu_cll1": 0.0024984448899283604, + "B_chd_chl3": 0.021044877262204813, + "u_B_chd_chl3": 0.0027874911020468935, + "B_chd_cll1": -0.018129635345155104, + "u_B_chd_cll1": 0.0022162063176299324, + "B_chl3_cll1": -0.011438068150173286, + "u_B_chl3_cll1": 0.00010632979072624481 + }, + "QQ2HLL_PTV_150_250_GE1J": { + "A_chbox": 0.12124809857305464, + "u_A_chbox": 0.00011910212582145432, + "A_chdd": 0.019006908626071847, + "u_A_chdd": 0.00229137993641473, + "A_chw": 0.8688616067689956, + "u_A_chw": 0.014476938699269677, + "A_chb": 0.08893299821154486, + "u_A_chb": 0.006398977353375642, + "A_chwb": 0.3407801792173406, + "u_A_chwb": 0.006069454523767577, + "A_chj1": -0.20721355543222722, + "u_A_chj1": 0.06402272605543324, + "A_chq1": 0.054539506321564145, + "u_A_chq1": 0.008467924984261493, + "A_chj3": 3.0926730516256877, + "u_A_chj3": 0.03567276940901563, + "A_chq3": 0.054539506321564145, + "u_A_chq3": 0.008467924984261493, + "A_chu": 0.6916379662578576, + "u_A_chu": 0.043419474172020016, + "A_chd": -0.24698618040300027, + "u_A_chd": 0.04214979496899164, + "A_chbq": -0.010619222986756919, + "u_A_chbq": 0.010788991500452046, + "A_chl1": -0.0262060965291777, + "u_A_chl1": 0.0023522415069399576, + "A_chl3": -0.15057225686188597, + "u_A_chl3": 0.0014770088351138595, + "A_che": -0.023089068851000486, + "u_A_che": 0.0016083462071663634, + "A_cll1": 0.11959532057195718, + "u_A_cll1": 0.0007270789151283815, + "B_chwtil_2": 0.365652648364061, + "u_B_chwtil_2": 0.023626901309713032, + "B_chbtil_2": 0.032122706605258226, + "u_B_chbtil_2": 0.003822413428086835, + "B_chwbtil_2": 0.05717227214950935, + "u_B_chwbtil_2": 0.004505483561683009, + "B_chw_2": 0.4786221000412695, + "u_B_chw_2": 0.023580247084831554, + "B_chb_2": 0.044938356877362, + "u_B_chb_2": 0.004542713660396925, + "B_chwb_2": 0.07687383039841113, + "u_B_chwb_2": 0.004658319001621392, + "B_chj1_2": 3.6058206694362758, + "u_B_chj1_2": 0.09598485319070311, + "B_chq1_2": 0.06419903821127018, + "u_B_chq1_2": 0.009084129061027282, + "B_chj3_2": 3.484001623561513, + "u_B_chj3_2": 0.09484113132624501, + "B_chq3_2": 0.06419903821127018, + "u_B_chq3_2": 0.009084129061027282, + "B_chu_2": 1.7776810140865535, + "u_B_chu_2": 0.1364147059388214, + "B_chd_2": 1.5870660431054027, + "u_B_chd_2": 0.3632436918735887, + "B_chbq_2": 0.10246043279173861, + "u_B_chbq_2": 0.0854635638693957, + "B_chwtil_chwbtil": 0.19344958522010486, + "u_B_chwtil_chwbtil": 0.015972924315692208, + "B_chwtil_chj1": -0.05231980046720417, + "u_B_chwtil_chj1": 0.055704038352893684, + "B_chwtil_chj3": -0.021992891087637963, + "u_B_chwtil_chj3": 0.055146891306516274, + "B_chbtil_chwbtil": 0.05858690574231772, + "u_B_chbtil_chwbtil": 0.007224382447268301, + "B_chbtil_chu": -0.018105995141374714, + "u_B_chbtil_chu": 0.02358079484587451, + "B_chbtil_chd": -0.03307777403933763, + "u_B_chbtil_chd": 0.038436716357554884, + "B_chwbtil_chj1": -0.021143497982418942, + "u_B_chwbtil_chj1": 0.017917753930130065, + "B_chwbtil_chu": -0.013203123408847741, + "u_B_chwbtil_chu": 0.022198850169410637, + "B_chwbtil_chd": -0.04334210880056262, + "u_B_chwbtil_chd": 0.03384125208933703, + "B_chbox_chw": 0.05267390833556092, + "u_B_chbox_chw": 0.0008776506048906677, + "B_chbox_chwb": 0.020659475663409994, + "u_B_chbox_chwb": 0.0003679549350029043, + "B_chbox_chj1": -0.012562126267645878, + "u_B_chbox_chj1": 0.0038813167057626962, + "B_chbox_chj3": 0.1874903578266936, + "u_B_chbox_chj3": 0.0021626275548776316, + "B_chbox_chu": 0.04192988773918367, + "u_B_chbox_chu": 0.002632263576690012, + "B_chbox_chd": -0.014973311714180138, + "u_B_chbox_chd": 0.002555293581637825, + "B_chdd_chw": 0.020034580794608025, + "u_B_chdd_chw": 0.0011748194468075741, + "B_chdd_chb": -0.010332885654271755, + "u_B_chdd_chb": 0.0008130163815413658, + "B_chdd_chj1": -0.044786005237340436, + "u_B_chdd_chj1": 0.0037201758820402473, + "B_chdd_chj3": 0.07439079040655781, + "u_B_chdd_chj3": 0.0035118932041545295, + "B_chdd_chu": -0.08027113998605812, + "u_B_chdd_chu": 0.00563975618128789, + "B_chdd_chd": 0.033982678032979045, + "u_B_chdd_chd": 0.006501139557018873, + "B_chw_chwb": 0.27215588862001205, + "u_B_chw_chwb": 0.01610137915964298, + "B_chw_chj1": -0.2324922682562109, + "u_B_chw_chj1": 0.06017030369139729, + "B_chw_chq1": 0.020880659378938092, + "u_B_chw_chq1": 0.004040310168960037, + "B_chw_chj3": 1.6671333453423454, + "u_B_chw_chj3": 0.052594703361065254, + "B_chw_chq3": 0.020880659378938092, + "u_B_chw_chq3": 0.004040310168960037, + "B_chw_chl1": -0.01401664530544763, + "u_B_chw_chl1": 0.0015803617783140492, + "B_chw_chl3": -0.063228342617288, + "u_B_chw_chl3": 0.0014081714766137686, + "B_chw_cll1": 0.051622163812976955, + "u_B_chw_cll1": 0.0010045525686801953, + "B_chb_chwb": 0.0653870458704909, + "u_B_chb_chwb": 0.007547490917422217, + "B_chb_chj1": 0.1590287757373064, + "u_B_chb_chj1": 0.00521516042477728, + "B_chb_chu": 0.3328414683923466, + "u_B_chb_chu": 0.029498586692092262, + "B_chb_chd": -0.09211679365003794, + "u_B_chb_chd": 0.050754393229608674, + "B_chwb_chj1": 0.04031992152143967, + "u_B_chwb_chj1": 0.018875734054186605, + "B_chwb_chj3": 0.5243558596945388, + "u_B_chwb_chj3": 0.016484201998439467, + "B_chwb_chu": 0.2293973733802907, + "u_B_chwb_chu": 0.02284082636074138, + "B_chwb_chd": -0.07466865101358071, + "u_B_chwb_chd": 0.04779256370313295, + "B_chwb_chl3": -0.023306571617930507, + "u_B_chwb_chl3": 0.000639031769119726, + "B_chwb_cll1": 0.021239998351901233, + "u_B_chwb_cll1": 0.0004281923098469168, + "B_chj1_chj3": -0.9379183317237569, + "u_B_chj1_chj3": 0.22436043562100802, + "B_chj1_chl3": 0.01710909862104046, + "u_B_chj1_chl3": 0.0055933550407496115, + "B_chj1_cll1": -0.013734169863835891, + "u_B_chj1_cll1": 0.004085932622673674, + "B_chq1_chj3": -0.035519335242548536, + "u_B_chq1_chj3": 0.0006689073621313931, + "B_chq1_chq3": 0.12839808023293126, + "u_B_chq1_chq3": 0.01816825863858943, + "B_chj3_chq3": -0.035519335242548536, + "u_B_chj3_chq3": 0.0006689073621313931, + "B_chj3_chu": -0.05089253204831876, + "u_B_chj3_chu": 0.0020840197885616855, + "B_chj3_chd": 0.02193031714093053, + "u_B_chj3_chd": 0.0021089919491428643, + "B_chj3_chl1": -0.04353004359254709, + "u_B_chj3_chl1": 0.004480578887022753, + "B_chj3_chl3": -0.23563722025868444, + "u_B_chj3_chl3": 0.003909519582791788, + "B_chj3_che": -0.036855666767327974, + "u_B_chj3_che": 0.0032613189804572675, + "B_chj3_cll1": 0.18785281393601486, + "u_B_chj3_cll1": 0.0025681690421484552, + "B_chu_chl3": -0.05205581069123672, + "u_B_chu_chl3": 0.003796206410285707, + "B_chu_cll1": 0.041471988664798815, + "u_B_chu_cll1": 0.0027241621216358212, + "B_chd_chl3": 0.020516428886757854, + "u_B_chd_chl3": 0.004403948139945232, + "B_chd_cll1": -0.014526187935431376, + "u_B_chd_cll1": 0.0026617278078416517, + "B_chl3_cll1": -0.01146441603623539, + "u_B_chl3_cll1": 0.00013566136047809535 + }, + "QQ2HLL_PTV_75_150": { + "A_chbox": 0.12124809452220725, + "u_A_chbox": 1.915128021726229e-05, + "A_chdd": 0.01643832716954886, + "u_A_chdd": 0.0007566313035418236, + "A_chw": 0.7735801382788834, + "u_A_chw": 0.0029875974775464644, + "A_chb": 0.08662131870542394, + "u_A_chb": 0.0016968695650335802, + "A_chwb": 0.30319542051965326, + "u_A_chwb": 0.0013351116405177354, + "A_chj1": -0.017733291735460628, + "u_A_chj1": 0.011463794258206773, + "A_chj3": 1.699991761055558, + "u_A_chj3": 0.005524857405669691, + "A_chu": 0.3611597827891409, + "u_A_chu": 0.008157445984911763, + "A_chd": -0.13766440303581312, + "u_A_chd": 0.007150142146314826, + "A_chl1": -0.027831075745792525, + "u_A_chl1": 0.0008688364628578886, + "A_chl3": -0.1538667737832007, + "u_A_chl3": 0.000629424640131202, + "A_che": -0.024571823051425728, + "u_A_che": 0.0005366715756273266, + "A_cll1": 0.12048310344208943, + "u_A_cll1": 0.00024119999103559015, + "B_chwtil_2": 0.1336359214474753, + "u_B_chwtil_2": 0.002694263084577934, + "B_chbtil_2": 0.014559793387817502, + "u_B_chbtil_2": 0.001385738907004894, + "B_chwbtil_2": 0.021954668504023066, + "u_B_chwbtil_2": 0.0006341155353122643, + "B_chw_2": 0.24280062999404642, + "u_B_chw_2": 0.006500107889370043, + "B_chb_2": 0.026817786643196517, + "u_B_chb_2": 0.0019087568737650548, + "B_chwb_2": 0.040998934499279265, + "u_B_chwb_2": 0.0007189765971732119, + "B_chj1_2": 1.0257606183568033, + "u_B_chj1_2": 0.010435914356594665, + "B_chq1_2": 0.015552009750971808, + "u_B_chq1_2": 0.0011954825254730875, + "B_chj3_2": 0.9595846047761072, + "u_B_chj3_2": 0.010278110985594877, + "B_chq3_2": 0.015552009750971808, + "u_B_chq3_2": 0.0011954825254730875, + "B_chu_2": 0.5530993022624695, + "u_B_chu_2": 0.01625977527252347, + "B_chd_2": 0.4046518569056531, + "u_B_chd_2": 0.024310803142159592, + "B_chbq_2": 0.017589968752602037, + "u_B_chbq_2": 0.004409253337740572, + "B_chwtil_chwbtil": 0.07144727177331006, + "u_B_chwtil_chwbtil": 0.0016281061548063056, + "B_chbtil_chwbtil": 0.023121544098896874, + "u_B_chbtil_chwbtil": 0.0012993636359294428, + "B_chbox_chw": 0.0468975591990998, + "u_B_chbox_chw": 0.00018112017290848533, + "B_chbox_chwb": 0.01838093475593861, + "u_B_chbox_chwb": 8.093987900317036e-05, + "B_chbox_chj3": 0.10306038443326591, + "u_B_chbox_chj3": 0.0003349392499513109, + "B_chbox_chu": 0.021894968700768395, + "u_B_chbox_chu": 0.0004945373785551252, + "B_chdd_chw": 0.015950021417468613, + "u_B_chdd_chw": 0.0003087285484617945, + "B_chdd_chj1": -0.023180315157021115, + "u_B_chdd_chj1": 0.0006729975427964417, + "B_chdd_chj3": 0.03778412263809627, + "u_B_chdd_chj3": 0.0006271345978415125, + "B_chdd_chu": -0.04387867883307009, + "u_B_chdd_chu": 0.0010339145071251816, + "B_chdd_chd": 0.016526188719211708, + "u_B_chdd_chd": 0.0008848922337577318, + "B_chw_chwb": 0.14256334792075404, + "u_B_chw_chwb": 0.0025836233631454392, + "B_chw_chj1": -0.08900565029223993, + "u_B_chw_chj1": 0.01075393550424026, + "B_chw_chj3": 0.8078713303620747, + "u_B_chw_chj3": 0.009600387755536047, + "B_chw_chl3": -0.05253834517404479, + "u_B_chw_chl3": 0.004844225776308561, + "B_chw_cll1": 0.04653676562094161, + "u_B_chw_cll1": 0.00022710690774282446, + "B_chb_chwb": 0.03304083167374972, + "u_B_chb_chwb": 0.0016023843147215543, + "B_chb_chj1": 0.0738688113894259, + "u_B_chb_chj1": 0.0009264034165243358, + "B_chb_chu": 0.1730590729712966, + "u_B_chb_chu": 0.005817265571610305, + "B_chb_chd": -0.06273067269312749, + "u_B_chb_chd": 0.004475527577666484, + "B_chwb_chj1": 0.018042493558309933, + "u_B_chwb_chj1": 0.002944220176096528, + "B_chwb_chj3": 0.25567997232131234, + "u_B_chwb_chj3": 0.0025164655516476475, + "B_chwb_chu": 0.11196838749443257, + "u_B_chwb_chu": 0.00455515008066081, + "B_chwb_chd": -0.041301131809904135, + "u_B_chwb_chd": 0.0035523304357300803, + "B_chwb_chl3": -0.021511702283316583, + "u_B_chwb_chl3": 0.0008127338701607885, + "B_chwb_cll1": 0.019103292434622988, + "u_B_chwb_cll1": 0.00010429487416145861, + "B_chj1_chj3": -0.21318830215212778, + "u_B_chj1_chj3": 0.023517206043336524, + "B_chq1_chj3": -0.018469801629602146, + "u_B_chq1_chj3": 0.00011235296653586324, + "B_chq1_chq3": 0.031104019975310156, + "u_B_chq1_chq3": 0.0023909649418025238, + "B_chj3_chq3": -0.018469801629602146, + "u_B_chj3_chq3": 0.00011235296653586324, + "B_chj3_chu": -0.026404410800917707, + "u_B_chj3_chu": 0.00037118311731721196, + "B_chj3_chd": 0.011420583250048435, + "u_B_chj3_chd": 0.00032391145459781677, + "B_chj3_chl1": -0.02146793978436924, + "u_B_chj3_chl1": 0.0024803497709355643, + "B_chj3_chl3": -0.13074950808933694, + "u_B_chj3_chl3": 0.002368022885734309, + "B_chj3_che": -0.02159598815239315, + "u_B_chj3_che": 0.0005409713806329535, + "B_chj3_cll1": 0.10474580359388386, + "u_B_chj3_cll1": 0.0004194762835628408, + "B_chu_chl3": -0.028307242948128634, + "u_B_chu_chl3": 0.0008211265820230023, + "B_chu_cll1": 0.022421617366568263, + "u_B_chu_cll1": 0.000534659292948495, + "B_chd_chl3": 0.010142727393091472, + "u_B_chd_chl3": 0.000874011435662044, + "B_chl3_cll1": -0.011742309533521424, + "u_B_chl3_cll1": 5.789789728545475e-05 + }, + "QQ2HLL_PTV_GT250": { + "A_chwtil": 0.013833457838668593, + "u_A_chwtil": 0.033132610408114334, + "A_chbox": 0.12124810089110592, + "u_A_chbox": 0.00017225229294018547, + "A_chdd": 0.013008734500433002, + "u_A_chdd": 0.002612429668657423, + "A_chw": 0.9030885091177141, + "u_A_chw": 0.032049387189100505, + "A_chb": 0.12287598439228191, + "u_A_chb": 0.013249059903225573, + "A_chwb": 0.37455595561561256, + "u_A_chwb": 0.013956376951165318, + "A_chj1": -1.1564371112937841, + "u_A_chj1": 0.26996313757214757, + "A_chq1": 0.06223460112164288, + "u_A_chq1": 0.01651799486491518, + "A_chj3": 9.630313067203291, + "u_A_chj3": 0.19994992811815354, + "A_chq3": 0.06223460112164288, + "u_A_chq3": 0.01651799486491518, + "A_chu": 2.7532318476511572, + "u_A_chu": 0.21200864423670301, + "A_chd": -0.6194049291652375, + "u_A_chd": 0.12052420356848802, + "A_chbq": -0.021092568195373987, + "u_A_chbq": 0.018032860148983056, + "A_chl1": -0.028348389981387872, + "u_A_chl1": 0.0026156242539634163, + "A_chl3": -0.15448358597762749, + "u_A_chl3": 0.001677814299087, + "A_che": -0.024323473654296438, + "u_A_che": 0.00177122094497809, + "A_cll1": 0.12157700527819812, + "u_A_cll1": 0.0008211018525657206, + "B_chwtil_2": 1.153883560297129, + "u_B_chwtil_2": 0.06192039932842239, + "B_chbtil_2": 0.16854248093780264, + "u_B_chbtil_2": 0.025147903838339276, + "B_chwbtil_2": 0.22189409069485175, + "u_B_chwbtil_2": 0.022200961776120534, + "B_chw_2": 1.2737347027829269, + "u_B_chw_2": 0.06232004640806578, + "B_chb_2": 0.1828907423326827, + "u_B_chb_2": 0.025449734948972264, + "B_chwb_2": 0.24110713890130656, + "u_B_chwb_2": 0.022228026434004237, + "B_chj1_2": 51.48991581704343, + "u_B_chj1_2": 5.426248619934485, + "B_chq1_2": 0.19342406823709915, + "u_B_chq1_2": 0.04578233240715313, + "B_chj3_2": 51.108970237106384, + "u_B_chj3_2": 5.4216692875084345, + "B_chq3_2": 0.19342406823709915, + "u_B_chq3_2": 0.04578233240715313, + "B_chu_2": 33.54672619842118, + "u_B_chu_2": 6.772936322132747, + "B_chd_2": 10.337114377572357, + "u_B_chd_2": 2.604515556070107, + "B_chbq_2": 0.22880642232351667, + "u_B_chbq_2": 0.17889905152442684, + "B_chwtil_chbtil": -0.048402941548790095, + "u_B_chwtil_chbtil": 0.013426947005470263, + "B_chwtil_chwbtil": 0.5593889384610051, + "u_B_chwtil_chwbtil": 0.030934531467619906, + "B_chwtil_chj1": -0.5758451777700254, + "u_B_chwtil_chj1": 0.6057882222013334, + "B_chwtil_chq1": -0.012342546967362195, + "u_B_chwtil_chq1": 0.013354227317507917, + "B_chwtil_chj3": 0.6768473966266274, + "u_B_chwtil_chj3": 0.6050034570387013, + "B_chwtil_chq3": -0.012342546967362195, + "u_B_chwtil_chq3": 0.013354227317507917, + "B_chbtil_chwbtil": 0.29041337322288424, + "u_B_chbtil_chwbtil": 0.04676919224535416, + "B_chbtil_chj1": 0.06292620295057075, + "u_B_chbtil_chj1": 0.05943128067724025, + "B_chbtil_chj3": -0.07419426896388438, + "u_B_chbtil_chj3": 0.05936249942448049, + "B_chbtil_chu": -0.21091317385004946, + "u_B_chbtil_chu": 0.3246405997690297, + "B_chbtil_chd": -0.1502366172826391, + "u_B_chbtil_chd": 0.15420877831296748, + "B_chwbtil_chj1": -0.1499191413786111, + "u_B_chwbtil_chj1": 0.1396585296876881, + "B_chwbtil_chj3": 0.12739365729536134, + "u_B_chwbtil_chj3": 0.13947322687400662, + "B_chwbtil_chu": -0.21112851580689368, + "u_B_chwbtil_chu": 0.3017633121184327, + "B_chwbtil_chd": -0.1232781530074817, + "u_B_chwbtil_chd": 0.14008523059012448, + "B_chbox_chw": 0.054748882826671855, + "u_B_chbox_chw": 0.0019429634380293064, + "B_chbox_chwb": 0.022707101530647363, + "u_B_chbox_chwb": 0.0008460921400357448, + "B_chbox_chj1": -0.0701077631564022, + "u_B_chbox_chj1": 0.016366253087542856, + "B_chbox_chj3": 0.583828521512649, + "u_B_chbox_chj3": 0.012121761620289847, + "B_chbox_chu": 0.16691207999066573, + "u_B_chbox_chu": 0.012852821297376001, + "B_chbox_chd": -0.03755081252990147, + "u_B_chbox_chd": 0.007306659299209922, + "B_chdd_chw": 0.01928795426226681, + "u_B_chdd_chw": 0.002236709848799442, + "B_chdd_chb": -0.014412397237752034, + "u_B_chdd_chb": 0.0015639491094298775, + "B_chdd_chj1": -0.1502175310557183, + "u_B_chdd_chj1": 0.018835264284536617, + "B_chdd_chj3": 0.22244198304395704, + "u_B_chdd_chj3": 0.01852316489124871, + "B_chdd_chu": -0.32124390208093395, + "u_B_chdd_chu": 0.02751039234819102, + "B_chdd_chd": 0.06837641840033362, + "u_B_chdd_chd": 0.013769100905216904, + "B_chw_chb": -0.04946873718677772, + "u_B_chw_chb": 0.014218734876026826, + "B_chw_chwb": 0.636865274659558, + "u_B_chw_chwb": 0.03237130386202227, + "B_chw_chj1": -1.0634807710463927, + "u_B_chw_chj1": 0.6310276019348896, + "B_chw_chq1": 0.024308415139811957, + "u_B_chw_chq1": 0.013947129392581706, + "B_chw_chj3": 4.899404636056873, + "u_B_chw_chj3": 0.6236736594868925, + "B_chw_chq3": 0.024308415139811957, + "u_B_chw_chq3": 0.013947129392581706, + "B_chw_chu": 0.010607908973212878, + "u_B_chw_chu": 0.0019545375081058657, + "B_chw_chl1": -0.013009339898014317, + "u_B_chw_chl1": 0.0027403836967126033, + "B_chw_chl3": -0.06760727637964428, + "u_B_chw_chl3": 0.0029534292568963966, + "B_chw_che": -0.012469833306907572, + "u_B_chw_che": 0.0017435380670445327, + "B_chw_cll1": 0.05473843502504568, + "u_B_chw_cll1": 0.0021232638437046125, + "B_chb_chwb": 0.3047835146970906, + "u_B_chb_chwb": 0.04682307191363573, + "B_chb_chj1": 0.47274088877579895, + "u_B_chb_chj1": 0.05826960672285161, + "B_chb_chj3": -0.06334343027767601, + "u_B_chb_chj3": 0.058846404955575624, + "B_chb_chu": 1.5846230410224083, + "u_B_chb_chu": 0.3907828900635853, + "B_chb_chd": -0.5820551557600845, + "u_B_chb_chd": 0.18876951112081458, + "B_chb_chbq": -0.020368282550994907, + "u_B_chb_chbq": 0.01541140409628986, + "B_chwb_chj1": 0.06591128026486794, + "u_B_chwb_chj1": 0.14722484236621716, + "B_chwb_chq1": 0.01031954086296649, + "u_B_chwb_chq1": 0.005694913797516969, + "B_chwb_chj3": 1.4856272288311585, + "u_B_chwb_chj3": 0.1443126563620552, + "B_chwb_chq3": 0.01031954086296649, + "u_B_chwb_chq3": 0.005694913797516969, + "B_chwb_chu": 1.1841433726023618, + "u_B_chwb_chu": 0.35888036130114626, + "B_chwb_chd": -0.4434386721549696, + "u_B_chwb_chd": 0.15850408543194514, + "B_chwb_chbq": -0.016316767601752012, + "u_B_chwb_chbq": 0.01245997722248001, + "B_chwb_chl3": -0.026376742997473588, + "u_B_chwb_chl3": 0.0014648048621441088, + "B_chwb_cll1": 0.023945889462106316, + "u_B_chwb_cll1": 0.0010331236615860398, + "B_chj1_chq1": 0.014384720304366874, + "u_B_chj1_chq1": 0.0033997686083515146, + "B_chj1_chj3": -29.238247139955703, + "u_B_chj1_chj3": 11.00457193493118, + "B_chj1_chq3": 0.014384720304366874, + "u_B_chj1_chq3": 0.0033997686083515146, + "B_chj1_chl3": 0.07961956712310998, + "u_B_chj1_chl3": 0.023084380932896144, + "B_chj1_che": 0.028247928141185485, + "u_B_chj1_che": 0.012881873896617074, + "B_chj1_cll1": -0.06278889316984824, + "u_B_chj1_cll1": 0.017670567878178466, + "B_chq1_chj3": -0.10535838103343358, + "u_B_chq1_chj3": 0.002860912370398445, + "B_chq1_chq3": 0.38684814232059306, + "u_B_chq1_chq3": 0.09156466477914842, + "B_chq1_chu": -0.026064966009879162, + "u_B_chq1_chu": 0.0022820357929523457, + "B_chj3_chq3": -0.10535838103343358, + "u_B_chj3_chq3": 0.002860912370398445, + "B_chj3_chu": -0.16539028752182353, + "u_B_chj3_chu": 0.008257490320312593, + "B_chj3_chd": 0.0608741922777986, + "u_B_chj3_chd": 0.005788461205802391, + "B_chj3_chbq": 0.019466185132999622, + "u_B_chj3_chbq": 0.0012608333977863928, + "B_chj3_chl1": -0.11985014002890626, + "u_B_chj3_chl1": 0.020733732516183694, + "B_chj3_chl3": -0.7407074665885709, + "u_B_chj3_chl3": 0.018418629529694277, + "B_chj3_che": -0.12916072731199638, + "u_B_chj3_che": 0.01261346539897771, + "B_chj3_cll1": 0.5811352328779468, + "u_B_chj3_cll1": 0.01390519537631591, + "B_chq3_chu": -0.026064966009879162, + "u_B_chq3_chu": 0.0022820357929523457, + "B_chu_chd": 0.013710627203660633, + "u_B_chu_chd": 0.001348638652238713, + "B_chu_chl1": -0.04239506959135184, + "u_B_chu_chl1": 0.01441127068954839, + "B_chu_chl3": -0.22694763942418944, + "u_B_chu_chl3": 0.0211511827005172, + "B_chu_che": -0.034226150702361895, + "u_B_chu_che": 0.009747058618564168, + "B_chu_cll1": 0.17696501154945532, + "u_B_chu_cll1": 0.01503508306165825, + "B_chd_chl1": 0.01704017068528091, + "u_B_chd_chl1": 0.00791888142920816, + "B_chd_chl3": 0.04481112630937123, + "u_B_chd_chl3": 0.009540463845494203, + "B_chd_cll1": -0.03686365516487103, + "u_B_chd_cll1": 0.007756062531519815, + "B_chl3_cll1": -0.011870677382761019, + "u_B_chl3_cll1": 0.00015524567472680493 + }, + "QQ2HLNU": { + "A_chbox": 0.12124814096587098, + "u_A_chbox": 8.315586389987168e-06, + "A_chdd": -0.030311998517480898, + "u_A_chdd": 2.078669045518119e-06, + "A_chw": 0.8809024157038546, + "u_A_chw": 0.0021184916346439495, + "A_chj3": 1.9091019177265927, + "u_A_chj3": 0.008873679913094668, + "A_chl3": -0.1592865922983961, + "u_A_chl3": 0.00021306302103745925, + "A_cll1": 0.12031104840202632, + "u_A_cll1": 0.0001404162564449366, + "B_chwtil_2": 0.22255780308447584, + "u_B_chwtil_2": 0.0035542953131581677, + "B_chw_2": 0.34695423494424815, + "u_B_chw_2": 0.0036013177008551466, + "B_chj3_2": 2.7285374192001663, + "u_B_chj3_2": 0.18239060122038622, + "B_chwtil_chj3": -0.018637055425535898, + "u_B_chwtil_chj3": 0.019454860164562326, + "B_chbox_chw": 0.05340386630133518, + "u_B_chbox_chw": 0.0001284315286452778, + "B_chbox_chj3": 0.11573747132939513, + "u_B_chbox_chj3": 0.0005379564945287352, + "B_chdd_chw": -0.013350960219259148, + "u_B_chdd_chw": 3.210789368701574e-05, + "B_chdd_chj3": -0.028934364065786027, + "u_B_chdd_chj3": 0.00013448967055788814, + "B_chw_chj3": 0.9552209362130714, + "u_B_chw_chj3": 0.023736487068679757, + "B_chw_chl3": -0.06803355103438287, + "u_B_chw_chl3": 0.0003318440227622495, + "B_chw_cll1": 0.053107590358428, + "u_B_chw_cll1": 0.00015708393996454993, + "B_chj3_chl3": -0.15370351990939152, + "u_B_chj3_chl3": 0.0008296377258304583, + "B_chj3_cll1": 0.11762968887626668, + "u_B_chj3_cll1": 0.0006069814993446935, + "B_chl3_cll1": -0.011994801766743923, + "u_B_chl3_cll1": 2.4347770540660533e-05 + }, + "QQ2HLNU_FWDH": { + "A_chbox": 0.12124816265308316, + "u_A_chbox": 0.0001838737636939198, + "A_chdd": -0.030312006527366025, + "u_A_chdd": 4.5968380283855896e-05, + "A_chw": 0.8757370268672812, + "u_A_chw": 0.005264239635749782, + "A_chj3": 1.409433014242516, + "u_A_chj3": 0.010011860397045054, + "A_chl3": -0.1606616598736216, + "u_A_chl3": 0.0006118065094994526, + "A_cll1": 0.12080520934243061, + "u_A_cll1": 0.0004315613377421311, + "B_chwtil_2": 0.1724629505594439, + "u_B_chwtil_2": 0.008973354555902825, + "B_chw_2": 0.297755048591371, + "u_B_chw_2": 0.009646730957865987, + "B_chj3_2": 0.7777705390291776, + "u_B_chj3_2": 0.03135027849698453, + "B_chwtil_chj3": 0.025861033167461876, + "u_B_chwtil_chj3": 0.012603836682074316, + "B_chbox_chw": 0.05309072001629225, + "u_B_chbox_chw": 0.0003191395516606111, + "B_chbox_chj3": 0.08544553965016072, + "u_B_chbox_chj3": 0.0006069592401855952, + "B_chdd_chw": -0.013272673104262528, + "u_B_chdd_chw": 7.978478205765939e-05, + "B_chdd_chj3": -0.021361373291806637, + "u_B_chdd_chj3": 0.0001517398579028368, + "B_chw_chj3": 0.7530292710299323, + "u_B_chw_chj3": 0.021704250934452902, + "B_chw_chl3": -0.06885647769465564, + "u_B_chw_chl3": 0.0006136287698622777, + "B_chw_cll1": 0.05307002639504363, + "u_B_chw_cll1": 0.00039812731825861127, + "B_chj3_chl3": -0.11555666872498907, + "u_B_chj3_chl3": 0.0009806686351225024, + "B_chj3_cll1": 0.08781111427291902, + "u_B_chj3_cll1": 0.0007116534294564148, + "B_chl3_cll1": -0.012139656668332789, + "u_B_chl3_cll1": 6.83988498826424e-05 + }, + "QQ2HLNU_PTV_0_75": { + "A_chbox": 0.12124814479186749, + "u_A_chbox": 6.761375506192452e-07, + "A_chdd": -0.030312002553837335, + "u_A_chdd": 1.5697252006005558e-07, + "A_chw": 0.8134819039205823, + "u_A_chw": 0.001444025136005686, + "A_chj3": 1.0597485565251832, + "u_A_chj3": 0.001704957156376039, + "A_chl3": -0.15977503268438645, + "u_A_chl3": 0.00027982258242501375, + "A_cll1": 0.12019105863697217, + "u_A_cll1": 0.00019236418848728138, + "B_chwtil_2": 0.07975823788906958, + "u_B_chwtil_2": 0.0012826206902625036, + "B_chw_2": 0.19830724697383448, + "u_B_chw_2": 0.0014231741194240634, + "B_chj3_2": 0.31728299996840986, + "u_B_chj3_2": 0.0018511003215467906, + "B_chbox_chw": 0.049316560235528745, + "u_B_chbox_chw": 8.754264516338224e-05, + "B_chbox_chj3": 0.06424624010915714, + "u_B_chbox_chj3": 0.00010336139308629549, + "B_chdd_chw": -0.012329133507130642, + "u_B_chdd_chw": 2.1885657649969108e-05, + "B_chdd_chj3": -0.016061555157744215, + "u_B_chdd_chj3": 2.584033027400213e-05, + "B_chw_chj3": 0.47643570479351643, + "u_B_chw_chj3": 0.0026241438048171953, + "B_chw_chl3": -0.06367078560529897, + "u_B_chw_chl3": 0.00023988950795561135, + "B_chw_cll1": 0.04886283196308466, + "u_B_chw_cll1": 0.0001264191717156099, + "B_chj3_chl3": -0.08704957947671266, + "u_B_chj3_chl3": 0.0002493298705318982, + "B_chj3_cll1": 0.06613198825756131, + "u_B_chj3_cll1": 0.00016057720386383095, + "B_chl3_cll1": -0.012034324343008062, + "u_B_chl3_cll1": 3.2608844442643046e-05 + }, + "QQ2HLNU_PTV_150_250_0J": { + "A_chbox": 0.12124814962988636, + "u_A_chbox": 5.788069707930625e-05, + "A_chdd": -0.03031200255055746, + "u_A_chdd": 1.4470432041229036e-05, + "A_chw": 1.0345333539060066, + "u_A_chw": 0.013933037441929587, + "A_chj3": 3.9397132131612733, + "u_A_chj3": 0.020777807710820828, + "A_chl3": -0.157750402568005, + "u_A_chl3": 0.000850947942340327, + "A_cll1": 0.12027805015500465, + "u_A_cll1": 0.0005555511228775218, + "B_chwtil_2": 0.5562069501516628, + "u_B_chwtil_2": 0.017972340517938046, + "B_chw_2": 0.7002385372377443, + "u_B_chw_2": 0.01883604720606017, + "B_chj3_2": 4.511892173753924, + "u_B_chj3_2": 0.09832019165899285, + "B_chwtil_chj3": 0.04246155975840738, + "u_B_chwtil_chj3": 0.04835191820036147, + "B_chbox_chw": 0.06271759208495907, + "u_B_chbox_chw": 0.0008446771978663991, + "B_chbox_chj3": 0.23884135147785174, + "u_B_chbox_chj3": 0.0012596350423635298, + "B_chdd_chw": -0.015679392884431365, + "u_B_chdd_chw": 0.000211169288567729, + "B_chdd_chj3": -0.059710331264995, + "u_B_chdd_chj3": 0.0003149087110232381, + "B_chw_chj3": 2.302917943463201, + "u_B_chw_chj3": 0.06969800980749734, + "B_chw_chl3": -0.07846510491938492, + "u_B_chw_chl3": 0.00153699546658745, + "B_chw_cll1": 0.06289106357221612, + "u_B_chw_cll1": 0.0009839807084779325, + "B_chj3_chl3": -0.31269161671255036, + "u_B_chj3_chl3": 0.0026009824251858726, + "B_chj3_cll1": 0.23956393897688832, + "u_B_chj3_cll1": 0.0017613674824152705, + "B_chl3_cll1": -0.011856324555178445, + "u_B_chl3_cll1": 9.615599624800673e-05 + }, + "QQ2HLNU_PTV_150_250_GE1J": { + "A_chwtil": 0.030871182799598954, + "u_A_chwtil": 0.01867357014375991, + "A_chbox": 0.12124815201749464, + "u_A_chbox": 0.00011566217924534124, + "A_chdd": -0.03031200147055219, + "u_A_chdd": 2.8915384706144426e-05, + "A_chw": 1.0198816577289767, + "u_A_chw": 0.017854990245138366, + "A_chj3": 3.4884536234759196, + "u_A_chj3": 0.031439831130328236, + "A_chl3": -0.16170320723591022, + "u_A_chl3": 0.0010185100068529364, + "A_cll1": 0.12174073813124543, + "u_A_cll1": 0.0007163221908262094, + "B_chwtil_2": 0.5808498380162225, + "u_B_chwtil_2": 0.052941598226999016, + "B_chw_2": 0.7120137554988492, + "u_B_chw_2": 0.05357600884636715, + "B_chj3_2": 3.9301913655942387, + "u_B_chj3_2": 0.1071074622501011, + "B_chwtil_chw": 0.015258619783847707, + "u_B_chwtil_chw": 0.005923689988510344, + "B_chwtil_chj3": 0.13391543170172168, + "u_B_chwtil_chj3": 0.06444208968788945, + "B_chbox_chw": 0.061829343548557146, + "u_B_chbox_chw": 0.0010824418751489665, + "B_chbox_chj3": 0.21148418757513238, + "u_B_chbox_chj3": 0.0019060088183048786, + "B_chdd_chw": -0.01545733121560146, + "u_B_chdd_chw": 0.0002706109013906879, + "B_chdd_chj3": -0.052871046893783094, + "u_B_chdd_chj3": 0.00047650257343619416, + "B_chw_chj3": 2.0908909971392697, + "u_B_chw_chj3": 0.10990884650164545, + "B_chw_chl3": -0.0819915834220586, + "u_B_chw_chl3": 0.0016548865256794383, + "B_chw_cll1": 0.06298280373386676, + "u_B_chw_cll1": 0.0012309349326472092, + "B_chj3_chl3": -0.2856863146676489, + "u_B_chj3_chl3": 0.0033823619446787102, + "B_chj3_cll1": 0.21578524610008634, + "u_B_chj3_cll1": 0.0024795923002517185, + "B_chl3_cll1": -0.012273998246807789, + "u_B_chl3_cll1": 0.0001187483691626566 + }, + "QQ2HLNU_PTV_75_150": { + "A_chbox": 0.12124814597168522, + "u_A_chbox": 1.3688349855166332e-05, + "A_chdd": -0.030312003234269445, + "u_A_chdd": 3.4213732675517912e-06, + "A_chw": 0.932027835481932, + "u_A_chw": 0.0032246659597326343, + "A_chj3": 1.8237873407267933, + "u_A_chj3": 0.004139324024025553, + "A_chl3": -0.15875231144092247, + "u_A_chl3": 0.00038811455126347747, + "A_cll1": 0.1203636215111073, + "u_A_cll1": 0.00024325680477825618, + "B_chwtil_2": 0.2133849600073911, + "u_B_chwtil_2": 0.00403845333500425, + "B_chw_2": 0.3427473905190991, + "u_B_chw_2": 0.004269097351629062, + "B_chj3_2": 0.9632582473743426, + "u_B_chj3_2": 0.007523616787440859, + "B_chbox_chw": 0.05650329063931989, + "u_B_chbox_chw": 0.00019549231451514257, + "B_chbox_chj3": 0.11056536226611491, + "u_B_chbox_chj3": 0.0002509425533561695, + "B_chdd_chw": -0.014125816432678136, + "u_B_chdd_chw": 4.887307162919035e-05, + "B_chdd_chj3": -0.027641330659696265, + "u_B_chdd_chj3": 6.27357213251894e-05, + "B_chw_chj3": 0.9355532808839205, + "u_B_chw_chj3": 0.007987576737595061, + "B_chw_chl3": -0.07107404471315801, + "u_B_chw_chl3": 0.0006941201820550232, + "B_chw_cll1": 0.05616492702216779, + "u_B_chw_cll1": 0.0002499249238443389, + "B_chj3_chl3": -0.14652906906655816, + "u_B_chj3_chl3": 0.0006886145448994676, + "B_chj3_cll1": 0.11241196753287576, + "u_B_chj3_cll1": 0.00036201444383993444, + "B_chl3_cll1": -0.011947581364319716, + "u_B_chl3_cll1": 4.347297925009031e-05 + }, + "QQ2HLNU_PTV_GT250": { + "A_chwtil": -0.05437582524936622, + "u_A_chwtil": 0.038278626625571036, + "A_chbox": 0.12124814552311841, + "u_A_chbox": 0.0001158246155763946, + "A_chdd": -0.030312004096468222, + "u_A_chdd": 2.895620313059865e-05, + "A_chw": 0.9907756385051696, + "u_A_chw": 0.036772659435196545, + "A_chj3": 10.875851062140637, + "u_A_chj3": 0.18893727170737576, + "A_chl3": -0.15684330108023015, + "u_A_chl3": 0.001390507504214398, + "A_cll1": 0.12006916649568208, + "u_A_cll1": 0.0007882617963570342, + "B_chwtil_2": 1.5783595854189612, + "u_B_chwtil_2": 0.06088698287800136, + "B_chw_2": 1.7006269642618839, + "u_B_chw_2": 0.05896481533281746, + "B_chj3_2": 55.95970882720871, + "u_B_chj3_2": 5.590449418850528, + "B_chwtil_chj3": -0.835286664287215, + "u_B_chwtil_chj3": 0.5895692530964697, + "B_chbox_chw": 0.06006482044038325, + "u_B_chbox_chw": 0.0022293073845984397, + "B_chbox_chj3": 0.6593378834059138, + "u_B_chbox_chj3": 0.01145406106534528, + "B_chdd_chw": -0.015016199533714759, + "u_B_chdd_chw": 0.0005573269895225779, + "B_chdd_chj3": -0.16483450753819592, + "u_B_chdd_chj3": 0.0028635395596345575, + "B_chw_chj3": 5.008465034491238, + "u_B_chw_chj3": 0.7017575405238463, + "B_chw_chl3": -0.07085786195034749, + "u_B_chw_chl3": 0.005051564942855483, + "B_chw_cll1": 0.060099194427187835, + "u_B_chw_cll1": 0.002542866124224235, + "B_chj3_chl3": -0.8532296506042141, + "u_B_chj3_chl3": 0.018502009979429086, + "B_chj3_cll1": 0.6611980760780972, + "u_B_chj3_cll1": 0.013662834395758171, + "B_chl3_cll1": -0.011764251916594833, + "u_B_chl3_cll1": 0.0001495727380395934 + }, + "QQ2HQQ": { + "A_chbox": 0.12124809480932401, + "u_A_chbox": 2.2813844949632393e-05, + "A_chw": 0.14252675556257408, + "u_A_chw": 0.002080030789426621, + "A_chwb": 0.04572473021231691, + "u_A_chwb": 0.0008361107996338434, + "A_chj3": 0.16239739884426813, + "u_A_chj3": 0.005603874015427839, + "A_chu": 0.02044315085755634, + "u_A_chu": 0.0026600610198648286, + "A_chl3": -0.3437587993521147, + "u_A_chl3": 0.00016153115263657528, + "A_cll1": 0.16702144970874766, + "u_A_cll1": 0.00011417121052255727, + "B_chwtil_2": 0.08968064019798322, + "u_B_chwtil_2": 0.002150598305483468, + "B_chbtil_2": 0.022941934021129484, + "u_B_chbtil_2": 0.001737867466464211, + "B_chwbtil_2": 0.01505411101158616, + "u_B_chwbtil_2": 0.0004858915004301726, + "B_chw_2": 0.12709427910503893, + "u_B_chw_2": 0.002690207993190059, + "B_chb_2": 0.02459888065244273, + "u_B_chb_2": 0.0018623243289966587, + "B_chwb_2": 0.019361377817144042, + "u_B_chwb_2": 0.0005445014177264449, + "B_chj1_2": 0.22315023874779563, + "u_B_chj1_2": 0.0204875406601059, + "B_chj3_2": 0.729825882229023, + "u_B_chj3_2": 0.04680646063754126, + "B_chu_2": 0.16611255445892315, + "u_B_chu_2": 0.03458606212381879, + "B_chd_2": 0.07004705339950051, + "u_B_chd_2": 0.023309195799835414, + "B_chl3_2": 0.030260421454306265, + "u_B_chl3_2": 2.160453972244476e-05, + "B_chwtil_chbtil": 0.011757029374393057, + "u_B_chwtil_chbtil": 0.0005747303597680452, + "B_chwtil_chwbtil": -0.013998717587363622, + "u_B_chwtil_chwbtil": 0.0008903319060470514, + "B_chbtil_chwbtil": -0.020834723610597152, + "u_B_chbtil_chwbtil": 0.00128717599081833, + "B_chbox_chl3": -0.020840049671103766, + "u_B_chbox_chl3": 9.792674073719337e-06, + "B_chbox_cll1": 0.010125517350096156, + "u_B_chbox_cll1": 6.921522661330271e-06, + "B_chw_chb": 0.012367017489919885, + "u_B_chw_chb": 0.0006802928737954773, + "B_chw_chj1": -0.01647295780539958, + "u_B_chw_chj1": 0.005153594101662706, + "B_chw_chj3": 0.28646304794746147, + "u_B_chw_chj3": 0.009765318303966883, + "B_chw_chl3": -0.017698168163987144, + "u_B_chw_chl3": 0.0003368649205274788, + "B_chb_chwb": -0.020077153138953686, + "u_B_chb_chwb": 0.0014336380163622424, + "B_chb_chu": 0.01843620414568557, + "u_B_chb_chu": 0.0023160455647453335, + "B_chwb_chj3": 0.022753093974474836, + "u_B_chwb_chj3": 0.001316416292722153, + "B_chwb_chu": 0.0179724754019345, + "u_B_chwb_chu": 0.002431579074450988, + "B_chj1_chj3": -0.1270135489343823, + "u_B_chj1_chj3": 0.04105543709311862, + "B_chj3_chl3": -0.010515426158925752, + "u_B_chj3_chl3": 0.0008378300633328531, + "B_chl3_cll1": -0.029774271568970518, + "u_B_chl3_cll1": 2.5063785750796297e-05 + }, + "QQ2HQQ_0J": { + "A_chbox": 0.12124809781565245, + "u_A_chbox": 9.903053249168556e-06, + "A_chdd": -0.012134328701455968, + "u_A_chdd": 0.0008262898420415276, + "A_chw": 0.19147590064007322, + "u_A_chw": 0.005279855944538517, + "A_chwb": 0.036185273778508796, + "u_A_chwb": 0.0043286395390571475, + "A_chj3": 0.2487965169079908, + "u_A_chj3": 0.006752942573685529, + "A_chu": 0.018208935973840785, + "u_A_chu": 0.003362717469227703, + "A_chl3": -0.34163945649481353, + "u_A_chl3": 0.0006173859264022628, + "A_cll1": 0.1654221294400159, + "u_A_cll1": 0.00045910242682669126, + "B_chwtil_2": 0.023805222245431863, + "u_B_chwtil_2": 0.0014525600394354084, + "B_chbtil_2": 0.08121568425967025, + "u_B_chbtil_2": 0.014085131241714066, + "B_chwbtil_2": 0.029165349885886257, + "u_B_chwbtil_2": 0.003711386475272925, + "B_chw_2": 0.052925477649238335, + "u_B_chw_2": 0.0018275122414553883, + "B_chb_2": 0.08269699339656539, + "u_B_chb_2": 0.017376532412957814, + "B_chwb_2": 0.03141839264541757, + "u_B_chwb_2": 0.004347001539799637, + "B_chj1_2": 0.025044871501288552, + "u_B_chj1_2": 0.0014048677830106517, + "B_chj3_2": 0.08370370479806419, + "u_B_chj3_2": 0.0024741254249574856, + "B_chu_2": 0.016137729675059005, + "u_B_chu_2": 0.003147236400816433, + "B_chl3_2": 0.029961632007066773, + "u_B_chl3_2": 8.713933108869428e-05, + "B_chwtil_chbtil": 0.05413477157752302, + "u_B_chwtil_chbtil": 0.007287432962802552, + "B_chwtil_chwbtil": -0.03401294787548465, + "u_B_chwtil_chwbtil": 0.003978097823496937, + "B_chbtil_chwbtil": -0.09281158836336534, + "u_B_chbtil_chwbtil": 0.014252540885352325, + "B_chbox_chw": 0.01160804490115362, + "u_B_chbox_chw": 0.0003200862329379681, + "B_chbox_chj3": 0.015083052206046171, + "u_B_chbox_chj3": 0.0004093907286165096, + "B_chbox_chl3": -0.020711566547724835, + "u_B_chbox_chl3": 3.74284082483053e-05, + "B_chbox_cll1": 0.0100285603027853, + "u_B_chbox_cll1": 2.7832650530969862e-05, + "B_chw_chb": 0.05422206387673396, + "u_B_chw_chb": 0.008662789488361614, + "B_chw_chwb": -0.027215253065417156, + "u_B_chw_chwb": 0.004547507999698908, + "B_chw_chj3": 0.11285118445029889, + "u_B_chw_chj3": 0.003583635213881733, + "B_chw_chl3": -0.026853266637213942, + "u_B_chw_chl3": 0.0008117842371726832, + "B_chw_cll1": 0.011474517191675193, + "u_B_chw_cll1": 0.0003784761184835181, + "B_chb_chwb": -0.09140426293905365, + "u_B_chb_chwb": 0.01706914309718273, + "B_chwb_chj3": 0.012543753034607757, + "u_B_chwb_chj3": 0.0006998646766178928, + "B_chj3_chl3": -0.03453186042503316, + "u_B_chj3_chl3": 0.0010026648255745739, + "B_chj3_cll1": 0.014648994829918088, + "u_B_chj3_cll1": 0.0004575149437367821, + "B_chl3_cll1": -0.029421479638297568, + "u_B_chl3_cll1": 0.00010228873999943585 + }, + "QQ2HQQ_1J": { + "A_chbox": 0.12124809622766163, + "u_A_chbox": 1.883095579207886e-05, + "A_chdd": -0.010221410773264706, + "u_A_chdd": 0.0003858134560774859, + "A_chw": 0.2349428497170726, + "u_A_chw": 0.0032158895159631875, + "A_chwb": 0.0481197380709681, + "u_A_chwb": 0.0015082802682094367, + "A_chj3": 0.30053327855462586, + "u_A_chj3": 0.008183146132575462, + "A_chu": 0.030667575910822233, + "u_A_chu": 0.005334441115240427, + "A_chd": -0.010954617454699616, + "u_A_chd": 0.0019105521292438832, + "A_chl3": -0.3392786014971858, + "u_A_chl3": 0.00028846322058781324, + "A_cll1": 0.16368214519326507, + "u_A_cll1": 0.00021226954050646322, + "B_chwtil_2": 0.0696279752608626, + "u_B_chwtil_2": 0.005082844069959359, + "B_chbtil_2": 0.02470452321713681, + "u_B_chbtil_2": 0.0030726307389612574, + "B_chwbtil_2": 0.01569440765611813, + "u_B_chwbtil_2": 0.0007811855216843957, + "B_chw_2": 0.10857948158614796, + "u_B_chw_2": 0.00529037064361426, + "B_chb_2": 0.026480616041425036, + "u_B_chb_2": 0.003251857914613675, + "B_chwb_2": 0.020289911813263877, + "u_B_chwb_2": 0.0009095523612557513, + "B_chj1_2": 0.14165074647920325, + "u_B_chj1_2": 0.021642939946590667, + "B_chj3_2": 0.5266044932857776, + "u_B_chj3_2": 0.05772452655433833, + "B_chu_2": 0.21098699241811747, + "u_B_chu_2": 0.10134481493990997, + "B_chd_2": 0.027030884041604593, + "u_B_chd_2": 0.005111832796748739, + "B_chl3_2": 0.029628116804340618, + "u_B_chl3_2": 4.0270502277504716e-05, + "B_chwtil_chbtil": 0.01408342501005185, + "u_B_chwtil_chbtil": 0.0009446424871125775, + "B_chwtil_chwbtil": -0.01751469454904888, + "u_B_chwtil_chwbtil": 0.0022012014487119073, + "B_chwtil_chj3": 0.01982488080268289, + "u_B_chwtil_chj3": 0.010152726552927059, + "B_chbtil_chwbtil": -0.0239779482796866, + "u_B_chbtil_chwbtil": 0.002192253129926834, + "B_chbtil_chu": -0.01397250309832017, + "u_B_chbtil_chu": 0.011098970914360119, + "B_chbox_chw": 0.014243187871600296, + "u_B_chbox_chw": 0.00019496023981745614, + "B_chbox_chj3": 0.018219546066675044, + "u_B_chbox_chj3": 0.0004960956156783161, + "B_chbox_chl3": -0.02056844086832189, + "u_B_chbox_chl3": 1.748784974557552e-05, + "B_chw_chb": 0.015214240333892895, + "u_B_chw_chb": 0.0011664627197766843, + "B_chw_chwb": -0.010763555135354373, + "u_B_chw_chwb": 0.0023146722988335294, + "B_chw_chj1": -0.0192815307149724, + "u_B_chw_chj1": 0.005879692058694241, + "B_chw_chj3": 0.24909544072004658, + "u_B_chw_chj3": 0.01160281456661612, + "B_chw_chl3": -0.03243907369627593, + "u_B_chw_chl3": 0.0004960588066967729, + "B_chw_cll1": 0.013705750299872478, + "u_B_chw_cll1": 0.00023198924209729993, + "B_chb_chwb": -0.023424739938663817, + "u_B_chb_chwb": 0.0024126263052419105, + "B_chb_chu": 0.019846793212564478, + "u_B_chb_chu": 0.005349156919340806, + "B_chwb_chj3": 0.025214809371328674, + "u_B_chwb_chj3": 0.0016609439649000889, + "B_chwb_chu": 0.020565995218066, + "u_B_chwb_chu": 0.006615945854969442, + "B_chj1_chj3": -0.0647788085626093, + "u_B_chj1_chj3": 0.043374655974292464, + "B_chj3_chl3": -0.03671822240280843, + "u_B_chj3_chl3": 0.0012391250441772567, + "B_chj3_cll1": 0.013985520202675185, + "u_B_chj3_cll1": 0.00056974416013729, + "B_chl3_cll1": -0.029031593810458188, + "u_B_chl3_cll1": 4.714814344440079e-05 + }, + "QQ2HQQ_FWDH": { + "A_chbox": 0.12124809618749918, + "u_A_chbox": 0.00024023408539155066, + "A_chw": 0.23206671782657562, + "u_A_chw": 0.0073066977188007195, + "A_chb": 0.01129133558413092, + "u_A_chb": 0.0027980333447508127, + "A_chwb": 0.05119425528272939, + "u_A_chwb": 0.002742687520810045, + "A_chj1": -0.05640910833292748, + "u_A_chj1": 0.007522314686395913, + "A_chj3": 0.3510120086331481, + "u_A_chj3": 0.012552802244041506, + "A_chu": 0.04279832680122912, + "u_A_chu": 0.006331614421541561, + "A_chl3": -0.3330825342289227, + "u_A_chl3": 0.0009067799371736728, + "A_cll1": 0.1590672448772046, + "u_A_cll1": 0.0005562064209069994, + "B_chwtil_2": 0.08475636218054802, + "u_B_chwtil_2": 0.005445028022913673, + "B_chbtil_2": 0.014497842828092179, + "u_B_chbtil_2": 0.0016817862116641027, + "B_chwbtil_2": 0.01409871645973942, + "u_B_chwbtil_2": 0.001108857786627749, + "B_chw_2": 0.1331900890487346, + "u_B_chw_2": 0.00664281620633066, + "B_chb_2": 0.018427532268897297, + "u_B_chb_2": 0.0025102256942722504, + "B_chwb_2": 0.01891401989856933, + "u_B_chwb_2": 0.0011933881775485972, + "B_chj1_2": 0.112741352100486, + "u_B_chj1_2": 0.00866336541225395, + "B_chj3_2": 0.33426545651961115, + "u_B_chj3_2": 0.012430203061029509, + "B_chu_2": 0.07810258580136409, + "u_B_chu_2": 0.01455581460065052, + "B_chd_2": 0.012149151758800034, + "u_B_chd_2": 0.0046721028008597015, + "B_chl3_2": 0.028753543191244343, + "u_B_chl3_2": 0.00010390963841043294, + "B_chwtil_chbtil": 0.012774445022686164, + "u_B_chwtil_chbtil": 0.0012622678800276262, + "B_chwtil_chwbtil": -0.01674701804375026, + "u_B_chwtil_chwbtil": 0.0021676585373146236, + "B_chbtil_chwbtil": -0.01815943801114206, + "u_B_chbtil_chwbtil": 0.0019680157190412116, + "B_chbox_chw": 0.014068824269884525, + "u_B_chbox_chw": 0.0004429616150210896, + "B_chbox_chj3": 0.021279769982669984, + "u_B_chbox_chj3": 0.0007610017057573461, + "B_chbox_chl3": -0.02019281217569433, + "u_B_chbox_chl3": 5.497259541408777e-05, + "B_chw_chb": 0.012611451948057986, + "u_B_chw_chb": 0.0012921122795555508, + "B_chw_chj1": -0.055927733327955066, + "u_B_chw_chj1": 0.00849665464174627, + "B_chw_chj3": 0.3076139690507672, + "u_B_chw_chj3": 0.012779435594903639, + "B_chw_chl3": -0.029708829329478288, + "u_B_chw_chl3": 0.001163629217777333, + "B_chw_cll1": 0.011798734567071057, + "u_B_chw_cll1": 0.000551387344211623, + "B_chb_chwb": -0.017963946206555354, + "u_B_chb_chwb": 0.002077015140877403, + "B_chb_chu": 0.023105237754234446, + "u_B_chb_chu": 0.0037971199349894754, + "B_chwb_chj3": 0.021855648882804744, + "u_B_chwb_chj3": 0.00228472750922283, + "B_chwb_chu": 0.018363275959387203, + "u_B_chwb_chu": 0.0024122984403713355, + "B_chj1_chj3": -0.11908008228895892, + "u_B_chj1_chj3": 0.017614769268437882, + "B_chj3_chl3": -0.04248426620346145, + "u_B_chj3_chl3": 0.0019602156162701876, + "B_chj3_cll1": 0.01603144511993281, + "u_B_chj3_cll1": 0.0009170494198308557, + "B_chl3_cll1": -0.02800461925374606, + "u_B_chl3_cll1": 0.00011585493610655133 + }, + "QQ2HQQ_GE2J_MJJ_0_60": { + "A_chbox": 0.12124808737621479, + "u_A_chbox": 1.7645892987095945e-05, + "A_chw": 0.3882634538880599, + "u_A_chw": 0.014913094924384862, + "A_chwb": 0.06123137721593635, + "u_A_chwb": 0.006179791502156504, + "A_chj1": -0.027459166993474105, + "u_A_chj1": 0.022882301885096833, + "A_chj3": 0.8066289918290617, + "u_A_chj3": 0.03543552478519739, + "A_chu": 0.03672191019772468, + "u_A_chu": 0.012950355379712598, + "A_chd": -0.01690329093755083, + "u_A_chd": 0.010670317262950308, + "A_chl3": -0.3240742842775173, + "u_A_chl3": 0.0013918587117606725, + "A_cll1": 0.152372702411012, + "u_A_cll1": 0.0010338504014214044, + "B_chwtil_2": 0.11629630274593454, + "u_B_chwtil_2": 0.010288047875702902, + "B_chbtil_2": 0.026726221955424966, + "u_B_chbtil_2": 0.01061069537339266, + "B_chwbtil_2": 0.0150765820353445, + "u_B_chwbtil_2": 0.0032986397682768357, + "B_chw_2": 0.16919942065330956, + "u_B_chw_2": 0.010273661778067014, + "B_chb_2": 0.041943562249681696, + "u_B_chb_2": 0.017015792496484144, + "B_chwb_2": 0.022629660699268382, + "u_B_chwb_2": 0.003289695623830017, + "B_chj1_2": 0.23248458131004354, + "u_B_chj1_2": 0.02313079556163563, + "B_chj3_2": 0.7155284568415167, + "u_B_chj3_2": 0.03793811890086409, + "B_chu_2": 0.07217644865949278, + "u_B_chu_2": 0.020968162987285942, + "B_chd_2": 0.048944380976342065, + "u_B_chd_2": 0.03475969153668776, + "B_chl3_2": 0.027479808790121543, + "u_B_chl3_2": 0.0001962549101325853, + "B_chwtil_chj3": 0.012273051551555763, + "u_B_chwtil_chj3": 0.0220508372609785, + "B_chbtil_chwbtil": -0.017132350211480116, + "u_B_chbtil_chwbtil": 0.006881082095326481, + "B_chbtil_chb": 0.016672235052405227, + "u_B_chbtil_chb": 0.015155513467142534, + "B_chwbtil_chj1": 0.016208349795659594, + "u_B_chwbtil_chj1": 0.008144454842216006, + "B_chbox_chw": 0.023538103594693445, + "u_B_chbox_chw": 0.0009040922023173508, + "B_chbox_chj3": 0.04890111431472242, + "u_B_chbox_chj3": 0.0021482448306984633, + "B_chbox_chl3": -0.019646694768619043, + "u_B_chbox_chl3": 8.43801116427407e-05, + "B_chw_chb": 0.01162247286168537, + "u_B_chw_chb": 0.003595000521012622, + "B_chw_chj1": -0.019306332089452743, + "u_B_chw_chj1": 0.015204721763285398, + "B_chw_chj3": 0.4473536892873448, + "u_B_chw_chj3": 0.02731527137780983, + "B_chw_chl3": -0.054386046222910156, + "u_B_chw_chl3": 0.002276124668772399, + "B_chw_cll1": 0.02323136452832874, + "u_B_chw_cll1": 0.0010639181835385826, + "B_chb_chwb": -0.026393527540554296, + "u_B_chb_chwb": 0.010798000223269107, + "B_chb_chj1": 0.014877505987604428, + "u_B_chb_chj1": 0.002032993741638388, + "B_chb_chu": 0.013241910354867154, + "u_B_chb_chu": 0.011851867209713544, + "B_chwb_chj3": 0.05296764168336743, + "u_B_chwb_chj3": 0.005847053617201209, + "B_chwb_chu": 0.014443004794751423, + "u_B_chwb_chu": 0.005229790237002997, + "B_chj1_chj3": -0.1289570396500335, + "u_B_chj1_chj3": 0.04740909676303955, + "B_chj3_chl3": -0.1090472782429013, + "u_B_chj3_chl3": 0.005492000340118816, + "B_chj3_cll1": 0.04534535040927194, + "u_B_chj3_cll1": 0.002572874084662682, + "B_chl3_cll1": -0.026509764004059102, + "u_B_chl3_cll1": 0.00023019434187883524 + }, + "QQ2HQQ_GE2J_MJJ_120_350": { + "A_chwtil": -0.01205111971338201, + "u_A_chwtil": 0.0039192726098934315, + "A_chbox": 0.12124809531793901, + "u_A_chbox": 5.290371508002826e-05, + "A_chw": 0.06020675097021206, + "u_A_chw": 0.005355514096354926, + "A_chwb": 0.04282568776180805, + "u_A_chwb": 0.0020602837046244105, + "A_chj3": -0.05015116891987023, + "u_A_chj3": 0.012247129266864904, + "A_chl3": -0.34955660011879175, + "u_A_chl3": 0.00035266934844212754, + "A_cll1": 0.17133746710817363, + "u_A_cll1": 0.00024732405828086195, + "B_chwtil_2": 0.10537828734293264, + "u_B_chwtil_2": 0.005000374639367758, + "B_chbtil_2": 0.0157544132458466, + "u_B_chbtil_2": 0.0027383000257822417, + "B_chwbtil_2": 0.014377547934308666, + "u_B_chwbtil_2": 0.0014201143487461367, + "B_chw_2": 0.140157919693266, + "u_B_chw_2": 0.005181271056731733, + "B_chb_2": 0.025588732059834553, + "u_B_chb_2": 0.005917599298722058, + "B_chwb_2": 0.019212105642512682, + "u_B_chwb_2": 0.001488576455834509, + "B_chj1_2": 0.12014021272599186, + "u_B_chj1_2": 0.00854177474688498, + "B_chq1_2": 0.010668490325065413, + "u_B_chq1_2": 0.005722458983169163, + "B_chj3_2": 0.46139291558038786, + "u_B_chj3_2": 0.07525262067572905, + "B_chq3_2": 0.010668490325065413, + "u_B_chq3_2": 0.005722458983169163, + "B_chu_2": 0.0517986098126032, + "u_B_chu_2": 0.008786484940928665, + "B_chd_2": 0.04428837057076648, + "u_B_chd_2": 0.011644351032207964, + "B_chl3_2": 0.031078341683610473, + "u_B_chl3_2": 4.679426891878684e-05, + "B_chwtil_chwbtil": -0.014351103323823266, + "u_B_chwtil_chwbtil": 0.001707799680173777, + "B_chbtil_chwbtil": -0.013889265674277083, + "u_B_chbtil_chwbtil": 0.0026335028898584905, + "B_chbox_chl3": -0.021191536579038318, + "u_B_chbox_chl3": 2.138017658937087e-05, + "B_chbox_cll1": 0.01038717173060031, + "u_B_chbox_cll1": 1.4993778360796401e-05, + "B_chw_chwb": -0.012553924852605466, + "u_B_chw_chwb": 0.0017705345118170055, + "B_chw_chj3": 0.2907636975922662, + "u_B_chw_chj3": 0.017347186147558143, + "B_chb_chwb": -0.015251873208426686, + "u_B_chb_chwb": 0.002881337283069793, + "B_chb_chu": 0.015580696453427268, + "u_B_chb_chu": 0.004779227987357645, + "B_chb_chd": -0.017617939479754624, + "u_B_chb_chd": 0.008034150453846905, + "B_chwb_chj3": 0.01294816544997054, + "u_B_chwb_chj3": 0.0016482935426076208, + "B_chwb_chu": 0.011882492041109272, + "u_B_chwb_chu": 0.002456758993363471, + "B_chj1_chj3": -0.029846399027452335, + "u_B_chj1_chj3": 0.01728748445147671, + "B_chq1_chq3": 0.021336980715089892, + "u_B_chq1_chq3": 0.011444918973231126, + "B_chj3_chl3": 0.022957807490547544, + "u_B_chj3_chl3": 0.0019192601460071717, + "B_chj3_cll1": -0.014846500261785016, + "u_B_chj3_cll1": 0.0008982974990429856, + "B_chl3_cll1": -0.030734334497238096, + "u_B_chl3_cll1": 5.4171524578112394e-05 + }, + "QQ2HQQ_GE2J_MJJ_350_700_PTH_0_200_PTHJJ_0_25": { + "A_chbox": 0.12124809627799532, + "u_A_chbox": 6.398843416771087e-05, + "A_chw": -0.11862720086917283, + "u_A_chw": 0.004522155773466339, + "A_chwb": 0.025226988380774005, + "u_A_chwb": 0.002259055361656243, + "A_chj3": -0.3562227335342143, + "u_A_chj3": 0.00481195288828378, + "A_chu": -0.02061882760124278, + "u_A_chu": 0.001986785020778921, + "A_chl3": -0.36315603292814186, + "u_A_chl3": 0.00021156880022888113, + "A_cll1": 0.18143437360165163, + "u_A_cll1": 0.00011663945683964961, + "B_chwtil_2": 0.03364641868880154, + "u_B_chwtil_2": 0.0011796339541687497, + "B_chw_2": 0.04748689527540959, + "u_B_chw_2": 0.002177752311326534, + "B_chwb_2": 0.010720491640917445, + "u_B_chwb_2": 0.0005082020620027156, + "B_chj1_2": 0.016698199534165438, + "u_B_chj1_2": 0.0014581190345026875, + "B_chj3_2": 0.07697289335568322, + "u_B_chj3_2": 0.0030025823112192623, + "B_chl3_2": 0.03299694269164006, + "u_B_chl3_2": 2.1519036257690767e-05, + "B_chwtil_chwbtil": -0.012695564593174094, + "u_B_chwtil_chwbtil": 0.0005214975433010813, + "B_chbtil_chwbtil": -0.010996931076379675, + "u_B_chbtil_chwbtil": 0.0011263085995139683, + "B_chbox_chj3": -0.021595663748084536, + "u_B_chbox_chj3": 0.00029172008000830026, + "B_chbox_chl3": -0.02201598754921748, + "u_B_chbox_chl3": 1.2826298718027767e-05, + "B_chbox_cll1": 0.010999287304514088, + "u_B_chbox_cll1": 7.071153702745297e-06, + "B_chw_chwb": -0.01683066417675221, + "u_B_chw_chwb": 0.0007499436691021516, + "B_chw_chj3": 0.0771296974293594, + "u_B_chw_chj3": 0.004477964889657248, + "B_chw_chl3": 0.021798889110283718, + "u_B_chw_chl3": 0.0008140199240223601, + "B_chw_cll1": -0.010954250673463038, + "u_B_chw_cll1": 0.00040544662468744224, + "B_chb_chwb": -0.010995905637702282, + "u_B_chb_chwb": 0.0009118158959174426, + "B_chj3_chl3": 0.06516924490095044, + "u_B_chj3_chl3": 0.0008496875235400829, + "B_chj3_cll1": -0.032678656307653556, + "u_B_chj3_cll1": 0.0004197669758854725, + "B_chl3_cll1": -0.03298373177697063, + "u_B_chl3_cll1": 2.287152350732407e-05 + }, + "QQ2HQQ_GE2J_MJJ_350_700_PTH_0_200_PTHJJ_GT25": { + "A_chbox": 0.12124809812536587, + "u_A_chbox": 0.00011178264951851522, + "A_chw": -0.10032649345752903, + "u_A_chw": 0.007395628107490972, + "A_chwb": 0.03006691027964594, + "u_A_chwb": 0.0032470413725405123, + "A_chj3": -0.30534090885723797, + "u_A_chj3": 0.011196181641426097, + "A_chu": -0.014500953366231261, + "u_A_chu": 0.00419464663947179, + "A_chl3": -0.3587956133824617, + "u_A_chl3": 0.0004649985261844473, + "A_cll1": 0.17819242200111804, + "u_A_cll1": 0.0002929805681223923, + "B_chwtil_2": 0.05844547761624785, + "u_B_chwtil_2": 0.0034387460839231114, + "B_chbtil_2": 0.018596481579861, + "u_B_chbtil_2": 0.004913018106881224, + "B_chwbtil_2": 0.010538964525442646, + "u_B_chwbtil_2": 0.0009571746817855146, + "B_chw_2": 0.08618185179635834, + "u_B_chw_2": 0.004888267321319086, + "B_chb_2": 0.014695629935724878, + "u_B_chb_2": 0.0025808879777086593, + "B_chwb_2": 0.015663878209219797, + "u_B_chwb_2": 0.0011092475117954375, + "B_chj1_2": 0.04623303576733085, + "u_B_chj1_2": 0.004947743556047837, + "B_chj3_2": 0.19213513462218515, + "u_B_chj3_2": 0.011729550040624854, + "B_chu_2": 0.023598558752580316, + "u_B_chu_2": 0.005362439077291147, + "B_chd_2": 0.018222719424777434, + "u_B_chd_2": 0.006322946098120231, + "B_chl3_2": 0.03238137823742454, + "u_B_chl3_2": 5.4849818447419324e-05, + "B_chwtil_chwbtil": -0.015019295402861186, + "u_B_chwtil_chwbtil": 0.0014551801424635925, + "B_chbtil_chwbtil": -0.01605145853645144, + "u_B_chbtil_chwbtil": 0.0031291374268183764, + "B_chbox_chj3": -0.018511000764667947, + "u_B_chbox_chj3": 0.0006787578886095514, + "B_chbox_chl3": -0.02175164258556359, + "u_B_chbox_chl3": 2.819004150935027e-05, + "B_chbox_cll1": 0.010802746777421159, + "u_B_chbox_cll1": 1.776167031213429e-05, + "B_chw_chwb": -0.019295622107868143, + "u_B_chw_chwb": 0.0019511230207225451, + "B_chw_chj3": 0.17435000584379928, + "u_B_chw_chj3": 0.011118955511935499, + "B_chw_chl3": 0.02043427070690409, + "u_B_chw_chl3": 0.001273336070579822, + "B_chw_cll1": -0.010753691694485614, + "u_B_chw_cll1": 0.0006235372075727805, + "B_chb_chwb": -0.014053696856786237, + "u_B_chb_chwb": 0.0019887417062014554, + "B_chwb_chu": 0.010683322544099564, + "u_B_chwb_chu": 0.001842431587234808, + "B_chj3_chl3": 0.060436714445955296, + "u_B_chj3_chl3": 0.0017970549170500231, + "B_chj3_cll1": -0.03142035480893, + "u_B_chj3_cll1": 0.0008499081967427455, + "B_chl3_cll1": -0.03226144933114758, + "u_B_chl3_cll1": 6.161688299382744e-05 + }, + "QQ2HQQ_GE2J_MJJ_60_120": { + "A_chwtil": -0.021373210607823753, + "u_A_chwtil": 0.006688550144842251, + "A_chbox": 0.12124809792330625, + "u_A_chbox": 2.4713012183955314e-05, + "A_chw": 0.613816027826682, + "u_A_chw": 0.006862183241090454, + "A_chb": 0.025476691380717835, + "u_A_chb": 0.0019195665395418747, + "A_chwb": 0.10591313001897502, + "u_A_chwb": 0.0022190048532937877, + "A_chj1": -0.028171308995041305, + "u_A_chj1": 0.018295108676061964, + "A_chq1": 0.010356156747069772, + "u_A_chq1": 0.0013882387148443991, + "A_chj3": 1.8275149530145223, + "u_A_chj3": 0.02298857610305308, + "A_chq3": 0.010356156747069772, + "u_A_chq3": 0.0013882387148443991, + "A_chu": 0.16556405218383247, + "u_A_chu": 0.014813439208577504, + "A_chd": -0.05643661936773914, + "u_A_chd": 0.00870937627341397, + "A_chl3": -0.2967720197502615, + "u_A_chl3": 0.0006023629508082973, + "A_cll1": 0.13214473295747858, + "u_A_cll1": 0.00044550280396769056, + "B_chwtil_2": 0.18749795944641795, + "u_B_chwtil_2": 0.006676996950337242, + "B_chwbtil_2": 0.012672311739005532, + "u_B_chwbtil_2": 0.0010663347452702864, + "B_chw_2": 0.2627020697154657, + "u_B_chw_2": 0.006847705619071446, + "B_chb_2": 0.011796678243526851, + "u_B_chb_2": 0.0013751346100505676, + "B_chwb_2": 0.01873789580246351, + "u_B_chwb_2": 0.0008970796938470082, + "B_chj1_2": 0.8739361122233779, + "u_B_chj1_2": 0.0739826009282614, + "B_chj3_2": 2.2177067447944308, + "u_B_chj3_2": 0.08897371708354027, + "B_chu_2": 0.5725310416051346, + "u_B_chu_2": 0.09250322369457724, + "B_chd_2": 0.1963952531206176, + "u_B_chd_2": 0.041645205783595665, + "B_chl3_2": 0.023633788197535505, + "u_B_chl3_2": 8.462802406839527e-05, + "B_chwtil_chwbtil": 0.020198469420620174, + "u_B_chwtil_chwbtil": 0.0027006314238714993, + "B_chwtil_chj3": -0.0996830759078671, + "u_B_chwtil_chj3": 0.026621084672241814, + "B_chbox_chw": 0.03721201520943109, + "u_B_chbox_chw": 0.00041601334238092674, + "B_chbox_chj3": 0.11079135970649373, + "u_B_chbox_chj3": 0.001393660854349702, + "B_chbox_chu": 0.0100371598112604, + "u_B_chbox_chu": 0.0008980500036897521, + "B_chbox_chl3": -0.01799152093121147, + "u_B_chbox_chl3": 3.65176462277502e-05, + "B_chdd_chj1": -0.011209960151836347, + "u_B_chdd_chj1": 0.0010399328305155434, + "B_chdd_chj3": 0.01009956229889756, + "u_B_chdd_chj3": 0.0011006818919657613, + "B_chdd_chu": -0.01742011132296213, + "u_B_chdd_chu": 0.0015203412516603778, + "B_chw_chwb": 0.0438504445220901, + "u_B_chw_chwb": 0.0027560097523207597, + "B_chw_chj1": -0.07074044128959371, + "u_B_chw_chj1": 0.0270292548910997, + "B_chw_chj3": 0.9209004448583854, + "u_B_chw_chj3": 0.03323165578960941, + "B_chw_chl3": -0.08502036692747324, + "u_B_chw_chl3": 0.0010207375322375772, + "B_chw_cll1": 0.03603769704604698, + "u_B_chw_cll1": 0.00047537669344398063, + "B_chb_chj1": 0.03170474680888803, + "u_B_chb_chj1": 0.0025057868903546024, + "B_chb_chu": 0.06602889633090539, + "u_B_chb_chu": 0.00971474946272175, + "B_chb_chd": -0.024084935627142222, + "u_B_chb_chd": 0.004676864705801177, + "B_chwb_chj3": 0.1198152395046328, + "u_B_chwb_chj3": 0.006515120379250112, + "B_chwb_chu": 0.047477379687736784, + "u_B_chwb_chu": 0.008361948140298944, + "B_chwb_chd": -0.016922494765827956, + "u_B_chwb_chd": 0.0035400836797674176, + "B_chwb_chl3": -0.015350629412574117, + "u_B_chwb_chl3": 0.000349555081197664, + "B_chj1_chj3": -0.3444968498950145, + "u_B_chj1_chj3": 0.14898802745049047, + "B_chq1_chq3": 0.010090928512731096, + "u_B_chq1_chq3": 0.0018905060035084593, + "B_chj3_chl3": -0.25377173190238855, + "u_B_chj3_chl3": 0.0033144896490826564, + "B_chj3_cll1": 0.1077951147348939, + "u_B_chj3_cll1": 0.0015037102421174041, + "B_chu_chl3": -0.023170372893613168, + "u_B_chu_chl3": 0.0020711636960707948, + "B_chl3_cll1": -0.022006661852270525, + "u_B_chl3_cll1": 9.913785245060833e-05 + }, + "QQ2HQQ_GE2J_MJJ_GT350_PTH_GT200": { + "A_chwtil": -0.01501385033237515, + "u_A_chwtil": 0.0191371140086971, + "A_chbox": 0.12124809448298571, + "u_A_chbox": 0.00025406645015148575, + "A_chw": 0.20160157021141845, + "u_A_chw": 0.020125369450181566, + "A_chwb": 0.030798802601975265, + "u_A_chwb": 0.006639996358503737, + "A_chj1": 0.013370646282057013, + "u_A_chj1": 0.03839699849148817, + "A_chj3": -1.2798210940504382, + "u_A_chj3": 0.07243879178621047, + "A_chu": -0.09173987984939397, + "u_A_chu": 0.025698241567276684, + "A_chd": 0.05730915862984996, + "u_A_chd": 0.029384630276393053, + "A_chl3": -0.36041577073279146, + "u_A_chl3": 0.0008268031689869062, + "A_cll1": 0.17939365590507414, + "u_A_cll1": 0.00045081405885301107, + "B_chwtil_2": 0.40314755733088153, + "u_B_chwtil_2": 0.021632099761651057, + "B_chbtil_2": 0.054339541633703525, + "u_B_chbtil_2": 0.025007869433869703, + "B_chwbtil_2": 0.04781229488980701, + "u_B_chwbtil_2": 0.005594606347377972, + "B_chw_2": 0.4382829042320348, + "u_B_chw_2": 0.03525249908467041, + "B_chb_2": 0.03129691455161012, + "u_B_chb_2": 0.007589627833759979, + "B_chwb_2": 0.044767371914849446, + "u_B_chwb_2": 0.0062499507086553946, + "B_chj1_2": 1.3135095884849703, + "u_B_chj1_2": 0.45821779321717243, + "B_chq1_2": 0.03999861444658155, + "u_B_chq1_2": 0.030587387293149613, + "B_chj3_2": 5.08071231887487, + "u_B_chj3_2": 1.05168667275907, + "B_chq3_2": 0.03999861444658155, + "u_B_chq3_2": 0.030587387293149613, + "B_chu_2": 0.5922283396933422, + "u_B_chu_2": 0.21898962211159714, + "B_chd_2": 0.7721536401083959, + "u_B_chd_2": 0.5971243051475579, + "B_chl3_2": 0.03260815386746849, + "u_B_chl3_2": 8.30177467522985e-05, + "B_chwtil_chwbtil": -0.05446693887366345, + "u_B_chwtil_chwbtil": 0.005681344781025725, + "B_chwtil_chw": -0.013259463446481073, + "u_B_chwtil_chw": 0.017415003927176122, + "B_chwtil_chj1": 0.024786583927225377, + "u_B_chwtil_chj1": 0.03686131658305968, + "B_chbtil_chwbtil": -0.033923693645099715, + "u_B_chbtil_chwbtil": 0.009574299024873327, + "B_chbtil_chu": -0.07927014121387015, + "u_B_chbtil_chu": 0.08013565576240224, + "B_chbtil_chd": -0.01810400911040514, + "u_B_chbtil_chd": 0.017736969466598963, + "B_chwbtil_chu": -0.026026746595435312, + "u_B_chwbtil_chu": 0.02540095404218866, + "B_chwbtil_chd": -0.07478760184640974, + "u_B_chwbtil_chd": 0.06845735418432565, + "B_chbox_chw": 0.012221903267217091, + "u_B_chbox_chw": 0.0012200814779071503, + "B_chbox_chj3": -0.0775878989234964, + "u_B_chbox_chj3": 0.004391546997739568, + "B_chbox_chl3": -0.021849862442040957, + "u_B_chbox_chl3": 5.0124113996731064e-05, + "B_chbox_cll1": 0.010875570801172744, + "u_B_chbox_cll1": 2.7330176403724996e-05, + "B_chdd_chu": 0.010105254134210675, + "u_B_chdd_chu": 0.003086017469378185, + "B_chw_chwb": -0.05221037014058794, + "u_B_chw_chwb": 0.008565201866648319, + "B_chw_chj3": 0.2679734085402654, + "u_B_chw_chj3": 0.19345468657356188, + "B_chw_chl3": -0.035119279054333714, + "u_B_chw_chl3": 0.0035423377389837605, + "B_chw_cll1": 0.017180927976163895, + "u_B_chw_cll1": 0.0017518308038709288, + "B_chb_chwb": -0.02034188789811539, + "u_B_chb_chwb": 0.005725009223931707, + "B_chb_chu": 0.03935212006479631, + "u_B_chb_chu": 0.02064983614835478, + "B_chwb_chj1": 0.013527928414543196, + "u_B_chwb_chj1": 0.023652109518829807, + "B_chwb_chu": 0.036829097219366634, + "u_B_chwb_chu": 0.01832543180375291, + "B_chwb_chd": 0.02317366637654891, + "u_B_chwb_chd": 0.05916557357321052, + "B_chj1_chj3": -1.5874590061827976, + "u_B_chj1_chj3": 0.9185166699816664, + "B_chj1_chd": -0.013272488837465813, + "u_B_chj1_chd": 0.011631450040101916, + "B_chq1_chq3": 0.07999721758706116, + "u_B_chq1_chq3": 0.061174770959204997, + "B_chj3_chu": 0.02989137759451481, + "u_B_chj3_chu": 0.005717221382643974, + "B_chj3_chd": -0.026407865209905953, + "u_B_chj3_chd": 0.011623387965203432, + "B_chj3_chl3": 0.25216709311869473, + "u_B_chj3_chl3": 0.010298578526418762, + "B_chj3_cll1": -0.13084147602193524, + "u_B_chj3_cll1": 0.004570528177369553, + "B_chu_chl3": 0.018468449178719877, + "u_B_chu_chl3": 0.004052064687550951, + "B_chd_chl3": -0.01043922779475468, + "u_B_chd_chl3": 0.005342426284974499, + "B_chl3_cll1": -0.03252659830160095, + "u_B_chl3_cll1": 8.773873685382496e-05 + }, + "QQ2HQQ_GE2J_MJJ_GT700_PTH_0_200_PTHJJ_0_25": { + "A_chbox": 0.12124809316710387, + "u_A_chbox": 0.0001201192371561485, + "A_chdd": -0.010512189437190208, + "u_A_chdd": 0.0007704250365954559, + "A_chw": -0.1114781345928626, + "u_A_chw": 0.004241807596529116, + "A_chwb": 0.0227561721180907, + "u_A_chwb": 0.002264178488555299, + "A_chj1": 0.011991245352751076, + "u_A_chj1": 0.002585166181124272, + "A_chj3": -0.3585186174158863, + "u_A_chj3": 0.004344115668875014, + "A_chu": -0.022987044630323132, + "u_A_chu": 0.0018227549981562276, + "A_chl3": -0.36355461927212324, + "u_A_chl3": 0.0003627052179455444, + "A_cll1": 0.1817307187757624, + "u_A_cll1": 0.00018282873940387987, + "B_chwtil_2": 0.02658962447164995, + "u_B_chwtil_2": 0.0010333956564571045, + "B_chbtil_2": 0.013695423451762424, + "u_B_chbtil_2": 0.002370067615334014, + "B_chw_2": 0.04220622683394248, + "u_B_chw_2": 0.0029680552311112116, + "B_chb_2": 0.011642601666615897, + "u_B_chb_2": 0.0016360248300338188, + "B_chwb_2": 0.01113130630188511, + "u_B_chwb_2": 0.0005654063129821997, + "B_chj1_2": 0.013987364228918917, + "u_B_chj1_2": 0.0014427082749964813, + "B_chj3_2": 0.07116430470761316, + "u_B_chj3_2": 0.003755546334780092, + "B_chl3_2": 0.03305332144594233, + "u_B_chl3_2": 3.329444258435631e-05, + "B_chwtil_chwbtil": -0.012823071687068418, + "u_B_chwtil_chwbtil": 0.0004838830898660347, + "B_chbtil_chwbtil": -0.013413424460094707, + "u_B_chbtil_chwbtil": 0.0013520015720827653, + "B_chbox_chj3": -0.021734849698352588, + "u_B_chbox_chj3": 0.00026335788111603753, + "B_chbox_chl3": -0.022040153166506267, + "u_B_chbox_chl3": 2.1988574048233763e-05, + "B_chbox_cll1": 0.011017252544321086, + "u_B_chbox_cll1": 1.1083897089129563e-05, + "B_chw_chwb": -0.01705793895447569, + "u_B_chw_chwb": 0.0008477067731003057, + "B_chw_chj3": 0.07447356327412043, + "u_B_chw_chj3": 0.006106871537289298, + "B_chw_chl3": 0.020342161718324394, + "u_B_chw_chl3": 0.0007689341395263774, + "B_chw_cll1": -0.010187738172377583, + "u_B_chw_cll1": 0.00038400295938066203, + "B_chb_chwb": -0.01267907722556529, + "u_B_chb_chwb": 0.001097691276346116, + "B_chj1_chj3": -0.010035350118060258, + "u_B_chj1_chj3": 0.0031900775728038004, + "B_chj3_chl3": 0.06531265397293368, + "u_B_chj3_chl3": 0.0007756913118700255, + "B_chj3_cll1": -0.032683311138243666, + "u_B_chj3_cll1": 0.0003852298842901719, + "B_chl3_cll1": -0.03304991369550035, + "u_B_chl3_cll1": 3.349680953607088e-05 + }, + "QQ2HQQ_GE2J_MJJ_GT700_PTH_0_200_PTHJJ_GT25": { + "A_chbox": 0.12124809615793672, + "u_A_chbox": 0.0001678492685369901, + "A_chw": -0.14894434675137633, + "u_A_chw": 0.0068700538723298985, + "A_chwb": 0.024239966239463243, + "u_A_chwb": 0.002996810093978459, + "A_chj1": 0.023434568850970984, + "u_A_chj1": 0.004009686769604946, + "A_chj3": -0.42024226537218423, + "u_A_chj3": 0.007850421764071532, + "A_chu": -0.026635657683065053, + "u_A_chu": 0.0025809611222202197, + "A_chl3": -0.3630628797658166, + "u_A_chl3": 0.0005148598326426934, + "A_cll1": 0.18136685797346755, + "u_A_cll1": 0.000264177571648193, + "B_chwtil_2": 0.037972666225636414, + "u_B_chwtil_2": 0.0015797663726401182, + "B_chbtil_2": 0.015187044467100605, + "u_B_chbtil_2": 0.002882655461295248, + "B_chw_2": 0.08283314948036559, + "u_B_chw_2": 0.015397718822406276, + "B_chb_2": 0.017896125236089612, + "u_B_chb_2": 0.004928411564574659, + "B_chwb_2": 0.014765824111247964, + "u_B_chwb_2": 0.0012754760890834893, + "B_chj1_2": 0.025509196284544667, + "u_B_chj1_2": 0.0025072828510511475, + "B_chj3_2": 0.14087203695545425, + "u_B_chj3_2": 0.01815559424489008, + "B_chu_2": 0.010415452765687394, + "u_B_chu_2": 0.002303734828662093, + "B_chl3_2": 0.03298364300863156, + "u_B_chl3_2": 4.8261644423480105e-05, + "B_chwtil_chwbtil": -0.015345475738368244, + "u_B_chwtil_chwbtil": 0.0009134990354424673, + "B_chbtil_chwbtil": -0.014707582759500733, + "u_B_chbtil_chwbtil": 0.0016583389262437714, + "B_chbox_chj3": -0.025476786725595314, + "u_B_chbox_chj3": 0.00047592440257248074, + "B_chbox_chl3": -0.022010341238816466, + "u_B_chbox_chl3": 3.121287021685632e-05, + "B_chbox_cll1": 0.010995193868790826, + "u_B_chbox_cll1": 1.6015538754757493e-05, + "B_chw_chwb": -0.020825013510661967, + "u_B_chw_chwb": 0.0012721512345582736, + "B_chw_chj3": 0.16412203480735002, + "u_B_chw_chj3": 0.03249406387061279, + "B_chw_chl3": 0.0274445356254271, + "u_B_chw_chl3": 0.0012370154595352431, + "B_chw_cll1": -0.013808271510658728, + "u_B_chw_cll1": 0.0006162565517892492, + "B_chb_chwb": -0.015839669792833057, + "u_B_chb_chwb": 0.003158397739798649, + "B_chwb_chu": 0.011284905215689521, + "u_B_chwb_chu": 0.0026659677432707258, + "B_chj3_chl3": 0.07725916943766212, + "u_B_chj3_chl3": 0.0013518913812605741, + "B_chj3_cll1": -0.0388312884029612, + "u_B_chj3_cll1": 0.0006614787655807832, + "B_chl3_cll1": -0.03296825486235023, + "u_B_chl3_cll1": 4.91573684980732e-05 + }, + "THQ": { + "A_chbox": 0.12124808966820853, + "u_A_chbox": 8.662438571995868e-05, + "A_chdd": -0.030312022417052133, + "u_A_chdd": 2.1655481739600646e-05, + "A_chg": 0.01141783147411083, + "u_A_chg": 0.0033796029591837517, + "A_chw": 0.23503413828550476, + "u_A_chw": 0.00555978541789579, + "A_cthre": -0.04502238867224443, + "u_A_cthre": 0.002005533437963198, + "A_ctwre": -0.5638205888095894, + "u_A_ctwre": 0.016491598569343107, + "A_chj3": 0.1871315649094758, + "u_A_chj3": 0.024389720438472373, + "A_cqj31": 0.46300435265901707, + "u_A_cqj31": 0.06557246910402213, + "A_cqj38": -0.024739363447622707, + "u_A_cqj38": 0.004480679280866606, + "A_chl3": -0.36372904243031084, + "u_A_chl3": 0.00025990613047268107, + "A_cll1": 0.18185946551665244, + "u_A_cll1": 0.0001299655706491623, + "B_chgtil_2": 0.05620270903868824, + "u_B_chgtil_2": 0.015967490346609575, + "B_chwtil_2": 0.06287227147350585, + "u_B_chwtil_2": 0.00359848899751835, + "B_ctgim_2": 0.02335984898501117, + "u_B_ctgim_2": 0.005031460212466128, + "B_ctwim_2": 1.2112323090913015, + "u_B_ctwim_2": 0.14641366245108967, + "B_cbgim_2": 0.02718827907889082, + "u_B_cbgim_2": 0.027175169214522864, + "B_cbwim_2": 0.3223312964391398, + "u_B_cbwim_2": 0.163362567463933, + "B_chtbim_2": 0.0983460936614456, + "u_B_chtbim_2": 0.06437554677421257, + "B_chg_2": 0.05620270903868824, + "u_B_chg_2": 0.01596748978706208, + "B_chw_2": 0.10536025548016474, + "u_B_chw_2": 0.004826052234902944, + "B_cthre_2": 0.013443117613900641, + "u_B_cthre_2": 0.0005202934715546054, + "B_ctgre_2": 0.023359849409859784, + "u_B_ctgre_2": 0.005031460389845237, + "B_ctwre_2": 1.2112294626055897, + "u_B_ctwre_2": 0.14641320679888636, + "B_cbgre_2": 0.027188283714838897, + "u_B_cbgre_2": 0.02717517253504387, + "B_cbwre_2": 0.32233101179056867, + "u_B_cbwre_2": 0.16336255912234487, + "B_chj3_2": 1.8085939312244868, + "u_B_chj3_2": 0.28037975149138133, + "B_chq3_2": 0.18099180144139237, + "u_B_chq3_2": 0.010923354860002238, + "B_chtbre_2": 0.09834608533441279, + "u_B_chtbre_2": 0.0643755439676716, + "B_cqj31_2": 11.461802965749213, + "u_B_cqj31_2": 4.788543527422188, + "B_cqj38_2": 2.470049277341005, + "u_B_cqj38_2": 1.2168245354530467, + "B_chl3_2": 0.033078708813688414, + "u_B_chl3_2": 2.3660439025383183e-05, + "B_chgtil_ctgim": -0.030325209293172565, + "u_B_chgtil_ctgim": 0.010499175750855651, + "B_chgtil_ctwim": -0.02249585985025956, + "u_B_chgtil_ctwim": 0.007945553859774189, + "B_chgtil_cqj31": 0.013527889994458274, + "u_B_chgtil_cqj31": 0.013886652649934262, + "B_chwtil_ctwim": -0.18728760330831312, + "u_B_chwtil_ctwim": 0.011037984736469417, + "B_chwtil_chj3": -0.012594126909758247, + "u_B_chwtil_chj3": 0.009145978604386835, + "B_ctgim_ctwim": 0.03896669127389837, + "u_B_ctgim_ctwim": 0.02464749743844573, + "B_ctwim_cthim": 0.019003413913520197, + "u_B_ctwim_cthim": 0.0037521011303185063, + "B_ctwim_chtbim": -0.06157183595269498, + "u_B_ctwim_chtbim": 0.05905360228519884, + "B_ctwim_chg": -0.011800821920625024, + "u_B_ctwim_chg": 0.010323828644219626, + "B_ctwim_ctgre": 0.012312366761102018, + "u_B_ctwim_ctgre": 0.00810124499048519, + "B_ctwim_cbwre": 0.014155590990762263, + "u_B_ctwim_cbwre": 0.009030605930977901, + "B_ctwim_chj3": 0.13978475299896384, + "u_B_ctwim_chj3": 0.0851250939875582, + "B_ctwim_chq3": -0.010657039767019818, + "u_B_ctwim_chq3": 0.010337673582696322, + "B_ctwim_chtbre": -0.010587690283321344, + "u_B_ctwim_chtbre": 0.006956835276387675, + "B_ctwim_cqj31": -0.06322236712392275, + "u_B_ctwim_cqj31": 0.07770319486953842, + "B_ctwim_cqj38": 0.011273374108603882, + "u_B_ctwim_cqj38": 0.00793731995872907, + "B_cbgim_cbwim": -0.036301975656514315, + "u_B_cbgim_cbwim": 0.036328962558013524, + "B_cbgim_cbhim": 0.020179975073706988, + "u_B_cbgim_cbhim": 0.02018514301058971, + "B_cbgim_chtbim": -0.07416467790229807, + "u_B_cbgim_chtbim": 0.07411787144840451, + "B_cbgim_cbwre": -0.05054110078955566, + "u_B_cbgim_cbwre": 0.050522865007872585, + "B_cbgim_chtbre": 0.014752830114680236, + "u_B_cbgim_chtbre": 0.014748183265231411, + "B_cbwim_chtbim": 0.07292168391637009, + "u_B_cbwim_chtbim": 0.04127817626926838, + "B_cbwim_cbhre": 0.01807713253611341, + "u_B_cbwim_cbhre": 0.02028974146673114, + "B_cbwim_ctwre": 0.014152289492185253, + "u_B_cbwim_ctwre": 0.009031520809581361, + "B_cbwim_cbgre": 0.050547177749310085, + "u_B_cbwim_cbgre": 0.050522864406870566, + "B_cbwim_chtbre": -0.08677957566630283, + "u_B_cbwim_chtbre": 0.07900874951888605, + "B_cbwim_cqj31": 0.012591007671236509, + "u_B_cbwim_cqj31": 0.007783238357981935, + "B_cbhim_chtbim": -0.027830957299485475, + "u_B_cbhim_chtbim": 0.028095544543029597, + "B_cbhim_cbwre": -0.018110769980332904, + "u_B_cbhim_cbwre": 0.020288077102659008, + "B_chtbim_ctwre": -0.010582272061496327, + "u_B_chtbim_ctwre": 0.0069554147276219185, + "B_chtbim_cbgre": -0.01474728908947125, + "u_B_chtbim_cbgre": 0.014748183813034678, + "B_chtbim_cbwre": 0.08677949469015707, + "u_B_chtbim_cbwre": 0.07900873679267054, + "B_chbox_chw": 0.014248718529126516, + "u_B_chbox_chw": 0.0003370566874178329, + "B_chbox_ctwre": -0.034181084754069585, + "u_B_chbox_ctwre": 0.0009997872589410377, + "B_chbox_chj3": 0.011344670078710851, + "u_B_chbox_chj3": 0.0014786030891259009, + "B_chbox_cqj31": 0.028069247435061465, + "u_B_chbox_cqj31": 0.003975298061822185, + "B_chbox_chl3": -0.02205073023829419, + "u_B_chbox_chl3": 1.575639401803667e-05, + "B_chbox_cll1": 0.01102505476723479, + "u_B_chbox_cll1": 7.87911432818757e-06, + "B_chg_chw": 0.017820180360132276, + "u_B_chg_chw": 0.0022235607124750155, + "B_chg_cthre": -0.015195437584725436, + "u_B_chg_cthre": 0.0020545891276266613, + "B_chg_ctgre": -0.030325209293172565, + "u_B_chg_ctgre": 0.010499176438514734, + "B_chg_ctwre": -0.03079110210658636, + "u_B_chg_ctwre": 0.00793953061101267, + "B_chg_chj3": 0.050014729501436754, + "u_B_chg_chj3": 0.004954203651175, + "B_chg_chq3": 0.05883470143083915, + "u_B_chg_chq3": 0.007916967884980586, + "B_chg_cqj31": -0.045463827624302636, + "u_B_chg_cqj31": 0.011067695219675606, + "B_chw_cthre": -0.02093816685300527, + "u_B_chw_cthre": 0.000788303615094768, + "B_chw_ctwre": -0.30120606874152533, + "u_B_chw_ctwre": 0.01353661345002318, + "B_chw_chj3": 0.14523162661448846, + "u_B_chw_chj3": 0.012819341133668517, + "B_chw_chq3": 0.10026069560633459, + "u_B_chw_chq3": 0.007156098185447166, + "B_chw_cqj31": 0.25822540054302445, + "u_B_chw_cqj31": 0.04988195275418757, + "B_chw_chl3": -0.0427441252358547, + "u_B_chw_chl3": 0.0010110712075276646, + "B_chw_cll1": 0.021372227884038083, + "u_B_chw_cll1": 0.0005055274777411781, + "B_cthre_ctwre": 0.0360706626907634, + "u_B_cthre_ctwre": 0.004206868365053899, + "B_cthre_chj3": -0.07841574036923422, + "u_B_cthre_chj3": 0.003003276093426682, + "B_cthre_chq3": -0.06990231795704237, + "u_B_cthre_chq3": 0.0024905894895398614, + "B_cthre_cqj31": 0.047462863557828444, + "u_B_cthre_cqj31": 0.005098127993388502, + "B_cbhre_cbgre": 0.020186319667822767, + "u_B_cbhre_cbgre": 0.020187319941483452, + "B_cbhre_chtbre": -0.027856236662939893, + "u_B_cbhre_chtbre": 0.02809864253400212, + "B_ctgre_ctwre": 0.044387833083437384, + "u_B_ctgre_ctwre": 0.024646468274539438, + "B_ctgre_chj3": -0.016237932387552344, + "u_B_ctgre_chj3": 0.0026862933472538812, + "B_ctgre_chq3": -0.016882518227280076, + "u_B_ctgre_chq3": 0.00385370087653406, + "B_ctgre_cqj31": 0.015495199338119844, + "u_B_ctgre_cqj31": 0.002953525642050448, + "B_ctwre_chj3": -0.09384196761667914, + "u_B_ctwre_chj3": 0.12584498973449101, + "B_ctwre_chq3": -0.13171942691660682, + "u_B_ctwre_chq3": 0.011503156824846674, + "B_ctwre_chtbre": 0.06157310658992882, + "u_B_ctwre_chtbre": 0.05905425628036782, + "B_ctwre_cqj31": -1.4982933831187932, + "u_B_ctwre_cqj31": 0.2638361192595976, + "B_ctwre_cqj38": 0.017064821192264566, + "u_B_ctwre_cqj38": 0.02660672630228041, + "B_ctwre_chl3": 0.10254095158272253, + "u_B_ctwre_chl3": 0.0030002796769496845, + "B_ctwre_cll1": -0.05127030585191578, + "u_B_ctwre_cll1": 0.0015002038046287062, + "B_cbgre_cbwre": -0.03631511200623882, + "u_B_cbgre_cbwre": 0.03632894138589235, + "B_cbgre_chtbre": -0.0741719611326396, + "u_B_cbgre_chtbre": 0.07411787072790388, + "B_cbwre_chtbre": 0.07292156580845548, + "u_B_cbwre_chtbre": 0.04127813810105471, + "B_cbwre_cqj31": -0.03864864492835268, + "u_B_cbwre_cqj31": 0.023607227651808876, + "B_chj3_chq3": 0.23358217566334588, + "u_B_chj3_chq3": 0.007504752033588844, + "B_chj3_cqj31": 0.5235237487825963, + "u_B_chj3_cqj31": 0.3287908278950653, + "B_chj3_cqj38": -0.10557679019734899, + "u_B_chj3_cqj38": 0.03399194854379911, + "B_chj3_chl3": -0.03403744768626596, + "u_B_chj3_chl3": 0.004435450764677199, + "B_chj3_cll1": 0.017024824244377002, + "u_B_chj3_cll1": 0.002217714853569628, + "B_chq3_cqj31": -0.09775412918864622, + "u_B_chq3_cqj31": 0.018498145301577215, + "B_cqj31_cqj38": 0.21603560928134474, + "u_B_cqj31_cqj38": 0.445360212436354, + "B_cqj31_chl3": -0.08420288798492435, + "u_B_cqj31_chl3": 0.011926905895823582, + "B_cqj31_cll1": 0.04209817265813673, + "u_B_cqj31_cll1": 0.005963403208884941, + "B_chl3_cll1": -0.033079524523026704, + "u_B_chl3_cll1": 2.3668703807845324e-05 + }, + "THQ_FWDH": { + "A_ctwim": -0.015891805344842223, + "u_A_ctwim": 0.02823136447376448, + "A_chbox": 0.12124808041414571, + "u_A_chbox": 0.0013180102670800492, + "A_chdd": -0.030312018798417068, + "u_A_chdd": 0.00032950213676508403, + "A_chw": 0.025671361550753252, + "u_A_chw": 0.019663557327784104, + "A_ctwre": -0.2938936010585562, + "u_A_ctwre": 0.041527799244009705, + "A_cbwre": 0.013004239223417443, + "u_A_cbwre": 0.0070399519279221974, + "A_chj3": -0.19040851475525522, + "u_A_chj3": 0.028797053783588645, + "A_chq3": -0.13908307795954247, + "u_A_chq3": 0.014141838536917554, + "A_cqj31": 0.18340010345681093, + "u_A_cqj31": 0.08053700011768362, + "A_cqj38": -0.012446518656126436, + "u_A_cqj38": 0.00799330912895325, + "A_chl3": -0.36372129071866327, + "u_A_chl3": 0.0039525809026571, + "A_cll1": 0.18185424048612042, + "u_A_cll1": 0.0019760347879487733, + "B_chwtil_2": 0.050793041416853243, + "u_B_chwtil_2": 0.00611463158980518, + "B_ctwim_2": 0.4369954677772885, + "u_B_ctwim_2": 0.11062748578340917, + "B_cbwim_2": 0.011142993378672748, + "u_B_cbwim_2": 0.003786847124997731, + "B_chw_2": 0.08033070288703495, + "u_B_chw_2": 0.010396398132124327, + "B_ctwre_2": 0.43699882193401857, + "u_B_ctwre_2": 0.11062663967531704, + "B_cbwre_2": 0.01114307038071441, + "u_B_cbwre_2": 0.0037869152032300136, + "B_chj3_2": 0.17804379445440435, + "u_B_chj3_2": 0.04117170623305431, + "B_chq3_2": 0.039737971188054715, + "u_B_chq3_2": 0.005161683190465785, + "B_cqj31_2": 1.082761611663173, + "u_B_cqj31_2": 0.27164620858015776, + "B_cqj38_2": 0.20195131656850976, + "u_B_cqj38_2": 0.04237669230593038, + "B_chl3_2": 0.03307777160528832, + "u_B_chl3_2": 0.00035935871227414206, + "B_chwtil_ctwim": -0.10461860203576434, + "u_B_chwtil_ctwim": 0.01932193942592603, + "B_chwtil_ctwre": 0.011300357361254882, + "u_B_chwtil_ctwre": 0.008482075727095816, + "B_ctwim_cthim": 0.018236819648624024, + "u_B_ctwim_cthim": 0.005890635567124407, + "B_ctwim_chj3": 0.07694299532330058, + "u_B_ctwim_chj3": 0.054780479457086174, + "B_ctwim_cqj31": 0.011815531298752324, + "u_B_ctwim_cqj31": 0.026037839974325863, + "B_chbox_ctwre": -0.017817019526347386, + "u_B_chbox_ctwre": 0.0025175842496481904, + "B_chbox_chj3": -0.011543338217307464, + "u_B_chbox_chj3": 0.0017457932232696526, + "B_chbox_cqj31": 0.011118455699257172, + "u_B_chbox_cqj31": 0.004882480052317596, + "B_chbox_chl3": -0.022050259624129546, + "u_B_chbox_chl3": 0.0002396215493553896, + "B_chbox_cll1": 0.01102473729742019, + "u_B_chbox_cll1": 0.00011979524667764116, + "B_chg_chj3": 0.010375733942023596, + "u_B_chg_chj3": 0.004424906167457243, + "B_chw_cthre": -0.013251088192200227, + "u_B_chw_cthre": 0.0018545184629341932, + "B_chw_ctwre": -0.15182920633930402, + "u_B_chw_ctwre": 0.023941945006260856, + "B_chw_chj3": 0.10374851159295102, + "u_B_chw_chj3": 0.022929220778574923, + "B_chw_chq3": 0.05728116492865011, + "u_B_chw_chq3": 0.008333625373498483, + "B_chw_cqj31": 0.02085304819433802, + "u_B_chw_cqj31": 0.0451708659483058, + "B_cthre_ctwre": 0.02848793048464498, + "u_B_cthre_ctwre": 0.006563324031092557, + "B_cthre_chj3": -0.01882074309710956, + "u_B_cthre_chj3": 0.0026238398487172625, + "B_cthre_chq3": -0.016514578933585676, + "u_B_cthre_chq3": 0.002245727949844621, + "B_ctwre_chj3": -0.07083912126575173, + "u_B_ctwre_chj3": 0.029166869493497106, + "B_ctwre_chq3": -0.06846222159112451, + "u_B_ctwre_chq3": 0.011353590793230332, + "B_ctwre_cqj31": -0.10074834238422728, + "u_B_ctwre_cqj31": 0.1316202833076046, + "B_ctwre_cqj38": 0.01806934412336406, + "u_B_ctwre_cqj38": 0.01119779531282979, + "B_ctwre_chl3": 0.05346513037587634, + "u_B_ctwre_chl3": 0.007564100622408086, + "B_ctwre_cll1": -0.026735441670986067, + "u_B_ctwre_cll1": 0.003784367391054683, + "B_chj3_chq3": 0.07386873070421825, + "u_B_chj3_chq3": 0.009736877069439945, + "B_chj3_cqj31": -0.022689711333049548, + "u_B_chj3_cqj31": 0.04678587927569952, + "B_chj3_chl3": 0.03460628040397882, + "u_B_chj3_chl3": 0.005236163846793118, + "B_chj3_cll1": -0.017296851158120498, + "u_B_chj3_cll1": 0.002617970478006374, + "B_chq3_cqj31": -0.02407075208611908, + "u_B_chq3_cqj31": 0.01611053842221728, + "B_chq3_chl3": 0.02528107931282073, + "u_B_chq3_chl3": 0.0025718611254034324, + "B_chq3_cll1": -0.01263747001569863, + "u_B_chq3_cll1": 0.0012858970152232936, + "B_cqj31_cqj38": -0.05214849791530023, + "u_B_cqj31_cqj38": 0.059635002595807736, + "B_cqj31_chl3": -0.03334020108887412, + "u_B_cqj31_chl3": 0.014648218179925232, + "B_cqj31_cll1": 0.01666643805326049, + "u_B_cqj31_cll1": 0.007324123910013501, + "B_chl3_cll1": -0.033078715859138214, + "u_B_chl3_cll1": 0.0003593376289847339 + }, + "THW": { + "A_chbox": 0.12124806841003123, + "u_A_chbox": 2.4922229434934884e-05, + "A_chdd": -0.03031204178464444, + "u_A_chdd": 6.230105425941641e-06, + "A_chg": 0.4612294019058695, + "u_A_chg": 0.007905732413601471, + "A_chw": 0.16273926778143677, + "u_A_chw": 0.002346842092587987, + "A_cthre": -0.10483492416796518, + "u_A_cthre": 0.0014011555605764787, + "A_ctgre": -0.22806799809487951, + "u_A_ctgre": 0.00980309607155656, + "A_ctwre": 0.18189093763862427, + "u_A_ctwre": 0.011755020018663253, + "A_chq3": 0.35768906431552006, + "u_A_chq3": 0.008130577295124997, + "A_chl3": -0.24251292067297464, + "u_A_chl3": 5.118264463235804e-05, + "A_cll1": 0.12125652842514009, + "u_A_cll1": 2.567541262904731e-05, + "B_chgtil_2": 0.327305728604758, + "u_B_chgtil_2": 0.020627349413416627, + "B_chwtil_2": 0.016411145840106733, + "u_B_chwtil_2": 0.0007013564697837263, + "B_ctgim_2": 0.35041717917563026, + "u_B_ctgim_2": 0.038659480954785545, + "B_ctwim_2": 0.46740092335022043, + "u_B_ctwim_2": 0.15460290043134023, + "B_chg_2": 0.327305728604758, + "u_B_chg_2": 0.020627350115770646, + "B_chw_2": 0.02660695689000993, + "u_B_chw_2": 0.0008311727239782218, + "B_ctgre_2": 0.35041717917563026, + "u_B_ctgre_2": 0.038659481329537136, + "B_ctwre_2": 0.46740099143887326, + "u_B_ctwre_2": 0.15460183905787922, + "B_chq3_2": 0.24341378461584554, + "u_B_chq3_2": 0.07299420372971448, + "B_chl3_2": 0.014704263745481894, + "u_B_chl3_2": 3.334728844595119e-06, + "B_chgtil_ctgim": -0.28197655911950475, + "u_B_chgtil_ctgim": 0.019382635575792517, + "B_chgtil_ctwim": 0.15385945208380217, + "u_B_chgtil_ctwim": 0.016268143577766382, + "B_chgtil_cthim": 0.02114341955512917, + "u_B_chgtil_cthim": 0.0023369864239251572, + "B_chgtil_ctgre": 0.019261110280807816, + "u_B_chgtil_ctgre": 0.010238859095744946, + "B_ctgim_ctwim": -0.15608538078749296, + "u_B_ctgim_ctwim": 0.027948651807389722, + "B_ctgim_cthim": -0.04384580030891821, + "u_B_ctgim_cthim": 0.003990959145076193, + "B_ctgim_chg": -0.019261109599921288, + "u_B_ctgim_chg": 0.01023885923736853, + "B_ctgim_ctwre": -0.01260007619120247, + "u_B_ctgim_ctwre": 0.011672136508713548, + "B_ctwim_ctgre": 0.014585899282583909, + "u_B_ctwim_ctgre": 0.011678957842401127, + "B_chbox_chg": 0.027961575530572314, + "u_B_chbox_chg": 0.00047927744856323084, + "B_chbox_ctgre": -0.013826422278334837, + "u_B_chbox_ctgre": 0.0005943033803496072, + "B_chbox_ctwre": 0.011026948807886844, + "u_B_chbox_ctwre": 0.0007126377410694398, + "B_chbox_chq3": 0.02168454050542888, + "u_B_chbox_chq3": 0.0004929088537511507, + "B_chbox_chl3": -0.014702130868433317, + "u_B_chbox_chl3": 3.1040274620016e-06, + "B_chg_chw": 0.0963783475360589, + "u_B_chg_chw": 0.002836447172567174, + "B_chg_cthre": -0.01640519982828042, + "u_B_chg_cthre": 0.0028052759346169484, + "B_chg_ctgre": -0.28197655911950475, + "u_B_chg_ctgre": 0.019382636323250296, + "B_chg_ctwre": 0.16982489641162588, + "u_B_chg_ctwre": 0.01625200842806921, + "B_chg_chq3": 0.2599978654207351, + "u_B_chg_chq3": 0.020915506309044804, + "B_chg_chl3": -0.05592579970973807, + "u_B_chg_chl3": 0.0009587654649654017, + "B_chg_cll1": 0.027962818148485693, + "u_B_chg_cll1": 0.00047938766029998267, + "B_chw_ctgre": -0.07430164022160132, + "u_B_chw_ctgre": 0.002301597322557417, + "B_chw_ctwre": 0.01763124972977316, + "u_B_chw_ctwre": 0.00609167701265461, + "B_chw_chq3": 0.08773670594587567, + "u_B_chw_chq3": 0.0035774367745798636, + "B_chw_chl3": -0.01972802157865584, + "u_B_chw_chl3": 0.0002847675194057462, + "B_cthre_ctgre": -0.02208306475196836, + "u_B_cthre_ctgre": 0.004320828553357643, + "B_cthre_chq3": -0.02352851910244176, + "u_B_cthre_chq3": 0.0021710026183690188, + "B_cthre_chl3": 0.012710359041679449, + "u_B_cthre_chl3": 0.0001699010127334998, + "B_ctgre_ctwre": -0.14068388923746494, + "u_B_ctgre_ctwre": 0.02795796232686389, + "B_ctgre_chq3": -0.21764374450822463, + "u_B_ctgre_chq3": 0.026031508405379468, + "B_ctgre_chl3": 0.02766652526923104, + "u_B_ctgre_chl3": 0.0011880174977541677, + "B_ctgre_cll1": -0.013833348596539665, + "u_B_ctgre_cll1": 0.0005940116732699097, + "B_ctwre_chq3": 0.04540596837894876, + "u_B_ctwre_chq3": 0.005488586377248454, + "B_ctwre_chl3": -0.022051883893867495, + "u_B_ctwre_chl3": 0.0014255222264015408, + "B_ctwre_cll1": 0.01102575725646306, + "u_B_ctwre_cll1": 0.00071275278686038, + "B_chq3_chl3": -0.04337389317639353, + "u_B_chq3_chl3": 0.0009838299019490709, + "B_chq3_cll1": 0.021686920203843812, + "u_B_chq3_cll1": 0.0004918015975825735, + "B_chl3_cll1": -0.01470433183413468, + "u_B_chl3_cll1": 3.3515549116692363e-06 + }, + "THW_FWDH": { + "A_chgtil": 0.05985280094986618, + "u_A_chgtil": 0.11926772882250768, + "A_ctgim": -0.06025929110654909, + "u_A_ctgim": 0.061834864687480735, + "A_chbox": 0.12124809373555351, + "u_A_chbox": 7.680960922716422e-05, + "A_chdd": -0.030312032643729586, + "u_A_chdd": 1.9222507639874947e-05, + "A_chg": 0.8790104541368098, + "u_A_chg": 0.1950099086257137, + "A_chw": 0.22222207128315788, + "u_A_chw": 0.03294128877332056, + "A_cthre": -0.12794540967929446, + "u_A_cthre": 0.015387721689687299, + "A_ctgre": -0.5793477783859854, + "u_A_ctgre": 0.19079255517655844, + "A_ctwre": 0.2129838407349527, + "u_A_ctwre": 0.057493311927199815, + "A_chq3": 0.5357167082314476, + "u_A_chq3": 0.08720815143124508, + "A_chl3": -0.2424114707467123, + "u_A_chl3": 0.00022956677438720646, + "A_cll1": 0.12120127781020919, + "u_A_cll1": 0.00011922751283195517, + "B_chgtil_2": 1.1720378767613648, + "u_B_chgtil_2": 0.5927154010524784, + "B_chwtil_2": 0.025029873271203436, + "u_B_chwtil_2": 0.006901563108063345, + "B_ctgim_2": 0.8378997261039273, + "u_B_ctgim_2": 0.5264040877037774, + "B_ctwim_2": 0.09240186257986718, + "u_B_ctwim_2": 0.026234769990600818, + "B_chg_2": 1.1720378767613648, + "u_B_chg_2": 0.5927154014996849, + "B_chw_2": 0.03603327349852995, + "u_B_chw_2": 0.008150608138267304, + "B_cthre_2": 0.010309283736373636, + "u_B_cthre_2": 0.004366973235737137, + "B_ctgre_2": 0.8378997491285302, + "u_B_ctgre_2": 0.5264040871647669, + "B_ctwre_2": 0.09240285724271811, + "u_B_ctwre_2": 0.026232317290585165, + "B_chq3_2": 0.22330725305848467, + "u_B_chq3_2": 0.1282651814444744, + "B_chl3_2": 0.014691653825461812, + "u_B_chl3_2": 2.209566679672087e-05, + "B_chgtil_chwtil": 0.027496625629302697, + "u_B_chgtil_chwtil": 0.02892614664876918, + "B_chgtil_ctgim": -1.6216723634906973, + "u_B_chgtil_ctgim": 0.9216129128639874, + "B_chgtil_ctwim": 0.31031689636087395, + "u_B_chgtil_ctwim": 0.17491733339279966, + "B_chgtil_cthim": -0.07290971463721446, + "u_B_chgtil_cthim": 0.08806436692592448, + "B_chgtil_chw": -0.0291665061468092, + "u_B_chgtil_chw": 0.025187013485150712, + "B_chgtil_ctgre": 0.24758297387706824, + "u_B_chgtil_ctgre": 0.23186441553074363, + "B_chgtil_ctwre": -0.039917088404482964, + "u_B_chgtil_ctwre": 0.025217807313270987, + "B_chgtil_chq3": -0.14055241870922142, + "u_B_chgtil_chq3": 0.11207649560395237, + "B_chwtil_ctgim": -0.022816229683493217, + "u_B_chwtil_ctgim": 0.025383184941677576, + "B_chwtil_chg": 0.026034032619691908, + "u_B_chwtil_chg": 0.023746094542978238, + "B_ctgim_ctwim": -0.15976566203723255, + "u_B_ctgim_ctwim": 0.10529742641894296, + "B_ctgim_cthim": 0.039501193618445764, + "u_B_ctgim_cthim": 0.05231873366806076, + "B_ctgim_chg": -0.24758297387706824, + "u_B_ctgim_chg": 0.2318644144790045, + "B_ctgim_ctwre": 0.01009850316595199, + "u_B_ctgim_ctwre": 0.008908667157238159, + "B_ctwim_cthim": -0.015460540803717974, + "u_B_ctwim_cthim": 0.014819939176518197, + "B_ctwim_chg": 0.03315514424200037, + "u_B_ctwim_chg": 0.025366758499449586, + "B_cthim_chg": -0.010190596282419964, + "u_B_cthim_chg": 0.009279509744460089, + "B_chbox_chg": 0.05328915894394619, + "u_B_chbox_chg": 0.011822291646739815, + "B_chbox_chw": 0.013471983041366785, + "u_B_chbox_chw": 0.0019970346443377337, + "B_chbox_ctgre": -0.035122424807517774, + "u_B_chbox_ctgre": 0.011566616428758399, + "B_chbox_ctwre": 0.012911917170740462, + "u_B_chbox_ctwre": 0.003485477644229192, + "B_chbox_chq3": 0.03247729394235128, + "u_B_chbox_chq3": 0.005286910720097223, + "B_chbox_chl3": -0.014695987055752374, + "u_B_chbox_chl3": 1.389375640281795e-05, + "B_chdd_chg": -0.01332229111746273, + "u_B_chdd_chg": 0.0029555730528667396, + "B_chg_chw": 0.14381323620880387, + "u_B_chg_chw": 0.03176854172433309, + "B_chg_cthre": -0.13292727757416098, + "u_B_chg_cthre": 0.0960437421133068, + "B_chg_ctgre": -1.6216723634906973, + "u_B_chg_ctgre": 0.9216129128639874, + "B_chg_ctwre": 0.3180736548762126, + "u_B_chg_ctwre": 0.17471211784844323, + "B_chg_chq3": 0.7082933837283565, + "u_B_chg_chq3": 0.367635681346592, + "B_chg_chl3": -0.10664250817868436, + "u_B_chg_chl3": 0.023656024324791854, + "B_chg_cll1": 0.053321775596600854, + "u_B_chg_cll1": 0.011828244299555844, + "B_chw_ctgre": -0.10035383519200977, + "u_B_chw_ctgre": 0.032296333097228236, + "B_chw_ctwre": 0.02347716910295364, + "u_B_chw_ctwre": 0.01084060298222476, + "B_chw_chq3": 0.10349013379642871, + "u_B_chw_chq3": 0.019141425515774396, + "B_chw_chl3": -0.026934875969456668, + "u_B_chw_chl3": 0.003994926435999563, + "B_chw_cll1": 0.013467039659095886, + "u_B_chw_cll1": 0.001997479684430029, + "B_cthre_ctgre": 0.0878025507668321, + "u_B_cthre_ctgre": 0.057601199946090524, + "B_cthre_ctwre": -0.026904933624444134, + "u_B_cthre_ctwre": 0.016314698846623166, + "B_cthre_chq3": -0.04311784714804143, + "u_B_cthre_chq3": 0.012665037106345317, + "B_cthre_chl3": 0.015513760630977275, + "u_B_cthre_chl3": 0.0018666213891772709, + "B_ctgre_ctwre": -0.15979984896781393, + "u_B_ctgre_ctwre": 0.1052835451287908, + "B_ctgre_chq3": -0.722587748028507, + "u_B_ctgre_chq3": 0.5086124672488651, + "B_ctgre_chl3": 0.07026047180819253, + "u_B_ctgre_chl3": 0.023134258045248046, + "B_ctgre_cll1": -0.03513024396270733, + "u_B_ctgre_cll1": 0.011567080573712134, + "B_ctwre_chq3": 0.06746004460049804, + "u_B_ctwre_chq3": 0.023514380797983153, + "B_ctwre_chl3": -0.02582246990350527, + "u_B_ctwre_chl3": 0.006972878536851252, + "B_ctwre_cll1": 0.012911300111379214, + "u_B_ctwre_cll1": 0.0034865340115158134, + "B_chq3_chl3": -0.0649455369132508, + "u_B_chq3_chl3": 0.01057175408150804, + "B_chq3_cll1": 0.0324725877134916, + "u_B_chq3_cll1": 0.005285733181271479, + "B_chl3_cll1": -0.014691142679274509, + "u_B_chl3_cll1": 2.2744028135094702e-05 + }, + "TTH": { + "A_cg": 0.10881962049657114, + "u_A_cg": 0.004205021322448116, + "A_chbox": 0.12124809729207772, + "u_A_chbox": 1.4637939173853281e-05, + "A_chdd": -0.030427011080107858, + "u_A_chdd": 3.8874757908341285e-06, + "A_chg": 0.5235630228149804, + "u_A_chg": 0.002439772224140061, + "A_cthre": -0.12220063277662277, + "u_A_cthre": 4.155946112434655e-05, + "A_ctgre": -0.8988263487616704, + "u_A_ctgre": 0.0037317389534039422, + "A_cqj18": 0.09400889406316841, + "u_A_cqj18": 0.0011930519086386408, + "A_cqj31": 0.02630547080198098, + "u_A_cqj31": 0.0004822042617543808, + "A_cqj38": 0.019742390635594506, + "u_A_cqj38": 0.0012285047373489795, + "A_ctu8": 0.0578005511064458, + "u_A_ctu8": 0.0009508483298800845, + "A_ctd8": 0.036411153055946444, + "u_A_ctd8": 0.0006950051379224323, + "A_cqu8": 0.056980701411649945, + "u_A_cqu8": 0.0009303144514340409, + "A_ctj8": 0.0934756217862173, + "u_A_ctj8": 0.0012607432135576802, + "A_cqd8": 0.03661146076347338, + "u_A_cqd8": 0.0007125989269769196, + "A_chl3": -0.12235839631339408, + "u_A_chl3": 4.593149614744522e-05, + "A_cll1": 0.0611792010312817, + "u_A_cll1": 2.2965931909657286e-05, + "B_cgtil_2": 2.367242964055643, + "u_B_cgtil_2": 0.3796716845320846, + "B_chgtil_2": 0.5000553814089331, + "u_B_chgtil_2": 0.02194957001247432, + "B_ctgim_2": 0.8491115388373456, + "u_B_ctgim_2": 0.06012296015523941, + "B_cg_2": 2.3672429609812213, + "u_B_cg_2": 0.3796716846428647, + "B_chg_2": 0.5434399874884551, + "u_B_chg_2": 0.021927090843470633, + "B_ctgre_2": 0.916859074118155, + "u_B_ctgre_2": 0.060122884366590135, + "B_ctwre_2": 0.014874049978109087, + "u_B_ctwre_2": 0.0005112014314626011, + "B_chj1_2": 0.016615846833418997, + "u_B_chj1_2": 0.026084753213675205, + "B_chj3_2": 0.016615844170723565, + "u_B_chj3_2": 0.026084753213781443, + "B_chu_2": 0.029027743023200596, + "u_B_chu_2": 0.011790763063133017, + "B_cqj11_2": 0.17437126773852937, + "u_B_cqj11_2": 0.014218603664442248, + "B_cqj18_2": 0.03874917134864377, + "u_B_cqj18_2": 0.003159689849335, + "B_cqj31_2": 0.17437126860674615, + "u_B_cqj31_2": 0.01421860365613513, + "B_cqj38_2": 0.038749171294841386, + "u_B_cqj38_2": 0.0031596898641799353, + "B_ctu1_2": 0.10369829327902776, + "u_B_ctu1_2": 0.007371918683334209, + "B_ctu8_2": 0.023044064491825323, + "u_B_ctu8_2": 0.0016382042009089998, + "B_ctd1_2": 0.05604116041243873, + "u_B_ctd1_2": 0.003933157397238943, + "B_ctd8_2": 0.012453591000931798, + "u_B_ctd8_2": 0.00087403495318358, + "B_cqu1_2": 0.09462138389872568, + "u_B_cqu1_2": 0.006878857300059167, + "B_cqu8_2": 0.021026974227625745, + "u_B_cqu8_2": 0.0015286350048167047, + "B_ctj1_2": 0.13027764758685, + "u_B_ctj1_2": 0.029919495268291765, + "B_ctj8_2": 0.02895058897233434, + "u_B_ctj8_2": 0.006648777048592035, + "B_cqd1_2": 0.05864354546783432, + "u_B_cqd1_2": 0.004045862199554642, + "B_cqd8_2": 0.013031898773092396, + "u_B_cqd8_2": 0.000899080496393021, + "B_cgtil_chgtil": 0.013482542586106322, + "u_B_cgtil_chgtil": 0.012240017041491651, + "B_cgtil_ctgim": 1.2256870184280073, + "u_B_cgtil_ctgim": 0.10540284794778482, + "B_cgtil_cthim": -0.02674946706776953, + "u_B_cgtil_cthim": 0.0003087910225426685, + "B_chgtil_ctgim": -0.546189043997905, + "u_B_chgtil_ctgim": 0.02823700572760113, + "B_ctgim_cthim": -0.021480041145881805, + "u_B_ctgim_cthim": 0.0002904372403058328, + "B_cg_chg": 0.013482522772470806, + "u_B_cg_chg": 0.012240016258648272, + "B_cg_ctgre": 1.2256870187047055, + "u_B_cg_ctgre": 0.10540284781273646, + "B_chbox_chg": 0.03174051048161705, + "u_B_chbox_chg": 0.00014790887840694943, + "B_chbox_ctgre": -0.05449049249048363, + "u_B_chbox_ctgre": 0.000226233207397053, + "B_chdd_ctgre": 0.013622620504750514, + "u_B_chdd_ctgre": 5.655758220330202e-05, + "B_chg_cthre": -0.031824328957083675, + "u_B_chg_cthre": 0.00014960240094005268, + "B_chg_ctgre": -0.6704908661219194, + "u_B_chg_ctgre": 0.0282413333715823, + "B_chg_cqj18": 0.032713351521501385, + "u_B_chg_cqj18": 0.0008317451898820917, + "B_chg_ctu8": 0.021166783232199938, + "u_B_chg_ctu8": 0.0007715654141105446, + "B_chg_ctd8": 0.01233855183035846, + "u_B_chg_ctd8": 0.000509484697178976, + "B_chg_cqu8": 0.02123927883601851, + "u_B_chg_cqu8": 0.000918018567188304, + "B_chg_ctj8": 0.033199248950053745, + "u_B_chg_ctj8": 0.0007557311089733023, + "B_chg_cqd8": 0.012493713345866088, + "u_B_chg_cqd8": 0.0004604270591569173, + "B_chg_chl3": -0.03164610912298572, + "u_B_chg_chl3": 0.00014865338515476857, + "B_chg_cll1": 0.015823054104941166, + "u_B_chg_cll1": 7.432673509856898e-05, + "B_cthre_ctgre": 0.0546639652478523, + "u_B_cthre_ctgre": 0.0002284066610336043, + "B_ctgre_cqj18": -0.04721817709668001, + "u_B_ctgre_cqj18": 0.0028666319434917605, + "B_ctgre_ctu8": -0.030558068648563867, + "u_B_ctgre_ctu8": 0.0011758947097404123, + "B_ctgre_ctd8": -0.018822231351417862, + "u_B_ctgre_ctd8": 0.0008158259754414296, + "B_ctgre_cqu8": -0.030875952586343212, + "u_B_ctgre_cqu8": 0.0010295512650962957, + "B_ctgre_ctj8": -0.05016371530118312, + "u_B_ctgre_ctj8": 0.0014745240922921891, + "B_ctgre_cqd8": -0.018340242255817953, + "u_B_ctgre_cqd8": 0.000664472685393796, + "B_ctgre_chl3": 0.05435964133749389, + "u_B_ctgre_chl3": 0.00022723614348627626, + "B_ctgre_cll1": -0.02717982296226578, + "u_B_ctgre_cll1": 0.00011361892572081838, + "B_ctwre_cqj11": -0.011697075334498692, + "u_B_ctwre_cqj11": 0.004101932349162258, + "B_ctwre_cqj31": -0.06453087004039408, + "u_B_ctwre_cqj31": 0.0040969404270883554, + "B_ctwre_ctj1": -0.017930182912216857, + "u_B_ctwre_ctj1": 0.002088371171440736, + "B_ctbre_cqj11": -0.011288032263562916, + "u_B_ctbre_cqj11": 0.0007261666376523893, + "B_ctbre_ctu1": -0.029548404402705786, + "u_B_ctbre_ctu1": 0.0011797066937271532, + "B_ctbre_cqu1": -0.029899715527263837, + "u_B_ctbre_cqu1": 0.0010293686713165721, + "B_ctbre_ctj1": -0.01202080986692958, + "u_B_ctbre_ctj1": 0.00036756902750942317, + "B_chj1_cqj11": -0.01571743618786867, + "u_B_chj1_cqj11": 0.010165529701563269, + "B_chj3_cqj31": 0.015717438084756324, + "u_B_chj3_cqj31": 0.010165530066096558, + "B_chu_cqu1": -0.013925319955029871, + "u_B_chu_cqu1": 0.007337311446720356, + "B_cqj11_cqj31": 0.08407589944234482, + "u_B_cqj11_cqj31": 0.02845767066504399, + "B_cqj11_ctj1": 0.11858153104013434, + "u_B_cqj11_ctj1": 0.006224792771333888, + "B_cqj18_cqj38": 0.018683534410146654, + "u_B_cqj18_cqj38": 0.0063239264724044624, + "B_cqj18_ctj8": 0.026351451949382095, + "u_B_cqj18_ctj8": 0.001383287147256011, + "B_cqj31_ctj1": 0.027373032057107814, + "u_B_cqj31_ctj1": 0.0062356499471771624, + "B_ctu1_cqu1": 0.07436661233768364, + "u_B_ctu1_cqu1": 0.0029515275827937818, + "B_ctu8_cqu8": 0.016525913683759535, + "u_B_ctu8_cqu8": 0.0006558950474383109, + "B_ctd1_cqd1": 0.04583596244850495, + "u_B_ctd1_cqd1": 0.0021974545522883263, + "B_ctd8_cqd8": 0.010185769271875091, + "u_B_ctd8_cqd8": 0.0004883231805917625 + }, + "TTH_FWDH": { + "A_chgtil": -0.012315238489386506, + "u_A_chgtil": 0.008324392135390898, + "A_cg": 0.011712355963531042, + "u_A_cg": 0.017293160903483755, + "A_chbox": 0.12124809689738188, + "u_A_chbox": 0.0007513762781771511, + "A_chdd": -0.03058818619396164, + "u_A_chdd": 0.00019092607634472317, + "A_chg": 0.6578413610284006, + "u_A_chg": 0.01917988420072184, + "A_cthre": -0.12249409031207424, + "u_A_cthre": 0.0009863707352582185, + "A_ctgre": -0.9288271643668908, + "u_A_ctgre": 0.023170398770038413, + "A_ctwre": -0.013533082444089909, + "u_A_ctwre": 0.0006788362068881262, + "A_cqj11": 0.020980867326652667, + "u_A_cqj11": 0.0029811304036860926, + "A_cqj18": 0.14740749485784976, + "u_A_cqj18": 0.00866976008662728, + "A_cqj31": 0.038080568139976345, + "u_A_cqj31": 0.0028609126108503657, + "A_cqj38": 0.07378370535442998, + "u_A_cqj38": 0.009299970436473896, + "A_ctu1": 0.016313450012125884, + "u_A_ctu1": 0.0013550300640374747, + "A_ctu8": 0.11691178837152011, + "u_A_ctu8": 0.00852264794292403, + "A_ctd8": 0.052209544242102036, + "u_A_ctd8": 0.01243032138896277, + "A_cqu1": 0.012251879903057556, + "u_A_cqu1": 0.0010449392420300559, + "A_cqu8": 0.11931008153505894, + "u_A_cqu8": 0.011508094009204153, + "A_ctj1": 0.017091942581800138, + "u_A_ctj1": 0.0014403573315240068, + "A_ctj8": 0.16278479423337242, + "u_A_ctj8": 0.011879664056735345, + "A_cqd8": 0.046127776372494586, + "u_A_cqd8": 0.0055282057499207995, + "A_chl3": -0.12257238745571258, + "u_A_chl3": 0.000794843744396467, + "A_cll1": 0.06128612566675035, + "u_A_cll1": 0.00039740317295285164, + "B_cgtil_2": 0.6967811834540236, + "u_B_cgtil_2": 0.10918051528116572, + "B_chgtil_2": 0.33319822362682094, + "u_B_chgtil_2": 0.043983355170833356, + "B_ctgim_2": 0.5152850021182341, + "u_B_ctgim_2": 0.0705893538352303, + "B_cg_2": 0.6967811875801426, + "u_B_cg_2": 0.10918051597784138, + "B_chg_2": 0.39708430717968524, + "u_B_chg_2": 0.04442938159118119, + "B_ctgre_2": 0.603737303704869, + "u_B_ctgre_2": 0.070411147726606, + "B_ctwre_2": 0.017526211811652443, + "u_B_ctwre_2": 0.0010750692705526438, + "B_chd_2": 0.012301297498336992, + "u_B_chd_2": 0.010023714980600259, + "B_cqj11_2": 0.14223056667024137, + "u_B_cqj11_2": 0.01849570446821292, + "B_cqj18_2": 0.031606791255560464, + "u_B_cqj18_2": 0.004110156453248327, + "B_cqj31_2": 0.14223056673938958, + "u_B_cqj31_2": 0.018495704629733982, + "B_cqj38_2": 0.0316067925261595, + "u_B_cqj38_2": 0.004110156640100802, + "B_ctu1_2": 0.12293698672230756, + "u_B_ctu1_2": 0.018904993575672054, + "B_ctu8_2": 0.027319330061964003, + "u_B_ctu8_2": 0.0042011096993193955, + "B_ctd1_2": 0.2483502026173372, + "u_B_ctd1_2": 0.21068612918941093, + "B_ctd8_2": 0.05518894829419753, + "u_B_ctd8_2": 0.04681914621194454, + "B_cqu1_2": 0.20839239766792758, + "u_B_cqu1_2": 0.07140183267593882, + "B_cqu8_2": 0.04630942422285283, + "u_B_cqu8_2": 0.01586707465634421, + "B_ctj1_2": 0.2502771642479007, + "u_B_ctj1_2": 0.07098060667403876, + "B_ctj8_2": 0.055617149049552346, + "u_B_ctj8_2": 0.015773468390449637, + "B_cqd1_2": 0.051421979784351736, + "u_B_cqd1_2": 0.01316676304711606, + "B_cqd8_2": 0.011427107090057355, + "u_B_cqd8_2": 0.002925947769485973, + "B_cgtil_chgtil": -0.03333771989616815, + "u_B_cgtil_chgtil": 0.028793005766690773, + "B_cgtil_ctgim": 0.6189652299996422, + "u_B_cgtil_ctgim": 0.08919908640439995, + "B_cgtil_cthim": -0.010564884769983155, + "u_B_cgtil_cthim": 0.0011080138742244378, + "B_chgtil_ctgim": -0.3933646967685422, + "u_B_chgtil_ctgim": 0.06121447370548915, + "B_chgtil_ctgre": 0.02434680906524794, + "u_B_chgtil_ctgre": 0.02191119267223807, + "B_ctgim_chg": -0.021800314728995598, + "u_B_ctgim_chg": 0.02135114441406739, + "B_cg_chg": -0.033337724428619576, + "u_B_cg_chg": 0.02879300555761195, + "B_cg_ctgre": 0.6189652298721501, + "u_B_cg_ctgre": 0.08919908430342731, + "B_chbox_chg": 0.039881005931005686, + "u_B_chbox_chg": 0.0011627619673023823, + "B_chbox_ctgre": -0.05630926389054358, + "u_B_chbox_ctgre": 0.0014046832098188666, + "B_chdd_ctgre": 0.014077316489519027, + "u_B_chdd_ctgre": 0.0003511710142207956, + "B_chg_cthre": -0.039957551066006215, + "u_B_chg_cthre": 0.001180954661095528, + "B_chg_ctgre": -0.55662087674225, + "u_B_chg_ctgre": 0.061598686078912744, + "B_chg_cqj18": 0.045744214489913976, + "u_B_chg_cqj18": 0.0035519789314746764, + "B_chg_cqj38": 0.02270592809773454, + "u_B_chg_cqj38": 0.003703133492648674, + "B_chg_ctu8": 0.0375297408664274, + "u_B_chg_ctu8": 0.0036565323353858975, + "B_chg_ctd8": 0.022958367025032903, + "u_B_chg_ctd8": 0.01047387151979012, + "B_chg_cqu8": 0.043209499032762715, + "u_B_chg_cqu8": 0.008900068487237237, + "B_chg_ctj8": 0.056766510748241225, + "u_B_chg_ctj8": 0.006816766699476733, + "B_chg_cqd8": 0.015471485959376167, + "u_B_chg_cqd8": 0.0028711431963542983, + "B_chg_chl3": -0.03983731432394298, + "u_B_chg_chl3": 0.001163767581753982, + "B_chg_cll1": 0.019918653784727937, + "u_B_chg_cll1": 0.0005818837057481136, + "B_chw_cqj31": 0.011738000760893043, + "u_B_chw_cqj31": 0.0011638327519246055, + "B_cthre_ctgre": 0.05648843821976231, + "u_B_cthre_ctgre": 0.0014209894876542185, + "B_ctgre_cqj18": -0.058264567493343425, + "u_B_ctgre_cqj18": 0.004175363281531477, + "B_ctgre_cqj38": -0.030471681797365018, + "u_B_ctgre_cqj38": 0.0043759233590817724, + "B_ctgre_ctu8": -0.05582904992308611, + "u_B_ctgre_ctu8": 0.006870046693956918, + "B_ctgre_ctd8": -0.025179615301413202, + "u_B_ctgre_ctd8": 0.008139920453864805, + "B_ctgre_cqu8": -0.06546136107439617, + "u_B_ctgre_cqu8": 0.01341704023046484, + "B_ctgre_ctj8": -0.06836691982381911, + "u_B_ctgre_ctj8": 0.006604027706399551, + "B_ctgre_cqd8": -0.019285279636664, + "u_B_ctgre_cqd8": 0.0030333989506468517, + "B_ctgre_chl3": 0.056266008339667044, + "u_B_ctgre_chl3": 0.00140574068325575, + "B_ctgre_cll1": -0.028133010754907463, + "u_B_ctgre_cll1": 0.0007028697773612632, + "B_ctwre_cqj11": -0.040932175363624555, + "u_B_ctwre_cqj11": 0.005909261405793403, + "B_ctwre_cqj31": -0.07852922746944073, + "u_B_ctwre_cqj31": 0.005638794903427475, + "B_ctwre_ctj1": -0.05381842286712088, + "u_B_ctwre_ctj1": 0.009181512411834474, + "B_ctbre_cqj11": -0.013369355563221256, + "u_B_ctbre_cqj11": 0.0009768120739332697, + "B_ctbre_ctu1": -0.05323807555023141, + "u_B_ctbre_ctu1": 0.006692500004664643, + "B_ctbre_ctd1": 0.01201821189465539, + "u_B_ctbre_ctd1": 0.00392923796942308, + "B_ctbre_cqu1": -0.06284079412622878, + "u_B_ctbre_cqu1": 0.013295066826949562, + "B_ctbre_ctj1": -0.015725818615005476, + "u_B_ctbre_ctj1": 0.001564886979314189, + "B_chd_cqd1": -0.013319074949245134, + "u_B_chd_cqd1": 0.008948235239474975, + "B_cqj11_cqj31": 0.15441169696888363, + "u_B_cqj11_cqj31": 0.037524058662763586, + "B_cqj11_ctj1": 0.15380527433894925, + "u_B_cqj11_ctj1": 0.012279982673349515, + "B_cqj18_cqj38": 0.034313712837910224, + "u_B_cqj18_cqj38": 0.008338680272519598, + "B_cqj18_ctj8": 0.034178950373392365, + "u_B_cqj18_ctj8": 0.0027288852013698205, + "B_cqj31_ctj1": 0.08718220939959044, + "u_B_cqj31_ctj1": 0.01272646896114408, + "B_cqj38_ctj8": 0.01937382471112434, + "u_B_cqj38_ctj8": 0.002828104432343496, + "B_ctu1_cqu1": 0.16493225952477614, + "u_B_ctu1_cqu1": 0.03422836404952693, + "B_ctu8_cqu8": 0.036651612103828925, + "u_B_ctu8_cqu8": 0.007606301578884067, + "B_ctd1_cqd1": 0.055337777591800766, + "u_B_ctd1_cqd1": 0.013097173961696981, + "B_ctd8_cqd8": 0.012297282741211911, + "u_B_ctd8_cqd8": 0.002910481811998831 + }, + "TTH_PTH_0_60": { + "A_chbox": 0.12124809727142581, + "u_A_chbox": 2.215799309571045e-05, + "A_chdd": -0.03041408299008289, + "u_A_chdd": 6.063775235395386e-06, + "A_chg": 0.40513340010415466, + "u_A_chg": 0.002334622756166431, + "A_cthre": -0.12213391246142266, + "u_A_cthre": 5.4656714831521375e-05, + "A_ctgre": -0.7858315163542171, + "u_A_ctgre": 0.004377248093563112, + "A_cqj18": 0.055866779689873226, + "u_A_cqj18": 0.0012681345749204758, + "A_cqj31": 0.014310141398410352, + "u_A_cqj31": 0.00041487653963966537, + "A_ctu8": 0.03334206278925788, + "u_A_ctu8": 0.001066456593480605, + "A_ctd8": 0.022220575902493187, + "u_A_ctd8": 0.0007959956358408749, + "A_cqu8": 0.03190783413333322, + "u_A_cqu8": 0.0010988744180081493, + "A_ctj8": 0.05753962952345251, + "u_A_ctj8": 0.0014261124898930083, + "A_cqd8": 0.020573243631385615, + "u_A_cqd8": 0.0007386454023429012, + "A_chl3": -0.12223321716115502, + "u_A_chl3": 9.34009577739837e-05, + "A_cll1": 0.06111661216407133, + "u_A_cll1": 4.670106227449304e-05, + "B_cgtil_2": 0.7040678869099046, + "u_B_cgtil_2": 0.07287104942075551, + "B_chgtil_2": 0.1166894298444747, + "u_B_chgtil_2": 0.004622304481695629, + "B_ctgim_2": 0.3302875263605333, + "u_B_ctgim_2": 0.012495443271722641, + "B_cg_2": 0.7040678848409442, + "u_B_cg_2": 0.07287104908837372, + "B_chg_2": 0.14305102006656115, + "u_B_chg_2": 0.004638992208635847, + "B_ctgre_2": 0.37183465719570363, + "u_B_ctgre_2": 0.012524647860893868, + "B_cqj11_2": 0.04506325812224631, + "u_B_cqj11_2": 0.0029504510483120546, + "B_cqj18_2": 0.010014057498946766, + "u_B_cqj18_2": 0.0006556557980597362, + "B_cqj31_2": 0.045063258238919456, + "u_B_cqj31_2": 0.002950451112342132, + "B_cqj38_2": 0.0100140572818817, + "u_B_cqj38_2": 0.0006556557909317904, + "B_ctu1_2": 0.030095824174266112, + "u_B_ctu1_2": 0.004588763801206188, + "B_ctd1_2": 0.016562117403875906, + "u_B_ctd1_2": 0.0014430339169605726, + "B_cqu1_2": 0.03154849173524822, + "u_B_cqu1_2": 0.008745909321289401, + "B_ctj1_2": 0.054982181518214344, + "u_B_ctj1_2": 0.007447642724690252, + "B_ctj8_2": 0.012218262906368215, + "u_B_ctj8_2": 0.001655031716609427, + "B_cqd1_2": 0.014216854508093063, + "u_B_cqd1_2": 0.001297688193315041, + "B_cgtil_chgtil": -0.044698312942563004, + "u_B_cgtil_chgtil": 0.0023526747252306706, + "B_cgtil_ctgim": 0.4576723183399128, + "u_B_cgtil_ctgim": 0.028556730167500006, + "B_cgtil_cthim": -0.01484860124180335, + "u_B_cgtil_cthim": 0.00035637188262268877, + "B_chgtil_ctgim": -0.20390852774845267, + "u_B_chgtil_ctgim": 0.008721502653824367, + "B_ctgim_cthim": -0.013795445587349933, + "u_B_ctgim_cthim": 0.00033214049420681694, + "B_cg_chg": -0.04469831527237492, + "u_B_cg_chg": 0.0023526747976626494, + "B_cg_ctgre": 0.4576723202182044, + "u_B_cg_ctgre": 0.028556729901624358, + "B_chbox_chg": 0.024560827200046015, + "u_B_chbox_chg": 0.00014153429995822294, + "B_chbox_ctgre": -0.047640288347079285, + "u_B_chbox_ctgre": 0.0002653665108929927, + "B_chdd_ctgre": 0.01191007223754703, + "u_B_chdd_ctgre": 6.634165475509681e-05, + "B_chg_cthre": -0.024655760422677333, + "u_B_chg_cthre": 0.00014288018833056172, + "B_chg_ctgre": -0.274587695844769, + "u_B_chg_ctgre": 0.00873803911202802, + "B_chg_cqj18": 0.011717252870973124, + "u_B_chg_cqj18": 0.0003897569758340125, + "B_chg_ctj8": 0.01233499328151765, + "u_B_chg_ctj8": 0.0005341133802298115, + "B_chg_chl3": -0.02449674909677361, + "u_B_chg_chl3": 0.0001430283796598387, + "B_chg_cll1": 0.01224837423263368, + "u_B_chg_cll1": 7.1514209057315e-05, + "B_cthre_ctgre": 0.04783260721382868, + "u_B_cthre_ctgre": 0.0002678293439684458, + "B_ctgre_cqj18": -0.018619043783646677, + "u_B_ctgre_cqj18": 0.0007408839697870962, + "B_ctgre_ctu8": -0.010908338840585289, + "u_B_ctgre_ctu8": 0.0005481567426209307, + "B_ctgre_cqu8": -0.010493512344088362, + "u_B_ctgre_cqu8": 0.0006425556330014311, + "B_ctgre_ctj8": -0.019326221607843475, + "u_B_ctgre_ctj8": 0.0008589457961946632, + "B_ctgre_chl3": 0.04753229859699626, + "u_B_ctgre_chl3": 0.0002682635385746106, + "B_ctgre_cll1": -0.023766148195052437, + "u_B_ctgre_cll1": 0.00013413178193628653, + "B_ctwre_cqj31": -0.025113354937060184, + "u_B_ctwre_cqj31": 0.001010863770182869, + "B_ctbre_ctu1": -0.010353919018818845, + "u_B_ctbre_ctu1": 0.0005370384305932029, + "B_cqj11_cqj31": 0.010255662337101156, + "u_B_cqj11_cqj31": 0.005931204183633072, + "B_cqj11_ctj1": 0.04027341674971657, + "u_B_cqj11_ctj1": 0.001427476164839688, + "B_ctu1_cqu1": 0.02287604503012257, + "u_B_ctu1_cqu1": 0.0010667908341718472, + "B_ctd1_cqd1": 0.014401208999317018, + "u_B_ctd1_cqd1": 0.0006306600561872364 + }, + "TTH_PTH_120_200": { + "A_cg": 0.14956247070979792, + "u_A_cg": 0.00789005523733461, + "A_chbox": 0.12124809570130653, + "u_A_chbox": 3.2103797324239355e-05, + "A_chdd": -0.030429755412510112, + "u_A_chdd": 8.517611395179198e-06, + "A_chg": 0.5903704879780539, + "u_A_chg": 0.004577996477765985, + "A_cthre": -0.12228741693837142, + "u_A_cthre": 0.00010066778763845293, + "A_ctgre": -0.976172694159441, + "u_A_ctgre": 0.007293741948918437, + "A_cqj18": 0.09609876088126451, + "u_A_cqj18": 0.0020059469931717486, + "A_cqj31": 0.026179905840308042, + "u_A_cqj31": 0.0007074114976170509, + "A_cqj38": 0.01688182450850161, + "u_A_cqj38": 0.0020918305589334727, + "A_ctu8": 0.05695608107403053, + "u_A_ctu8": 0.0015538384763750953, + "A_ctd8": 0.038699429586539436, + "u_A_ctd8": 0.0012804958043609095, + "A_cqu8": 0.05662038266413824, + "u_A_cqu8": 0.0015203729302636687, + "A_ctj8": 0.09597614672622545, + "u_A_ctj8": 0.0019834889633583794, + "A_cqd8": 0.03652074711143271, + "u_A_cqd8": 0.0011992511876418308, + "A_chl3": -0.12240647161809241, + "u_A_chl3": 9.327556430748597e-05, + "A_cll1": 0.061203247963054486, + "u_A_cll1": 4.663979357866841e-05, + "B_cgtil_2": 2.058343382534641, + "u_B_cgtil_2": 0.15349005395527968, + "B_chgtil_2": 0.48109189504811073, + "u_B_chgtil_2": 0.03707611016267805, + "B_ctgim_2": 0.8965841915554764, + "u_B_ctgim_2": 0.06389571535563902, + "B_cg_2": 2.0583433697916727, + "u_B_cg_2": 0.15349005807125168, + "B_chg_2": 0.5319503139089639, + "u_B_chg_2": 0.03708589022458636, + "B_ctgre_2": 0.9705303345172231, + "u_B_ctgre_2": 0.0638718181028858, + "B_ctwre_2": 0.013045727292181564, + "u_B_ctwre_2": 0.0004666922774686198, + "B_cqj11_2": 0.12937379502170118, + "u_B_cqj11_2": 0.01070162873220392, + "B_cqj18_2": 0.028749732336018928, + "u_B_cqj18_2": 0.0023781394942791246, + "B_cqj31_2": 0.12937379429115187, + "u_B_cqj31_2": 0.010701628801085172, + "B_cqj38_2": 0.028749732262963998, + "u_B_cqj38_2": 0.0023781395008678034, + "B_ctu1_2": 0.0741681633495906, + "u_B_ctu1_2": 0.006589593382822614, + "B_ctu8_2": 0.016481814045667405, + "u_B_ctu8_2": 0.0014643541533475568, + "B_ctd1_2": 0.049145689028063946, + "u_B_ctd1_2": 0.004668951250584388, + "B_ctd8_2": 0.010921264005446773, + "u_B_ctd8_2": 0.0010375447160154924, + "B_cqu1_2": 0.07045201103533631, + "u_B_cqu1_2": 0.005807844167340661, + "B_cqu8_2": 0.01565600248219184, + "u_B_cqu8_2": 0.0012906320230220045, + "B_ctj1_2": 0.12472115516071693, + "u_B_ctj1_2": 0.008778376931122949, + "B_ctj8_2": 0.027715812420281368, + "u_B_ctj8_2": 0.0019507505019226725, + "B_cqd1_2": 0.04308758317602958, + "u_B_cqd1_2": 0.004525311515453617, + "B_cgtil_chgtil": -0.030743506156598967, + "u_B_cgtil_chgtil": 0.0074149579958646215, + "B_cgtil_ctgim": 1.1739079804705697, + "u_B_cgtil_ctgim": 0.04754860105186637, + "B_cgtil_cthim": -0.03152843939691741, + "u_B_cgtil_cthim": 0.0007234117263441491, + "B_chgtil_ctgim": -0.6360102977462341, + "u_B_chgtil_ctgim": 0.052745689188849004, + "B_chgtil_cthim": 0.011717337674091924, + "u_B_chgtil_cthim": 0.0006595818356285836, + "B_ctgim_cthim": -0.025486377186033058, + "u_B_ctgim_cthim": 0.0007310507058448478, + "B_cg_chg": -0.03074351102772083, + "u_B_cg_chg": 0.007414957328975828, + "B_cg_ctgre": 1.1739079771271768, + "u_B_cg_ctgre": 0.04754860283545477, + "B_chbox_chg": 0.03579064962090477, + "u_B_chbox_chg": 0.0002775366711876998, + "B_chbox_ctgre": -0.05917954097547011, + "u_B_chbox_ctgre": 0.00044217627803514104, + "B_chdd_ctgre": 0.014794884917856948, + "u_B_chdd_ctgre": 0.00011054396676589503, + "B_chg_cthre": -0.03587203422347305, + "u_B_chg_cthre": 0.00028089301243618413, + "B_chg_ctgre": -0.7727879913616665, + "u_B_chg_ctgre": 0.052737363507104576, + "B_chg_cqj18": 0.03003526281966103, + "u_B_chg_cqj18": 0.0010178561753349407, + "B_chg_ctu8": 0.017731056213687913, + "u_B_chg_ctu8": 0.0007730333695678855, + "B_chg_ctd8": 0.011713378334259268, + "u_B_chg_ctd8": 0.0005478288984487966, + "B_chg_cqu8": 0.017420242954652655, + "u_B_chg_cqu8": 0.0006251407458201169, + "B_chg_ctj8": 0.030524700732849023, + "u_B_chg_ctj8": 0.0009739244942192485, + "B_chg_cqd8": 0.01101006977095095, + "u_B_chg_cqd8": 0.0006835785428503072, + "B_chg_chl3": -0.03568275084535246, + "u_B_chg_chl3": 0.00027934295699990307, + "B_chg_cll1": 0.017841373681375127, + "u_B_chg_cll1": 0.00013967138899069308, + "B_cthre_ctgre": 0.05935246921575796, + "u_B_cthre_ctgre": 0.0004464517227346595, + "B_ctgre_cqj18": -0.043028166013711094, + "u_B_ctgre_cqj18": 0.0016537319467413597, + "B_ctgre_ctu8": -0.02614392228311705, + "u_B_ctgre_ctu8": 0.0014050296281315738, + "B_ctgre_ctd8": -0.01727024687993922, + "u_B_ctgre_ctd8": 0.0007881455842693901, + "B_ctgre_cqu8": -0.02515066514983181, + "u_B_ctgre_cqu8": 0.0009217146689231491, + "B_ctgre_ctj8": -0.04343341337372592, + "u_B_ctgre_ctj8": 0.001670423670320106, + "B_ctgre_cqd8": -0.016372590192189312, + "u_B_ctgre_cqd8": 0.000869551288676516, + "B_ctgre_chl3": 0.05904191679161462, + "u_B_ctgre_chl3": 0.00044428014827127175, + "B_ctgre_cll1": -0.02952095706439904, + "u_B_ctgre_cll1": 0.0002221401197652994, + "B_ctwre_cqj11": -0.012443316977313443, + "u_B_ctwre_cqj11": 0.002325845583721908, + "B_ctwre_cqj31": -0.05850841380714152, + "u_B_ctwre_cqj31": 0.0022980507651056002, + "B_ctwre_ctj1": -0.015490854409170828, + "u_B_ctwre_ctj1": 0.002351640935890657, + "B_ctbre_cqj11": -0.01021163768681762, + "u_B_ctbre_cqj11": 0.00040646533057451417, + "B_ctbre_ctu1": -0.025068082270207712, + "u_B_ctbre_ctu1": 0.0013866817952201452, + "B_ctbre_cqu1": -0.024079452339542458, + "u_B_ctbre_cqu1": 0.0008960219685041721, + "B_ctbre_ctj1": -0.010297330605810952, + "u_B_ctbre_ctj1": 0.00041019284189118104, + "B_cqj11_cqj31": 0.04758756588297592, + "u_B_cqj11_cqj31": 0.021462593535784242, + "B_cqj11_ctj1": 0.10107792391155476, + "u_B_cqj11_ctj1": 0.004939992126469058, + "B_cqj18_cqj38": 0.010575014805509509, + "u_B_cqj18_cqj38": 0.004769465740173075, + "B_cqj18_ctj8": 0.02246176096582127, + "u_B_cqj18_ctj8": 0.00109777609153698, + "B_cqj31_ctj1": 0.025271251145493535, + "u_B_cqj31_ctj1": 0.004977966803774005, + "B_ctu1_cqu1": 0.05687393531334176, + "u_B_ctu1_cqu1": 0.0019858126772637767, + "B_ctu8_cqu8": 0.012638652290875437, + "u_B_ctu8_cqu8": 0.0004412917062803137, + "B_ctd1_cqd1": 0.03839109769910277, + "u_B_ctd1_cqd1": 0.0017613159368594837 + }, + "TTH_PTH_200_300": { + "A_ctgim": 0.010700887616381969, + "u_A_ctgim": 0.0075722444903100075, + "A_cg": 0.29090925579240107, + "u_A_cg": 0.020929259793862686, + "A_chbox": 0.12124809739373879, + "u_A_chbox": 4.2804448987284166e-05, + "A_chdd": -0.03044610637448003, + "u_A_chdd": 1.1891321796259366e-05, + "A_chg": 0.680756661013959, + "u_A_chg": 0.011082098041665229, + "A_cthre": -0.1221061560700754, + "u_A_cthre": 0.00014102380138900184, + "A_ctgre": -1.0213333053950364, + "u_A_ctgre": 0.015799112578254625, + "A_ctwre": -0.01176856371392413, + "u_A_ctwre": 0.0004769474114750405, + "A_cqj11": 0.01282335232449957, + "u_A_cqj11": 0.0017084274520195169, + "A_cqj18": 0.1494195744951563, + "u_A_cqj18": 0.004557072711459841, + "A_cqj31": 0.042805665265852166, + "u_A_cqj31": 0.001662373438043343, + "A_cqj38": 0.032587574266518295, + "u_A_cqj38": 0.004769285785865963, + "A_ctu1": 0.014256564332080616, + "u_A_ctu1": 0.0006314958228058387, + "A_ctu8": 0.09199329747606452, + "u_A_ctu8": 0.003432088044298446, + "A_ctd8": 0.058715982108890306, + "u_A_ctd8": 0.0028059133979565394, + "A_cqu8": 0.09990621868754351, + "u_A_cqu8": 0.0038648400322347145, + "A_ctj8": 0.15368987839242762, + "u_A_ctj8": 0.004540715315589989, + "A_cqd8": 0.05985645548612195, + "u_A_cqd8": 0.0028791264153957105, + "A_chl3": -0.12240708707223784, + "u_A_chl3": 0.00012326561928230993, + "A_cll1": 0.0612035749409627, + "u_A_cll1": 6.163872410555175e-05, + "B_cgtil_2": 6.855505885282777, + "u_B_cgtil_2": 3.230597712081935, + "B_chgtil_2": 1.0871836123476235, + "u_B_chgtil_2": 0.08078186082418787, + "B_ctgim_2": 1.6352338613726287, + "u_B_ctgim_2": 0.14642671128510323, + "B_ctwim_2": 0.01053358665753588, + "u_B_ctwim_2": 0.0010868635389482816, + "B_cg_2": 6.855505930480745, + "u_B_cg_2": 3.230598939211301, + "B_chg_2": 1.1610585129963973, + "u_B_chg_2": 0.0808197774778605, + "B_ctgre_2": 1.7435458693214383, + "u_B_ctgre_2": 0.14637384913680032, + "B_ctwre_2": 0.02671466183127778, + "u_B_ctwre_2": 0.001297733272130257, + "B_ctbre_2": 0.010003801539814186, + "u_B_ctbre_2": 0.0004421907529979929, + "B_chj1_2": 0.01972416175001211, + "u_B_chj1_2": 0.0011977268130397322, + "B_chj3_2": 0.019724161429711288, + "u_B_chj3_2": 0.0011977267338798532, + "B_chu_2": 0.01151810843142414, + "u_B_chu_2": 0.0008465935833967581, + "B_cqj11_2": 0.2896790347060466, + "u_B_cqj11_2": 0.02378144273086056, + "B_cqj18_2": 0.06437311934275577, + "u_B_cqj18_2": 0.0052847652248516775, + "B_cqj31_2": 0.2896790357164534, + "u_B_cqj31_2": 0.023781443241264636, + "B_cqj38_2": 0.0643731195981736, + "u_B_cqj38_2": 0.005284765139354528, + "B_ctu1_2": 0.15621730686422963, + "u_B_ctu1_2": 0.01489313955034919, + "B_ctu8_2": 0.034714956856029634, + "u_B_ctu8_2": 0.003309586455160814, + "B_ctd1_2": 0.10146167032583892, + "u_B_ctd1_2": 0.011427704831076085, + "B_ctd8_2": 0.022547037723869887, + "u_B_ctd8_2": 0.0025394901639580695, + "B_cqu1_2": 0.19508957638004212, + "u_B_cqu1_2": 0.021383958480516, + "B_cqu8_2": 0.043353240343434386, + "u_B_cqu8_2": 0.004751991436719385, + "B_ctj1_2": 0.2834793545637104, + "u_B_ctj1_2": 0.02262035223851495, + "B_ctj8_2": 0.0629954121363456, + "u_B_ctj8_2": 0.0050267447365924854, + "B_cqd1_2": 0.10683002276472041, + "u_B_cqd1_2": 0.013179384315535071, + "B_cqd8_2": 0.023740005354589512, + "u_B_cqd8_2": 0.00292875212065585, + "B_cgtil_chgtil": 0.10461732417827908, + "u_B_cgtil_chgtil": 0.03852243166058671, + "B_cgtil_ctgim": 2.978700045177674, + "u_B_cgtil_ctgim": 0.8242592452221432, + "B_cgtil_cthim": -0.04680529029252378, + "u_B_cgtil_cthim": 0.0013099983002096435, + "B_cgtil_chg": 0.014101758203923884, + "u_B_cgtil_chg": 0.013993588206313733, + "B_chgtil_ctgim": -1.0413738361840255, + "u_B_chgtil_ctgim": 0.09707626798951001, + "B_chgtil_cthim": 0.014997082588284359, + "u_B_chgtil_cthim": 0.001302813186027858, + "B_chgtil_cg": -0.014101758271678578, + "u_B_chgtil_cg": 0.013993587330893469, + "B_ctgim_cthim": -0.03496402293220431, + "u_B_ctgim_cthim": 0.001185852748658324, + "B_cg_chbox": 0.01763603769394268, + "u_B_cg_chbox": 0.001268778221969826, + "B_cg_chg": 0.104617161379759, + "u_B_cg_chg": 0.038522423766813654, + "B_cg_cthre": -0.01772819805048517, + "u_B_cg_cthre": 0.001275498513627893, + "B_cg_ctgre": 2.9787000479683994, + "u_B_cg_ctgre": 0.8242592454524499, + "B_cg_chl3": -0.017629187118072077, + "u_B_cg_chl3": 0.0012681428361013024, + "B_chbox_chg": 0.041270226085884855, + "u_B_chbox_chg": 0.0006718419468149162, + "B_chbox_ctgre": -0.06191736318631376, + "u_B_chbox_ctgre": 0.0009578068887741388, + "B_chdd_chg": -0.010317556335892012, + "u_B_chdd_chg": 0.0001679602458747182, + "B_chdd_ctgre": 0.015479336990796873, + "u_B_chdd_ctgre": 0.00023945104413928926, + "B_chg_cthre": -0.04128893116202897, + "u_B_chg_cthre": 0.0006848933915640052, + "B_chg_ctgre": -1.2543687104984256, + "u_B_chg_ctgre": 0.09690134809443955, + "B_chg_cqj18": 0.061917514248906826, + "u_B_chg_cqj18": 0.0026590225524987772, + "B_chg_cqj38": 0.015103221573617846, + "u_B_chg_cqj38": 0.002721396618422535, + "B_chg_ctu8": 0.03716216866124333, + "u_B_chg_ctu8": 0.0018636222628737617, + "B_chg_ctd8": 0.02265082375897586, + "u_B_chg_ctd8": 0.0013369646551284824, + "B_chg_cqu8": 0.04134487444426667, + "u_B_chg_cqu8": 0.0020627080607523063, + "B_chg_ctj8": 0.06393389725585515, + "u_B_chg_ctj8": 0.0026726756215781538, + "B_chg_cqd8": 0.024161020931153222, + "u_B_chg_cqd8": 0.0017047258199813437, + "B_chg_chl3": -0.04112481470554638, + "u_B_chg_chl3": 0.0006760487445328471, + "B_chg_cll1": 0.020562408449633546, + "u_B_chg_cll1": 0.0003380244760794602, + "B_chw_cqj31": 0.017830496196768065, + "u_B_chw_cqj31": 0.0010235546048523619, + "B_cthre_ctgre": 0.06199968337339078, + "u_B_cthre_ctgre": 0.0009721417487437095, + "B_ctgre_cqj18": -0.08943224112469703, + "u_B_ctgre_cqj18": 0.004319921623381661, + "B_ctgre_cqj38": -0.020253863266771133, + "u_B_ctgre_cqj38": 0.0044009054632285225, + "B_ctgre_ctu8": -0.05315475379158746, + "u_B_ctgre_ctu8": 0.002683153366565206, + "B_ctgre_ctd8": -0.0340978511232771, + "u_B_ctgre_ctd8": 0.002703425335335749, + "B_ctgre_cqu8": -0.05786703134948295, + "u_B_ctgre_cqu8": 0.002929418822343608, + "B_ctgre_ctj8": -0.09162317184414562, + "u_B_ctgre_ctj8": 0.003986529381613834, + "B_ctgre_cqd8": -0.03423658192454696, + "u_B_ctgre_cqd8": 0.00245868272130373, + "B_ctgre_chl3": 0.06174182490500043, + "u_B_ctgre_chl3": 0.000962549743965743, + "B_ctgre_cll1": -0.03087091388053075, + "u_B_ctgre_cll1": 0.00048127460138878134, + "B_ctwre_cqj11": -0.02755435587950442, + "u_B_ctwre_cqj11": 0.006107272801218301, + "B_ctwre_cqj31": -0.12252073116835904, + "u_B_ctwre_cqj31": 0.0059976883559310894, + "B_ctwre_ctj1": -0.028028191550073942, + "u_B_ctwre_ctj1": 0.0056461244870141215, + "B_ctbre_cqj11": -0.021473380085383187, + "u_B_ctbre_cqj11": 0.0010623575810443965, + "B_ctbre_ctu1": -0.05138826889447184, + "u_B_ctbre_ctu1": 0.0026302557167983357, + "B_ctbre_ctd1": 0.01649077694266, + "u_B_ctbre_ctd1": 0.00132846677867189, + "B_ctbre_cqu1": -0.056003960638293375, + "u_B_ctbre_cqu1": 0.0028833867424144645, + "B_ctbre_ctj1": -0.021986097486730718, + "u_B_ctbre_ctj1": 0.0009759724156594315, + "B_ctbre_cqd1": 0.01656149887597438, + "u_B_ctbre_cqd1": 0.0012063822664463127, + "B_chj1_cqj11": -0.019975054426267794, + "u_B_chj1_cqj11": 0.002789339153234819, + "B_chj1_ctj1": 0.011644004760129391, + "u_B_chj1_ctj1": 0.002660632651427887, + "B_chj3_cqj31": 0.019975066118816023, + "u_B_chj3_cqj31": 0.002789340632719918, + "B_cqj11_cqj31": 0.15858587190176707, + "u_B_cqj11_cqj31": 0.047865735454366974, + "B_cqj11_ctj1": 0.21805349493555048, + "u_B_cqj11_ctj1": 0.009925877551374949, + "B_cqj18_cqj38": 0.03524130430794364, + "u_B_cqj18_cqj38": 0.01063683032622225, + "B_cqj18_ctj8": 0.048456332880096625, + "u_B_cqj18_ctj8": 0.0022057507181846934, + "B_cqj31_ctj1": 0.04746473194846785, + "u_B_cqj31_ctj1": 0.010136016649457347, + "B_cqj38_ctj8": 0.010547717927836667, + "u_B_cqj38_ctj8": 0.002252448280709066, + "B_ctu1_cqu1": 0.13377497203075706, + "u_B_ctu1_cqu1": 0.006318774028928914, + "B_ctu8_cqu8": 0.029727771368112773, + "u_B_ctu8_cqu8": 0.001404171991225014, + "B_ctd1_cqd1": 0.0826030996626302, + "u_B_ctd1_cqd1": 0.006978583031862329, + "B_ctd8_cqd8": 0.018356243711857803, + "u_B_ctd8_cqd8": 0.0015507961737181199 + }, + "TTH_PTH_60_120": { + "A_cg": 0.051285203209906656, + "u_A_cg": 0.004582151840544553, + "A_chbox": 0.12124809919415161, + "u_A_chbox": 2.0560212717210098e-05, + "A_chdd": -0.030421606532640835, + "u_A_chdd": 5.536829050163925e-06, + "A_chg": 0.47206141489274156, + "u_A_chg": 0.0024741339493333874, + "A_cthre": -0.12225700033577136, + "u_A_cthre": 6.742215839716547e-05, + "A_ctgre": -0.8565757114806135, + "u_A_ctgre": 0.00439674355904058, + "A_cqj18": 0.06849084014105501, + "u_A_cqj18": 0.0012514385993810282, + "A_cqj31": 0.018239690244167342, + "u_A_cqj31": 0.0004333608168604044, + "A_cqj38": 0.017404406345532957, + "u_A_cqj38": 0.0013003045328486933, + "A_ctu8": 0.04056544549707731, + "u_A_ctu8": 0.000963741379929674, + "A_ctd8": 0.027200901788023524, + "u_A_ctd8": 0.0007583972600342196, + "A_cqu8": 0.04019547550625115, + "u_A_cqu8": 0.0010958211984633825, + "A_ctj8": 0.06687020952779135, + "u_A_ctj8": 0.0012103385033833743, + "A_cqd8": 0.028415137799119992, + "u_A_cqd8": 0.0008428790336111509, + "A_chl3": -0.12236100131457557, + "u_A_chl3": 7.985187693542441e-05, + "A_cll1": 0.06118048620458862, + "u_A_cll1": 3.992447157414535e-05, + "B_cgtil_2": 1.1953177334011342, + "u_B_cgtil_2": 0.16792471948815213, + "B_chgtil_2": 0.1995405938856089, + "u_B_chgtil_2": 0.01218036275361521, + "B_ctgim_2": 0.4771109420693392, + "u_B_ctgim_2": 0.021915687466390374, + "B_cg_2": 1.1953177394177203, + "u_B_cg_2": 0.16792471997392444, + "B_chg_2": 0.23331796284690834, + "u_B_chg_2": 0.01220935313515445, + "B_ctgre_2": 0.5289601166702813, + "u_B_ctgre_2": 0.02191410664622898, + "B_cqj11_2": 0.06892315504176247, + "u_B_cqj11_2": 0.00391574753646655, + "B_cqj18_2": 0.015316256828033122, + "u_B_cqj18_2": 0.0008701661059269612, + "B_cqj31_2": 0.06892315526867371, + "u_B_cqj31_2": 0.003915747536691612, + "B_cqj38_2": 0.015316256720594093, + "u_B_cqj38_2": 0.0008701661063922719, + "B_ctu1_2": 0.039031766960813064, + "u_B_ctu1_2": 0.0031526387357298092, + "B_ctd1_2": 0.023748495212205914, + "u_B_ctd1_2": 0.0025374707756534026, + "B_cqu1_2": 0.031607016349740134, + "u_B_cqu1_2": 0.009412268387179361, + "B_ctj1_2": 0.06351208234307504, + "u_B_ctj1_2": 0.0036044532699132433, + "B_ctj8_2": 0.014113796422335864, + "u_B_ctj8_2": 0.0008009895613455721, + "B_cqd1_2": 0.02913729231251644, + "u_B_cqd1_2": 0.004124943523515261, + "B_cgtil_chgtil": -0.043748209695493236, + "u_B_cgtil_chgtil": 0.002302193021258851, + "B_cgtil_ctgim": 0.6939504635255423, + "u_B_cgtil_ctgim": 0.04402058609762341, + "B_cgtil_cthim": -0.01994989127308741, + "u_B_cgtil_cthim": 0.00029872279429912947, + "B_chgtil_ctgim": -0.3103412318518009, + "u_B_chgtil_ctgim": 0.01854910893110945, + "B_ctgim_cthim": -0.01679320839986609, + "u_B_ctgim_cthim": 0.0002933539675800457, + "B_cg_chg": -0.043748204354707325, + "u_B_cg_chg": 0.002302192945700136, + "B_cg_ctgre": 0.6939504595717855, + "u_B_cg_ctgre": 0.044020585937480046, + "B_chbox_chg": 0.02861827468164648, + "u_B_chbox_chg": 0.00014999203701716561, + "B_chbox_ctgre": -0.051929087687582025, + "u_B_chbox_ctgre": 0.00026654836411502624, + "B_chdd_ctgre": 0.01298227234993262, + "u_B_chdd_ctgre": 6.663719153540489e-05, + "B_chg_cthre": -0.02870232568393554, + "u_B_chg_cthre": 0.00015170437134199522, + "B_chg_ctgre": -0.4008011975980838, + "u_B_chg_ctgre": 0.01857388552326328, + "B_chg_cqj18": 0.016719602049910152, + "u_B_chg_cqj18": 0.00044997753580103863, + "B_chg_ctj8": 0.016213495279706815, + "u_B_chg_ctj8": 0.0004743685591420609, + "B_chg_chl3": -0.02852214655180288, + "u_B_chg_chl3": 0.00015157189703366797, + "B_chg_cll1": 0.014261073441787332, + "u_B_chg_cll1": 7.578609830935067e-05, + "B_cthre_ctgre": 0.05210381170147675, + "u_B_cthre_ctgre": 0.0002691845102094894, + "B_ctgre_cqj18": -0.024778242053542163, + "u_B_ctgre_cqj18": 0.0006087260771053752, + "B_ctgre_ctu8": -0.014940243387360155, + "u_B_ctgre_ctu8": 0.0005078622887254312, + "B_ctgre_cqu8": -0.01474837026034853, + "u_B_ctgre_cqu8": 0.0005429131411998848, + "B_ctgre_ctj8": -0.024451773005240398, + "u_B_ctgre_ctj8": 0.0006397256484379884, + "B_ctgre_cqd8": -0.010162265071211225, + "u_B_ctgre_cqd8": 0.00037931420992222577, + "B_ctgre_chl3": 0.05178952165442388, + "u_B_ctgre_chl3": 0.0002687373751995177, + "B_ctgre_cll1": -0.025894761407382776, + "u_B_ctgre_cll1": 0.0001343686401360675, + "B_ctwre_cqj31": -0.03350195783543424, + "u_B_ctwre_cqj31": 0.0008299573242898506, + "B_ctbre_ctu1": -0.01421396977278034, + "u_B_ctbre_ctu1": 0.000491150509800568, + "B_ctbre_cqu1": -0.014032883887496655, + "u_B_ctbre_cqu1": 0.0005228128886843584, + "B_cqj11_cqj31": 0.048584955143889386, + "u_B_cqj11_cqj31": 0.007861627667797466, + "B_cqj11_ctj1": 0.0535412931464758, + "u_B_cqj11_ctj1": 0.0012840294568091193, + "B_cqj18_cqj38": 0.010796656655297832, + "u_B_cqj18_cqj38": 0.0017470284395136443, + "B_cqj18_ctj8": 0.011898065217235524, + "u_B_cqj18_ctj8": 0.00028533987844015033, + "B_cqj31_ctj1": 0.013894437604718654, + "u_B_cqj31_ctj1": 0.0013132806550848661, + "B_ctu1_cqu1": 0.03256607824011613, + "u_B_ctu1_cqu1": 0.0010759011014637278, + "B_ctd1_cqd1": 0.021955411271782632, + "u_B_ctd1_cqd1": 0.0008194897830678287 + }, + "TTH_PTH_GT300": { + "A_cgtil": -0.011716182494093348, + "u_A_cgtil": 0.029301540441423655, + "A_chgtil": 0.01555131775535571, + "u_A_chgtil": 0.01724401396905544, + "A_ctgim": 0.023536696413108016, + "u_A_ctgim": 0.02641953835157738, + "A_cg": 0.4352300430874514, + "u_A_cg": 0.04281247845362203, + "A_chbox": 0.12124809886435824, + "u_A_chbox": 0.00014015057404906996, + "A_chdd": -0.030470888305249064, + "u_A_chdd": 3.505564888996117e-05, + "A_chg": 0.754086289335075, + "u_A_chg": 0.029229146490026833, + "A_cthre": -0.12183970059373501, + "u_A_cthre": 0.00018548859022883468, + "A_ctgre": -1.0558876442487084, + "u_A_ctgre": 0.04143908195985684, + "A_ctwre": -0.021829327881675048, + "u_A_ctwre": 0.0014949789589932736, + "A_chj3": 0.0352896026183713, + "u_A_chj3": 0.016514754433168917, + "A_chu": 0.013571028867140872, + "u_A_chu": 0.0028778727431901614, + "A_cqj11": 0.029471161231856235, + "u_A_cqj11": 0.007735318673286677, + "A_cqj18": 0.33058591705980717, + "u_A_cqj18": 0.016179058710750715, + "A_cqj31": 0.10741529959608655, + "u_A_cqj31": 0.007586330553858603, + "A_cqj38": 0.07321625341149426, + "u_A_cqj38": 0.016852209244351407, + "A_ctu1": 0.0399624803954187, + "u_A_ctu1": 0.002829262472864076, + "A_ctu8": 0.23108372799778557, + "u_A_ctu8": 0.013459247249882761, + "A_ctd8": 0.1101562867915588, + "u_A_ctd8": 0.008686876513152305, + "A_cqu1": 0.019222986349971976, + "u_A_cqu1": 0.001345106145839972, + "A_cqu8": 0.20705499084446938, + "u_A_cqu8": 0.01159274696613951, + "A_ctj1": 0.024812019803670843, + "u_A_ctj1": 0.003457878085600311, + "A_ctj8": 0.3143687630215566, + "u_A_ctj8": 0.018343792683840135, + "A_cqd8": 0.1223747051392538, + "u_A_cqd8": 0.009172626573468925, + "A_chl3": -0.12256501640583863, + "u_A_chl3": 0.00018986022954737056, + "A_cll1": 0.06128250991258529, + "u_A_cll1": 9.493037177196227e-05, + "B_cgtil_2": 10.5374006091646, + "u_B_cgtil_2": 2.5178205424949143, + "B_chgtil_2": 3.358669776893158, + "u_B_chgtil_2": 0.3576282200038114, + "B_ctgim_2": 4.076525622181336, + "u_B_ctgim_2": 1.157901574516178, + "B_ctwim_2": 0.05103074766976357, + "u_B_ctwim_2": 0.008989111663984469, + "B_ctbim_2": 0.018103418516787196, + "u_B_ctbim_2": 0.0015711013261088956, + "B_cg_2": 10.537401349186569, + "u_B_cg_2": 2.5178205441772126, + "B_chg_2": 3.445249537675166, + "u_B_chg_2": 0.3567443668995019, + "B_ctgre_2": 4.262735841995478, + "u_B_ctgre_2": 1.1578621169008898, + "B_ctwre_2": 0.08977489672695259, + "u_B_ctwre_2": 0.009547704951920866, + "B_ctbre_2": 0.03648222675659532, + "u_B_ctbre_2": 0.0026332999637571353, + "B_chj1_2": 0.2840008105974116, + "u_B_chj1_2": 0.5504733975306786, + "B_chj3_2": 0.2840008125879666, + "u_B_chj3_2": 0.5504733592997266, + "B_chu_2": 0.573585186477668, + "u_B_chu_2": 0.24869132524457205, + "B_chd_2": 0.1313764844330744, + "u_B_chd_2": 0.025443295858363902, + "B_cqj11_2": 1.5705202274817631, + "u_B_cqj11_2": 0.28653040615933084, + "B_cqj18_2": 0.34900448826844993, + "u_B_cqj18_2": 0.06367342798329645, + "B_cqj31_2": 1.5705202306804937, + "u_B_cqj31_2": 0.2865304069158709, + "B_cqj38_2": 0.3490044915515277, + "u_B_cqj38_2": 0.0636734279399339, + "B_ctu1_2": 0.9850341148737323, + "u_B_ctu1_2": 0.143191412071047, + "B_ctu8_2": 0.21889647570386675, + "u_B_ctu8_2": 0.03182031364106396, + "B_ctd1_2": 0.42218938373468073, + "u_B_ctd1_2": 0.07141843935147849, + "B_ctd8_2": 0.09381985788369725, + "u_B_ctd8_2": 0.015870763181670144, + "B_cqu1_2": 0.7732542523248066, + "u_B_cqu1_2": 0.10354002067768522, + "B_cqu8_2": 0.1718342758251939, + "u_B_cqu8_2": 0.02300889369350637, + "B_ctj1_2": 0.6728742435795179, + "u_B_ctj1_2": 0.6257669147013802, + "B_ctj8_2": 0.14952761447137328, + "u_B_ctj8_2": 0.13905932122793063, + "B_cqd1_2": 0.4683513111138066, + "u_B_cqd1_2": 0.068631769845029, + "B_cqd8_2": 0.1040780709193058, + "u_B_cqd8_2": 0.01525150439826876, + "B_cgtil_chgtil": 0.7558604432767057, + "u_B_cgtil_chgtil": 0.2380152266302757, + "B_cgtil_ctgim": 5.168060553655865, + "u_B_cgtil_ctgim": 1.0673066223543863, + "B_cgtil_cthim": -0.0629101525318089, + "u_B_cgtil_cthim": 0.0030104635825293625, + "B_cgtil_ctgre": -0.1821648936301471, + "u_B_cgtil_ctgre": 0.12488188773563462, + "B_chgtil_ctgim": -2.338129847267367, + "u_B_chgtil_ctgim": 0.4471845299276925, + "B_chgtil_cthim": 0.018970366703683118, + "u_B_chgtil_cthim": 0.003143035599484278, + "B_chgtil_chg": 0.03087565142464494, + "u_B_chgtil_chg": 0.02459414249328774, + "B_chgtil_ctgre": -0.048255873748133976, + "u_B_chgtil_ctgre": 0.057229926910780486, + "B_chgtil_ctu8": 0.01014332522025975, + "u_B_chgtil_ctu8": 0.007206940366569428, + "B_chgtil_cqu8": 0.011566545545423726, + "u_B_chgtil_cqu8": 0.01111210738542759, + "B_chwtil_chj1": 0.013452554944599739, + "u_B_chwtil_chj1": 0.011385011784707614, + "B_chwtil_chj3": -0.01232463205448476, + "u_B_chwtil_chj3": 0.011385251724854053, + "B_ctgim_cthim": -0.0408169105735115, + "u_B_ctgim_cthim": 0.0025464276306291747, + "B_ctgim_cg": 0.18216491555111486, + "u_B_ctgim_cg": 0.12488187222582571, + "B_ctgim_chg": 0.02242621644645153, + "u_B_ctgim_chg": 0.05299534407985016, + "B_ctgim_cqj38": -0.013395645930972755, + "u_B_ctgim_cqj38": 0.011825657903068974, + "B_ctwim_cqj11": -0.019010366936736203, + "u_B_ctwim_cqj11": 0.016807325275868697, + "B_cg_chbox": 0.026385415369290788, + "u_B_cg_chbox": 0.002595465970703867, + "B_cg_chg": 0.7558603775346949, + "u_B_cg_chg": 0.23801522494812846, + "B_cg_cthre": -0.02652306616102957, + "u_B_cg_cthre": 0.0026090103866253695, + "B_cg_ctgre": 5.168060509262294, + "u_B_cg_ctgre": 1.0673066091602454, + "B_cg_chl3": -0.026367444741284315, + "u_B_cg_chl3": 0.002593433109169037, + "B_cg_cll1": 0.013183693514159336, + "u_B_cg_cll1": 0.001296708404104219, + "B_chbox_chg": 0.045715760843113275, + "u_B_chbox_chg": 0.0017719887815608, + "B_chbox_ctgre": -0.06401218551559688, + "u_B_chbox_ctgre": 0.002512206675237678, + "B_chbox_cqj18": 0.020041456299118424, + "u_B_chbox_cqj18": 0.0009808399922258554, + "B_chbox_ctu8": 0.014009231907150147, + "u_B_chbox_ctu8": 0.0008159539620869699, + "B_chbox_cqu8": 0.012552512264878033, + "u_B_chbox_cqu8": 0.0007027993978150998, + "B_chbox_ctj8": 0.019058304978527767, + "u_B_chbox_ctj8": 0.0011120760621540023, + "B_chdd_chg": -0.011428942233997742, + "u_B_chdd_chg": 0.00044299685375237416, + "B_chdd_ctgre": 0.01600299692106084, + "u_B_chdd_ctgre": 0.0006280240805178632, + "B_chg_cthre": -0.04590779409055959, + "u_B_chg_cthre": 0.0017822784943482039, + "B_chg_ctgre": -2.7028005952814462, + "u_B_chg_ctgre": 0.447118937739972, + "B_chg_cqj18": 0.20150568889325587, + "u_B_chg_cqj18": 0.014742874279938471, + "B_chg_cqj38": 0.03620566287285271, + "u_B_chg_cqj38": 0.015025285751410171, + "B_chg_ctu8": 0.156781974036424, + "u_B_chg_ctu8": 0.014580488183957421, + "B_chg_ctd8": 0.07558774896617307, + "u_B_chg_ctd8": 0.009612302898552845, + "B_chg_cqu8": 0.15351335296529114, + "u_B_chg_cqu8": 0.017938742746399186, + "B_chg_ctj8": 0.20530185903672177, + "u_B_chg_ctj8": 0.012693871803646171, + "B_chg_cqd8": 0.07643288263593435, + "u_B_chg_cqd8": 0.00764119398926654, + "B_chg_chl3": -0.04568002500528338, + "u_B_chg_chl3": 0.0017725729833229515, + "B_chg_cll1": 0.022840015651106788, + "u_B_chg_cll1": 0.0008862875095989588, + "B_chw_ctwre": -0.013512236034685517, + "u_B_chw_ctwre": 0.0014832786612591427, + "B_chw_chj1": -0.022851322036232986, + "u_B_chw_chj1": 0.025705247725364432, + "B_chw_chj3": 0.024961009361709703, + "u_B_chw_chj3": 0.025704851851865506, + "B_chw_cqj31": 0.06008223727691338, + "u_B_chw_cqj31": 0.005691995128297815, + "B_chb_ctu1": 0.025629291875771936, + "u_B_chb_ctu1": 0.002601355393199433, + "B_chb_cqu1": 0.014952989322818407, + "u_B_chb_cqu1": 0.0012981354190451557, + "B_chwb_cqj11": -0.011918966770852022, + "u_B_chwb_cqj11": 0.001297201814490504, + "B_chwb_cqj31": -0.01779966920164568, + "u_B_chwb_cqj31": 0.0012827085663725802, + "B_chwb_ctu1": -0.017562408301008477, + "u_B_chwb_ctu1": 0.0014673349829626321, + "B_chwb_cqu1": -0.024117902851077247, + "u_B_chwb_cqu1": 0.0029176207175368994, + "B_chwb_ctj1": -0.0147799175437939, + "u_B_chwb_ctj1": 0.002021211003210915, + "B_cthre_ctgre": 0.0642987695606946, + "u_B_cthre_ctgre": 0.0025261082098014384, + "B_cthre_cqj18": -0.02014600157380244, + "u_B_cthre_cqj18": 0.0009859567020462775, + "B_cthre_ctu8": -0.014082310038936742, + "u_B_cthre_ctu8": 0.0008202105158449609, + "B_cthre_cqu8": -0.01261799207514065, + "u_B_cthre_cqu8": 0.0007064655507090707, + "B_cthre_ctj8": -0.019157725006738253, + "u_B_cthre_ctj8": 0.0011178763240984556, + "B_ctgre_cqj18": -0.2794214066217456, + "u_B_ctgre_cqj18": 0.058581144937645865, + "B_ctgre_cqj38": -0.02419746267933378, + "u_B_ctgre_cqj38": 0.058722479680619055, + "B_ctgre_ctu8": -0.21474342193896687, + "u_B_ctgre_ctu8": 0.022113087433111644, + "B_ctgre_ctd8": -0.11803234384724179, + "u_B_ctgre_ctd8": 0.0150783004722607, + "B_ctgre_cqu8": -0.21945009113746206, + "u_B_ctgre_cqu8": 0.019134460888378085, + "B_ctgre_ctj8": -0.3333978763520071, + "u_B_ctgre_ctj8": 0.027214286243386808, + "B_ctgre_cqd8": -0.11056595807210631, + "u_B_ctgre_cqd8": 0.011348174074500209, + "B_ctgre_chl3": 0.06397731412477252, + "u_B_ctgre_chl3": 0.0025115395752354406, + "B_ctgre_cll1": -0.03198871678643822, + "u_B_ctgre_cll1": 0.001255804771191647, + "B_ctwre_chj1": 0.02265449471871924, + "u_B_ctwre_chj1": 0.06343894125923488, + "B_ctwre_chj3": -0.010862122605317364, + "u_B_ctwre_chj3": 0.06343960670062071, + "B_ctwre_cqj11": -0.031287034548972525, + "u_B_ctwre_cqj11": 0.08408151822473799, + "B_ctwre_cqj31": -0.3871231956489739, + "u_B_ctwre_cqj31": 0.0838918816142913, + "B_ctwre_ctj1": -0.15412811009323713, + "u_B_ctwre_ctj1": 0.03907036758105747, + "B_ctbre_cqj11": -0.06835768049209585, + "u_B_ctbre_cqj11": 0.014871112079971199, + "B_ctbre_ctu1": -0.21151479322947442, + "u_B_ctbre_ctu1": 0.022303680540963804, + "B_ctbre_ctd1": 0.05831159869781148, + "u_B_ctbre_ctd1": 0.007545796424749549, + "B_ctbre_cqu1": -0.21691200756181325, + "u_B_ctbre_cqu1": 0.019242611402055573, + "B_ctbre_ctj1": -0.08188472011250227, + "u_B_ctbre_ctj1": 0.006821755412343352, + "B_ctbre_cqd1": 0.05452084556074363, + "u_B_ctbre_cqd1": 0.005669913252811138, + "B_chj1_chj3": 0.18640656608993797, + "u_B_chj1_chj3": 1.100974652581539, + "B_chj1_cqj11": -0.20977456168614128, + "u_B_chj1_cqj11": 0.21439078300217532, + "B_chj1_cqj31": -0.04316045465847365, + "u_B_chj1_cqj31": 0.21441181007317117, + "B_chj1_ctj1": 0.028926411000475823, + "u_B_chj1_ctj1": 0.17078151854559465, + "B_chq1_cqj31": -0.02095185872784649, + "u_B_chq1_cqj31": 0.0022312782997097325, + "B_chj3_cqj11": 0.04316047602495185, + "u_B_chj3_cqj11": 0.214411815560151, + "B_chj3_cqj31": 0.2097745266614105, + "u_B_chj3_cqj31": 0.21439078862280178, + "B_chj3_ctj1": 0.17909828460026914, + "u_B_chj3_ctj1": 0.17076194801660963, + "B_chq3_cqj31": 0.02095183917242049, + "u_B_chq3_cqj31": 0.0022312716643237687, + "B_chu_ctu1": 0.10694246898906565, + "u_B_chu_ctu1": 0.07725185194209555, + "B_chu_cqu1": -0.2251333290612514, + "u_B_chu_cqu1": 0.15473176283170598, + "B_chd_ctd1": 0.055781296017189064, + "u_B_chd_ctd1": 0.020520647196369656, + "B_chd_cqd1": -0.08485763313551493, + "u_B_chd_cqd1": 0.0294091063716258, + "B_cqj11_cqj31": 0.7334922129105212, + "u_B_cqj11_cqj31": 0.5747994758837363, + "B_cqj11_ctj1": 0.8515532870769554, + "u_B_cqj11_ctj1": 0.12543895327799856, + "B_cqj18_cqj38": 0.1629982982146606, + "u_B_cqj18_cqj38": 0.12773321624400405, + "B_cqj18_ctj8": 0.1892340692541315, + "u_B_cqj18_ctj8": 0.027875320032206795, + "B_cqj18_chl3": -0.020040972995322346, + "u_B_cqj18_chl3": 0.0009808316566482195, + "B_cqj18_cll1": 0.01002048611876674, + "u_B_cqj18_cll1": 0.0004904156669133379, + "B_cqj31_ctj1": 0.19640898125440964, + "u_B_cqj31_ctj1": 0.12602309988046873, + "B_cqj31_chl3": -0.019535821434047015, + "u_B_cqj31_chl3": 0.001379739240221645, + "B_cqj38_ctj8": 0.04364644675782601, + "u_B_cqj38_ctj8": 0.028005130368596268, + "B_ctu1_cqu1": 0.5954805995573351, + "u_B_ctu1_cqu1": 0.05824834683586933, + "B_ctu8_cqu8": 0.13232902057934928, + "u_B_ctu8_cqu8": 0.01294407687445269, + "B_ctu8_chl3": -0.014008924812981103, + "u_B_ctu8_chl3": 0.0008159325504289067, + "B_ctd1_cqd1": 0.33281885538076417, + "u_B_ctd1_cqd1": 0.04161956145595856, + "B_ctd8_cqd8": 0.07395974397742872, + "u_B_ctd8_cqd8": 0.009248791641384901, + "B_cqu8_chl3": -0.012552752581827989, + "u_B_cqu8_chl3": 0.0007028047450563539, + "B_ctj8_chl3": -0.01905861324655933, + "u_B_ctj8_chl3": 0.0011120774355126398 + } +} diff --git a/interface/RooEFTScalingFunction.h b/interface/RooEFTScalingFunction.h new file mode 100644 index 00000000000..7e9a751d54e --- /dev/null +++ b/interface/RooEFTScalingFunction.h @@ -0,0 +1,32 @@ +#ifndef ROO_EFTSCALINGFUNCTION +#define ROO_EFTSCALINGFUNCTION +#include +#include +#include +#include + +#include +#include +#include + + +class RooEFTScalingFunction : public RooAbsReal { + public: + RooEFTScalingFunction() {} + RooEFTScalingFunction(const char *name, const char *title, const std::map &coeffs, const RooArgList &terms); + RooEFTScalingFunction(const RooEFTScalingFunction& other, const char* name=0); + virtual ~RooEFTScalingFunction() {} + virtual TObject *clone(const char *newname) const { return new RooEFTScalingFunction(*this,newname); } + const std::map & coeffs() const { return coeffs_; } + const RooArgList & terms() const { return terms_; } + protected: + std::map coeffs_; + RooListProxy terms_; + std::map< std::vector, double> vcomponents_; + double offset_; + virtual Double_t evaluate() const ; + private: + ClassDef(RooEFTScalingFunction,1) +}; + +#endif diff --git a/python/STXStoSMEFTModel.py b/python/STXStoSMEFTModel.py new file mode 100644 index 00000000000..63daf71b636 --- /dev/null +++ b/python/STXStoSMEFTModel.py @@ -0,0 +1,689 @@ +# Author: Jonathon Langford (ICL) +# Date: 10/2022 +# Description: Model to describe how bins in STXS stage 1.2 scale using full set of dimension-6 EFT parameters +# Equations calculated using nanoAOD reweighting using Madgraph reweighting modules +# SMEFTsim + +from HiggsAnalysis.CombinedLimit.PhysicsModel import * +from HiggsAnalysis.CombinedLimit.SMHiggsBuilder import SMHiggsBuilder +from math import exp +import ROOT +import os +import re +import sys +import json +import yaml +from collections import OrderedDict as od + +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# Ordered dicts crucial: e.g. choose WH_had before WH + +MAP_HIGGS_DECAY_SMEFT = od() +MAP_HIGGS_DECAY_SMEFT["hgg"] = "gamgam" +MAP_HIGGS_DECAY_SMEFT["hzz"] = "ZZ" +MAP_HIGGS_DECAY_SMEFT["hbb"] = "bb" +MAP_HIGGS_DECAY_SMEFT["hww"] = "WW" +MAP_HIGGS_DECAY_SMEFT["htt"] = "tautau" +MAP_HIGGS_DECAY_SMEFT["hmm"] = "mumu" +MAP_HIGGS_DECAY_SMEFT["hzg"] = "Zgam" + +MAP_HIGGS_PROD_SMEFT = od() +MAP_HIGGS_PROD_SMEFT["ggH"] = "GG2H" +MAP_HIGGS_PROD_SMEFT["qqH"] = "QQ2HQQ" +MAP_HIGGS_PROD_SMEFT["WH_had"] = "QQ2HQQ" +MAP_HIGGS_PROD_SMEFT["ZH_had"] = "QQ2HQQ" +MAP_HIGGS_PROD_SMEFT["ggZH_had"] = "GG2H" +MAP_HIGGS_PROD_SMEFT["ggZH_qq"] = "GG2H" +MAP_HIGGS_PROD_SMEFT["WH_lep"] = "QQ2HLNU" +MAP_HIGGS_PROD_SMEFT["ZH_lep"] = "QQ2HLL" +MAP_HIGGS_PROD_SMEFT["ggZH_lep"] = "GG2HLL" +MAP_HIGGS_PROD_SMEFT["ggZH_ll"] = "GG2HLL" +MAP_HIGGS_PROD_SMEFT["ggZH_nunu"] = "GG2HLL" +MAP_HIGGS_PROD_SMEFT["ttH"] = "TTH" +MAP_HIGGS_PROD_SMEFT["tHq"] = "THQ" +MAP_HIGGS_PROD_SMEFT["tHW"] = "THW" +MAP_HIGGS_PROD_SMEFT["bbH"] = "BBH" + +MAP_HIGGS_PROD_SMEFT_ATLAS = od() +MAP_HIGGS_PROD_SMEFT_ATLAS["ggH"] = "GG2H" +MAP_HIGGS_PROD_SMEFT_ATLAS["qqH"] = "QQ2HQQ" +MAP_HIGGS_PROD_SMEFT_ATLAS["WH_had"] = "QQ2HQQ" +MAP_HIGGS_PROD_SMEFT_ATLAS["ZH_had"] = "QQ2HQQ" +MAP_HIGGS_PROD_SMEFT_ATLAS["ggZH_had"] = "GG2H" +MAP_HIGGS_PROD_SMEFT_ATLAS["ggZH_qq"] = "GG2H" +MAP_HIGGS_PROD_SMEFT_ATLAS["WH_lep"] = "QQ2HLNU" +MAP_HIGGS_PROD_SMEFT_ATLAS["ZH_lep"] = "QQ2HLL" +MAP_HIGGS_PROD_SMEFT_ATLAS["ggZH_lep"] = "GG2HLL" +MAP_HIGGS_PROD_SMEFT_ATLAS["ggZH_ll"] = "GG2HLL" +MAP_HIGGS_PROD_SMEFT_ATLAS["ggZH_nunu"] = "GG2HLL" +MAP_HIGGS_PROD_SMEFT_ATLAS["ttH"] = "TTH" +MAP_HIGGS_PROD_SMEFT_ATLAS["tHq"] = "TH" +MAP_HIGGS_PROD_SMEFT_ATLAS["tHW"] = "TH" +MAP_HIGGS_PROD_SMEFT_ATLAS["bbH"] = "BBH" + + +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# Global function to extract reco category, STXS bin, decay mode and energy from process name +def getProcessInfo(bin, process): + foundRecoCategory = bin + foundSTXSBin = process + foundDecay = None + foundEnergy = "13TeV" + # Iterate over Higgs decays + matchedDecayString = False + for D in ALL_HIGGS_DECAYS: + if matchedDecayString: + continue + if "_%s" % D in foundSTXSBin: + foundSTXSBin = re.sub("_%s" % D, "", foundSTXSBin) + foundDecay = D + matchedDecayString = True + # Also drop year tag in STXS bin name if present + for Y in ["2016", "2017", "2018"]: + if "_%s" % Y in foundSTXSBin: + foundSTXSBin = re.sub("_%s" % Y, "", foundSTXSBin) + + # Catch for H->Zgam + if (foundDecay == "hzg") | ("bkg" in foundSTXSBin): + foundSTXSBin = foundSTXSBin.split("_")[0] + + if not matchedDecayString: + raise RuntimeError("Validation Error: no supported decay found in process") + + return (foundRecoCategory, foundSTXSBin, foundDecay, foundEnergy) + + +################################################################################################################# +# STXS to EFT abstract base class: inherited classes for different stages +class STXStoSMEFTBaseModel(SMLikeHiggsModel): + def __init__(self, fixProcesses=[]): + SMLikeHiggsModel.__init__(self) + self.PROCESSES = None + self.DECAYS = None + # Dicts to store pois + scaling functions + self.pois = None + self.poiNameMap = {} # To account for exponents in poi names, which aren't in input json files + self.STXSScalingTerms = None + self.DecayScalingTerms = None + self.map_prod = MAP_HIGGS_PROD_SMEFT + self.map_decay = MAP_HIGGS_DECAY_SMEFT + # Options + self.floatMass = False + self.fixProcesses = fixProcesses # Option to fix certain STXS bins: comma separated list of STXS bins + self.stage0 = False + self.parametrisation = "CMS-prelim-SMEFT-topU3l_22_05_05_AccCorr_0p01" + self.eigenvalueThreshold = -1 + # Configuration of model: taylor expansion vs full, save only linear/linquad + self.linear_only = False + self.linquad_only = False + self.expand_equations = False # Option for Taylor-expanded equations + + def setPhysicsOptionsBase(self, physOptions): + for po in physOptions: + if po.startswith("higgsMassRange="): + self.floatMass = True + self.mHRange = po.replace("higgsMassRange=", "").split(",") + if len(self.mHRange) != 2: + raise RuntimeError("Higgs mass range definition requires two extrema") + elif float(self.mHRange[0]) >= float(self.mHRange[1]): + raise RuntimeError("Extrema for Higgs mass range defined with inverterd order. Second must be larger the first") + if po.startswith("fixProcesses="): + self.fixProcesses = (po.replace("fixProcesses=", "")).split(",") + if po.startswith("stage0="): + self.stage0 = po.replace("stage0=", "") in ["yes", "1", "Yes", "True", "true"] + if po.startswith("parametrisation="): + self.parametrisation = po.replace("parametrisation=", "") + if "ATLAS" in self.parametrisation: + self.map_prod = MAP_HIGGS_PROD_SMEFT_ATLAS + if po.startswith("eigenvalueThreshold="): + self.eigenvalueThreshold = po.replace("eigenvalueThreshold=", "") + if po.startswith("linear_only="): + self.linear_only = po.replace("linear_only=", "") in ["yes", "1", "Yes", "True", "true"] + if po.startswith("linquad_only="): + self.linquad_only = po.replace("linquad_only=", "") in ["yes", "1", "Yes", "True", "true"] + if po.startswith("expand_equations="): + self.expand_equations = po.replace("expand_equations=", "") in ["yes", "1", "Yes", "True", "true"] + + # Output options to screen + print(" --> [STXStoSMEFT] Using (%s) parametrisation" % self.parametrisation) + if len(self.fixProcesses) > 0: + print(" --> [STXStoSMEFT] Fixing following processes to SM: %s" % self.fixProcesses) + + def doMH(self): + if self.floatMass: + if self.modelBuilder.out.var("MH"): + self.modelBuilder.out.var("MH").setRange(float(self.mHRange[0]), float(self.mHRange[1])) + self.modelBuilder.out.var("MH").setConstant(False) + else: + self.modelBuilder.doVar("MH[%s,%s]" % (self.mHRange[0], self.mHRange[1])) + else: + if self.modelBuilder.out.var("MH"): + self.modelBuilder.out.var("MH").setVal(self.options.mass) + self.modelBuilder.out.var("MH").setConstant(True) + else: + self.modelBuilder.doVar("MH[%g]" % self.options.mass) + + # Overwrite getYieldScale to extract (RECO-category,STXS bin,decay,energy) + def getYieldScale(self, bin, process): + if not self.DC.isSignal[process]: + return 1.0 + + # Extract process line info + (recocat, stxsbin, decay, energy) = getProcessInfo(bin, process) + + # Return 1 (no scaling) for fixed processes and scaling for non-fixed + if stxsbin in self.fixProcesses: + return 1.0 + else: + procStr = stxsbin + return self.getHiggsSignalYieldScale(procStr, decay, energy) + + # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + # Extract pois from yaml file + def extractPOIs(self, filename): + with open(filename, "r") as fpois: + try: + self.pois = yaml.safe_load(fpois) + # Apply eigenvector threshold if set + if self.eigenvalueThreshold != -1.0: + pois_to_keep = {} + for poi, v in self.pois.items(): + if "eigenvalue" in v: + if v["eigenvalue"] > float(self.eigenvalueThreshold): + pois_to_keep[poi] = v + else: + pois_to_keep[poi] = v + self.pois = pois_to_keep + + except yaml.YAMLERROR as exc: + print(exc) + + # Function to extract STXS scaling terms from json file + def extractSTXSScalingTerms(self, filename=""): + if filename != "": + with open(filename, "r") as jf: + self.STXSScalingTerms = json.load(jf) + else: + self.STXSScalingTerms = {} + + # Function to extract decay scaling functions from file + def extractDecayScalingTerms(self, filename=""): + if filename != "": + with open(filename, "r") as jf: + self.DecayScalingTerms = json.load(jf) + else: + self.DecayScalingTerms = {} + + # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + # Function to make individual scaling functions in workspace + def makeScalingFunction(self, what, is_decay=False, mode=""): + mode_str = "_%s" % mode if mode != "" else "" + + # Apply mapping of production mode/decay to match inputs in json file + k = what + if is_decay: + for D in self.map_decay.keys(): + if what == D: + k = self.map_decay[D] + else: + for P in self.map_prod.keys(): + if P in what: + k = re.sub(P, self.map_prod[P], what) + + # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + # Pre-processing fix: + # Fix for ttH multilepton: missing lep label in VH bins + if "WH_PTV" in k: + k = re.sub("WH", "QQ2HLNU", k) + if "ZH_PTV" in k: + k = re.sub("ZH", "QQ2HLL", k) + if "ggZH_PTV" in k: + k = re.sub("ggZH", "GG2HLL", k) + + # Fix for ttH multilepton: duplicate of proc names + for P in self.map_prod.values(): + if "%s_%s" % (P, P) in k: + k = re.sub("%s_%s" % (P, P), P, k) + + # Fix for VH procs without had/lep label: use leptonic scaling function. Is this accurate? + if k == "WH": + k = "QQ2HLNU" + if k == "ZH": + k = "QQ2HLL" + if k == "ggZH": + k = "GG2HLL" + # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + # Extract terms for dict + if k in self.STXSScalingTerms: + terms = self.STXSScalingTerms[k] + elif k in self.DecayScalingTerms: + terms = self.DecayScalingTerms[k] + else: + print(" --> [WARNING] Scaling terms for %s do not exist in input json. Setting to 1" % k) + terms = {} + + # Loop over pois and extract the terms from scaling function, stored in C++ map + coeffs = ROOT.std.map("string", "double")() + list_pois = [] + + for j, jpoi in enumerate(self.pois): + if mode == "linear": + jpoi_name = "l%s" % self.poiNameMap[jpoi] + else: + jpoi_name = self.poiNameMap[jpoi] + e_jpoi = 10 ** (-1 * self.pois[jpoi]["exponent"]) + + # Interference terms: Aj + if "A_%s" % jpoi in terms: + coeffs[jpoi_name] = e_jpoi * terms["A_%s" % jpoi] + if jpoi_name not in list_pois: + list_pois.append(jpoi_name) + + if mode != "linear": + # BSM-only terms: Bjk + if "B_%s_2" % jpoi in terms: + coeffs["%s_2" % jpoi_name] = e_jpoi * e_jpoi * terms["B_%s_2" % jpoi] + if jpoi_name not in list_pois: + list_pois.append(jpoi_name) + + # Cross terms + for k, kpoi in enumerate(self.pois): + if k > j: + if mode == "linear": + kpoi_name = "l%s" % self.poiNameMap[kpoi] + else: + kpoi_name = self.poiNameMap[kpoi] + e_kpoi = 10 ** (-1 * self.pois[kpoi]["exponent"]) + + if "B_%s_%s" % (jpoi, kpoi) in terms: + coeffs["%s_%s" % (jpoi_name, kpoi_name)] = e_jpoi * e_kpoi * terms["B_%s_%s" % (jpoi, kpoi)] + elif "B_%s_%s" % (kpoi, jpoi) in terms: + coeffs["%s_%s" % (jpoi_name, kpoi_name)] = e_jpoi * e_kpoi * terms["B_%s_%s" % (kpoi, jpoi)] + + if kpoi_name not in list_pois: + list_pois.append(kpoi_name) + + # Make RooArgList of pois in equation + arglist_pois = ROOT.RooArgList() + for jpoi in list_pois: + arglist_pois.add(self.modelBuilder.out.var(jpoi)) + + # Make RooEFTScalingFunction + if is_decay: + if what != "tot": + name = "scaling%s_partial_%s" % (mode_str, what) + else: + name = "scaling%s_%s" % (mode_str, what) + else: + name = "scaling%s_XS_%s" % (mode_str, what) + eft_scaling = ROOT.RooEFTScalingFunction(name, name, coeffs, arglist_pois) + + # Add scaling function as RooAddition into model + self.modelBuilder.out.Import(eft_scaling) + + # Function to make BR scaling functions: partial width/total width + def makeBRScalingFunction(self, what, mode=""): + mode_str = "_%s" % mode if mode != "" else "" + self.modelBuilder.factory_('expr::scaling%s_BR_%s("@0/@1", scaling%s_partial_%s, scaling%s_tot)' % (mode_str, what, mode_str, what, mode_str)) + + # Function to make Taylor-expanded scaling functions in workspace + def makeScalingFunction_expand(self, what_production, what_decay): + # Apply mapping of production mode/decay to match inputs in json file + k_production = what_production + for P in self.map_prod.keys(): + if P in what_production: + k_production = re.sub(P, self.map_prod[P], what_production) + + k_decay = what_decay + for D in self.map_decay.keys(): + if what_decay == D: + k_decay = self.map_decay[D] + + # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + # Pre-processing fix: + # Fix for ttH multilepton: missing lep label in VH bins + if "WH_PTV" in k_production: + k_production = re.sub("WH", "QQ2HLNU", k_production) + if "ZH_PTV" in k_production: + k_production = re.sub("ZH", "QQ2HLL", k_production) + if "ggZH_PTV" in k_production: + k_production = re.sub("ggZH", "GG2HLL", k_production) + + # Fix for ttH multilepton: duplicate of proc names + for P in self.map_prod.values(): + if "%s_%s" % (P, P) in k_production: + k_production = re.sub("%s_%s" % (P, P), P, k_production) + + # Fix for VH procs without had/lep label: use leptonic scaling function. Is this accurate? + if k_production == "WH": + k_production = "QQ2HLNU" + if k_production == "ZH": + k_production = "QQ2HLL" + if k_production == "ggZH": + k_production = "GG2HLL" + # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + # Extract terms from dict + if k_production in self.STXSScalingTerms: + terms_production = self.STXSScalingTerms[k_production] + else: + print(" --> [WARNING] Scaling terms for %s do not exist in input json. Setting to 1" % k_production) + terms_production = {} + + if k_decay in self.DecayScalingTerms: + terms_decay = self.DecayScalingTerms[k_decay] + else: + print(" --> [WARNING] Scaling terms for %s do not exist in input json. Setting to 1" % k_decay) + terms_decay = {} + + if "tot" in self.DecayScalingTerms: + terms_tot = self.DecayScalingTerms["tot"] + else: + print(" --> [WARNING] Scaling terms for Higgs total decay width (tot) do not exist in input json. Setting to 1") + terms_tot = {} + + # Loop over pois and extract the terms from scaling function, stored in C++ map + coeffs = ROOT.std.map("string", "double")() + list_pois = [] + # Use different pois for linearised model so can store both in same workspace + lcoeffs = ROOT.std.map("string", "double")() + list_lpois = [] + + for j, jpoi in enumerate(self.pois): + Aj_sum = 0 + Bjj_sum = 0 + jpoi_name = self.poiNameMap[jpoi] + jpoi_lname = "l%s" % self.poiNameMap[jpoi] + e_jpoi = 10 ** (-1 * self.pois[jpoi]["exponent"]) + + # Interference terms: O(c_j) + if "A_%s" % jpoi in terms_production: + Aj_sum += terms_production["A_%s" % jpoi] + if "A_%s" % jpoi in terms_decay: + Aj_sum += terms_decay["A_%s" % jpoi] + if "A_%s" % jpoi in terms_tot: + Aj_sum -= terms_tot["A_%s" % jpoi] + # Multiply by exponent + Aj_sum *= e_jpoi + # If non-zero then add to coeffs + if Aj_sum != 0.0: + if jpoi_name not in list_pois: + list_pois.append(jpoi_name) + coeffs[jpoi_name] = Aj_sum + if jpoi_lname not in list_lpois: + list_lpois.append(jpoi_lname) + lcoeffs[jpoi_lname] = Aj_sum + + if not self.linear_only: + # Squared term: O(c_j^2) + if "B_%s_2" % jpoi in terms_production: + Bjj_sum += terms_production["B_%s_2" % jpoi] + if "B_%s_2" % jpoi in terms_decay: + Bjj_sum += terms_decay["B_%s_2" % jpoi] + if "B_%s_2" % jpoi in terms_tot: + Bjj_sum -= terms_tot["B_%s_2" % jpoi] + if ("A_%s" % jpoi in terms_production) & ("A_%s" % jpoi in terms_decay): + Bjj_sum += terms_production["A_%s" % jpoi] * terms_decay["A_%s" % jpoi] + if ("A_%s" % jpoi in terms_production) & ("A_%s" % jpoi in terms_tot): + Bjj_sum -= terms_production["A_%s" % jpoi] * terms_tot["A_%s" % jpoi] + if ("A_%s" % jpoi in terms_decay) & ("A_%s" % jpoi in terms_tot): + Bjj_sum -= terms_decay["A_%s" % jpoi] * terms_tot["A_%s" % jpoi] + if "A_%s" % jpoi in terms_tot: + Bjj_sum += terms_tot["A_%s" % jpoi] * terms_tot["A_%s" % jpoi] + # Multiply by exponent + Bjj_sum *= e_jpoi * e_jpoi + # If non zero then add to coeffs + if Bjj_sum != 0.0: + if jpoi_name not in list_pois: + list_pois.append(jpoi_name) + coeffs["%s_2" % jpoi_name] = Bjj_sum + + # Cross terms + for k, kpoi in enumerate(self.pois): + if k > j: + Bjk_sum = 0 + kpoi_name = self.poiNameMap[kpoi] + e_kpoi = 10 ** (-1 * self.pois[kpoi]["exponent"]) + if "B_%s_%s" % (jpoi, kpoi) in terms_production: + Bjk_sum += terms_production["B_%s_%s" % (jpoi, kpoi)] + elif "B_%s_%s" % (kpoi, jpoi) in terms_production: + Bjk_sum += terms_production["B_%s_%s" % (kpoi, jpoi)] + if "B_%s_%s" % (jpoi, kpoi) in terms_decay: + Bjk_sum += terms_decay["B_%s_%s" % (jpoi, kpoi)] + elif "B_%s_%s" % (kpoi, jpoi) in terms_decay: + Bjk_sum += terms_decay["B_%s_%s" % (kpoi, jpoi)] + if "B_%s_%s" % (jpoi, kpoi) in terms_tot: + Bjk_sum -= terms_tot["B_%s_%s" % (jpoi, kpoi)] + elif "B_%s_%s" % (kpoi, jpoi) in terms_tot: + Bjk_sum -= terms_tot["B_%s_%s" % (kpoi, jpoi)] + if ("A_%s" % jpoi in terms_production) & ("A_%s" % kpoi in terms_decay): + Bjk_sum += terms_production["A_%s" % jpoi] * terms_decay["A_%s" % kpoi] + if ("A_%s" % kpoi in terms_production) & ("A_%s" % jpoi in terms_decay): + Bjk_sum += terms_production["A_%s" % kpoi] * terms_decay["A_%s" % jpoi] + if ("A_%s" % jpoi in terms_production) & ("A_%s" % kpoi in terms_tot): + Bjk_sum -= terms_production["A_%s" % jpoi] * terms_tot["A_%s" % kpoi] + if ("A_%s" % kpoi in terms_production) & ("A_%s" % jpoi in terms_tot): + Bjk_sum -= terms_production["A_%s" % kpoi] * terms_tot["A_%s" % jpoi] + if ("A_%s" % jpoi in terms_decay) & ("A_%s" % kpoi in terms_tot): + Bjk_sum -= terms_decay["A_%s" % jpoi] * terms_tot["A_%s" % kpoi] + if ("A_%s" % kpoi in terms_decay) & ("A_%s" % jpoi in terms_tot): + Bjk_sum -= terms_decay["A_%s" % kpoi] * terms_tot["A_%s" % jpoi] + if ("A_%s" % jpoi in terms_tot) & ("A_%s" % kpoi in terms_tot): + Bjk_sum += 2 * terms_tot["A_%s" % jpoi] * terms_tot["A_%s" % kpoi] + # Multiply by exponent + Bjk_sum *= e_jpoi * e_kpoi + if Bjk_sum != 0.0: + if jpoi_name not in list_pois: + list_pois.append(jpoi_name) + if kpoi_name not in list_pois: + list_pois.append(kpoi_name) + coeffs["%s_%s" % (jpoi_name, kpoi_name)] = Bjk_sum + + if not self.linquad_only: + # Make RooArgList of pois in equation + arglist_lpois = ROOT.RooArgList() + for jpoi in list_lpois: + arglist_lpois.add(self.modelBuilder.out.var(jpoi)) + # Make RooEFTScalingFunction + name = "scaling_linear_expand_XS_%s_BR_%s" % (what_production, what_decay) + eft_scaling_linear = ROOT.RooEFTScalingFunction(name, name, lcoeffs, arglist_lpois) + # Add scaling function into model + self.modelBuilder.out.Import(eft_scaling_linear) + + if not self.linear_only: + # Make RooArgList of pois in equation + arglist_pois = ROOT.RooArgList() + for jpoi in list_pois: + arglist_pois.add(self.modelBuilder.out.var(jpoi)) + # Make RooEFTScalingFunction + name = "scaling_linquad_expand_XS_%s_BR_%s" % (what_production, what_decay) + eft_scaling_linquad = ROOT.RooEFTScalingFunction(name, name, coeffs, arglist_pois) + # Add scaling function into model + self.modelBuilder.out.Import(eft_scaling_linquad) + + +################################################################################################################# +class STXSToSMEFTModel(STXStoSMEFTBaseModel): + def __init__(self): + STXStoSMEFTBaseModel.__init__(self) + + def setPhysicsOptions(self, physOptions): + self.setPhysicsOptionsBase(physOptions) + + def doParametersOfInterest(self): + if self.floatMass: + print(" --> [WARNING] Floating Higgs mass selected. STXStoSMEFT model assumes MH=125.0 GeV") + self.doMH() + self.SMH = SMHiggsBuilder(self.modelBuilder) + + # Read in parameters of interest from yaml file + self.extractPOIs("%s/src/HiggsAnalysis/CombinedLimit/data/eft/STXStoSMEFT/%s/pois.yaml" % (os.environ["CMSSW_BASE"], self.parametrisation)) + + # Create list of pois and build RooRealVars + POIs, lPOIs = [], [] + for poi in self.pois: + if self.pois[poi]["exponent"] < 0: + poi_name = "%sXEm%g" % (poi, abs(self.pois[poi]["exponent"])) + elif self.pois[poi]["exponent"] >= 1: + poi_name = "%sXE%g" % (poi, self.pois[poi]["exponent"]) + else: + poi_name = poi + self.poiNameMap[poi] = poi_name + + if not self.linear_only: + POIs.append(poi_name) + self.modelBuilder.doVar("%s[%g,%g,%g]" % (poi_name, self.pois[poi]["val"], self.pois[poi]["min"], self.pois[poi]["max"])) + self.modelBuilder.out.var(poi_name).setConstant(True) + + if not self.linquad_only: + lpoi_name = "l%s" % poi_name + lPOIs.append(lpoi_name) + self.modelBuilder.doVar("%s[%g,%g,%g]" % (lpoi_name, self.pois[poi]["val"], self.pois[poi]["min"], self.pois[poi]["max"])) + self.modelBuilder.out.var(lpoi_name).setConstant(True) + + # Create POI sets + if self.linear_only: + self.modelBuilder.doSet("POI", ",".join(lPOIs)) + self.POIs = ROOT.RooArgList(self.modelBuilder.out.set("POI")) + elif self.linquad_only: + self.modelBuilder.doSet("POI", ",".join(POIs)) + self.POIs = ROOT.RooArgList(self.modelBuilder.out.set("POI")) + else: + self.modelBuilder.doSet("POI", ",".join(POIs)) + self.POIs = ROOT.RooArgList(self.modelBuilder.out.set("POI")) + self.modelBuilder.doSet("lPOI", ",".join(lPOIs)) + self.lPOIs = ROOT.RooArgList(self.modelBuilder.out.set("lPOI")) + + # set up model + self.setup() + + # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + def setup(self): + # Extract scaling terms from json files: inclusive vs reco-level + self.extractSTXSScalingTerms( + filename="%s/src/HiggsAnalysis/CombinedLimit/data/eft/STXStoSMEFT/%s/prod.json" % (os.environ["CMSSW_BASE"], self.parametrisation) + ) + self.extractDecayScalingTerms( + filename="%s/src/HiggsAnalysis/CombinedLimit/data/eft/STXStoSMEFT/%s/decay.json" % (os.environ["CMSSW_BASE"], self.parametrisation) + ) + + if not self.expand_equations: + if not self.linquad_only: + self.makeScalingFunction("tot", is_decay=True, mode="linear") + if not self.linear_only: + self.makeScalingFunction("tot", is_decay=True, mode="linquad") + + # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + def getHiggsSignalYieldScale(self, production, decay, energy): + # Function to convert troublesome procs into viable one for HC combination + production = convert_to_STXS(production, decay) + + # Stage 0 option: use stage 0 bin scaling + if self.stage0: + for P in self.map_prod.keys(): + if P in production: + production = P + + # For model with Taylor-expanded equations + if self.expand_equations: + if self.linear_only: + name = "scaling_linear_expand_XS_%s_BR_%s" % (production, decay) + if self.modelBuilder.out.function(name) == None: + print(" --> [STXStoSMEFT] Making linearised model for (STXS bin,decay): (%s,%s)" % (production, decay)) + self.makeScalingFunction_expand(production, decay) + + elif self.linquad_only: + name = "scaling_linquad_expand_XS_%s_BR_%s" % (production, decay) + if self.modelBuilder.out.function(name) == None: + print(" --> [STXStoSMEFT] Making linear+quad model for (STXS bin,decay): (%s,%s)" % (production, decay)) + self.makeScalingFunction_expand(production, decay) + + else: + name = "stxstosmeft_scaling_expand_XS_%s_BR_%s" % (production, decay) + name_lin = "scaling_linear_expand_XS_%s_BR_%s" % (production, decay) + name_linquad = "scaling_linquad_expand_XS_%s_BR_%s" % (production, decay) + if (self.modelBuilder.out.function(name_lin) == None) | (self.modelBuilder.out.function(name_linquad) == None): + print(" --> [STXStoSMEFT] Making linearised and linear+quadratic model for (STXS bin,decay): (%s,%s)" % (production, decay)) + self.makeScalingFunction_expand(production, decay) + # Combine linear and linear+quadratic models into same scaling (use different POIs) + self.modelBuilder.factory_("prod::%s(%s)" % (name, ",".join([name_lin, name_linquad]))) + + # For model with full equations: xs*partial/total + else: + if self.linear_only: + name_lin_xs = "scaling_linear_XS_%s" % production + if self.modelBuilder.out.function(name_lin_xs) == None: + print(" --> [STXStoSMEFT] Making linear scaling function for STXS bin: %s" % production) + self.makeScalingFunction(production, mode="linear") + name_lin_br = "scaling_linear_BR_%s" % decay + if self.modelBuilder.out.function(name_lin_br) == None: + print(" --> [STXStoSMEFT] Making linear scaling function for decay: %s" % decay) + self.makeScalingFunction(decay, is_decay=True, mode="linear") + self.makeBRScalingFunction(decay, mode="linear") + name = "scaling_linear_XS_%s_BR_%s" % (production, decay) + if self.modelBuilder.out.function(name) == None: + self.modelBuilder.factory_("prod::%s(%s)" % (name, ",".join([name_lin_xs, name_lin_br]))) + + elif self.linquad_only: + name_linquad_xs = "scaling_linquad_XS_%s" % production + if self.modelBuilder.out.function(name_linquad_xs) == None: + print(" --> [STXStoSMEFT] Making linear+quad scaling function for STXS bin: %s" % production) + self.makeScalingFunction(production, mode="linquad") + name_linquad_br = "scaling_linquad_BR_%s" % decay + if self.modelBuilder.out.function(name_linquad_br) == None: + print(" --> [STXStoSMEFT] Making linear+quad scaling function for decay: %s" % decay) + self.makeScalingFunction(decay, is_decay=True, mode="linquad") + self.makeBRScalingFunction(decay, mode="linquad") + name = "scaling_linquad_XS_%s_BR_%s" % (production, decay) + if self.modelBuilder.out.function(name) == None: + self.modelBuilder.factory_("prod::%s(%s)" % (name, ",".join([name_linquad_xs, name_linquad_br]))) + + # Combine linear and linear+quadratic models into same scaling (use different POIs) as product + else: + # Linear part + name_lin_xs = "scaling_linear_XS_%s" % production + if self.modelBuilder.out.function(name_lin_xs) == None: + print(" --> [STXStoSMEFT] Making linear scaling function for STXS bin: %s" % production) + self.makeScalingFunction(production, mode="linear") + name_lin_br = "scaling_linear_BR_%s" % decay + if self.modelBuilder.out.function(name_lin_br) == None: + print(" --> [STXStoSMEFT] Making linear scaling function for decay: %s" % decay) + self.makeScalingFunction(decay, is_decay=True, mode="linear") + self.makeBRScalingFunction(decay, mode="linear") + name_lin = "scaling_linear_XS_%s_BR_%s" % (production, decay) + if self.modelBuilder.out.function(name_lin) == None: + self.modelBuilder.factory_("prod::%s(%s)" % (name_lin, ",".join([name_lin_xs, name_lin_br]))) + + # Linear+quadratic part + name_linquad_xs = "scaling_linquad_XS_%s" % production + if self.modelBuilder.out.function(name_linquad_xs) == None: + print(" --> [STXStoSMEFT] Making linear+quad scaling function for STXS bin: %s" % production) + self.makeScalingFunction(production, mode="linquad") + name_linquad_br = "scaling_linquad_BR_%s" % decay + if self.modelBuilder.out.function(name_linquad_br) == None: + print(" --> [STXStoSMEFT] Making linear+quad scaling function for decay: %s" % decay) + self.makeScalingFunction(decay, is_decay=True, mode="linquad") + self.makeBRScalingFunction(decay, mode="linquad") + name_linquad = "scaling_linquad_XS_%s_BR_%s" % (production, decay) + if self.modelBuilder.out.function(name_linquad) == None: + self.modelBuilder.factory_("prod::%s(%s)" % (name_linquad, ",".join([name_linquad_xs, name_linquad_br]))) + + # Combination + name = "stxstosmeft_scaling_XS_%s_BR_%s" % (production, decay) + if self.modelBuilder.out.function(name) == None: + self.modelBuilder.factory_("prod::%s(%s)" % (name, ",".join([name_lin, name_linquad]))) + + return name + + +################################################################################################################# +# Function to convert troublesome procs to the names in the json files +def convert_to_STXS(_production, _decay): + # Add string replace functions + return _production + + +################################################################################################################# +# Instantiation of STXStoSMEFT model +STXStoSMEFT = STXSToSMEFTModel() diff --git a/src/RooEFTScalingFunction.cc b/src/RooEFTScalingFunction.cc new file mode 100644 index 00000000000..699cae17ac3 --- /dev/null +++ b/src/RooEFTScalingFunction.cc @@ -0,0 +1,87 @@ +#include "HiggsAnalysis/CombinedLimit/interface/RooEFTScalingFunction.h" + +ClassImp(RooEFTScalingFunction) + +RooEFTScalingFunction::RooEFTScalingFunction(const char *name, const char *title, const std::map &coeffs, const RooArgList &terms) : + RooAbsReal(name,title), + coeffs_(coeffs), + terms_("!terms","RooArgList of Wilson coefficients",this), + offset_(1.0) +{ + + // Add Wilson coefficients to terms_ container + RooFIter iter = terms.fwdIterator(); + for( RooAbsArg *a = iter.next(); a != 0; a = iter.next()) { + RooAbsReal *rar = dynamic_cast(a); + if (!rar) { + throw std::invalid_argument(std::string("Term ")+a->GetName()+" of RooEFTScalingFunction is a "+a->ClassName()); + } + terms_.add(*rar); + } + + // Loop over elements in mapping: add components to vector depending on string + for( auto const& x : coeffs ) { + TString term_name = x.first; + double term_prefactor = x.second; + + if( term_name.Contains("_") ) { + TString first_term = dynamic_cast( term_name.Tokenize("_")->At(0))->GetString(); + TString second_term = dynamic_cast( term_name.Tokenize("_")->At(1))->GetString(); + + // Squared-quadratic components + if( second_term == "2" ){ + if( terms.find(first_term) ){ + std::vector vterms; + RooAbsReal *rar1 = dynamic_cast( terms.find(first_term) ); + RooAbsReal *rar2 = dynamic_cast( terms.find(first_term) ); + vterms.push_back(rar1); + vterms.push_back(rar2); + vcomponents_.emplace(vterms,term_prefactor); + } + } else{ + // Cross-quadratic components + if( terms.find(first_term) && terms.find(second_term) ){ + std::vector vterms; + RooAbsReal *rar1 = dynamic_cast( terms.find(first_term) ); + RooAbsReal *rar2 = dynamic_cast( terms.find(second_term) ); + vterms.push_back(rar1); + vterms.push_back(rar2); + vcomponents_.emplace(vterms,term_prefactor); + } + } + } else { + + if( terms.find(term_name) ) { + std::vector vterms; + RooAbsReal *rar = dynamic_cast( terms.find(term_name) ); + vterms.push_back(rar); + vcomponents_.emplace(vterms,term_prefactor); + } + } + } +} + +RooEFTScalingFunction::RooEFTScalingFunction(const RooEFTScalingFunction& other, const char* name) : + RooAbsReal(other, name), + coeffs_(other.coeffs_), + terms_("!terms",this,other.terms_), + vcomponents_(other.vcomponents_), + offset_(other.offset_) +{ +} + +Double_t RooEFTScalingFunction::evaluate() const +{ + if (vcomponents_.empty()) { + return offset_; + } + double ret = offset_; + for (auto const &x : vcomponents_) { + double res = x.second; + for( auto const &y : x.first ){ + res *= y->getVal(); + } + ret += res; + } + return ret; +} diff --git a/src/classes.h b/src/classes.h index fc5ece7e62a..9374e48d881 100644 --- a/src/classes.h +++ b/src/classes.h @@ -66,3 +66,4 @@ #include "HiggsAnalysis/CombinedLimit/interface/RooCheapProduct.h" #include "HiggsAnalysis/CombinedLimit/interface/CMSHggFormula.h" #include "HiggsAnalysis/CombinedLimit/interface/SimpleProdPdf.h" +#include "HiggsAnalysis/CombinedLimit/interface/RooEFTScalingFunction.h" diff --git a/src/classes_def.xml b/src/classes_def.xml index ae303590427..2c891d14a4f 100644 --- a/src/classes_def.xml +++ b/src/classes_def.xml @@ -33,6 +33,7 @@ + @@ -221,4 +222,5 @@ + From 1094cdf94357b6febb2a1cf3423ab5341a3634b8 Mon Sep 17 00:00:00 2001 From: Stefano Belforte Date: Thu, 14 Sep 2023 13:38:29 +0200 Subject: [PATCH 56/98] Update CRAB env. setup instructions (#859) --- docs/part3/runningthetool.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/part3/runningthetool.md b/docs/part3/runningthetool.md index 9e696897e36..a1208a92a61 100644 --- a/docs/part3/runningthetool.md +++ b/docs/part3/runningthetool.md @@ -316,10 +316,10 @@ When the `--dry-run` option is removed each command will be run in sequence. #### Grid submission -Submission to the grid with `crab3` works in a similar way. Before doing so ensure that the `crab3` environment has been sourced, then for compatibility reasons source the CMSSW environment again. We will use the example of generating a grid of test-statistic distributions for limits. +Submission to the grid with `crab3` works in a similar way. Before doing so ensure that the `crab3` environment has been sourced in addition to the CMSSW environment. We will use the example of generating a grid of test-statistic distributions for limits. ```sh -$ source /cvmfs/cms.cern.ch/crab3/crab.sh; cmsenv +$ cmsenv; source /cvmfs/cms.cern.ch/crab3/crab.sh $ combineTool.py -d htt_mt.root -M HybridNew --LHCmode LHC-limits --clsAcc 0 -T 2000 -s -1 --singlePoint 0.2:2.0:0.05 --saveToys --saveHybridResult -m 125 --job-mode crab3 --task-name grid-test --custom-crab custom_crab.py ``` From 0c7be56b0f5e713356a701c38689bc5c2f4a7ae3 Mon Sep 17 00:00:00 2001 From: nckw Date: Thu, 14 Sep 2023 14:39:12 +0100 Subject: [PATCH 57/98] Update commonstatsmethods.md Point to specific part of docs for HybridNew running over grid of points (on the grid) --- docs/part3/commonstatsmethods.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/part3/commonstatsmethods.md b/docs/part3/commonstatsmethods.md index f21cde92f67..1bcfca0cb68 100644 --- a/docs/part3/commonstatsmethods.md +++ b/docs/part3/commonstatsmethods.md @@ -1025,7 +1025,7 @@ As in general for `HybridNew`, you can split the task into multiple tasks (grid ### Extracting contours -As in general for `HybridNew`, you can split the task into multiple tasks (grid and/or batch) and then merge the outputs with `hadd`. You can also refer to the [combineTool for job submission](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part3/runningthetool/#combinetool-for-job-submission) section for submitting the jobs to the grid/batch. +As in general for `HybridNew`, you can split the task into multiple tasks (grid and/or batch) and then merge the outputs with `hadd`. You can also refer to the [combineTool for job submission](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part3/runningthetool/#combinetool-for-job-submission) section for submitting the jobs to the grid/batch or if you have more than one parameter of interest, see the instructions for running `HybridNew` on a grid of parameter points on the [CombineHarvest - HybridNewGrid](http://cms-analysis.github.io/CombineHarvester/md_docs__hybrid_new_grid.html) documentation. #### Extracting 1D intervals From 8eca7a1bcd365363de7ca63a3d6ea812ba0b5211 Mon Sep 17 00:00:00 2001 From: nckw Date: Fri, 15 Sep 2023 14:33:43 +0100 Subject: [PATCH 58/98] Update commonstatsmethods.md correct spelling error --- docs/part3/commonstatsmethods.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/part3/commonstatsmethods.md b/docs/part3/commonstatsmethods.md index 1bcfca0cb68..3ceca849546 100644 --- a/docs/part3/commonstatsmethods.md +++ b/docs/part3/commonstatsmethods.md @@ -267,15 +267,15 @@ Three parameters control how the MCMC integration is performed: - the number of **tries** (option `--tries`): the algorithm will run multiple times with different ransom seeds and report as result the truncated mean and rms of the different results. The default value is 10, which should be ok for a quick computation, but for something more accurate you might want to increase this number even up to ~200. - the number of **iterations** (option `-i`) determines how many points are proposed to fill a single Markov Chain. The default value is 10k, and a plausible range is between 5k (for quick checks) and 20-30k for lengthy calculations. Usually beyond 30k you get a better tradeoff in time vs accuracy by increasing the number of chains (option `--tries`) -- the number of **burn-in steps** (option `-b`) is the number of points that are removed from the beginning of the chain before using it to compute the limit. The default is 200. If your chain is very long, you might want to try increase this a bit (e.g. to some hundreds). Instead going below 50 is probably dangerous. +- the number of **burn-in steps** (option `-b`) is the number of points that are removed from the beginning of the chain before using it to compute the limit. The default is 200. If your chain is very long, you might want to try increase this a bit (e.g. to some hundreds). Instead using a burn-on below 50 is likely to result in bias towards earlier stages of the chain before a reasonable convergence. #### Proposals The option `--proposal` controls the way new points are proposed to fill in the MC chain. - **uniform**: pick points at random. This works well if you have very few nuisance parameters (or none at all), but normally fails if you have many. -- **gaus**: Use a product of independent gaussians one for each nuisance parameter; the sigma of the gaussian for each variable is 1/5 of the range of the variable (this can be controlled using the parameter `--propHelperWidthRangeDivisor`). This proposal appears to work well for a reasonable number of nuisances (up to ~15), provided that the range of the nuisance parameters is reasonable, like ±5σ. It does **not** work without systematics. -- **ortho** (**default**): This proposalis similar to the multi-gaussian proposal but at every step only a single coordinate of the point is varied, so that the acceptance of the chain is high even for a large number of nuisances (i.e. more than 20). +- **gaus**: Use a product of independent gaussians one for each nuisance parameter; the sigma of the gaussian for each variable is 1/5 of the range of the variable (this can be controlled using the parameter `--propHelperWidthRangeDivisor`). This proposal appears to work well for a reasonable number of nuisances (up to ~15), provided that the range of the nuisance parameters is reasonable - something like ±5σ. This method does **not** work when there are no nuisance parameters. +- **ortho** (**default**): This proposal is similar to the multi-gaussian proposal but at every step only a single coordinate of the point is varied, so that the acceptance of the chain is high even for a large number of nuisances (i.e. more than 20). - **fit**: Run a fit and use the uncertainty matrix from HESSE to construct a proposal (or the one from MINOS if the option `--runMinos` is specified). This sometimes work fine, but sometimes gives biased results, so we don't recommend it in general. If you believe there's something going wrong, e.g. if your chain remains stuck after accepting only a few events, the option `--debugProposal` can be used to have a printout of the first *N* proposed points to see what's going on (e.g. if you have some region of the phase space with probability zero, the **gaus** and **fit** proposal can get stuck there forever) From 3902ca902d1f725c8d44519411ea61946fd528d7 Mon Sep 17 00:00:00 2001 From: Aliya Nigamova Date: Fri, 29 Sep 2023 19:44:22 +0200 Subject: [PATCH 59/98] Update ci.yml --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index be3abdaab78..646ec6005bf 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -57,7 +57,7 @@ jobs: - name: Install build environment shell: bash -l {0} run: | - mamba install -c conda-forge python==${{ matrix.python }} pip pandas root==${{ matrix.root }} gsl tbb vdt boost pcre eigen + mamba install -c conda-forge python==${{ matrix.python }} pip pandas root==${{ matrix.root }} gsl tbb vdt boost-cpp boost pcre eigen cd HiggsAnalysis/CombinedLimit bash set_conda_env_vars.sh - name: Build From a3fa324184a17110d6ea61c7c5f0093b52a9010d Mon Sep 17 00:00:00 2001 From: Kyle Cormier Date: Tue, 10 Oct 2023 10:38:45 +0200 Subject: [PATCH 60/98] Moving documentation to separate PR --- docs/part3/runningthetool.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/part3/runningthetool.md b/docs/part3/runningthetool.md index 7a229b8f29c..a4a93a6fa7a 100644 --- a/docs/part3/runningthetool.md +++ b/docs/part3/runningthetool.md @@ -55,7 +55,7 @@ There are a number of useful command line options which can be used to alter the - `--freezeParameters name1[,name2,...]` Will freeze the parameters with the given names to their set values. This option supports the use of regexps via by replacing `name` with `rgx{some regular expression}` for matching to *constrained nuisance parameters* or `var{some regular expression}` for matching to *any* parameter. For example `--freezeParameters rgx{CMS_scale_j.*}` will freeze all constrained nuisance parameters with the prefix `CMS_scale_j`, while `--freezeParameters var{.*rate_scale}` will freeze any parameter (constrained nuisance or otherwise) with the suffix `rate_scale`. - use the option `--freezeParameters allConstrainedNuisances` to freeze all nuisance parameters that have a constraint term (i.e not `flatParams` or `rateParams` or other freely floating parameters). - - similarly the option `--floatParameters` sets the parameter floating (and also accepts regexps, as of version > 9.1.0). + - similarly the option `--floatParameters` sets the parameter floating. - groups of nuisances (constrained or otherwise), as defined in the datacard, can be frozen using `--freezeNuisanceGroups`. You can also specify to freeze nuisances which are *not* contained in a particular group using a **^** before the group name (`--freezeNuisanceGroups=^group_name` will freeze everything except nuisance parameters in the group "group_name".) - all *constrained* nuisance parameters (not `flatParam` or `rateParam`) can be set floating using `--floatAllNuisances`. From 965fc6aeeea2c9ef1192c4f0f02596bf0918aa31 Mon Sep 17 00:00:00 2001 From: Izaak Date: Tue, 10 Oct 2023 11:59:15 +0200 Subject: [PATCH 61/98] Add optional range for channels in `ChannelCompatibilityCheck` (#760) * add optional ranges for channel group in ChannelCompatibilityCheck * add groupRanges_ to header file --- interface/ChannelCompatibilityCheck.h | 1 + src/ChannelCompatibilityCheck.cc | 30 ++++++++++++++++++++++----- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/interface/ChannelCompatibilityCheck.h b/interface/ChannelCompatibilityCheck.h index e0a390e1acb..b9e41654f5b 100644 --- a/interface/ChannelCompatibilityCheck.h +++ b/interface/ChannelCompatibilityCheck.h @@ -29,6 +29,7 @@ class ChannelCompatibilityCheck : public FitterAlgoBase { static bool saveFitResult_; static std::vector groups_; + static std::map> groupRanges_; virtual bool runSpecific(RooWorkspace *w, RooStats::ModelConfig *mc_s, RooStats::ModelConfig *mc_b, RooAbsData &data, double &limit, double &limitErr, const double *hint); }; diff --git a/src/ChannelCompatibilityCheck.cc b/src/ChannelCompatibilityCheck.cc index 3d81afa9c07..319f9eff3d3 100644 --- a/src/ChannelCompatibilityCheck.cc +++ b/src/ChannelCompatibilityCheck.cc @@ -25,6 +25,7 @@ bool ChannelCompatibilityCheck::fixedMu_ = false; bool ChannelCompatibilityCheck::saveFitResult_ = true; bool ChannelCompatibilityCheck::runMinos_ = true; std::vector ChannelCompatibilityCheck::groups_; +std::map> ChannelCompatibilityCheck::groupRanges_; ChannelCompatibilityCheck::ChannelCompatibilityCheck() : FitterAlgoBase("ChannelCompatibilityCheck specific options") @@ -32,7 +33,7 @@ ChannelCompatibilityCheck::ChannelCompatibilityCheck() : options_.add_options() ("fixedSignalStrength", boost::program_options::value(&mu_)->default_value(mu_), "Compute the compatibility for a fixed signal strength. If not specified, it's left floating") ("saveFitResult", "Save fit results in output file") - ("group,g", boost::program_options::value >(&groups_), "Group together channels that contain a given name. Can be used multiple times.") + ("group,g", boost::program_options::value >(&groups_), "Group together channels that contain a given name. Can be used multiple times. Optionally, set range as name=rMin,rMax") ("runMinos", boost::program_options::value(&runMinos_)->default_value(runMinos_), "Compute also uncertainties using profile likeilhood (MINOS or robust variants of it)") ; } @@ -42,6 +43,19 @@ void ChannelCompatibilityCheck::applyOptions(const boost::program_options::varia applyOptionsBase(vm); fixedMu_ = !vm["fixedSignalStrength"].defaulted(); saveFitResult_ = vm.count("saveFitResult"); + for(unsigned int i = 0; i < groups_.size(); i++) { + std::vector groupExpr; + boost::split(groupExpr, groups_[i], boost::is_any_of("=,")); // "-g channel=rMin,rMax" or just "-g channel" + if (groupExpr.size() == 3) { + groups_[i] = groupExpr[0]; + groupRanges_[groupExpr[0]] = {atof(groupExpr[1].c_str()), atof(groupExpr[2].c_str())}; + if (verbose>=0) std::cout << "Will set range of channel " << groupExpr[0] << " to [" << groupExpr[1] << ", " << groupExpr[2] << "]" << std::endl; + } else if (groupExpr.size() == 1) { + if (verbose>=1) std::cout << "No range to parse for channel " << groups_[i] << std::endl; + } else { + std::cout << "Error parsing group expression : " << groups_[i] << std::endl; + } + } } bool ChannelCompatibilityCheck::runSpecific(RooWorkspace *w, RooStats::ModelConfig *mc_s, RooStats::ModelConfig *mc_b, RooAbsData &data, double &limit, double &limitErr, const double *hint) { @@ -64,10 +78,13 @@ bool ChannelCompatibilityCheck::runSpecific(RooWorkspace *w, RooStats::ModelConf RooAbsPdf *pdfi = sim->getPdf(cat->getLabel()); if (pdfi == 0) continue; RooCustomizer customizer(*pdfi, "freeform"); - TString riName = TString::Format("_ChannelCompatibilityCheck_%s_%s", r->GetName(), nameForLabel(cat->getLabel()).c_str()); - rs.insert(std::pair(nameForLabel(cat->getLabel()), riName.Data())); + std::string label = nameForLabel(cat->getLabel()); + TString riName = TString::Format("_ChannelCompatibilityCheck_%s_%s", r->GetName(), label.c_str()); + rs.insert(std::pair(label, riName.Data())); + std::pair range = {r->getMin(),r->getMax()}; + if (groupRanges_.find(TString(label)) != groupRanges_.end()) range = groupRanges_[label]; if (w->var(riName) == 0) { - w->factory(TString::Format("%s[%g,%g]", riName.Data(), r->getMin(), r->getMax())); + w->factory(TString::Format("%s[%g,%g]", riName.Data(), range.first, range.second)); } customizer.replaceArg(*r, *w->var(riName)); newsim->addPdf((RooAbsPdf&)*customizer.build(), cat->getLabel()); @@ -138,7 +155,10 @@ std::string ChannelCompatibilityCheck::nameForLabel(const char *label) { std::string ret(label); for (std::vector::const_iterator it = groups_.begin(), ed = groups_.end(); it != ed; ++it) { - if (ret.find(*it) != std::string::npos) { ret = *it; break; } + if (ret.find(*it) != std::string::npos) { + if (verbose>=1) std::cout << "Grouping channel" << label << " with " << *it << std::endl; + ret = *it; break; + } } return ret; } From 85ae175add1ce201e64978c1a8f98dfa488015d8 Mon Sep 17 00:00:00 2001 From: nckw Date: Sun, 15 Oct 2023 19:32:25 +0100 Subject: [PATCH 62/98] Update settinguptheanalysis.md Change .png image of html to direct html output of sysanalyzer --- docs/part2/settinguptheanalysis.md | 51 +++++++++++++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/docs/part2/settinguptheanalysis.md b/docs/part2/settinguptheanalysis.md index 2b3aa2c3017..f3132341ae9 100644 --- a/docs/part2/settinguptheanalysis.md +++ b/docs/part2/settinguptheanalysis.md @@ -541,7 +541,56 @@ The default output is a `.html` file which allows you to expand to give more det $ python test/systematicsAnalyzer.py data/tutorials/shapes/simple-shapes-TH1.txt > out.html ``` -![systematics analyzer output](images/sysanalyzer.png) + + + + +Nuisance Report + +

    Nuisance Report

    + + + + + + + + + + + + + + + + + + + + + + +
    Nuisance (types)RangeProcessesChannels
    lumi (lnN)1.0001.100 background, signal bin1(1) [+]
    bgnorm (lnN)1.0001.300 background, signal bin1(1) [+]
    + + In case you only have a cut-and-count style card, include the option `--noshape`. From 9f66bd845452f96c3b692c2b599da823f699ae73 Mon Sep 17 00:00:00 2001 From: nckw Date: Sun, 15 Oct 2023 19:46:14 +0100 Subject: [PATCH 63/98] Update settinguptheanalysis.md Fix output --- docs/part2/settinguptheanalysis.md | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/docs/part2/settinguptheanalysis.md b/docs/part2/settinguptheanalysis.md index f3132341ae9..61355fa0122 100644 --- a/docs/part2/settinguptheanalysis.md +++ b/docs/part2/settinguptheanalysis.md @@ -538,13 +538,15 @@ In order to get a quick view of the systematic uncertainties included in the dat The default output is a `.html` file which allows you to expand to give more details about the affect of the systematic for each channel/process. Add the option `--format brief` to give a simpler summary report direct to the terminal. An example output for the tutorial card `data/tutorials/shapes/simple-shapes-TH1.txt` is shown below. ```nohighlight -$ python test/systematicsAnalyzer.py data/tutorials/shapes/simple-shapes-TH1.txt > out.html +$ python test/systematicsAnalyzer.py data/tutorials/shapes/simple-shapes-TH1.txt --all -f html > out.html ``` +which will produce the following output in html format. + @@ -576,6 +578,17 @@ function toggleChann(id) { +
    alpha (shape) +1.1111.150 + background +bin1(1) [+] + + + + +
    bin1background(0.900/1.150 (shape))
    + + bgnorm (lnN) 1.0001.300 background, signal @@ -587,6 +600,17 @@ function toggleChann(id) { +sigma (shape) +1.0001.000 + signal +bin1(1) [+] + + + + +
    bin1signal(1.000/1.000 (shape))
    + + From 3e89502f85c6c363a8583a0a8a004b92b75b248c Mon Sep 17 00:00:00 2001 From: nckw Date: Wed, 18 Oct 2023 17:43:28 +0100 Subject: [PATCH 64/98] Update usefullinks.md Improve formatting of lists --- docs/part4/usefullinks.md | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/docs/part4/usefullinks.md b/docs/part4/usefullinks.md index 3e7c4f446d1..08900587eee 100644 --- a/docs/part4/usefullinks.md +++ b/docs/part4/usefullinks.md @@ -4,25 +4,28 @@ There are several tutorials which have been run over the last few years with instructions and examples for running the combine tool. -* Tutorial Sessions +Tutorial Sessions: + * [1st tutorial 17th Nov 2015](https://indico.cern.ch/event/456547/). * [2nd tutorial 30th Nov 2016](https://indico.cern.ch/event/577649/#b-229590-higgs-combine-tool-mi). - * [3rd tutorial 29th Nov 2017](https://indico.cern.ch/event/677948/#day-2017-11-29) + * [3rd tutorial 29th Nov 2017](https://indico.cern.ch/event/677948/#day-2017-11-29) * [4th tutorial 31st Oct 2018](https://indico.cern.ch/event/747340/overview) - Latest for `81x-root606` branch. * [5th tutorial 2nd-4th Dec 2019](https://indico.cern.ch/event/859454/overview) * [6th tutorial 14th-16th Dec 2020](https://indico.cern.ch/event/976099/overview) - Latest for `102x` branch * [7th tutorial 3rd Feb 2023](https://indico.cern.ch/event/1227742/) - Uses `113x` branch -* Worked examples from Higgs analyses using combine +Worked examples from Higgs analyses using combine: + * [The CMS DAS at CERN 2014](https://twiki.cern.ch/twiki/bin/viewauth/CMS/SWGuideCMSDataAnalysisSchool2014HiggsCombPropertiesExercise) * [The CMS DAS at DESY 2018](https://twiki.cern.ch/twiki/bin/view/CMS/SWGuideCMSDataAnalysisSchoolHamburg2018LongStatisticsExercise) +Higgs combinations procedures -* [Conventions to be used when preparing inputs for Higgs combinations](https://twiki.cern.ch/twiki/bin/view/CMS/HiggsWG/HiggsCombinationConventions) + * [Conventions to be used when preparing inputs for Higgs combinations](https://twiki.cern.ch/twiki/bin/view/CMS/HiggsWG/HiggsCombinationConventions) -* [CMS AN-2011/298](http://cms.cern.ch/iCMS/jsp/db_notes/noteInfo.jsp?cmsnoteid=CMS AN-2011/298) Procedure for the LHC Higgs boson search combination in summer 2011. This describes in more detail some of the methods used in Combine. + * [CMS AN-2011/298](http://cms.cern.ch/iCMS/jsp/db_notes/noteInfo.jsp?cmsnoteid=CMS AN-2011/298) Procedure for the LHC Higgs boson search combination in summer 2011. This describes in more detail some of the methods used in Combine. ### Citations From 9420afe15a948e794ec17157eeab000bafc05812 Mon Sep 17 00:00:00 2001 From: nucleosynthesis Date: Thu, 19 Oct 2023 09:22:37 +0100 Subject: [PATCH 65/98] Avoiding use of "####" where unecessary --- docs/part2/settinguptheanalysis.md | 2 +- docs/part3/commonstatsmethods.md | 6 +++--- docs/part3/nonstandard.md | 2 +- docs/part3/runningthetool.md | 16 ++++++++-------- docs/part5/longexercise.md | 2 +- docs/part5/longexerciseanswers.md | 3 ++- 6 files changed, 16 insertions(+), 15 deletions(-) diff --git a/docs/part2/settinguptheanalysis.md b/docs/part2/settinguptheanalysis.md index 61355fa0122..a326bafdd45 100644 --- a/docs/part2/settinguptheanalysis.md +++ b/docs/part2/settinguptheanalysis.md @@ -383,7 +383,7 @@ name rateParam bin process rootfile:workspacename The name should correspond to the name of the object which is being picked up inside the RooWorkspace. A simple example using the SM XS and BR splines available in HiggsAnalysis/CombinedLimit can be found under [data/tutorials/rate_params/simple_sm_datacard.txt](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/data/tutorials/rate_params/simple_sm_datacard.txt) -#### Extra arguments +### Extra arguments If a parameter is intended to be used and it is *not* a user defined `param` or `rateParam`, it can be picked up by first issuing an `extArgs` directive before this line in the datacard. The syntax for `extArgs` is diff --git a/docs/part3/commonstatsmethods.md b/docs/part3/commonstatsmethods.md index 3ceca849546..c9013ca3cfc 100644 --- a/docs/part3/commonstatsmethods.md +++ b/docs/part3/commonstatsmethods.md @@ -930,7 +930,7 @@ If you suspect your fits/uncertainties are not stable, you may also try to run c For a full list of options use `combine -M MultiDimFit --help` -#### Fitting only some parameters +### Fitting only some parameters If your model contains more than one parameter of interest, you can still decide to fit a smaller number of them, using the option `--parameters` (or `-P`), with a syntax like this: @@ -1023,7 +1023,7 @@ This can sometimes be an issue as Minuit may not know if has successfully conver As in general for `HybridNew`, you can split the task into multiple tasks (grid and/or batch) and then merge the outputs, as described in the [combineTool for job submission](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part3/runningthetool/#combinetool-for-job-submission) section. -### Extracting contours +### Extracting contours from results files As in general for `HybridNew`, you can split the task into multiple tasks (grid and/or batch) and then merge the outputs with `hadd`. You can also refer to the [combineTool for job submission](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part3/runningthetool/#combinetool-for-job-submission) section for submitting the jobs to the grid/batch or if you have more than one parameter of interest, see the instructions for running `HybridNew` on a grid of parameter points on the [CombineHarvest - HybridNewGrid](http://cms-analysis.github.io/CombineHarvester/md_docs__hybrid_new_grid.html) documentation. @@ -1039,7 +1039,7 @@ The output tree will contain the values of the POI which crosses the critical va You can produce a plot of the value of $p_{x}$ vs the parameter of interest $x$ by adding the option `--plot `. -#### 2D contours +#### Extracting 2D contours There is a tool for extracting *2D contours* from the output of `HybridNew` located in `test/makeFCcontour.py` provided the option `--saveHybridResult` was included when running `HybridNew`. It can be run with the usual combine output files (or several of them) as input, diff --git a/docs/part3/nonstandard.md b/docs/part3/nonstandard.md index ec42a7fd4fa..347f7f805a3 100644 --- a/docs/part3/nonstandard.md +++ b/docs/part3/nonstandard.md @@ -343,7 +343,7 @@ The `combine` tool has a number of features for diagnostics and plotting results This can in some cases be achieved by removing a specific datacard when running `combineCards.py` however, when doing so the information of particular nuisances and pdfs in that region will be lost. Instead, it is possible to ***mask*** that channel from the likelihood! This is acheived at the `text2Workspace` step using the option `--channel-masks`. -#### Example: removing constraints from the signal region +### Example: removing constraints from the signal region We will take the control region example from the rate parameters tutorial from [data/tutorials/rate_params/](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/tree/81x-root606/data/tutorials/rate_params). diff --git a/docs/part3/runningthetool.md b/docs/part3/runningthetool.md index a1208a92a61..dad20633347 100644 --- a/docs/part3/runningthetool.md +++ b/docs/part3/runningthetool.md @@ -74,7 +74,7 @@ There are a number of useful command line options which can be used to alter the By default, the dataset used by combine will be the one pointed to in the datacard. You can tell combine to use a different dataset (for example a toy one that you generated) by using the option `--dataset`. The argument should be `rootfile.root:workspace:location` or `rootfile.root:location`. In order to use this option, you must first convert your datacard to a binary workspace and use this binary workspace as the input to the command line. -#### Generic Minimizer Options +### Generic Minimizer Options Combine uses its own minimizer class which is used to steer Minuit (via RooMinimizer) named the `CascadeMinimizer`. This allows for sequential minimization which can help in case a particular setting/algo fails. Also, the `CascadeMinimizer` knows about extra features of Combine such as *discrete* nuisance parameters. @@ -105,7 +105,7 @@ You can find details about these in the Minuit2 documentation [here](https://roo More of these options can be found in the **Cascade Minimizer options** section when running `--help`. -#### Output from combine +### Output from combine Most methods will print the results of the computation to the screen, however, in addition, combine will also produce a root file containing a tree called **limit** with these results. The name of this file will be of the format, @@ -156,7 +156,7 @@ The output file will contain the toys (as `RooDataSets` for the observables, inc The branches that are created by methods like `MultiDimFit` *will not* show the values used to generate the toy. If you also want the TTree to show the values of the POIs used to generate to toy, you should add additional branches using the `--trackParameters` option as described in the [common command line options](#common-command-line-options) section above. These branches will behave as expected when adding the option `--saveToys`. -#### Asimov datasets +### Asimov datasets If you are using wither `-t -1` or using `AsymptoticLimits`, combine will calculate results based on an Asimov dataset. @@ -184,7 +184,7 @@ You can turn off the internal logic by setting `--X-rtd TMCSO_AdaptivePseudoAsim If you set `--X-rtd TMCSO_PseudoAsimov=X` with `X>0` and also turn on `--X-rtd TMCSO_AdaptivePseudoAsimov=`$\beta$, with $\beta>0$, the internal logic will be used but this time the default will be to generate Pseudo-Asimov datasets, rather than the normal Asimov ones. -#### Nuisance parameter generation +### Nuisance parameter generation The default method of dealing with systematics is to generate random values (around their nominal values, see above) for the nuisance parameters, according to their prior pdfs centred around their default values, *before* generating the data. The *unconstrained* nuisance parameters (eg `flatParam` or `rateParam`) or those with *flat* priors are **not** randomised before the data generation. If you wish to also randomise these parameters, you **must** declare these as `flatParam` in your datacard and when running text2workspace you must add the option `--X-assign-flatParam-prior` in the command line. @@ -199,14 +199,14 @@ If you are using `toysFrequentist`, be aware that the values set by `--setParame !!! warning The methods such as `AsymptoticLimits` and `HybridNew --LHCmode LHC-limits`, the "nominal" nuisance parameter values are taken from fits to the data and are therefore not "blind" to the observed data by default (following the fully frequentist paradigm). See the detailed documentation on these methods for avoiding this and running in a completely "blind" mode. -#### Generate only +### Generate only It is also possible to generate the toys first and then feed them to the Methods in combine. This can be done using `-M GenerateOnly --saveToys`. The toys can then be read and used with the other methods by specifying `--toysFile=higgsCombineTest.GenerateOnly...` and using the same options for the toy generation. !!! warning Some Methods also use toys within the method itself (eg `AsymptoticLimits` and `HybridNew`). For these, you should **not** specify the toy generation with `-t` or the options above and instead follow the specific instructions. -#### Loading snapshots +### Loading snapshots Snapshots from workspaces can be loaded and used in order to generate toys using the option `--snapshotName `. This will first set the parameters to the values in the snapshot *before* any other parameter options are set and toys are generated. @@ -265,7 +265,7 @@ Remember, any usual options (such as redefining POIs or freezing parameters) are The option `-n NAME` should be included to avoid overwriting output files as the jobs will be run inside the directory from which the command is issued. -### Running combine jobs on the Grid +### Grid submission with combineTool For more CPU-intensive tasks, for example determining limits for complex models using toys, it is generally not feasible to compute all the results interactively. Instead, these jobs can be submitted to the Grid. @@ -314,7 +314,7 @@ combineTool.py -M HybridNew -d htt_mt.root --LHCmode LHC-limits --singlePoint 0. When the `--dry-run` option is removed each command will be run in sequence. -#### Grid submission +### Grid submission with crab3 Submission to the grid with `crab3` works in a similar way. Before doing so ensure that the `crab3` environment has been sourced in addition to the CMSSW environment. We will use the example of generating a grid of test-statistic distributions for limits. diff --git a/docs/part5/longexercise.md b/docs/part5/longexercise.md index 30f42c5015c..0f02c08c612 100644 --- a/docs/part5/longexercise.md +++ b/docs/part5/longexercise.md @@ -153,8 +153,8 @@ This produces a new ROOT file `cls_qmu_distributions.root` containing the plots, ```shell python3 printTestStatPlots.py cls_qmu_distributions.root ``` +### Advanced section: B: Asymptotic approximation limitations -#### Advanced exercises These distributions can be useful in understanding features in the CLs limits, especially in the low statistics regime. To explore this, try reducing the observed and expected yields in the datacard by a factor of 10, and rerun the above steps to compare the observed and expected limits with the asymptotic approach, and plot the test statistic distributions. **Tasks and questions:** diff --git a/docs/part5/longexerciseanswers.md b/docs/part5/longexerciseanswers.md index 859c8e1dd90..1a16c1a0b01 100644 --- a/docs/part5/longexerciseanswers.md +++ b/docs/part5/longexerciseanswers.md @@ -49,7 +49,8 @@ -#### Advanced exercises +### Advanced section: B: Asymptotic approximation limitations + **Tasks and questions:** - Is the asymptotic limit still a good approximation? From a6c8071790aa841d2f88815061eb796296248246 Mon Sep 17 00:00:00 2001 From: Nick Wardle Date: Thu, 26 Oct 2023 11:56:48 +0200 Subject: [PATCH 66/98] Moving toy hgg into tutorials area --- {test => data/tutorials}/multiDim/toy-hgg-125.txt | 0 docs/part3/commonstatsmethods.md | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) rename {test => data/tutorials}/multiDim/toy-hgg-125.txt (100%) diff --git a/test/multiDim/toy-hgg-125.txt b/data/tutorials/multiDim/toy-hgg-125.txt similarity index 100% rename from test/multiDim/toy-hgg-125.txt rename to data/tutorials/multiDim/toy-hgg-125.txt diff --git a/docs/part3/commonstatsmethods.md b/docs/part3/commonstatsmethods.md index c9013ca3cfc..059b2f4bc87 100644 --- a/docs/part3/commonstatsmethods.md +++ b/docs/part3/commonstatsmethods.md @@ -295,9 +295,9 @@ For more heavy methods (eg the `MarkovChainMC`) you'll probably want to split th The `MarkovChainMC` method allows the user to produce the posterior pdf as a function of (in principle) any number of parameter of interest. In order to do so, you first need to create a workspace with more than one parameter, as explained in the [physics models](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part2/physicsmodels/) section. -For example, lets use the toy datacard [test/multiDim/toy-hgg-125.txt](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/test/multiDim/toy-hgg-125.txt) (counting experiment which vaguely resembles the H→γγ analysis at 125 GeV) and convert the datacard into a workspace with 2 parameters, ggH and qqH cross sections using `text2workspace`. +For example, lets use the toy datacard [data/tutorials/multiDim/toy-hgg-125.txt](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/data/tutorials/multiDim/toy-hgg-125.txt) (counting experiment which vaguely resembles the H→γγ analysis at 125 GeV) and convert the datacard into a workspace with 2 parameters, ggH and qqH cross sections using `text2workspace`. - text2workspace.py test/multiDim/toy-hgg-125.txt -P HiggsAnalysis.CombinedLimit.PhysicsModel:floatingXSHiggs --PO modes=ggH,qqH -o workspace.root + text2workspace.py data/tutorials/multiDim/toy-hgg-125.txt -P HiggsAnalysis.CombinedLimit.PhysicsModel:floatingXSHiggs --PO modes=ggH,qqH -o workspace.root Now we just run one (or more) MCMC chain(s) and save them in the output tree.By default, the nuisance parameters will be marginalized (integrated) over their pdfs. You can ignore the complaints about not being able to compute an upper limit (since for more than 1D, this isn't well defined), @@ -814,7 +814,7 @@ The macro [cccPlot.cxx](https://github.com/cms-analysis/HiggsAnalysis-CombinedLi The `MultiDimFit` method can do multi-dimensional fits and likelihood based scans/contours using models with several parameters of interest. -Taking a toy datacard [test/multiDim/toy-hgg-125.txt](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/test/multiDim/toy-hgg-125.txt) (counting experiment which vaguely resembles the H→γγ analysis at 125 GeV), we need to convert the datacard into a workspace with 2 parameters, ggH and qqH cross sections +Taking a toy datacard [data/tutorials/multiDim/toy-hgg-125.txt](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/data/tutorials/multiDim/toy-hgg-125.txt) (counting experiment which vaguely resembles the H→γγ analysis at 125 GeV), we need to convert the datacard into a workspace with 2 parameters, ggH and qqH cross sections ```sh text2workspace.py toy-hgg-125.txt -m 125 -P HiggsAnalysis.CombinedLimit.PhysicsModel:floatingXSHiggs --PO modes=ggH,qqH From e80071c3b0d349e11d4d506d5bd810a3f84b4901 Mon Sep 17 00:00:00 2001 From: Nick Smith Date: Fri, 27 Oct 2023 14:42:28 -0500 Subject: [PATCH 67/98] Actually run test --- .github/workflows/ci.yml | 5 +++++ test/test_interference.py | 6 ++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index be3abdaab78..ed2078efb5a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -65,3 +65,8 @@ jobs: run: | cd HiggsAnalysis/CombinedLimit make CONDA=1 -j 2 + - name: Run tests + shell: bash -l {0} + run: | + cd HiggsAnalysis/CombinedLimit/test + python test_interference.py diff --git a/test/test_interference.py b/test/test_interference.py index 725bdd676d0..9712293cfd2 100755 --- a/test/test_interference.py +++ b/test/test_interference.py @@ -144,7 +144,8 @@ def to_TH1(name, array): "POIs=kl[1,0,2]:kv[1,0,2]:k2v[1,0,2]", ] -subprocess.call(t2wcmd) +ret = subprocess.call(t2wcmd) +assert ret == 0 fws = ROOT.TFile.Open("card.root") w = fws.Get("w") @@ -167,4 +168,5 @@ def setvars(x, kl, kv, k2v): setvars(2, 1.1, 0.9, 1.3) assert abs(func.getVal() - 4.372110974178483) < 1e-14, func.getVal() -subprocess.call("combine -M MultiDimFit card.root -t 100".split(" ")) +ret = subprocess.call("combine -M MultiDimFit card.root -t 100".split(" ")) +assert ret == 0 From 3e25193bffb3607785a82984b8b554b0ebb13c81 Mon Sep 17 00:00:00 2001 From: Nick Smith Date: Tue, 31 Oct 2023 16:55:40 -0500 Subject: [PATCH 68/98] Implement external morph for CMSHistSum as well --- interface/CMSHistSum.h | 10 +++++++- python/InterferenceModels.py | 23 ++++++++++++----- src/CMSHistFunc.cc | 4 +-- src/CMSHistSum.cc | 49 ++++++++++++++++++++++++++++++++++-- test/test_interference.py | 28 ++++++++++++++++++++- 5 files changed, 102 insertions(+), 12 deletions(-) diff --git a/interface/CMSHistSum.h b/interface/CMSHistSum.h index 4fe3e375ac9..791f737431a 100644 --- a/interface/CMSHistSum.h +++ b/interface/CMSHistSum.h @@ -73,9 +73,14 @@ class CMSHistSum : public RooAbsReal { RooArgList const& coefList() const { return coeffpars_; } // RooArgList const& funcList() const { return funcs_; } + RooAbsReal const& getXVar() const { return x_.arg(); } + static void EnableFastVertical(); friend class CMSHistV; + // TODO: allow any class that implements hasChanged() and batchGetBinValues() + void injectExternalMorph(int idx, CMSInterferenceFunc& morph); + protected: RooRealProxy x_; @@ -128,6 +133,9 @@ class CMSHistSum : public RooAbsReal { mutable int fast_mode_; //! not to be serialized static bool enable_fast_vertical_; //! not to be serialized + RooListProxy external_morphs_; + std::vector external_morph_indices_; + inline int& morphField(int const& ip, int const& iv) { return vmorph_fields_[ip * n_morphs_ + iv]; } @@ -143,7 +151,7 @@ class CMSHistSum : public RooAbsReal { private: - ClassDef(CMSHistSum,1) + ClassDef(CMSHistSum,2) }; #endif diff --git a/python/InterferenceModels.py b/python/InterferenceModels.py index 9726da3edfd..88064370bde 100644 --- a/python/InterferenceModels.py +++ b/python/InterferenceModels.py @@ -139,13 +139,15 @@ def done(self): # if there are no systematics, it ends up with a different name? hfname = "shapeSig_{process}_{channel}_rebinPdf".format(channel=channel, process=process) histfunc = self.modelBuilder.out.function(hfname) + if not histfunc: + # assume this is a CMSHistSum workspace + hfname = f"prop_bin{channel}" + histfunc = self.modelBuilder.out.function(hfname) # TODO: support FastVerticalInterpHistPdf2 - if not isinstance(histfunc, ROOT.CMSHistFunc): - self.modelBuilder.out.Print("v") + if not isinstance(histfunc, (ROOT.CMSHistFunc, ROOT.CMSHistSum)): raise RuntimeError( - "Could not locate the CMSHistFunc for {string}.\nNote that CMSInterferenceFunc currently only supports workspaces that use CMSHistFunc".format( - string=string - ) + "Could not locate the CMSHistFunc or CMSHistSum for {string}.\n".format(string=string) + + "Note that CMSInterferenceFunc currently only supports workspaces that use these classes" ) funcname = hfname + "_externalMorph" @@ -164,7 +166,16 @@ def done(self): self.modelBuilder.out.safe_import(ROOT.CMSInterferenceFunc(funcname, "", histfunc.getXVar(), params, edges, scaling_array)) func = self.modelBuilder.out.function(funcname) - histfunc.injectExternalMorph(func) + if isinstance(histfunc, ROOT.CMSHistFunc): + histfunc.injectExternalMorph(func) + elif isinstance(histfunc, ROOT.CMSHistSum): + coefname = "n_exp_final_bin{channel}_proc_{process}".format(channel=channel, process=process) + for idx, coef in enumerate(histfunc.coefList()): + if coef.GetName() == coefname: + if self.verbose: + print("Injecting external morph for " + coefname) + histfunc.injectExternalMorph(idx, func) + break interferenceModel = InterferenceModel() diff --git a/src/CMSHistFunc.cc b/src/CMSHistFunc.cc index a05a5c1854f..2ef5504f082 100644 --- a/src/CMSHistFunc.cc +++ b/src/CMSHistFunc.cc @@ -323,7 +323,7 @@ void CMSHistFunc::updateCache() const { if (mcache_.size() == 0) mcache_.resize(storage_.size()); } - bool external_morph_updated = (external_morph_.getSize() && dynamic_cast(external_morph_.at(0))->hasChanged()); + bool external_morph_updated = (external_morph_.getSize() && static_cast(external_morph_.at(0))->hasChanged()); if (step1 || external_morph_updated) { fast_vertical_ = false; } @@ -567,7 +567,7 @@ void CMSHistFunc::updateCache() const { std::cout << "Template before external morph update:" << mcache_[idx].step2.Integral() << "\n"; mcache_[idx].step2.Dump(); #endif - auto& extdata = dynamic_cast(external_morph_.at(0))->batchGetBinValues(); + auto& extdata = static_cast(external_morph_.at(0))->batchGetBinValues(); for(size_t i=0; igetParameters({*x_}); + sentry_.addVars(*deps); + delete deps; + } + sentry_.setValueDirty(); binsentry_.setValueDirty(); @@ -250,6 +260,16 @@ void CMSHistSum::initialize() const { } void CMSHistSum::updateMorphs() const { + // set up pointers ahead of time for quick loop + std::vector process_morphs(compcache_.size(), nullptr); + // if any external morphs are dirty, disable fast_mode_ + for(size_t i=0; i < external_morph_indices_.size(); ++i) { + auto* morph = static_cast(external_morphs_.at(i)); + process_morphs[external_morph_indices_[i]] = morph; + if (morph->hasChanged()) { + fast_mode_ = 0; + } + } // If we're not in fast mode, need to reset all the compcache_ #if HFVERBOSE > 0 std::cout << "fast_mode_ = " << fast_mode_ << std::endl; @@ -257,6 +277,12 @@ void CMSHistSum::updateMorphs() const { for (unsigned ip = 0; ip < compcache_.size(); ++ip) { if (fast_mode_ == 0) { compcache_[ip].CopyValues(storage_[process_fields_[ip]]); + if ( process_morphs[ip] != nullptr ) { + auto& extdata = process_morphs[ip]->batchGetBinValues(); + for(size_t ibin=0; ibin= coeffpars_.getSize() ) { + throw std::runtime_error("Process index larger than number of processes in CMSHistSum"); + } + if ( morph.batchGetBinValues().size() != cache_.size() ) { + throw std::runtime_error("Mismatched binning between external morph and CMSHistSum"); + // equal edges are user responsibility for now + } + + for (auto other_idx : external_morph_indices_) { + if ( idx == other_idx ) { + external_morphs_.replace(external_morphs_[idx], morph); + return; + } + } + external_morph_indices_.push_back(idx); + external_morphs_.add(morph); +} + #undef HFVERBOSE diff --git a/test/test_interference.py b/test/test_interference.py index 9712293cfd2..1cb146909c5 100755 --- a/test/test_interference.py +++ b/test/test_interference.py @@ -147,6 +147,10 @@ def to_TH1(name, array): ret = subprocess.call(t2wcmd) assert ret == 0 +histsum_args = ["--for-fits", "--no-wrappers", "--use-histsum", "-o", "card_histsum.root"] +ret = subprocess.call(t2wcmd + histsum_args) +assert ret == 0 + fws = ROOT.TFile.Open("card.root") w = fws.Get("w") @@ -168,5 +172,27 @@ def setvars(x, kl, kv, k2v): setvars(2, 1.1, 0.9, 1.3) assert abs(func.getVal() - 4.372110974178483) < 1e-14, func.getVal() -ret = subprocess.call("combine -M MultiDimFit card.root -t 100".split(" ")) +# toy generation is different between the histsum and histfunc models, somehow +ntoys = 10 +ret = subprocess.call(f"combine -M GenerateOnly card.root -t {ntoys} --saveToys".split(" ")) assert ret == 0 + +ret = subprocess.call(f"combine -M MultiDimFit card.root -t {ntoys} --toysFile higgsCombineTest.GenerateOnly.mH120.123456.root -n HistFunc".split(" ")) +assert ret == 0 + +ret = subprocess.call(f"combine -M MultiDimFit card_histsum.root -t {ntoys} --toysFile higgsCombineTest.GenerateOnly.mH120.123456.root -n HistSum".split(" ")) +assert ret == 0 + +f_histfunc = ROOT.TFile.Open("higgsCombineHistFunc.MultiDimFit.mH120.123456.root") +f_histsum = ROOT.TFile.Open("higgsCombineHistSum.MultiDimFit.mH120.123456.root") + +ndiff = {"kl": 0, "kv": 0, "k2v": 0} +for row1, row2 in zip(f_histfunc.Get("limit"), f_histsum.Get("limit")): + if abs(row1.kl - row2.kl) > 1e-4: + ndiff["kl"] += 1 + if abs(row1.kv - row2.kv) > 1e-4: + ndiff["kv"] += 1 + if abs(row1.k2v - row2.k2v) > 1e-4: + ndiff["k2v"] += 1 + +print(f"Out of {ntoys} toys, {ndiff} are not matching (tolerance: 1e-4) between CMSHistFunc and CMSHistSum") From 6123b595e93f67b62cf815d0ff1b5548d9cb38e8 Mon Sep 17 00:00:00 2001 From: Nick Smith Date: Tue, 31 Oct 2023 22:12:39 -0500 Subject: [PATCH 69/98] Refactor CMSInterferenceFunc to use base class CMSExternalMorph This should make extending external morphs, e.g. to replace RooParametricHist, much simpler. --- interface/CMSExternalMorph.h | 45 +++++++++++++++++++++++++++++++++ interface/CMSHistFunc.h | 5 ++-- interface/CMSHistSum.h | 3 +-- interface/CMSInterferenceFunc.h | 20 +++++---------- python/InterferenceModels.py | 2 +- src/CMSExternalMorph.cc | 33 ++++++++++++++++++++++++ src/CMSHistFunc.cc | 6 ++--- src/CMSHistSum.cc | 6 ++--- src/CMSInterferenceFunc.cxx | 29 +++++++-------------- src/classes.h | 1 + src/classes_def.xml | 1 + test/test_interference.py | 12 ++++++--- 12 files changed, 113 insertions(+), 50 deletions(-) create mode 100644 interface/CMSExternalMorph.h create mode 100644 src/CMSExternalMorph.cc diff --git a/interface/CMSExternalMorph.h b/interface/CMSExternalMorph.h new file mode 100644 index 00000000000..8889a6e792c --- /dev/null +++ b/interface/CMSExternalMorph.h @@ -0,0 +1,45 @@ +#ifndef CMSExternalMorph_h +#define CMSExternalMorph_h +#include + +#include "RooAbsReal.h" +#include "RooRealVar.h" +#include "RooRealProxy.h" + +class CMSExternalMorph : public RooAbsReal { + public: + CMSExternalMorph(); + /* + * All subclasses need to provide an edges array of length nbins+1 + * of the observable (x) + * TODO: CMSHistFunc and CMSHistSum do not check the binning is compatible + * with their binning other than having the correct length + */ + CMSExternalMorph( + const char* name, + const char* title, + RooRealVar& x, + const std::vector& edges + ); + CMSExternalMorph(CMSExternalMorph const& other, const char* name = 0); + virtual ~CMSExternalMorph(); + + /* Batch accessor for CMSHistFunc / CMSHistSum, to be overriden by concrete + * implementations. hasChanged() should indicate whether or not + * batchGetBinValues() would return a new vector, given the state of + * any dependent variables. + */ + virtual bool hasChanged() const = 0; + virtual const std::vector& batchGetBinValues() const = 0; + + protected: + RooRealProxy x_; + std::vector edges_; + + double evaluate() const; + + private: + ClassDef(CMSExternalMorph, 1) +}; + +#endif // CMSExternalMorph_h diff --git a/interface/CMSHistFunc.h b/interface/CMSHistFunc.h index 2c8ee8b509a..28d0b5c6d86 100644 --- a/interface/CMSHistFunc.h +++ b/interface/CMSHistFunc.h @@ -15,7 +15,7 @@ #include "CMSHistV.h" #include "FastTemplate_Old.h" #include "SimpleCacheSentry.h" -#include "CMSInterferenceFunc.h" +#include "CMSExternalMorph.h" class CMSHistFuncWrapper; @@ -149,8 +149,7 @@ class CMSHistFunc : public RooAbsReal { friend class CMSHistV; friend class CMSHistSum; - // TODO: allow any class that implements hasChanged() and batchGetBinValues() - void injectExternalMorph(CMSInterferenceFunc& morph); + void injectExternalMorph(CMSExternalMorph& morph); /* – RooAbsArg::setVerboseEval(Int_t level) • Level 0 – No messages diff --git a/interface/CMSHistSum.h b/interface/CMSHistSum.h index 791f737431a..23b39c95635 100644 --- a/interface/CMSHistSum.h +++ b/interface/CMSHistSum.h @@ -78,8 +78,7 @@ class CMSHistSum : public RooAbsReal { static void EnableFastVertical(); friend class CMSHistV; - // TODO: allow any class that implements hasChanged() and batchGetBinValues() - void injectExternalMorph(int idx, CMSInterferenceFunc& morph); + void injectExternalMorph(int idx, CMSExternalMorph& morph); protected: RooRealProxy x_; diff --git a/interface/CMSInterferenceFunc.h b/interface/CMSInterferenceFunc.h index 1cf7262418d..14be41fcca2 100644 --- a/interface/CMSInterferenceFunc.h +++ b/interface/CMSInterferenceFunc.h @@ -1,16 +1,13 @@ #ifndef CMSInterferenceFunc_h #define CMSInterferenceFunc_h -#include - -#include "RooAbsReal.h" -#include "RooRealVar.h" -#include "RooRealProxy.h" #include "RooListProxy.h" #include "SimpleCacheSentry.h" +#include "CMSExternalMorph.h" + class _InterferenceEval; -class CMSInterferenceFunc : public RooAbsReal { +class CMSInterferenceFunc : public CMSExternalMorph { public: CMSInterferenceFunc(); CMSInterferenceFunc(CMSInterferenceFunc const& other, const char* name = 0); @@ -24,8 +21,8 @@ class CMSInterferenceFunc : public RooAbsReal { const char* name, const char* title, RooRealVar& x, - const RooArgList& coefficients, const std::vector& edges, + const RooArgList& coefficients, const std::vector> binscaling ); virtual ~CMSInterferenceFunc(); @@ -38,21 +35,16 @@ class CMSInterferenceFunc : public RooAbsReal { std::ostream& os, Int_t contents, Bool_t verbose, TString indent ) const override; - // batch accessor for CMSHistFunc / CMSHistSum - bool hasChanged() const { return !sentry_.good(); }; - const std::vector& batchGetBinValues() const; + bool hasChanged() const override { return !sentry_.good(); }; + const std::vector& batchGetBinValues() const override; protected: - RooRealProxy x_; RooListProxy coefficients_; - std::vector edges_; std::vector> binscaling_; mutable SimpleCacheSentry sentry_; //! mutable std::unique_ptr<_InterferenceEval> evaluator_; //! - double evaluate() const override; - private: void initialize() const; void updateCache() const; diff --git a/python/InterferenceModels.py b/python/InterferenceModels.py index 88064370bde..ca70a1e5499 100644 --- a/python/InterferenceModels.py +++ b/python/InterferenceModels.py @@ -164,7 +164,7 @@ def done(self): for sbin in item["scaling"]: scaling_array.push_back(sbin) - self.modelBuilder.out.safe_import(ROOT.CMSInterferenceFunc(funcname, "", histfunc.getXVar(), params, edges, scaling_array)) + self.modelBuilder.out.safe_import(ROOT.CMSInterferenceFunc(funcname, "", histfunc.getXVar(), edges, params, scaling_array)) func = self.modelBuilder.out.function(funcname) if isinstance(histfunc, ROOT.CMSHistFunc): histfunc.injectExternalMorph(func) diff --git a/src/CMSExternalMorph.cc b/src/CMSExternalMorph.cc new file mode 100644 index 00000000000..95e7d25d10e --- /dev/null +++ b/src/CMSExternalMorph.cc @@ -0,0 +1,33 @@ +#include "../interface/CMSExternalMorph.h" + +CMSExternalMorph::CMSExternalMorph() {} + +CMSExternalMorph::CMSExternalMorph( + const char* name, + const char* title, + RooRealVar& x, + const std::vector& edges + ) : + RooAbsReal(name, title), + x_("x", "", this, x), + edges_(edges) +{ +} + +CMSExternalMorph::CMSExternalMorph(CMSExternalMorph const& other, const char* name) : + RooAbsReal(other, name), + x_("x", this, other.x_), + edges_(other.edges_) +{ +} + +CMSExternalMorph::~CMSExternalMorph() = default; + +double CMSExternalMorph::evaluate() const { + auto it = std::upper_bound(std::begin(edges_), std::end(edges_), x_->getVal()); + if ( (it == std::begin(edges_)) or (it == std::end(edges_)) ) { + return 0.0; + } + size_t idx = std::distance(std::begin(edges_), it) - 1; + return batchGetBinValues()[idx]; +} diff --git a/src/CMSHistFunc.cc b/src/CMSHistFunc.cc index 2ef5504f082..045f802e278 100644 --- a/src/CMSHistFunc.cc +++ b/src/CMSHistFunc.cc @@ -323,7 +323,7 @@ void CMSHistFunc::updateCache() const { if (mcache_.size() == 0) mcache_.resize(storage_.size()); } - bool external_morph_updated = (external_morph_.getSize() && static_cast(external_morph_.at(0))->hasChanged()); + bool external_morph_updated = (external_morph_.getSize() && static_cast(external_morph_.at(0))->hasChanged()); if (step1 || external_morph_updated) { fast_vertical_ = false; } @@ -567,7 +567,7 @@ void CMSHistFunc::updateCache() const { std::cout << "Template before external morph update:" << mcache_[idx].step2.Integral() << "\n"; mcache_[idx].step2.Dump(); #endif - auto& extdata = static_cast(external_morph_.at(0))->batchGetBinValues(); + auto& extdata = static_cast(external_morph_.at(0))->batchGetBinValues(); for(size_t i=0; i process_morphs(compcache_.size(), nullptr); + std::vector process_morphs(compcache_.size(), nullptr); // if any external morphs are dirty, disable fast_mode_ for(size_t i=0; i < external_morph_indices_.size(); ++i) { - auto* morph = static_cast(external_morphs_.at(i)); + auto* morph = static_cast(external_morphs_.at(i)); process_morphs[external_morph_indices_[i]] = morph; if (morph->hasChanged()) { fast_mode_ = 0; @@ -780,7 +780,7 @@ void CMSHistSum::EnableFastVertical() { enable_fast_vertical_ = true; } -void CMSHistSum::injectExternalMorph(int idx, CMSInterferenceFunc& morph) { +void CMSHistSum::injectExternalMorph(int idx, CMSExternalMorph& morph) { if ( idx >= coeffpars_.getSize() ) { throw std::runtime_error("Process index larger than number of processes in CMSHistSum"); } diff --git a/src/CMSInterferenceFunc.cxx b/src/CMSInterferenceFunc.cxx index 34e96097103..e0ecc8e056f 100644 --- a/src/CMSInterferenceFunc.cxx +++ b/src/CMSInterferenceFunc.cxx @@ -39,21 +39,24 @@ CMSInterferenceFunc::CMSInterferenceFunc() {}; CMSInterferenceFunc::CMSInterferenceFunc( CMSInterferenceFunc const& other, const char* name ) : - RooAbsReal(other, name), x_("x", this, other.x_), + CMSExternalMorph(other, name), coefficients_("coefficients", this, other.coefficients_), - edges_(other.edges_), binscaling_(other.binscaling_), + binscaling_(other.binscaling_), sentry_(name ? TString(name) + "_sentry" : TString(other.GetName())+"_sentry", "") { } CMSInterferenceFunc::CMSInterferenceFunc( - const char* name, const char* title, RooRealVar& x, - RooArgList const& coefficients, const std::vector& edges, + const char* name, + const char* title, + RooRealVar& x, + const std::vector& edges, + RooArgList const& coefficients, const std::vector> binscaling ) : - RooAbsReal(name, title), x_("x", "", this, x), + CMSExternalMorph(name, title, x, edges), coefficients_("coefficients", "", this), - edges_(edges), binscaling_(binscaling), + binscaling_(binscaling), sentry_(TString(name) + "_sentry", "") { coefficients_.add(coefficients); @@ -117,21 +120,7 @@ void CMSInterferenceFunc::updateCache() const { sentry_.reset(); } -double CMSInterferenceFunc::evaluate() const { - if ( not evaluator_ ) initialize(); - if ( not sentry_.good() ) updateCache(); - - auto it = std::upper_bound(std::begin(edges_), std::end(edges_), x_->getVal()); - if ( (it == std::begin(edges_)) or (it == std::end(edges_)) ) { - return 0.0; - } - size_t idx = std::distance(std::begin(edges_), it) - 1; - return evaluator_->getValues()[idx]; -} - const std::vector& CMSInterferenceFunc::batchGetBinValues() const { - // we don't really expect the cache to be valid, as upstream callers are - // managing their own and calling this only when dirty, but let's check anyway if ( not evaluator_ ) initialize(); if ( not sentry_.good() ) updateCache(); return evaluator_->getValues(); diff --git a/src/classes.h b/src/classes.h index dfd8e1d38d8..867ffeee1c9 100644 --- a/src/classes.h +++ b/src/classes.h @@ -66,5 +66,6 @@ #include "HiggsAnalysis/CombinedLimit/interface/RooCheapProduct.h" #include "HiggsAnalysis/CombinedLimit/interface/CMSHggFormula.h" #include "HiggsAnalysis/CombinedLimit/interface/SimpleProdPdf.h" +#include "HiggsAnalysis/CombinedLimit/interface/CMSExternalMorph.h" #include "HiggsAnalysis/CombinedLimit/interface/CMSInterferenceFunc.h" #include "HiggsAnalysis/CombinedLimit/interface/RooEFTScalingFunction.h" diff --git a/src/classes_def.xml b/src/classes_def.xml index da5e4d7fbcd..3bf3eb4f689 100644 --- a/src/classes_def.xml +++ b/src/classes_def.xml @@ -222,6 +222,7 @@ + diff --git a/test/test_interference.py b/test/test_interference.py index 1cb146909c5..a97e2414093 100755 --- a/test/test_interference.py +++ b/test/test_interference.py @@ -174,13 +174,17 @@ def setvars(x, kl, kv, k2v): # toy generation is different between the histsum and histfunc models, somehow ntoys = 10 -ret = subprocess.call(f"combine -M GenerateOnly card.root -t {ntoys} --saveToys".split(" ")) +ret = subprocess.call("combine -M GenerateOnly card.root -t {ntoys} --saveToys".format(ntoys=ntoys).split(" ")) assert ret == 0 -ret = subprocess.call(f"combine -M MultiDimFit card.root -t {ntoys} --toysFile higgsCombineTest.GenerateOnly.mH120.123456.root -n HistFunc".split(" ")) +ret = subprocess.call( + "combine -M MultiDimFit card.root -t {ntoys} --toysFile higgsCombineTest.GenerateOnly.mH120.123456.root -n HistFunc".format(ntoys=ntoys).split(" ") +) assert ret == 0 -ret = subprocess.call(f"combine -M MultiDimFit card_histsum.root -t {ntoys} --toysFile higgsCombineTest.GenerateOnly.mH120.123456.root -n HistSum".split(" ")) +ret = subprocess.call( + "combine -M MultiDimFit card_histsum.root -t {ntoys} --toysFile higgsCombineTest.GenerateOnly.mH120.123456.root -n HistSum".format(ntoys=ntoys).split(" ") +) assert ret == 0 f_histfunc = ROOT.TFile.Open("higgsCombineHistFunc.MultiDimFit.mH120.123456.root") @@ -195,4 +199,4 @@ def setvars(x, kl, kv, k2v): if abs(row1.k2v - row2.k2v) > 1e-4: ndiff["k2v"] += 1 -print(f"Out of {ntoys} toys, {ndiff} are not matching (tolerance: 1e-4) between CMSHistFunc and CMSHistSum") +print("Out of {ntoys} toys, {ndiff} are not matching (tolerance: 1e-4) between CMSHistFunc and CMSHistSum".format(ntoys=ntoys, ndiff=ndiff)) From 88579163116abf444c53526ff4b062e9073c0ce0 Mon Sep 17 00:00:00 2001 From: Nick Smith Date: Tue, 31 Oct 2023 22:33:31 -0500 Subject: [PATCH 70/98] Only run tests in python3 --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7c52b9c0409..81a571f14a0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -66,6 +66,7 @@ jobs: cd HiggsAnalysis/CombinedLimit make CONDA=1 -j 2 - name: Run tests + if: startsWith(matrix.python, '3.') shell: bash -l {0} run: | cd HiggsAnalysis/CombinedLimit/test From 7be2d156446421a3bbafe2cce6913c27ab07ff75 Mon Sep 17 00:00:00 2001 From: nckw Date: Wed, 1 Nov 2023 09:20:59 +0000 Subject: [PATCH 71/98] Update settinguptheanalysis.md Fix error in warning box --- docs/part2/settinguptheanalysis.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/part2/settinguptheanalysis.md b/docs/part2/settinguptheanalysis.md index a326bafdd45..48cc5a46d64 100644 --- a/docs/part2/settinguptheanalysis.md +++ b/docs/part2/settinguptheanalysis.md @@ -206,7 +206,7 @@ or just attach a postifx to the name of the histogram `shapes * * shapes.root $CHANNEL/$PROCESS $CHANNEL/$PROCESS_$SYSTEMATIC` !!! warning - If you have a nuisance parameter which has shape effects (using `shape`) *and* rate effects (using `lnN`) you should use a single line for the systemstic uncertainty with `shape?`. This will tell combine to fist look for Up/Down systematic templates for that process and if it doesnt find them, it will interpret the number that you put for the process as a `lnN` instead. + If you have a nuisance parameter which has shape effects (using `shape`) *and* rate effects (using `lnN`) you should use a single line for the systemstic uncertainty with `shape?`. This will tell combine to fist look for Up/Down systematic templates for that process and if it doesnt find them, it will interpret the number that you put for the process as a `lnN` instead. For a detailed example of a template based binned analysis see the [H→ττ 2014 DAS tutorial](https://twiki.cern.ch/twiki/bin/viewauth/CMS/SWGuideCMSDataAnalysisSchool2014HiggsCombPropertiesExercise#A_shape_analysis_using_templates) From 334e052dc792f14b5053170e595156534679a300 Mon Sep 17 00:00:00 2001 From: Nick Smith Date: Wed, 1 Nov 2023 12:03:47 -0500 Subject: [PATCH 72/98] Remove f-string --- python/InterferenceModels.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/InterferenceModels.py b/python/InterferenceModels.py index ca70a1e5499..c7af8204730 100644 --- a/python/InterferenceModels.py +++ b/python/InterferenceModels.py @@ -141,7 +141,7 @@ def done(self): histfunc = self.modelBuilder.out.function(hfname) if not histfunc: # assume this is a CMSHistSum workspace - hfname = f"prop_bin{channel}" + hfname = "prop_bin{channel}".format(channel=channel) histfunc = self.modelBuilder.out.function(hfname) # TODO: support FastVerticalInterpHistPdf2 if not isinstance(histfunc, (ROOT.CMSHistFunc, ROOT.CMSHistSum)): From 484a45ec16ab10371056433506c4600d943ac966 Mon Sep 17 00:00:00 2001 From: Nick Smith Date: Wed, 1 Nov 2023 12:22:01 -0500 Subject: [PATCH 73/98] Unique external morph name --- python/InterferenceModels.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/python/InterferenceModels.py b/python/InterferenceModels.py index c7af8204730..cfbf8221f7e 100644 --- a/python/InterferenceModels.py +++ b/python/InterferenceModels.py @@ -141,8 +141,11 @@ def done(self): histfunc = self.modelBuilder.out.function(hfname) if not histfunc: # assume this is a CMSHistSum workspace - hfname = "prop_bin{channel}".format(channel=channel) - histfunc = self.modelBuilder.out.function(hfname) + histsum_name = "prop_bin{channel}".format(channel=channel) + histfunc = self.modelBuilder.out.function(histsum_name) + # in this workspace there is no object representing the process morphing + # make one up so that funcname is still unique + hfname = "prop_bin{channel}_process{process}".format(channel=channel, process=process) # TODO: support FastVerticalInterpHistPdf2 if not isinstance(histfunc, (ROOT.CMSHistFunc, ROOT.CMSHistSum)): raise RuntimeError( From 6ca71960a4aa13eea4c537fc9bc5f358df8c9e92 Mon Sep 17 00:00:00 2001 From: Nick Smith Date: Thu, 2 Nov 2023 13:43:42 -0500 Subject: [PATCH 74/98] Sometimes coefficient has a different name --- python/InterferenceModels.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/python/InterferenceModels.py b/python/InterferenceModels.py index cfbf8221f7e..16d6ba3bcfe 100644 --- a/python/InterferenceModels.py +++ b/python/InterferenceModels.py @@ -172,11 +172,11 @@ def done(self): if isinstance(histfunc, ROOT.CMSHistFunc): histfunc.injectExternalMorph(func) elif isinstance(histfunc, ROOT.CMSHistSum): - coefname = "n_exp_final_bin{channel}_proc_{process}".format(channel=channel, process=process) + postfix = "bin{channel}_proc_{process}".format(channel=channel, process=process) for idx, coef in enumerate(histfunc.coefList()): - if coef.GetName() == coefname: + if coef.GetName() in ("n_exp_" + postfix, "n_exp_final_" + postfix): if self.verbose: - print("Injecting external morph for " + coefname) + print("Injecting external morph for " + funcname) histfunc.injectExternalMorph(idx, func) break From ca9df6cc0089975eea7b4b652a40c45231bd409b Mon Sep 17 00:00:00 2001 From: Jonas Rembser Date: Wed, 2 Aug 2023 19:32:19 +0200 Subject: [PATCH 75/98] Fix errors and warnings with C++20 in `FastTemplate.h` MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The destructor and assignment operators are not allowed to include template specializations in C++20. They were not needed anyway, because the class itself is templated. Also, generalize the assignment operators to take `TH1` and check for the dimension at runtime. This is necessary to avoid other compiler warnings, such as: ``` interface/FastTemplate.h:123:34: warning: ‘FastTemplate_t& FastTemplate_t::operator=(const TH1&) [with T = double]’ was hidden [-Woverloaded-virtual=] 123 | virtual FastTemplate_t & operator=(const TH1 &other) { | ^~~~~~~~ interface/FastTemplate.h:284:24: note: by ‘FastHisto2D_t::operator=’ 284 | FastHisto2D_t& operator=(const TH2 &other) { ``` That is a very valid warning! `FastHisto2D_t` inherits from `FastTemplate_t`, and it's not good if their assignment operators take different types. --- interface/FastTemplate.h | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/interface/FastTemplate.h b/interface/FastTemplate.h index 08e7279aa0d..b61be41a120 100644 --- a/interface/FastTemplate.h +++ b/interface/FastTemplate.h @@ -120,7 +120,10 @@ template class FastTemplate_t { } return *this; } - virtual FastTemplate_t & operator=(const TH1 &other) { + virtual FastTemplate_t & operator=(const TH1 &other) { + if(other.GetDimension() != 1) { + throw std::invalid_argument("FastTemplate_t assignment error: right hand histogram must be 1-dimensional"); + } if ((int)size() != other.GetNbinsX()) { size_ = (unsigned int)other.GetNbinsX(); values_.resize(size_); @@ -200,7 +203,7 @@ template class FastHisto_t : public FastTempla else this->CopyValues(other); return *this; } - ~FastHisto_t(){} + ~FastHisto_t(){} }; template class FastHisto2D_t : public FastTemplate_t { private: @@ -278,9 +281,12 @@ template class FastHisto2D_t : public FastTemp else this->CopyValues(other); return *this; } - FastHisto2D_t& operator=(const TH2 &other) { - if (GetNbinsX() != other.GetNbinsX() || GetNbinsY() != other.GetNbinsY()) { - FastHisto2D_t fh(other); + FastHisto2D_t& operator=(const TH1 &other) { + if(other.GetDimension() != 2) { + throw std::invalid_argument("FastHisto2D_t assignment error: right hand histogram must be 2-dimensional"); + } + if (int(GetNbinsX()) != other.GetNbinsX() || int(GetNbinsY()) != other.GetNbinsY()) { + FastHisto2D_t fh(static_cast(other)); swap(fh); } else this->CopyValues(other); @@ -374,9 +380,12 @@ template class FastHisto3D_t : public FastTemp else this->CopyValues(other); return *this; } - FastHisto3D_t& operator=(const TH3 &other) { - if (GetNbinsX() != other.GetNbinsX() || GetNbinsY() != other.GetNbinsY() || GetNbinsZ() != other.GetNbinsZ()) { - FastHisto3D_t fh(other); + FastHisto3D_t& operator=(const TH1 &other) { + if(other.GetDimension() != 3) { + throw std::invalid_argument("FastHisto3D_t assignment error: right hand histogram must be 3-dimensional"); + } + if (int(GetNbinsX()) != other.GetNbinsX() || int(GetNbinsY()) != other.GetNbinsY() || int(GetNbinsZ()) != other.GetNbinsZ()) { + FastHisto3D_t fh(static_cast(other)); swap(fh); } else this->CopyValues(other); From e397b9fe5cf134f054f94ce8860df1e4daad9c49 Mon Sep 17 00:00:00 2001 From: Jonas Rembser Date: Tue, 28 Nov 2023 11:19:09 +0100 Subject: [PATCH 76/98] Add missing include to compile with ROOT `master` --- src/ProfiledLikelihoodRatioTestStat.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ProfiledLikelihoodRatioTestStat.cc b/src/ProfiledLikelihoodRatioTestStat.cc index 7bbea842df5..3a29700de56 100644 --- a/src/ProfiledLikelihoodRatioTestStat.cc +++ b/src/ProfiledLikelihoodRatioTestStat.cc @@ -1,6 +1,7 @@ #include "../interface/ProfiledLikelihoodRatioTestStat.h" #include "../interface/CloseCoutSentry.h" #include +#include #include Double_t ProfiledLikelihoodRatioTestStat::Evaluate(RooAbsData& data, RooArgSet& nullPOI) From 622b5b5f8935e84f574e5b8657a9bbd7c42700c1 Mon Sep 17 00:00:00 2001 From: Jonas Rembser Date: Tue, 28 Nov 2023 11:19:33 +0100 Subject: [PATCH 77/98] Avoid `operator-` on TComplex and RooRealProxy This will not work anymore in ROOT 6.30. The `double` value needs to be retrieved from the proxy first. --- src/HZZ4LRooPdfs.cc | 41 +++++++++++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/src/HZZ4LRooPdfs.cc b/src/HZZ4LRooPdfs.cc index 9e221d4c141..613031da83b 100644 --- a/src/HZZ4LRooPdfs.cc +++ b/src/HZZ4LRooPdfs.cc @@ -4009,11 +4009,14 @@ ClassImp(RooCPSHighMassGGH) beta = getBeta(mH,effKPrime); } + // Cast the "x" proxy to double only once to avoid overhead and ambiguous + // overloads the TComplex operators. + const double xVal = x; - Double_t bwHM = x / ( TMath::Power( TMath::Power(x,2) - TMath::Power(mH+delta,2) , 2 ) + TMath::Power(x,2)*TMath::Power(effKPrime*width,2) ); + Double_t bwHM = xVal / ( TMath::Power( TMath::Power(xVal,2) - TMath::Power(mH+delta,2) , 2 ) + TMath::Power(xVal,2)*TMath::Power(effKPrime*width,2) ); Double_t splineFactor; - if (x<1850) splineFactor = Spline(x); + if (xVal<1850) splineFactor = Spline(xVal); else splineFactor = Spline(1850); Double_t signal = bwHM*splineFactor; @@ -4024,9 +4027,9 @@ ClassImp(RooCPSHighMassGGH) TComplex M = MSquared.Sqrt(MSquared); TComplex Exp1 = MSquared.Exp((TComplex)alpha); TComplex Exp2 = MSquared.Exp(-(TComplex)alpha); - TComplex Exp3 = MSquared.Exp(-x*(TComplex)alpha/M); + TComplex Exp3 = MSquared.Exp(-xVal*(TComplex)alpha/M); - double interference = -r*(1-TMath::Exp(-beta*(x-150.)/mH_eff))*((Exp1/(x-M)-Exp2/(x+M))*Exp3).Re(); + double interference = -r*(1-TMath::Exp(-beta*(xVal-150.)/mH_eff))*((Exp1/(xVal-M)-Exp2/(xVal+M))*Exp3).Re(); Double_t fValue = signal + IntStr*interference/( TMath::Sqrt(1-BRnew) ); if (fValue > 0) return fValue; @@ -4655,7 +4658,11 @@ ClassImp(RooBWHighMassGGH) Double_t r = getR(mH,effKPrime); Double_t beta = getBeta(mH,effKPrime); - Double_t bwHM = x / ( TMath::Power( TMath::Power(x,2) - TMath::Power(mH+delta,2) , 2 ) + TMath::Power(x,2)*TMath::Power(effKPrime*width,2) ); + // Cast the "x" proxy to double only once to avoid overhead and ambiguous + // overloads the TComplex operators. + const double xVal = x; + + Double_t bwHM = xVal / ( TMath::Power( TMath::Power(xVal,2) - TMath::Power(mH+delta,2) , 2 ) + TMath::Power(xVal,2)*TMath::Power(effKPrime*width,2) ); Double_t signal = bwHM; Double_t k=0.25; @@ -4666,7 +4673,7 @@ ClassImp(RooBWHighMassGGH) TComplex Exp2 = MSquared.Exp(-(TComplex)alpha); TComplex Exp3 = MSquared.Exp(-x*(TComplex)alpha/M); - double interference = -r*(1-TMath::Exp(-beta*(x-150.)/mH_eff))*((Exp1/(x-M)-Exp2/(x+M))*Exp3).Re(); + double interference = -r*(1-TMath::Exp(-beta*(xVal-150.)/mH_eff))*((Exp1/(xVal-M)-Exp2/(xVal+M))*Exp3).Re(); Double_t fValue = signal + IntStr*interference/( TMath::Sqrt(1-BRnew) ); if (fValue > 0) return fValue; @@ -6552,11 +6559,14 @@ ClassImp(RooCPSHighMassVBF) beta = getBeta(mH,effKPrime); } + // Cast the "x" proxy to double only once to avoid overhead and ambiguous + // overloads the TComplex operators. + const double xVal = x; - Double_t bwHM = x / ( TMath::Power( TMath::Power(x,2) - TMath::Power(mH+delta,2) , 2 ) + TMath::Power(x,2)*TMath::Power(effKPrime*width,2) ); + Double_t bwHM = xVal / ( TMath::Power( TMath::Power(xVal,2) - TMath::Power(mH+delta,2) , 2 ) + TMath::Power(xVal,2)*TMath::Power(effKPrime*width,2) ); Double_t splineFactor; - if (x<1850) splineFactor = Spline(x); + if (xVal<1850) splineFactor = Spline(xVal); else splineFactor = Spline(1850); Double_t signal = bwHM*splineFactor; @@ -6567,9 +6577,9 @@ ClassImp(RooCPSHighMassVBF) TComplex M = MSquared.Sqrt(MSquared); TComplex Exp1 = MSquared.Exp((TComplex)alpha); TComplex Exp2 = MSquared.Exp(-(TComplex)alpha); - TComplex Exp3 = MSquared.Exp(-x*(TComplex)alpha/M); + TComplex Exp3 = MSquared.Exp(-xVal*(TComplex)alpha/M); - double interference = -r*(1-TMath::Exp(-beta*(x-150.)/mH_eff))*((Exp1/(x-M)-Exp2/(x+M))*Exp3).Re(); + double interference = -r*(1-TMath::Exp(-beta*(xVal-150.)/mH_eff))*((Exp1/(xVal-M)-Exp2/(xVal+M))*Exp3).Re(); Double_t fValue = signal*(1+IntStr*interference/(bwHM*( TMath::Sqrt(1-BRnew) ))); if (fValue > 0) return fValue; @@ -7645,13 +7655,16 @@ ClassImp(RooSigPlusInt) Double_t RooSigPlusInt::evaluate() const { + // Cast the "x" proxy to double only once to avoid overhead and ambiguous + // overloads the TComplex operators. + const double xVal = x; Double_t totWidthSF = CSquared/(1-BRnew); Double_t mH_eff = mH*TMath::Sqrt(1-k*(totWidthSF*width/mH)*(totWidthSF*width/mH)); - + Double_t splineFactor = Spline(x); - Double_t bwHM = x / ( TMath::Power( TMath::Power(x,2) - TMath::Power(mH+delta,2) , 2 ) + TMath::Power(x,2)*TMath::Power(totWidthSF*width,2) ); + Double_t bwHM = xVal / ( TMath::Power( TMath::Power(xVal,2) - TMath::Power(mH+delta,2) , 2 ) + TMath::Power(xVal,2)*TMath::Power(totWidthSF*width,2) ); Double_t signal = splineFactor*bwHM; @@ -7659,9 +7672,9 @@ ClassImp(RooSigPlusInt) TComplex M = MSquared.Sqrt(MSquared); TComplex Exp1 = MSquared.Exp((TComplex)alpha); TComplex Exp2 = MSquared.Exp(-(TComplex)alpha); - TComplex Exp3 = MSquared.Exp(-x*(TComplex)alpha/M); + TComplex Exp3 = MSquared.Exp(-xVal*(TComplex)alpha/M); - double interference = -r*sqrt(1/1-BRnew)*(1-TMath::Exp(-beta*(x-150.)/mH_eff))*((Exp1/(x-M)-Exp2/(x+M))*Exp3).Re(); + double interference = -r*sqrt(1/1-BRnew)*(1-TMath::Exp(-beta*(xVal-150.)/mH_eff))*((Exp1/(xVal-M)-Exp2/(xVal+M))*Exp3).Re(); return signal + interference; From b47ce8190c60ef6a02d9d485772ab54adbd19bae Mon Sep 17 00:00:00 2001 From: nckw Date: Mon, 4 Dec 2023 16:21:32 +0100 Subject: [PATCH 78/98] Nckw new logger (#868) * Minimial version of CombineLogger Replace Logger with stripped down version (CombineLogger) * new splash * moving messages to the logger, 1 of many * replace couts with logger (2 of many) * fixing compilation errors, sorry --------- Co-authored-by: Nick Wardle Co-authored-by: Giacomo Ortona --- bin/combine.cpp | 8 +- data/splash.txt | 122 ++++++++++++------------------- interface/CombineLogger.h | 31 ++++++++ interface/Logger.h | 79 -------------------- src/AsimovUtils.cc | 10 +-- src/AsymptoticLimits.cc | 82 ++++++++++----------- src/CachingNLL.cc | 32 ++++---- src/CascadeMinimizer.cc | 62 ++++++++-------- src/Combine.cc | 50 ++++++------- src/CombineLogger.cc | 43 +++++++++++ src/FitDiagnostics.cc | 37 +++++----- src/FitterAlgoBase.cc | 150 +++++++++++++++++++------------------- src/HybridNew.cc | 134 +++++++++++++++------------------- src/Logger.cc | 91 ----------------------- src/MultiDimFit.cc | 38 +++++----- src/ToyMCSamplerOpt.cc | 20 ++--- src/utils.cc | 9 +-- 17 files changed, 425 insertions(+), 573 deletions(-) create mode 100644 interface/CombineLogger.h delete mode 100644 interface/Logger.h create mode 100644 src/CombineLogger.cc delete mode 100644 src/Logger.cc diff --git a/bin/combine.cpp b/bin/combine.cpp index a166b99d695..e5ada18689f 100644 --- a/bin/combine.cpp +++ b/bin/combine.cpp @@ -26,7 +26,7 @@ #include "../interface/CascadeMinimizer.h" #include "../interface/ProfilingTools.h" #include "../interface/GenerateOnly.h" -#include "../interface/Logger.h" +#include "../interface/CombineLogger.h" #include using namespace std; @@ -51,6 +51,9 @@ int main(int argc, char **argv) { Combine combiner; + // Set name of Log file (ideally would make this similar format to out file) + CombineLogger::instance().setName("combine_logger.out"); + map methods; algo = new Significance(); methods.insert(make_pair(algo->name(), algo)); algo = new BayesianFlatPrior(); methods.insert(make_pair(algo->name(), algo)); @@ -250,6 +253,7 @@ int main(int argc, char **argv) { } TString fileName = "higgsCombine" + name + "."+whichMethod+"."+massName+toyName+"root"; + TFile *test = new TFile(fileName, "RECREATE"); outputFile = test; TTree *t = new TTree("limit", "limit"); int syst, iToy, iSeed, iChannel; @@ -324,7 +328,7 @@ int main(int argc, char **argv) { try { combiner.run(datacard, dataset, limit, limitErr, iToy, t, runToys); - if (verbose>0) Logger::instance().printLog(); + if (verbose>0) CombineLogger::instance().printLog(); } catch (std::exception &ex) { cerr << "Error when running the combination:\n\t" << ex.what() << std::endl; test->Close(); diff --git a/data/splash.txt b/data/splash.txt index 43284ea9f2c..7f3844d5a84 100644 --- a/data/splash.txt +++ b/data/splash.txt @@ -1,74 +1,48 @@ - ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@, - ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@, - ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@, - ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@, - ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@, - ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@, - ;@@@@@@@@@@@@@` ,@@@@: #@@@ .@@. #@ :@@: @@ `@@@ :@, :@@@@@@@@@@@, - ;@@@@@@@@@@@@ ,@@. +@@ @@` #@ '@: @@ :@@ :@, :@@@@@@@@@@@, - ;@@@@@@@@@@@, `' ## ;. @@ ## #@ ,#' ,@: @@ #@ :@, +''''#@@@@@@@@@@@, - ;@@@@@@@@@@@ `@@@ `;@. @@@; #@ '' #@ ,@@ :@: @@ `@ :@, @@@@@@@@@@@@@@@@@, - ;@@@@@@@@@@@ :@@@@@@@` `@@@# ;@ ` .. ` #@ `@@: @@ , :@, @@@@@@@@@@@@, - ;@@@@@@@@@@@ :@@@@@@@` `@@@# ;@ `. .` #@ +@: @@ ` :@, @@@@@@@@@@@@, - ;@@@@@@@@@@@ ,@@@`,#@` @@@# '@ ' ;` #@ ,#+` @: @@ :. :@, #####@@@@@@@@@@@@, - ;@@@@@@@@@@@` @@# ': +@@. #@ # #` #@ ,@@: @: @@ :# :@, @@@@@@@@@@@@@@@@@, - ;@@@@@@@@@@@+ ` @@ ` `@@ @ @` #@ ` @: @@ :@' :@, .@@@@@@@@@@@, - ;@@@@@@@@@@@@. +@@+ @@@ @. .@` #@ ;@: @@ :@@. :@, .@@@@@@@@@@@, - ;@@@@@@@@@@@@@+` `#@@@@#. ;@@@@` `@' '@` @@` `,#@@; `@@` ;@@@ :@: ,@@@@@@@@@@@, - ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@, - ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@, - ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@, - ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@, - ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@, - - - `` - :'''+++++'', - `;`.++++++++'+'. - `'` ;+''++++++';;: - ;+,'+++'''++++'+'+: - .+++++'''''''''+::;+. - `+++++''''''''''',.,#+ - ;++++''''''''''''``;+#; - ,+''++'''''''''+'+::####, - `++'++'''''''''+''++++++#+` - `;'''+#'` ;++++'''''''''''::;+++++#+' - :';.`.''++,+++++'''''''''+;,.:++++++#+. - .'';.` .''+++++++''''',:'''':``'+++++#;;; - `;'''.`` ;''++++++'''';. .''+''.:+++++++::; - :'''''. ;'''++++++''''. ;'++++++++++++;,:: - .'''''''''''''''++++''''';.;'+'::'+++++++++`;. - ;''''''''''''';;;'++++++'''''++,,.;+++++++##++ - ,''''''''''''';;;;;'++'''++++++++.``'+++++#;:+#, - :'''''''''''';;;;;;;;''''++++++###; :+++++#+,:++ - ::..';'''''';;;;;;;;;;'''++++++++##++++++++#'.,+. - .,.``''''''';;;;;;;;;;;''++++;+'++++#++++++##+,'; - '`` ,;;;'';;;;;;;;;;;;;;'++++';;.++++++++++##+##` - .; .';'';;;;;;;;;;;;:;;;''+++#,#+,++++++++#::+#: - :;;''''';;;;;;;;;;;:.``:;;;,'+++;#####+++++',,'+ - ;;''''';;;;;;;;;;;:.`` ,;;;,:+++#;########+;`,+. - ;;'';';;;;;;;;;;;;``` :'';;`'++#; .+##::#+#,': - ;''';;;;;;;;;;;;;;` ,;'''',,++#+` ,+;`###. - ;''';;;;;;;;;;;;;;: `:;+++'''.++##, .:. - :''';';;;;;;;;;;;;;;;;'+++++++++##+ - :''''';;;;;;;;;;;;;;;'+#####+++++##` - ,';;'';;;;;;;;;;;;;;+#+++###+++'+#+; - .';;;:,;;;;;;;;;;;+#++++++++++++'+#+ - .'';,.`.;;;;;;;;'#+++++++++++++#++++, - `''.`` .;;;;;;'#++++++++++++++###+++' - `'' :;;;;;++++++++++++++++###+#+++` - ;: ,;;;;+++++++++++++++++++++###++: - ';,`:';;++++++++++++++++++++++#####+' - ;';'';'#+++###++++++++++++++########; - `++++##+++###+++++++++++++##########, - '#######+++++++++':::,+###########+ - `########++++++#+.,:,,+##########+. - :#+######++++##+`.,,+####+######. - '+##+++###+++++++############+` - ;###++#+++#++++++#########+` - `+######+###++#########+` - ,##################+. - `'##############+. - .#++########+` - ;++#####+. - .::,. +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@.%&&&&&&&&&&&&&&&&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@/% +@.%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@/% +@.%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@/% +@.%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@/% +@.%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@/% +@.%&&&&&&&&&&&&&&&&#*.......,/#&&&&&&&&*&&&&&&&&&&&&&&&&&&&&%%@@@@@@@@@@&/.....,#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@/% +@.%&&&&&&&&&&&&* ./&&&&&&&&&&&*.%&&&&&# .%&&&&&&&&&&&&&&&&&,.,&&@@@@@@..(@@@@@@@,(@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@/% +@.%&&&&&&&&&&...(&&&&&&&&&&&&&&&&&&&&&,.. (&&&&&&&&&&&&&&%... &&&&&&@../@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@/% +@.%&&&&&&&&% ..%&&&&&&&&&&&&&&&&&&&&&& (# .*&&&&&&&&&&&&/.%*. %&&&&&&...%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@/% +@.%&&&&&&&&...*&&&&&&&&&&&&&&&&&&&&&&#.%&&...%&&&&&&&&&,,&&% ./&&&&&&&,..../&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@/% +@.%&&&&&&&&.../&&&&&&&&&&&&&&&&&&&&&&,.&&&&*. #&&&&&&% (&&&&...&&&&&&&&&&#*.....,&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@/% +@.%&&&&&&&&,..,&&&&&&&&&&&&&&&&&&&&&& *&&&&&(..,&&&&/.%&&&&&...&&&&&&&&&&&&&&&#...,@@@@@@@@@@@@@@@@@@@@@@@@&@@@@@@@@@@/% +@.%&&&&&&&&& ..(&&&&&&&&&&&&&&&&&&&&( #&&&&&&%.. %&.,&&&&&&&/. (&&&&&&&&&&&&&&&&*. &@@@@@@@@@@@@@@@@@@@@@*(@@@@@@@@@@@/% +@.%&&&&&&&&&&,..*&&&&&&&&&&&&&&&&&&&. &&&&&&&&&... /&&&&&&&&# .,&&&&&%&&&&&&&&&&,./&&&@@@@@@@@@@@@@@@@@@//@@@@@@@@@@@@/% +@.%&&&&&&&&&&&&/...#&&&&&&&&&#,.&&&% .&&&&&&&&&&, #&&&&&&&&&& ..&&&&( .#&&&&&&(..%&&&&&&@@@@@@@@@@@@@@@(*@@@@@@@@@@@@@/% +@.%&&&&&&&&&&&&&&&&%(/****/(%&&&&&&%%%&&&&&&&&&&&&&&&&&&&&&&&#%%&&&&&&&#/***/#&&&&&&&&&&&&@@@@@@@@@@@@#,@@@@@@@@@@@@@@/% +@.%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@@@@@@@@@%,&@@@@@@@@@@@@@@/% +@.%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&##%&&&&&&&&&&#%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@@@@@@&,&@@@@@@@@@@@@@@@/% +@.%&&&&&&&&&&&(.(&&( #&&&&#((&&&&##%(%#(%&&&.(#(#&&&&&%###&&&&&%#%((%&&&&&&#(#&&&&&&&&&&&&&&&&&&@@@&,&@@@@@@@@@@@@@@@@/% +@.#######%%%%%./&&&&&&&&.,&&&( %&% %% &#.&&&.,&&&,.&&&&&,,&&&&&& /&&*,&&& ,(((,.&&&&&&&&&&&&&&&&&&@,%@@@@@@@@@@@@@@@@@/% +@.(###########(.,//*./##/ /#(.,&&( /% /#.(&(../#( *&&%//..//&&&( *%%,.#&&*./#(/*&&&&&&&&&&&&&&&&&&,#@@@@@@@@@@@@@@@@@@/% +@.(############################%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&#&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&,#&&@@@@@@@@@@@@@@@@@/% +@.(#################################%&&&&&&&&&&&&&&&&&&&&&&&&(#&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&,(&&&&@@@@@@@@@@@@@@@@/% +@.(#####################################%&&&&&&&&&&&&&&&&&&&(*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&,(&&&&&&&@@@@@@@@@@@@@@/% +@.(#########################################&&&&&&&&&&&&&&&*/&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&,(&&&&&&&&&@@@@@@@@@@@@@/% +@.(############################################&&&&&&&&&&&%#&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&,(&&&&&&&&&&&@@@@@@@@@@@@/% +@.(###############################################&&&&&&&*#&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&,#&&&&&&&&&&&&&&@@@@@@@@@@/% +@.(#################################################%&&%(&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%,#&&&&&&&&&&&&&&&&@@@@@@@@@/% +@.(//#((##############################################%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%,%&&&&&&&&&&&&&&&&&&@@@@@@@@/% +@.(############/*(/(#################################/*#%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%,%&&&&&&&&&&&&&&&&&&&&@@@@@@@/% +@.###################(/#/(##########################(#####%&&&&&&&&&&&&&&&&&&&&&&&&&&&&#,&&&&&&&&&&&&&&&&&&&&&&&@@@@@@/% +@.#########################//#####################(,(#######&&&&&&&&&&&&&&&&&&&&&&&&&&(,&&&&&&&&&&&&&&&&&&&&&&&&&@@@@@/% +@.############################((/################//##########%&&&&&&&&&&&&&&&&&&&&&&&/*&&&&&&&&&&&&&&&&&&&&&&&&&&@@@@@/% +@.#######################/,/(((((/,*(###########//#############&&&&&&&&&&&&&&&&&&&&&*/&&&&&&&&&&&&&&&&&&&&&&&&&&&&@@@@*% +@.####################**(###########/,,(######/,(###############&&&&&&&&&&&&&&&&&&&*(&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@@@*% +@.&&&&&&&&&&&%#####(*/################/**/####(##################&&&&&&&&&&&&&&&&&,%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@@*% +@.&&&&&&&&&&&&&&&&//####################*/**,(####################&&&&&&&&&&&&&&%,%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@@*% +@.&&&&&&&&&&&&&&#*&&&%###################(*(,/#####################&&&&&&&&&&&&(*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@*% +@.&&&&&&&&&&&&&*#&&&&&&&################(/#*((,(###################%&&&&&&&&&&/(&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@*% +@.&&&&&&&&&&&%,&&&&&&&&&&&############,*####/(#**###################&&&&&&&&&,#&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*% +@.%&&&&&&&&&/(&&&&&&&&&&&&&%#######(*########((##,(##################&&&&&&%,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*% +@.%&&&&&&&&,&&&&&&&&&&&&&&&&&#####(/##########(###(,(################%&&&&(/&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*% +@.%&&&&&&#*&&&&&&&&&&&&&&&&&&&#*,(#############/####*/################&&&,%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*% +@.%&&&&&*%&&&&&&&&&&&&&&&&&&(,#################*(####(,(##############&(*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*% +@.&@@&/(&&&&&&&&&&&&&&&&&*&&&&&#################*######(,(###########(,%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*% +@.(@/(@@&&&&&&&&&&&%(/&%&&&&&&&%################*########(**#######/*(%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*% +@.(&&#/%%,,,#%,,*(#############(/////////////////////////////*,,,,/////(((((((((((((((((((((((((((((((((((((((((((((((,% diff --git a/interface/CombineLogger.h b/interface/CombineLogger.h new file mode 100644 index 00000000000..7e2df3d1d53 --- /dev/null +++ b/interface/CombineLogger.h @@ -0,0 +1,31 @@ +#ifndef HiggsAnalysis_CombinedLimit_CombineLogger_h +#define HiggsAnalysis_CombinedLimit_CombineLogger_h + +#include +#include +#include + +class CombineLogger +{ + public: + static int nLogs; + + static CombineLogger& instance(); + + static void setName(const char* _fName){ + fName=_fName; + }; + + void log(const std::string & _file, const int _lineN, const std::string& _logmsg, const std::string& _function); + void printLog(); + + protected: + // Static variable for the instance + static CombineLogger* pL; + + static const char* fName; + std::ofstream outStream; + CombineLogger(); + virtual ~CombineLogger(); +}; +#endif \ No newline at end of file diff --git a/interface/Logger.h b/interface/Logger.h deleted file mode 100644 index df0f96dd224..00000000000 --- a/interface/Logger.h +++ /dev/null @@ -1,79 +0,0 @@ -#ifndef HiggsAnalysis_CombinedLimit_Logger_h -#define HiggsAnalysis_CombinedLimit_Logger_h - -/* - * Logger adapted from - * Professional C++, 2nd Edition, Oct 2011 - * Marc Gregoire, Nicholas A. Solter, Scott J. Kleper - * ISBN: 978-0-470-93244-5 - * http://www.wiley.com/WileyCDA/WileyTitle/productCd-0470932449.html -*/ - -// Logger.h -#include -#include -#include -#include -#include - -class Logger -{ -public: - static const std::string kLogLevelDebug; - static const std::string kLogLevelInfo; - static const std::string kLogLevelError; - - static int nLogLevelInfo; - static int nLogLevelDebug; - static int nLogLevelError; - - // Returns a reference to the singleton Logger object - static Logger& instance(); - - // Logs a single message at the given log level - void log(const std::string& inMessage, - const std::string& inLogLevel, - const std::string& inFunction); - - // Logs a vector of messages at the given log level - void log(const std::vector& inMessages, - const std::string& inLogLevel, - const std::string& inFunction); - - void printLog(); - -protected: - // Static variable for the one-and-only instance - static Logger* pInstance; - - // Constant for the filename - static const char* const kLogFileName; - - // Data member for the output stream - std::ofstream mOutputStream; - - // Embedded class to make sure the single Logger - // instance gets deleted on program shutdown. - friend class Cleanup; - class Cleanup - { - public: - ~Cleanup(); - }; - - // Logs message. The thread should own a lock on sMutex - // before calling this function. - void logHelper(const std::string& inMessage, - const std::string& inLogLevel, - const std::string& inFunction); - - -private: - Logger(); - virtual ~Logger(); - Logger(const Logger&); - Logger& operator=(const Logger&); - static std::mutex sMutex; -}; - -#endif diff --git a/src/AsimovUtils.cc b/src/AsimovUtils.cc index 51e3ee857d7..d453443c0c6 100644 --- a/src/AsimovUtils.cc +++ b/src/AsimovUtils.cc @@ -11,7 +11,7 @@ #include "../interface/ToyMCSamplerOpt.h" #include "../interface/CloseCoutSentry.h" #include "../interface/CascadeMinimizer.h" -#include "../interface/Logger.h" +#include "../interface/CombineLogger.h" RooAbsData *asimovutils::asimovDatasetNominal(RooStats::ModelConfig *mc, double poiValue, int verbose) { RooArgSet poi(*mc->GetParametersOfInterest()); @@ -20,11 +20,11 @@ RooAbsData *asimovutils::asimovDatasetNominal(RooStats::ModelConfig *mc, double toymcoptutils::SimPdfGenInfo newToyMC(*mc->GetPdf(), *mc->GetObservables(), false); if (verbose>2) { - Logger::instance().log(std::string(Form("AsimovUtils.cc: %d -- Parameters after fit for asimov dataset",__LINE__)),Logger::kLogLevelInfo,__func__); + CombineLogger::instance().log("AsimovUtils.cc",__LINE__,"Parameters after fit for asimov dataset",__func__); std::unique_ptr iter(mc->GetPdf()->getParameters((const RooArgSet*) 0)->createIterator()); for (RooAbsArg *a = (RooAbsArg *) iter->Next(); a != 0; a = (RooAbsArg *) iter->Next()) { TString varstring = utils::printRooArgAsString(a); - Logger::instance().log(std::string(Form("AsimovUtils.cc: %d -- %s",__LINE__,varstring.Data())),Logger::kLogLevelInfo,__func__); + CombineLogger::instance().log("AsimovUtils.cc",__LINE__,std::string(Form("%s",varstring.Data())),__func__); } } @@ -66,11 +66,11 @@ RooAbsData *asimovutils::asimovDatasetWithFit(RooStats::ModelConfig *mc, RooAbsD } if (verbose>2) { - Logger::instance().log(std::string(Form("AsimovUtils.cc: %d -- Parameters after fit for asimov dataset",__LINE__)),Logger::kLogLevelInfo,__func__); + CombineLogger::instance().log("AsimovUtils.cc",__LINE__,"Parameters after fit for asimov dataset",__func__); std::unique_ptr iter(mc->GetPdf()->getParameters(realdata)->createIterator()); for (RooAbsArg *a = (RooAbsArg *) iter->Next(); a != 0; a = (RooAbsArg *) iter->Next()) { TString varstring = utils::printRooArgAsString(a); - Logger::instance().log(std::string(Form("AsimovUtils.cc: %d -- %s",__LINE__,varstring.Data())),Logger::kLogLevelInfo,__func__); + CombineLogger::instance().log("AsimovUtils.cc",__LINE__,std::string(Form("%s",varstring.Data())),__func__); } } diff --git a/src/AsymptoticLimits.cc b/src/AsymptoticLimits.cc index f056dd577d3..75563600626 100644 --- a/src/AsymptoticLimits.cc +++ b/src/AsymptoticLimits.cc @@ -18,7 +18,7 @@ #include "../interface/CascadeMinimizer.h" #include "../interface/utils.h" #include "../interface/AsimovUtils.h" -#include "../interface/Logger.h" +#include "../interface/CombineLogger.h" #include @@ -189,8 +189,8 @@ bool AsymptoticLimits::runLimit(RooWorkspace *w, RooStats::ModelConfig *mc_s, Ro } rBestD_ = r->getVal(); if (verbose > 0) { - std::cout << "NLL at global minimum of data: " << minNllD_ << " (" << r->GetName() << " = " << r->getVal() << ")" << std::endl; - Logger::instance().log(std::string(Form("AsymptoticLimits.cc: %d -- NLL at global minimum of data = %g (%s=%g)",__LINE__,minNllD_,r->GetName(),r->getVal())),Logger::kLogLevelInfo,__func__); + //std::cout << "NLL at global minimum of data: " << minNllD_ << " (" << r->GetName() << " = " << r->getVal() << ")" << std::endl; + CombineLogger::instance().log("AsymptoticLimits.cc",__LINE__,std::string(Form("NLL at global minimum of data = %g (%s=%g)",minNllD_,r->GetName(),r->getVal())),__func__); } double rErr = std::max(r->getError(), 0.02 * (r->getMax() - r->getMin())); @@ -209,10 +209,10 @@ bool AsymptoticLimits::runLimit(RooWorkspace *w, RooStats::ModelConfig *mc_s, Ro sentry.clear(); } if (verbose > 0) { - std::cout << "NLL at global minimum of asimov: " << minNllA_ << " (" << r->GetName() << " = " << r->getVal() << ")" << std::endl; - Logger::instance().log(std::string(Form("AsymptoticLimits.cc: %d -- NLL at global minimum of asimov = %g (%s=%g)",__LINE__,minNllA_,r->GetName(),r->getVal())),Logger::kLogLevelInfo,__func__); + //std::cout << "NLL at global minimum of asimov: " << minNllA_ << " (" << r->GetName() << " = " << r->getVal() << ")" << std::endl; + CombineLogger::instance().log("AsymptoticLimits.cc",__LINE__,std::string(Form("NLL at global minimum of asimov = %g (%s=%g)",minNllA_,r->GetName(),r->getVal())),__func__); } - if (verbose > 1) fitFreeA_.Print("V"); + if (verbose > 2) fitFreeA_.Print("V"); fitFreeD_.writeTo(*params_); r->setConstant(true); @@ -230,13 +230,14 @@ bool AsymptoticLimits::runLimit(RooWorkspace *w, RooStats::ModelConfig *mc_s, Ro for (int tries = 0; tries < 5; ++tries) { double cls = getCLs(*r, rMax); if (cls == -999) { - std::cerr << "Minimization failed in an unrecoverable way" << std::endl; - if (verbose>0) Logger::instance().log(std::string(Form("AsymptoticLimits.cc: %d -- Minimization failed in an unrecoverable way for calculation of limit",__LINE__)),Logger::kLogLevelError,__func__); + //std::cerr << "Minimization failed in an unrecoverable way" << std::endl; + CombineLogger::instance().log("AsymptoticLimits.cc",__LINE__,"[ERROR] Minimization failed in an unrecoverable way for calculation of limit",__func__); break; } if (cls < clsTarget) { clsMin = cls; break; } if (strictBounds_ && rMax == r->getMax()) { - std::cout << rule_ << " at upper bound " << r->GetName() << " = " << r->getVal() << " is " << cls << ". Stopping search and using that as a limit.\n" << std::endl; + //std::cout << rule_ << " at upper bound " << r->GetName() << " = " << r->getVal() << " is " << cls << ". Stopping search and using that as a limit.\n" << std::endl; + CombineLogger::instance().log("AsymptoticLimits.cc",__LINE__,std::string(Form(" %s at upper bound %s = %g is %g. Stopping search and using that as limit.",rule_.data(),r->GetName(),r->getVal(),cls)),__func__); limit = rMax; limitErr = -1.0; return true; } @@ -258,8 +259,8 @@ bool AsymptoticLimits::runLimit(RooWorkspace *w, RooStats::ModelConfig *mc_s, Ro } double cls = getCLs(*r, limit); if (cls == -999) { - std::cerr << "Minimization failed in an unrecoverable way" << std::endl; - if (verbose>0) Logger::instance().log(std::string(Form("AsymptoticLimits.cc: %d -- Minimization failed in an unrecoverable way for calculation of limit",__LINE__)),Logger::kLogLevelError,__func__); + //std::cerr << "Minimization failed in an unrecoverable way" << std::endl; + CombineLogger::instance().log("AsymptoticLimits.cc",__LINE__, "Minimization failed in an unrecoverable way for calculation of limit",__func__); break; } if (cls > clsTarget) { @@ -301,11 +302,7 @@ double AsymptoticLimits::getCLs(RooRealVar &r, double rVal, bool getAlsoExpected // qmu is zero when mu < mu^ (CMS NOTE-2011/005) // --> prevents us excluding from below if (what_ == "singlePoint" && rVal < rBestD_) { - if (verbose > 0) { - std::cout << "Value being tested (" << r.GetName() << " = " << rValue_ - << ") is lower than the best fit (" << r.GetName() << " = " - << rBestD_ << "). Setting q_mu to zero.\n"; - } + if (verbose > 0) CombineLogger::instance().log("AsymptoticLimits.cc",__LINE__,std::string(Form("Value being tested (%s=%f) is lower than the best fit(%s=%f). Setting q_mu to zero.",r.GetName(),rValue_,r.GetName(),rBestD_)),__func__); qmu = 0.; } @@ -339,8 +336,7 @@ double AsymptoticLimits::getCLs(RooRealVar &r, double rVal, bool getAlsoExpected double CLs = (OnemPb == 0 ? 0 : Pmu/OnemPb); sentry.clear(); if (verbose > 0) { - printf("At %s = %f:\tq_mu = %.5f\tq_A = %.5f\tPmu = %7.5f\t1-Pb = %7.5f\tCLs = %7.5f\n", r.GetName(), rVal, qmu, qA, Pmu, OnemPb, CLs); - Logger::instance().log(std::string(Form("AsymptoticLimits.cc: %d -- At %s = %f:\tq_mu = %.5f\tq_A = %.5f\tPmu = %7.5f\t1-Pb = %7.5f\tCLs = %7.5f",__LINE__,r.GetName(), rVal, qmu, qA, Pmu, OnemPb, CLs)),Logger::kLogLevelInfo,__func__); + CombineLogger::instance().log("AsymptoticLimits.cc",__LINE__,std::string(Form("At %s = %f:\tq_mu = %.5f\tq_A = %.5f\tPmu = %7.5f\t1-Pb = %7.5f\tCLs = %7.5f",r.GetName(), rVal, qmu, qA, Pmu, OnemPb, CLs)),__func__); } if (getAlsoExpected) { @@ -418,10 +414,8 @@ std::vector > AsymptoticLimits::runLimitExpected(RooWorks } if (r->getVal()/r->getMax() > 1e-3) { if (verbose) { - printf("WARNING: Best fit of asimov dataset is at %s = %f (%f times %sMax), while it should be at zero\n", - r->GetName(), r->getVal(), r->getVal()/r->getMax(), r->GetName()); - Logger::instance().log(std::string(Form("AsymptoticLimits.cc: %d -- Best fit of asimov dataset is at %s = %f (%f times %sMax), while it should be at zero",__LINE__,r->GetName(), r->getVal(), r->getVal()/r->getMax(), r->GetName())),Logger::kLogLevelDebug,__func__); - } + CombineLogger::instance().log("AsymptoticLimits.cc",__LINE__,std::string(Form("[WARNING] Best fit of asimov dataset is at %s = %f (%f times %sMax), while it should be at zero",r->GetName(), r->getVal(), r->getVal()/r->getMax(), r->GetName())),__func__); + } } @@ -431,9 +425,9 @@ std::vector > AsymptoticLimits::runLimitExpected(RooWorks double sigma = median / ROOT::Math::normal_quantile(1-(doCLs_ ? 0.5:1.0)*(1-cl),1.0); double alpha = 1-cl; if (verbose > 0) { - std::cout << "Median for expected limits: " << median << std::endl; - std::cout << "Sigma for expected limits: " << sigma << std::endl; - Logger::instance().log(std::string(Form("AsymptoticLimits.cc: %d -- Median for expected limits = %g (Sigma for expected limits = %g)",__LINE__,median,sigma)),Logger::kLogLevelInfo,__func__); + //std::cout << "Median for expected limits: " << median << std::endl; + //std::cout << "Sigma for expected limits: " << sigma << std::endl; + CombineLogger::instance().log("AsymptoticLimits.cc",__LINE__,std::string(Form("Median for expected limits = %g, Sigma for expected limits = %g",median,sigma)),__func__); } const double quantiles[5] = { 0.025, 0.16, 0.50, 0.84, 0.975 }; @@ -520,7 +514,7 @@ float AsymptoticLimits::findExpectedLimitFromCrossing(RooAbsReal &nll, RooRealVa CascadeMinimizer minim2(nll, CascadeMinimizer::Constrained); //minim2.setStrategy(minimizerStrategy_); if (minosAlgo_ == "bisection") { - if (verbose > 1) printf("Will search for NLL crossing by bisection\n"); + if (verbose > 1) CombineLogger::instance().log("AsymptoticLimits.cc",__LINE__,"Will search for NLL crossing by bisection",__func__); if (strictBounds_) minosStat = 0; // the bracket is correct by construction in this case while (rErr > std::max(rRelAccuracy_*rCross, rAbsAccuracy_)) { if (!strictBounds_ && rCross >= r->getMax()) r->setMax(rCross*1.1); @@ -533,13 +527,13 @@ float AsymptoticLimits::findExpectedLimitFromCrossing(RooAbsReal &nll, RooRealVa } if (!ok && picky_) break; else minosStat = 0; double here = nll.getVal(); - if (verbose > 1) printf("At %s = %f:\tdelta(nll) = %.5f\n", r->GetName(), rCross, here-nll0); + if (verbose > 1) CombineLogger::instance().log("AsymptoticLimits.cc",__LINE__,std::string(Form("At %s = %f:\tdelta(nll) = %.5f\n", r->GetName(), rCross, here-nll0)),__func__); if (fabs(here - threshold) < 0.05*minim2.tolerance()) break; if (here < threshold) rMin = rCross; else rMax = rCross; rCross = 0.5*(rMin+rMax); rErr = 0.5*(rMax-rMin); } } else if (minosAlgo_ == "stepping") { - if (verbose > 1) printf("Will search for NLL crossing by stepping.\n"); + if (verbose > 1) CombineLogger::instance().log("AsymptoticLimits.cc",__LINE__,"Will search for NLL crossing by stepping",__func__); rCross = 0.05 * rMax; rErr = rMax; double stride = rCross; bool overstepped = false; while (rErr > std::max(rRelAccuracy_*rCross, rAbsAccuracy_)) { @@ -557,12 +551,12 @@ float AsymptoticLimits::findExpectedLimitFromCrossing(RooAbsReal &nll, RooRealVa } if (!ok && picky_) break; else minosStat = 0; double here = nll.getVal(); - if (verbose > 1) printf("At %s = %f:\tdelta(nll) = %.5f\n", r->GetName(), rCross, here-nll0); + if (verbose > 1) CombineLogger::instance().log("AsymptoticLimits.cc",__LINE__,std::string(Form("At %s = %f:\tdelta(nll) = %.5f\n", r->GetName(), rCross, here-nll0)),__func__); if (fabs(here - threshold) < 0.05*minim2.tolerance()) break; if (here < threshold) { if ((threshold-here) < 0.5*fabs(threshold-there)) stride *= 0.5; if (strictBounds_ && rCross == r->getMax()) { - if (verbose > 1) printf("reached hard bound at %s = %f\n", r->GetName(), rCross); + if (verbose > 1) CombineLogger::instance().log("AsymptoticLimits.cc",__LINE__,std::string(Form("reached hard bound at %s = %f\n", r->GetName(), rCross)),__func__); return rCross; } rCross += stride; @@ -574,7 +568,7 @@ float AsymptoticLimits::findExpectedLimitFromCrossing(RooAbsReal &nll, RooRealVa } } else if (minosAlgo_ == "new") { if (strictBounds_) throw std::invalid_argument("AsymptoticLimits: --minosAlgo=new doesn't work with --strictBounds\n"); - if (verbose > 1) printf("Will search for NLL crossing with new algorithm.\n"); + if (verbose > 1) CombineLogger::instance().log("AsymptoticLimits.cc",__LINE__,"Will search for NLL crossing with new algorithm",__func__); // // Let X(x,y) = (x-a*y)^2 / s^2 + y^2 be the chi-square in case of correlations // then yhat(x) = a*x / (a^2 + s^2) @@ -605,7 +599,7 @@ float AsymptoticLimits::findExpectedLimitFromCrossing(RooAbsReal &nll, RooRealVa bool binNLLchange = (nll_1 < threshold && nll_1 - nll_0 > 0.5); bool aboveThresh = (nll_1 > threshold + kappa*std::pow(r_1-r_0,2)); if (binNLLchange || aboveThresh) { - if (verbose > 1) printf("At %s = %f:\tdelta(nll unprof) = %.5f\t \tkappa=%.5f\n", r->GetName(), r_1, nll_1-nll0, kappa); + if (verbose > 1) CombineLogger::instance().log("AsymptoticLimits.cc",__LINE__,std::string(Form("At %s = %f:\tdelta(nll unprof) = %.5f\t\tkappa=%.5f\n", r->GetName(), r_1, nll_1-nll0, kappa)),__func__); { CloseCoutSentry sentry2(verbose < 3); bool ok=true; @@ -615,7 +609,7 @@ float AsymptoticLimits::findExpectedLimitFromCrossing(RooAbsReal &nll, RooRealVa } double nll_1_prof = nll.getVal(); kappa = (nll_1 - nll_1_prof) / std::pow(r_1 - r_0,2); - if (verbose > 1) printf("At %s = %f:\tdelta(nll unprof) = %.5f\tdelta(nll prof) = %.5f\tkappa=%.5f\n", r->GetName(), r_1, nll_1-nll0, nll.getVal()-nll0, kappa); + if (verbose > 1) CombineLogger::instance().log("AsymptoticLimits.cc",__LINE__,std::string(Form("At %s = %f:\tdelta(nll unprof) = %.5f\tdelta(nll prof) = %.5f\tkappa=%.5f\n", r->GetName(), r_1, nll_1-nll0, nll.getVal()-nll0, kappa)),__func__); if (nll_1_prof > threshold) { nll_1 = nll_1_prof; break; @@ -625,13 +619,13 @@ float AsymptoticLimits::findExpectedLimitFromCrossing(RooAbsReal &nll, RooRealVa if (aboveThresh) rStep *= 2; } } else { - if (verbose > 1) printf("At %s = %f:\tdelta(nll unprof) = %.5f\t \tkappa=%.5f\n", r->GetName(), r_1, nll_1-nll0, kappa); + if (verbose > 1) CombineLogger::instance().log("AsymptoticLimits.cc",__LINE__,std::string(Form("At %s = %f:\tdelta(nll unprof) = %.5f\t \tkappa=%.5f\n", r->GetName(), r_1, nll_1-nll0, kappa)),__func__); } if (r_1 > rMax0) return std::numeric_limits::quiet_NaN(); } while (true); // now crossing is bracketed, do bisection - if (verbose > 1) printf("At %s = %f:\t \tdelta(nll prof) = %.5f\tkappa=%.5f\n", r->GetName(), r_0, nll_0-nll0, kappa); - if (verbose > 1) printf("At %s = %f:\t \tdelta(nll prof) = %.5f\tkappa=%.5f\n", r->GetName(), r_1, nll_1-nll0, kappa); + if (verbose > 1) CombineLogger::instance().log("AsymptoticLimits.cc",__LINE__,std::string(Form("At %s = %f:\t \tdelta(nll prof) = %.5f\tkappa=%.5f\n", r->GetName(), r_0, nll_0-nll0, kappa)),__func__); + if (verbose > 1) CombineLogger::instance().log("AsymptoticLimits.cc",__LINE__,std::string(Form("At %s = %f:\t \tdelta(nll prof) = %.5f\tkappa=%.5f\n", r->GetName(), r_0, nll_1-nll0, kappa)),__func__); minosStat = 0; do { // LOOP PRECONDITIONS: @@ -644,7 +638,7 @@ float AsymptoticLimits::findExpectedLimitFromCrossing(RooAbsReal &nll, RooRealVa double r_2 = 0.5*(r_hi+r_lo); r->setVal(r_2); double y0 = nll.getVal(), y = y0 - kappa*std::pow(r_2-r_1,2); - if (verbose > 1) printf("At %s = %f:\tdelta(nll unprof) = %.5f\tdelta(nll appr) = %.5f\tkappa=%.5f\n", r->GetName(), r_2, y0-nll0, y-nll0, kappa); + if (verbose > 1) CombineLogger::instance().log("AsymptoticLimits.cc",__LINE__,std::string(Form("At %s = %f:\tdelta(nll unprof) = %.5f\tdelta(nll appr) = %.5f\tkappa=%.5f\n", r->GetName(), r_2, y0-nll0, y-nll0, kappa)),__func__); if (y < threshold) { r_lo = r_2; } else { r_hi = r_2; } } // profile at that point @@ -658,7 +652,7 @@ float AsymptoticLimits::findExpectedLimitFromCrossing(RooAbsReal &nll, RooRealVa } if (!ok && picky_) return std::numeric_limits::quiet_NaN(); double nll_prof = nll.getVal(); - if (verbose > 1) printf("At %s = %f:\tdelta(nll unprof) = %.5f\tdelta(nll prof) = %.5f\tdelta(nll appr) = %.5f\n", r->GetName(), rCross, nll_unprof-nll0, nll_prof-nll0, nll_unprof-nll0 - kappa*std::pow(rCross-r_1,2)); + if (verbose > 1) CombineLogger::instance().log("AsymptoticLimits.cc",__LINE__,std::string(Form("At %s = %f:\tdelta(nll unprof) = %.5f\tdelta(nll prof) = %.5f\tdelta(nll appr) = %.5f\n", r->GetName(), rCross, nll_unprof-nll0, nll_prof-nll0, nll_unprof-nll0 - kappa*std::pow(rCross-r_1,2))),__func__); if (fabs(nll_prof - threshold) < 0.1*minim2.tolerance()) { break; } // not yet bang on, so update r_0, kappa kappa = (nll_unprof - nll_prof)/std::pow(rCross-r_1,2); @@ -674,8 +668,8 @@ float AsymptoticLimits::findExpectedLimitFromCrossing(RooAbsReal &nll, RooRealVa } if (minosStat != -1) return rCross; } - if (verbose > 1) printf("fail search for crossing of %s between %f and %f\n", r->GetName(), rMin, rMax); - if (verbose > 0) Logger::instance().log(std::string(Form("AsymptoticLimits.cc: %d -- fail search for crossing of %s between %f and %f",__LINE__, r->GetName(), rMin, rMax)),Logger::kLogLevelDebug,__func__); + //if (verbose > 1) printf("fail search for crossing of %s between %f and %f\n", r->GetName(), rMin, rMax); + if (verbose > 1) CombineLogger::instance().log("AsymptoticLimits.cc",__LINE__,std::string(Form("[WARNING] fail search for crossing of %s between %f and %f", r->GetName(), rMin, rMax)),__func__); return std::numeric_limits::quiet_NaN(); } @@ -723,13 +717,13 @@ float AsymptoticLimits::calculateLimitFromGrid(RooRealVar *r , double quantile, } if (!rminfound){ - std::cout << "Cannot Find r with CL above threshold for quantile " << quantiles[iq] << ", using lowest value of r found" << std::endl; - if (verbose) Logger::instance().log(std::string(Form("AsymptoticLimits.cc: %d -- Cannot Find r with CL above threshold for quantile %g, using lowest value of r found",__LINE__,quantiles[iq])),Logger::kLogLevelDebug,__func__); + //std::cout << "Cannot Find r with CL above threshold for quantile " << quantiles[iq] << ", using lowest value of r found" << std::endl; + CombineLogger::instance().log("AsymptoticLimits.cc",__LINE__,std::string(Form("Cannot Find r with CL above threshold for quantile %g, using lowest value of r found",quantiles[iq])),__func__); return rlower; } if (!rmaxfound){ - std::cout << "Cannot Find r with CL below threshold for quantile " << quantiles[iq] << ", using largest value of r found" << std::endl; - if (verbose) Logger::instance().log(std::string(Form("AsymptoticLimits.cc: %d -- Cannot Find r with CL below threshold for quantile %g, using largest value of r found",__LINE__,quantiles[iq])),Logger::kLogLevelDebug,__func__); + //std::cout << "Cannot Find r with CL below threshold for quantile " << quantiles[iq] << ", using largest value of r found" << std::endl; + CombineLogger::instance().log("AsymptoticLimits.cc",__LINE__,std::string(Form("Cannot Find r with CL below threshold for quantile %g, using largest value of r found",quantiles[iq])),__func__); return rupper; } diff --git a/src/CachingNLL.cc b/src/CachingNLL.cc index 55b550d04bc..f50443deece 100644 --- a/src/CachingNLL.cc +++ b/src/CachingNLL.cc @@ -22,7 +22,7 @@ #include "../interface/CachingMultiPdf.h" #include "../interface/RooCheapProduct.h" #include "../interface/Accumulators.h" -#include "../interface/Logger.h" +#include "../interface/CombineLogger.h" #include "vectorized.h" namespace cacheutils { @@ -486,7 +486,7 @@ cacheutils::makeCachingPdf(RooAbsReal *pdf, const RooArgSet *obs) { return new CachingHistPdf2(pdf, obs); } else if (gaussNll && typeid(*pdf) == typeid(RooGaussian)) { if (runtimedef::get("DBG_GAUSS")) { - std::cout << "Creating CachingGaussPdf for " << pdf->GetName() << "\n"; + CombineLogger::instance().log("CachingNLL.cc",__LINE__,std::string(Form("Creating CachingGaussPdf for %s",pdf->GetName())),__func__); pdf->Print("v"); } return new CachingGaussPdf(pdf, obs); @@ -521,7 +521,7 @@ cacheutils::makeCachingPdf(RooAbsReal *pdf, const RooArgSet *obs) { return new CachingCMSHistSum(pdf, obs); } else { if (verb) { - std::cout << "I don't have an optimized implementation for " << pdf->ClassName() << " (" << pdf->GetName() << ")" << std::endl; + CombineLogger::instance().log("CachingNLL.cc",__LINE__,std::string(Form("I don't have an optimized implementation for %s (%s)",pdf->ClassName(),pdf->GetName())),__func__); } return new CachingPdf(pdf, obs); } @@ -646,7 +646,7 @@ cacheutils::CachingAddNLL::evaluate() const double refintegral = integrals_[itc - coeffs_.begin()]->getVal(); if (refintegral > 0) { if (std::abs((integral - refintegral)/refintegral) > 1e-5) { - printf("integrals don't match: %+10.6f %+10.6f %10.7f %s\n", refintegral, integral, refintegral ? std::abs((integral - refintegral)/refintegral) : 0, itp->pdf()->GetName()); + CombineLogger::instance().log("CachingNLL.cc",__LINE__,std::string(Form("integrals don't match: %+10.6f %+10.6f %10.7f %s\n", refintegral, integral, refintegral ? std::abs((integral - refintegral)/refintegral) : 0, itp->pdf()->GetName() )),__func__); allBasicIntegralsOk = false; basicIntegrals_ = 0; // don't waste time on this anymore } @@ -656,10 +656,10 @@ cacheutils::CachingAddNLL::evaluate() const } } #ifdef LOG_ADDPDFS - printf("%s coefficient %s (%s) = %20.15f\n", itp->pdf()->GetName(), (*itc)->GetName(), (*itc)->ClassName(), coeff); + CombineLogger::instance().log("CachingNLL.cc",__LINE__,std::string(Form("%s coefficient %s (%s) = %20.15f\n", itp->pdf()->GetName(), (*itc)->GetName(), (*itc)->ClassName(), coeff)),__func__); //(*itc)->Print(""); for (unsigned int i = 0, n = pdfvals.size(); i < n; ++i) { - if (i%84==0) printf("%-80s[%3d] = %20.15f\n", itp->pdf()->GetName(), i, pdfvals[i]); + if (i%84==0) CombineLogger::instance().log("CachingNLL.cc",__LINE__,std::string(Form("%-80s[%3d] = %20.15f\n", itp->pdf()->GetName(), i, pdfvals[i])),__func__); } #endif // update running sum @@ -716,8 +716,8 @@ cacheutils::CachingAddNLL::evaluate() const static bool expEventsNoNorm = runtimedef::get("ADDNLL_ROOREALSUM_NONORM"); double expectedEvents = (isRooRealSum_ && !expEventsNoNorm ? pdf_->getNorm(data_->get()) : sumCoeff); if (expectedEvents <= 0) { - std::cout << "WARNING: underflow in total event yield for " << pdf_->GetName() << ", expected yield = " << expectedEvents << " (observed: " << sumWeights_ << ")" << std::endl; - Logger::instance().log(std::string(Form("CachingNLL.cc: %d -- underflow (expected events <=0) in total event yield for %s, expected yield = %g (observed: %g)",__LINE__,pdf_->GetName(), expectedEvents, sumWeights_)),Logger::kLogLevelInfo,__func__); + //std::cout << "WARNING: underflow in total event yield for " << pdf_->GetName() << ", expected yield = " << expectedEvents << " (observed: " << sumWeights_ << ")" << std::endl; + CombineLogger::instance().log("CachingNLL.cc",__LINE__,std::string(Form("underflow (expected events <=0) in total event yield for %s, expected yield = %g (observed: %g)",pdf_->GetName(), expectedEvents, sumWeights_)),__func__); if (!CachingSimNLL::noDeepLEE_) logEvalError("Expected number of events is negative"); else CachingSimNLL::hasError_ = true; expectedEvents = 1e-6; } @@ -798,8 +798,10 @@ cacheutils::CachingAddNLL::setData(const RooAbsData &data) //printf("bin %3d: center %+8.5f ( data %+8.5f , diff %+8.5f ), width %8.5f, data weight %10.5f, channel %s\n", ibin, bc, dc, abs(dc-bc)/bins.binWidth(ibin), bins.binWidth(ibin), data_->weight(), pdf_->GetName()); binWidths_[ibin] = bins.binWidth(ibin); if (std::abs(bc-dc) > 1e-5*binWidths_[ibin]) { - printf("channel %s, for observable %s, bin %d mismatch: binning %+8.5f ( data %+8.5f , diff %+7.8f of width %8.5f\n", - pdf_->GetName(), xvar->GetName(), ibin, bc, dc, std::abs(bc-dc)/binWidths_[ibin], binWidths_[ibin]); + //printf("channel %s, for observable %s, bin %d mismatch: binning %+8.5f ( data %+8.5f , diff %+7.8f of width %8.5f\n", + // pdf_->GetName(), xvar->GetName(), ibin, bc, dc, std::abs(bc-dc)/binWidths_[ibin], binWidths_[ibin]); + CombineLogger::instance().log("CachingNLL.cc",__LINE__,std::string(Form("channel %s, for observable %s, bin %d mismatch: binning %+8.5f ( data %+8.5f , diff %+7.8f of width %8.5f", + pdf_->GetName(), xvar->GetName(), ibin, bc, dc, std::abs(bc-dc)/binWidths_[ibin], binWidths_[ibin])),__func__); canBasicIntegrals_ = 0; break; } @@ -807,7 +809,9 @@ cacheutils::CachingAddNLL::setData(const RooAbsData &data) } if (all_equal) binWidths_.resize(1); } else { - printf("channel %s (binned likelihood? %d), can't do binned intergals. nobs %d, obs %s, nbins %d, ndata %d\n", pdf_->GetName(), pdf_->getAttribute("BinnedLikelihood"), obs->getSize(), (xvar ? xvar->GetName() : ""), (xvar ? xvar->numBins() : -999), data_->numEntries()); + //printf("channel %s (binned likelihood? %d), can't do binned intergals. nobs %d, obs %s, nbins %d, ndata %d\n", pdf_->GetName(), pdf_->getAttribute("BinnedLikelihood"), obs->getSize(), (xvar ? xvar->GetName() : ""), (xvar ? xvar->numBins() : -999), data_->numEntries()); + CombineLogger::instance().log("CachingNLL.cc",__LINE__,std::string(Form("channel %s (binned likelihood? %d), can't do binned intergals. nobs %d, obs %s, nbins %d, ndata %d" + , pdf_->GetName(), pdf_->getAttribute("BinnedLikelihood"), obs->getSize(), (xvar ? xvar->GetName() : ""), (xvar ? xvar->numBins() : -999), data_->numEntries())),__func__); } } propagateData(); @@ -1078,8 +1082,8 @@ cacheutils::CachingSimNLL::evaluate() const for (std::vector::const_iterator it = constrainPdfs_.begin(), ed = constrainPdfs_.end(); it != ed; ++it, ++itz) { double pdfval = (*it)->getVal(nuis_); if (!isnormal(pdfval) || pdfval <= 0) { - std::cout << "WARNING: underflow constraint pdf " << (*it)->GetName() << ", value = " << pdfval << std::endl; - Logger::instance().log(std::string(Form("CachingNLL.cc: %d -- underflow (pdf evaluates to <=0) of constraint pdf %s, value = %g ",__LINE__,(*it)->GetName(), pdfval)),Logger::kLogLevelInfo,__func__); + //std::cout << "WARNING: underflow constraint pdf " << (*it)->GetName() << ", value = " << pdfval << std::endl; + CombineLogger::instance().log("CachingNLL.cc",__LINE__,std::string(Form("underflow (pdf evaluates to <=0) of constraint pdf %s, value = %g ",(*it)->GetName(), pdfval)),__func__); if (gentleNegativePenalty_) { ret += 25; continue; } if (!noDeepLEE_) logEvalError((std::string("Constraint pdf ")+(*it)->GetName()+" evaluated to zero, negative or error").c_str()); pdfval = 1e-9; @@ -1313,7 +1317,7 @@ void cacheutils::CachingSimNLL::setMaskNonDiscreteChannels(bool mask) { internalMasks_[idx] = true; activeParameters_.add((*it)->params(), /*silent=*/true); activeCatParameters_.add((*it)->catParams(), /*silent=*/true); - std::cout << "Enabling channel " << (*it)->GetName() << " that depends on non-const category " << cat->GetName() << std::endl; + CombineLogger::instance().log("CachingNLL.cc",__LINE__,std::string(Form("Enabling channel %s that depends on non-constant category %s",(*it)->GetName(), cat->GetName())),__func__); break; } } diff --git a/src/CascadeMinimizer.cc b/src/CascadeMinimizer.cc index 928e46b2534..1c5be035728 100644 --- a/src/CascadeMinimizer.cc +++ b/src/CascadeMinimizer.cc @@ -4,7 +4,7 @@ #include "../interface/CloseCoutSentry.h" #include "../interface/utils.h" #include "../interface/ProfilingTools.h" -#include "../interface/Logger.h" +#include "../interface/CombineLogger.h" #include #include @@ -131,8 +131,8 @@ bool CascadeMinimizer::improve(int verbose, bool cascade, bool forceResetMinimiz if (cascade && !outcome && !fallbacks_.empty()) { int nominalStrat(strategy_); if (verbose > 0) { - std::cerr << "Failed minimization with " << nominalType << "," << nominalAlgo << " and tolerance " << nominalTol << std::endl; - Logger::instance().log(std::string(Form("CascadeMinimizer.cc: %d -- Failed minimization with %s, %s and tolerance %g",__LINE__,nominalType.c_str(),nominalAlgo.c_str(),nominalTol)),Logger::kLogLevelDebug,__func__); + //std::cerr << "Failed minimization with " << nominalType << "," << nominalAlgo << " and tolerance " << nominalTol << std::endl; + CombineLogger::instance().log("CascadeMinimizer.cc",__LINE__,std::string(Form("Failed minimization with %s, %s and tolerance %g",nominalType.c_str(),nominalAlgo.c_str(),nominalTol)),__func__); } for (std::vector::const_iterator it = fallbacks_.begin(), ed = fallbacks_.end(); it != ed; ++it) { Significance::MinimizerSentry minimizerConfig(it->type + "," + it->algo, it->tolerance != Algo::default_tolerance() ? it->tolerance : nominalTol); // set the global defaults @@ -142,8 +142,8 @@ bool CascadeMinimizer::improve(int verbose, bool cascade, bool forceResetMinimiz nominalTol != ROOT::Math::MinimizerOptions::DefaultTolerance() || myStrategy != nominalStrat) { if (verbose > 0) { - std::cerr << "Will fallback to minimization using " << it->algo << ", strategy " << myStrategy << " and tolerance " << it->tolerance << std::endl; - Logger::instance().log(std::string(Form("CascadeMinimizer.cc: %d -- Will fallback to minimization using %s, strategy %d and tolerance %g",__LINE__,(it->algo).c_str(),myStrategy,it->tolerance)),Logger::kLogLevelDebug,__func__); + //std::cerr << "Will fallback to minimization using " << it->algo << ", strategy " << myStrategy << " and tolerance " << it->tolerance << std::endl; + CombineLogger::instance().log("CascadeMinimizer.cc",__LINE__,std::string(Form("Will fallback to minimization using %s, strategy %d and tolerance %g",(it->algo).c_str(),myStrategy,it->tolerance)),__func__); } minimizer_->setEps(ROOT::Math::MinimizerOptions::DefaultTolerance()); minimizer_->setStrategy(myStrategy); @@ -185,7 +185,7 @@ bool CascadeMinimizer::improveOnce(int verbose, bool noHesse) if (rooFitOffset) minimizer_->setOffsetting(std::max(0,rooFitOffset)); outcome = nllutils::robustMinimize(nll_, *minimizer_, verbose, setZeroPoint_); } else { - if (verbose+2>0) Logger::instance().log(std::string(Form("CascadeMinimizer.cc: %d -- Minimisation configured with Type=%s, Algo=%s, strategy=%d, tolerance=%g",__LINE__,myType.c_str(),myAlgo.c_str(),myStrategy,tol)),Logger::kLogLevelInfo,__func__); + if (verbose+2>0) CombineLogger::instance().log("CascadeMinimizer.cc",__LINE__,std::string(Form("Minimisation configured with Type=%s, Algo=%s, strategy=%d, tolerance=%g",myType.c_str(),myAlgo.c_str(),myStrategy,tol)),__func__); cacheutils::CachingSimNLL *simnll = setZeroPoint_ ? dynamic_cast(&nll_) : 0; if (simnll) simnll->setZeroPoint(); if ((!simnll) && optConst) minimizer_->optimizeConst(std::max(0,optConst)); @@ -202,19 +202,22 @@ bool CascadeMinimizer::improveOnce(int verbose, bool noHesse) minimizer_->setPrintLevel(std::max(0,verbose-3)); status = minimizer_->hesse(); minimizer_->setPrintLevel(verbose-1); - if (verbose+2>0 ) Logger::instance().log(std::string(Form("CascadeMinimizer.cc: %d -- Hesse finished with status=%d",__LINE__,status)),Logger::kLogLevelDebug,__func__); + if (verbose+2>0 ) CombineLogger::instance().log("CascadeMinimizer.cc",__LINE__,std::string(Form("Hesse finished with status=%d",status)),__func__); } if (simnll) simnll->clearZeroPoint(); outcome = (status == 0 || status == 1); - if (status==1) std::cerr << "[WARNING] Minimisation finished with status 1 (covariance forced positive definite), this could indicate a problem with the minimim!" << std::endl; + // Severe enough that we should print this to the terminal too + if (status==1) { + std::cerr << "[WARNING] Minimisation finished with status 1 (covariance forced positive definite), this could indicate a problem with the minimim!" << std::endl; + if (verbose+2>0 ) CombineLogger::instance().log("CascadeMinimizer.cc",__LINE__,"[WARNING] Minimisation finished with status 1 (covariance forced positive definite), this could indicate a problem with the minimim.",__func__); + } if (verbose+2>0 ) { - Logger::instance().log(std::string(Form("CascadeMinimizer.cc: %d -- Minimisation finished with status=%d",__LINE__,status)),Logger::kLogLevelInfo,__func__); - if (status==1) Logger::instance().log(std::string(Form("CascadeMinimizer.cc: %d -- finished with status 1 (covariance forced positive definite), this could indicate a problem with the minimim.",__LINE__)),Logger::kLogLevelDebug,__func__); - } + CombineLogger::instance().log("CascadeMinimizer.cc",__LINE__,std::string(Form("Minimisation finished with status=%d",status)),__func__); + } } if (verbose+2>0 ){ - if (outcome) Logger::instance().log(std::string(Form("CascadeMinimizer.cc: %d -- Minimization success! status=0",__LINE__)),Logger::kLogLevelInfo,__func__); - else Logger::instance().log(std::string(Form("CascadeMinimizer.cc: %d -- Minimization ended with latest status != 0 or 1",__LINE__)),Logger::kLogLevelDebug,__func__); + if (outcome) CombineLogger::instance().log("CascadeMinimizer.cc",__LINE__,"Minimization success! status=0",__func__); + else CombineLogger::instance().log("CascadeMinimizer.cc",__LINE__,"Minimization ended with latest status != 0 or 1",__func__); } // restore original params @@ -257,7 +260,7 @@ bool CascadeMinimizer::minos(const RooArgSet & params , int verbose ) { // need to re-run Migrad before running minos minimizer_->minimize(myType.c_str(), "Migrad"); int iret = minimizer_->minos(params); - if (verbose>0 ) Logger::instance().log(std::string(Form("CascadeMinimizer.cc: %d -- Minos finished with status=%d",__LINE__,iret)),Logger::kLogLevelDebug,__func__); + if (verbose>0 ) CombineLogger::instance().log("CascadeMinimizer.cc",__LINE__,std::string(Form("Minos finished with status=%d",iret)),__func__); freezeDiscParams(false); //std::cout << "Run Minos in "; tw.Print(); std::cout << std::endl; @@ -474,10 +477,10 @@ bool CascadeMinimizer::minimize(int verbose, bool cascade) bool boundariesNotOk = utils::anyParameterAtBoundaries(*nllParams, verbose); if(boundariesNotOk && verbose > 0){ - fprintf(CloseCoutSentry::trueStdOutGlobal(), - " [WARNING] After the fit some parameters are at their boundary.\n" - " [WARNING] Are you sure your model is correct?\n"); - Logger::instance().log(std::string(Form("CascadeMinimizer.cc: %d -- After fit, some parameters are found at the boundary (within ~1sigma)",__LINE__)),Logger::kLogLevelInfo,__func__); + //fprintf(CloseCoutSentry::trueStdOutGlobal(), + // " [WARNING] After the fit some parameters are at their boundary.\n" + // " [WARNING] Are you sure your model is correct?\n"); + CombineLogger::instance().log("CascadeMinimizer.cc",__LINE__,"[WARNING] After fit, some parameters are found at the boundary (within ~1sigma)",__func__); } freezeDiscParams(false); return ret; @@ -779,9 +782,9 @@ void CascadeMinimizer::applyOptions(const boost::program_options::variables_map // check default minimizer type/algo if they are set and make sense if (vm.count("cminDefaultMinimizerAlgo")){ if (! checkAlgoInType(defaultMinimizerType_,defaultMinimizerAlgo_)) { - std::cerr << Form("The combination of minimizer type/algo %s/%s, is not recognized. Please set these with --cminDefaultMinimizerType and --cminDefaultMinimizerAlgo",defaultMinimizerType_.c_str(),defaultMinimizerAlgo_.c_str()); - //Logger::instance().log(std::string(Form("CascadeMinimizer.cc: %d -- The combination of minimizer type/algo %s/%s, is not recognized. Please set these with --cminDefaultMinimizerType and --cminDefaultMinimizerAlgo",__LINE__,defaultMinimizerType_.c_str(),defaultMinimizerAlgo_.c_str())),Logger::kLogLevelError,__func__); - exit(0); + // severe enough to print to terminal + std::cerr << Form("The combination of minimizer type/algo %s/%s, is not recognized. Please set these with --cminDefaultMinimizerType and --cminDefaultMinimizerAlgo",defaultMinimizerType_.c_str(),defaultMinimizerAlgo_.c_str()); + exit(0); } } @@ -823,16 +826,11 @@ void CascadeMinimizer::applyOptions(const boost::program_options::variables_map } } if (! checkAlgoInType(type,algo)) { - std::cerr << Form("The fallback combination of minimizer type/algo %s/%s, is not recognized. Please check --cminFallbackAlgo again",type.c_str(),algo.c_str()); - //Logger::instance().log(std::string(Form("CascadeMinimizer.cc: %d -- The fallback combination of minimizer type/algo %s/%s, is not recognized. Please check --cminFallbackAlgo again",__LINE__,defaultMinimizerType_.c_str(),algo.c_str())),Logger::kLogLevelError,__func__); - exit(0); - } + std::cerr << Form("The fallback combination of minimizer type/algo %s/%s, is not recognized. Please check --cminFallbackAlgo again",type.c_str(),algo.c_str()); + exit(0); + } fallbacks_.push_back(Algo(type, algo, tolerance, strategy)); - std::cout << "Configured fallback algorithm " << - ", type " << fallbacks_.back().type << - ", algo " << fallbacks_.back().algo << - ", strategy " << fallbacks_.back().strategy << - ", tolerance " << fallbacks_.back().tolerance << std::endl; + CombineLogger::instance().log("CascadeMinimizer.cc",__LINE__,std::string(Form("Configured fallback algorithm, type %s, algo %s, strategy %d, tolerance %g",fallbacks_.back().type.data(),fallbacks_.back().algo.data(),fallbacks_.back().strategy,fallbacks_.back().tolerance)),__func__); } } @@ -931,8 +929,8 @@ bool CascadeMinimizer::autoBoundsOk(int verbose) { } } if (!ok && verbose) { - std::cout << "At least one of the POIs was close to the boundary, repeating the fit." << std::endl; - Logger::instance().log(std::string(Form("CascadeMinimizer.cc: %d -- On checking with autoBounds on, At least one of the POIs was close to the boundary, repeating the fit.",__LINE__)),Logger::kLogLevelDebug,__func__); + //std::cout << "At least one of the POIs was close to the boundary, repeating the fit." << std::endl; + CombineLogger::instance().log("CascadeMinimizer.cc",__LINE__,"On checking with autoBounds on, at least one of the POIs was close to the boundary, combine is now repeating the fit.",__func__); } return ok; } diff --git a/src/Combine.cc b/src/Combine.cc index b2281c7928f..38cef32c95c 100644 --- a/src/Combine.cc +++ b/src/Combine.cc @@ -65,7 +65,7 @@ #include "../interface/CMSHistFunc.h" #include "../interface/CMSHistSum.h" -#include "../interface/Logger.h" +#include "../interface/CombineLogger.h" using namespace RooStats; using namespace RooFit; @@ -669,11 +669,11 @@ void Combine::run(TString hlfFile, const std::string &dataset, double &limit, do } if (verbose > 0) { - std::cout << "Floating the following parameters: "; toFloat.Print(""); - Logger::instance().log(std::string(Form("Combine.cc: %d -- Floating the following parameters: ",__LINE__)),Logger::kLogLevelInfo,__func__); + //std::cout << "Floating the following parameters: "; toFloat.Print(""); + CombineLogger::instance().log("Combine.cc",__LINE__,"Floating the following parameters:",__func__); std::unique_ptr iter(toFloat.createIterator()); for (RooAbsArg *a = (RooAbsArg*) iter->Next(); a != 0; a = (RooAbsArg*) iter->Next()) { - Logger::instance().log(std::string(Form("Combine.cc: %d %s ",__LINE__,a->GetName())),Logger::kLogLevelInfo,__func__); + CombineLogger::instance().log("Combine.cc",__LINE__,a->GetName(),__func__); } } utils::setAllConstant(toFloat, false); @@ -704,11 +704,11 @@ void Combine::run(TString hlfFile, const std::string &dataset, double &limit, do } if (verbose > 0) { - std::cout << "Freezing the following parameters: "; toFreeze.Print(""); - Logger::instance().log(std::string(Form("Combine.cc: %d -- Freezing the following parameters: ",__LINE__)),Logger::kLogLevelInfo,__func__); + //std::cout << "Freezing the following parameters: "; toFreeze.Print(""); + CombineLogger::instance().log("Combine.cc",__LINE__,"Freezing the following parameters: ",__func__); std::unique_ptr iter(toFreeze.createIterator()); for (RooAbsArg *a = (RooAbsArg*) iter->Next(); a != 0; a = (RooAbsArg*) iter->Next()) { - Logger::instance().log(std::string(Form("Combine.cc: %d %s ",__LINE__,a->GetName())),Logger::kLogLevelInfo,__func__); + CombineLogger::instance().log("Combine.cc",__LINE__,a->GetName(),__func__); } } utils::setAllConstant(toFreeze, true); @@ -982,11 +982,11 @@ void Combine::run(TString hlfFile, const std::string &dataset, double &limit, do // print the values of the parameters used to generate the toy if (verbose > 2) { - Logger::instance().log(std::string(Form("Combine.cc: %d -- Generate Asimov toy from parameter values ... ",__LINE__)),Logger::kLogLevelInfo,__func__); - std::unique_ptr iter(genPdf->getParameters((const RooArgSet*)0)->createIterator()); - for (RooAbsArg *a = (RooAbsArg *) iter->Next(); a != 0; a = (RooAbsArg *) iter->Next()) { - TString varstring = utils::printRooArgAsString(a); - Logger::instance().log(std::string(Form("Combine.cc: %d -- %s",__LINE__,varstring.Data())),Logger::kLogLevelInfo,__func__); + CombineLogger::instance().log("Combine.cc",__LINE__, "Generate Asimov toy from parameter values ... ",__func__); + std::unique_ptr iter(genPdf->getParameters((const RooArgSet*)0)->createIterator()); + for (RooAbsArg *a = (RooAbsArg *) iter->Next(); a != 0; a = (RooAbsArg *) iter->Next()) { + TString varstring = utils::printRooArgAsString(a); + CombineLogger::instance().log("Combine.cc",__LINE__,varstring.Data(),__func__); } } // Also save the current state of the tree here but specify the quantile as -2 (i.e not the default, something specific to the toys) @@ -1007,8 +1007,6 @@ void Combine::run(TString hlfFile, const std::string &dataset, double &limit, do if (snap) writeToysHere->WriteTObject(snap, "toy_asimov_snapshot"); } } - //std::cout << "Computing" << (iToy==0 ? " observed " :" expected ")<<" results starting from " << ((toysFrequentist_ && !bypassFrequentistFit_) ? " post-fit " : " pre-fit ") << " (nuisance) parameters " << std::endl; - //if (verbose) Logger::instance().log(std::string(Form("Combine.cc: %d -- Computing %s results starting from %s parameters",__LINE__, (iToy==0 ? " observed " :" expected "), ( (toysFrequentist_ && !bypassFrequentistFit_) ? "post-fit" : "pre-fit") )),Logger::kLogLevelInfo,__func__); if (MH) MH->setVal(mass_); if (verbose > (isExtended ? 3 : 2)) utils::printRAD(dobs); if (mklimit(w,mc,mc_bonly,*dobs,limit,limitErr)) commitPoint(0,g_quantileExpected_); //tree->Fill(); @@ -1081,11 +1079,11 @@ void Combine::run(TString hlfFile, const std::string &dataset, double &limit, do */ std::cout << "Generate toy " << iToy << "/" << nToys << std::endl; if (verbose > 2) { - Logger::instance().log(std::string(Form("Combine.cc: %d -- Generating toy %d/%d, from parameter values ... ",__LINE__,iToy,nToys)),Logger::kLogLevelInfo,__func__); - std::unique_ptr iter(genPdf->getParameters((const RooArgSet*)0)->createIterator()); - for (RooAbsArg *a = (RooAbsArg *) iter->Next(); a != 0; a = (RooAbsArg *) iter->Next()) { + CombineLogger::instance().log("Combine.cc",__LINE__, std::string(Form("Generating toy %d/%d, from parameter values ... ",iToy,nToys)),__func__); + std::unique_ptr iter(genPdf->getParameters((const RooArgSet*)0)->createIterator()); + for (RooAbsArg *a = (RooAbsArg *) iter->Next(); a != 0; a = (RooAbsArg *) iter->Next()) { TString varstring = utils::printRooArgAsString(a); - Logger::instance().log(std::string(Form("Combine.cc: %d -- %s",__LINE__,varstring.Data())),Logger::kLogLevelInfo,__func__); + CombineLogger::instance().log("Combine.cc" ,__LINE__,varstring.Data(),__func__); } } @@ -1237,10 +1235,10 @@ void Combine::addDiscreteNuisances(RooWorkspace *w){ while (RooAbsArg *arg = (RooAbsArg*)dp->Next()) { RooCategory *cat = dynamic_cast(arg); if (cat && (!cat->isConstant() || runtimedef::get("ADD_DISCRETE_FALLBACK"))) { - if (verbose){ - std::cout << "Adding discrete " << cat->GetName() << "\n"; - if (verbose) Logger::instance().log(std::string(Form("Combine.cc: %d -- Adding discrete %s ",__LINE__,cat->GetName())),Logger::kLogLevelInfo,__func__); - } + if (verbose){ + //std::cout << "Adding discrete " << cat->GetName() << "\n"; + CombineLogger::instance().log("Combine.cc",__LINE__,std::string(Form("Adding discrete %s ",cat->GetName())),__func__); + } (CascadeMinimizerGlobalConfigs::O().pdfCategories).add(*arg); } } @@ -1253,10 +1251,10 @@ void Combine::addDiscreteNuisances(RooWorkspace *w){ RooCategory *cat = dynamic_cast(arg); if (! (std::string(cat->GetName()).find("pdfindex") != std::string::npos )) continue; if (cat/* && !cat->isConstant()*/) { - if (verbose){ - std::cout << "Adding discrete " << cat->GetName() << "\n"; - if (verbose) Logger::instance().log(std::string(Form("Combine.cc: %d -- Adding discrete %s ",__LINE__,cat->GetName())),Logger::kLogLevelInfo,__func__); - } + if (verbose){ + //std::cout << "Adding discrete " << cat->GetName() << "\n"; + CombineLogger::instance().log("Combine.cc",__LINE__,std::string(Form("Adding discrete %s ",cat->GetName())),__func__); + } (CascadeMinimizerGlobalConfigs::O().pdfCategories).add(*arg); } } diff --git a/src/CombineLogger.cc b/src/CombineLogger.cc new file mode 100644 index 00000000000..e7515725fd9 --- /dev/null +++ b/src/CombineLogger.cc @@ -0,0 +1,43 @@ +#include "../interface/CombineLogger.h" +using namespace std; + +// counter for Logger calls +int CombineLogger::nLogs=0; + +const char* CombineLogger::fName = "combine_logger.out"; + +CombineLogger* CombineLogger::pL = nullptr; + +CombineLogger& CombineLogger::instance() +{ + + if (pL == nullptr) + pL = new CombineLogger(); + + return *pL; +} + +CombineLogger::CombineLogger() +{ + outStream.open(fName, ios_base::out); +} + +void CombineLogger::log(const std::string & _file, const int _lineN, const string& _logmsg, const string& _function) +{ + std::cout << _logmsg << std::endl; + outStream << _file << "[" << _lineN << "] " << ": (in function: " << _function << ") - " << _logmsg << endl; + nLogs++; +} + +void CombineLogger::printLog() +{ + std::cout << nLogs << " log messages saved to " << fName << std::endl; +} + +CombineLogger::~CombineLogger() +{ + // Combine will delete + outStream.close(); + delete CombineLogger::pL; + CombineLogger::pL = nullptr; +} \ No newline at end of file diff --git a/src/FitDiagnostics.cc b/src/FitDiagnostics.cc index b8f9adabc87..acd7caebca2 100644 --- a/src/FitDiagnostics.cc +++ b/src/FitDiagnostics.cc @@ -28,7 +28,7 @@ #include "../interface/CloseCoutSentry.h" #include "../interface/CascadeMinimizer.h" #include "../interface/utils.h" -#include "../interface/Logger.h" +#include "../interface/CombineLogger.h" #include "../interface/RobustHesse.h" #include "../interface/ProfilingTools.h" @@ -173,8 +173,8 @@ bool FitDiagnostics::runSpecific(RooWorkspace *w, RooStats::ModelConfig *mc_s, R if ( currentToy_ > 1 && (saveShapes_) ) { - std::cerr << " ERROR, cannot use saveShapes with > 1 toy dataset, \n you should run multiple times with -t 1 using random seeds (-s -1) or remove those options." << std::endl; - if ( verbose > 0 ) Logger::instance().log(std::string(Form("FitDiagnostics.cc: %d -- cannot use saveShapes with > 1 toy dataset, \n you should run multiple times with -t 1 using random seeds (-s -1) or remove those options",__LINE__)),Logger::kLogLevelError,__func__); + //std::cerr << " ERROR, cannot use saveShapes with > 1 toy dataset, \n you should run multiple times with -t 1 using random seeds (-s -1) or remove those options." << std::endl; + CombineLogger::instance().log("FitDiagnostics.cc",__LINE__,"[ERROR] cannot use saveShapes with > 1 toy dataset, \n you should run multiple times with -t 1 using random seeds (-s -1) or remove those options",__func__); assert(0); } @@ -304,18 +304,18 @@ bool FitDiagnostics::runSpecific(RooWorkspace *w, RooStats::ModelConfig *mc_s, R if (!robustHesse_ && res_b->covQual() < 3){ if(!saveWithUncertainties_){ - std::cerr<<"[WARNING]: Unable to determine uncertainties on all fit parameters in b-only fit. Have a look at https://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part3/nonstandard/#fit-parameter-uncertainties for more information."< 0 ) Logger::instance().log(std::string(Form("FitDiagnostics.cc: %d -- Fit B-only, status = %d, numBadNLL = %d, covariance quality = %d",__LINE__,fitStatus_,numbadnll_,res_b->covQual())),Logger::kLogLevelDebug,__func__); + if ( verbose > 0 ) CombineLogger::instance().log("FitDiagnostics.cc",__LINE__,std::string(Form(" Fit B-only, status = %d, numBadNLL = %d, covariance quality = %d",fitStatus_,numbadnll_,res_b->covQual())),__func__); if (makePlots_ && currentToy_<1) { std::vector plots = utils::makePlots(*mc_b->GetPdf(), data, signalPdfNames_.c_str(), backgroundPdfNames_.c_str(), rebinFactor_,res_b); @@ -429,18 +429,18 @@ bool FitDiagnostics::runSpecific(RooWorkspace *w, RooStats::ModelConfig *mc_s, R saveWithUncertainties_=saveWithUncertsRequested_; //Reset saveWithUncertainties flag to original value in case it has been set to false due to covariance matrix issues in the b-only fit. if (!robustHesse_ && res_s->covQual() < 3){ if(!saveWithUncertainties_){ - std::cerr<<"[WARNING]: Unable to determine uncertainties on all fit parameters in s+b fit. Have a look at https://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part3/nonstandard/#fit-parameter-uncertainties for more information."< 0 ) Logger::instance().log(std::string(Form("FitDiagnostics.cc: %d -- Fit S+B, status = %d, numBadNLL = %d, covariance quality = %d",__LINE__,fitStatus_,numbadnll_,res_s->covQual())),Logger::kLogLevelDebug,__func__); + if ( verbose > 0 ) CombineLogger::instance().log("FitDiagnostics.cc",__LINE__,std::string(Form("Fit S+B, status = %d, numBadNLL = %d, covariance quality = %d",fitStatus_,numbadnll_,res_s->covQual())),__func__); // Additionally store the nll_sb - nll_bonly (=0.5*q0) nll_nll0_ = nll_sb_ - nll_bonly_; } @@ -867,8 +867,7 @@ void FitDiagnostics::getNormalizations(RooAbsPdf *pdf, const RooArgSet &obs, Roo { int ntoys = numToysForShapes_; - if (verbose > 0) - Logger::instance().log(std::string(Form("FitDiagnostics.cc: %d -- Generating toy data for evaluating per-bin uncertainties and covariances with post-fit nuisance parameters with %d toys", __LINE__, ntoys)), Logger::kLogLevelInfo, __func__); + if (verbose > 0) CombineLogger::instance().log("FitDiagnostics.cc",__LINE__,std::string(Form("Generating toy data for evaluating per-bin uncertainties and covariances with post-fit nuisance parameters with %d toys", ntoys)), __func__); sampler.generate(ntoys); std::unique_ptr params(pdf->getParameters(obs)); diff --git a/src/FitterAlgoBase.cc b/src/FitterAlgoBase.cc index c68b2c3acec..a11fcd80ecd 100644 --- a/src/FitterAlgoBase.cc +++ b/src/FitterAlgoBase.cc @@ -31,7 +31,7 @@ #include "../interface/ProfilingTools.h" #include "../interface/CachingNLL.h" -#include "../interface/Logger.h" +#include "../interface/CombineLogger.h" #include #include @@ -110,12 +110,15 @@ void FitterAlgoBase::applyOptionsBase(const boost::program_options::variables_ma if (robustFit_){ if (verbose) { - Logger::instance().log(std::string(Form("FitterAlgoBase.cc: %d -- Setting robust fit options to Tolerance=%g / Strategy=%d / Type,Algo=%s (note that defaults of CascadeMinimizer were taken where option not specified)",__LINE__,minimizerToleranceForMinos_,minimizerStrategyForMinos_,minimizerAlgoForMinos_.c_str())),Logger::kLogLevelInfo,__func__); + CombineLogger::instance().log("FitterAlgoBase.cc",__LINE__ + ,std::string(Form("Setting robust fit options to Tolerance=%g / Strategy=%d / Type,Algo=%s (note that defaults of CascadeMinimizer were taken where option not specified)" + ,minimizerToleranceForMinos_,minimizerStrategyForMinos_,minimizerAlgoForMinos_.c_str())) + ,__func__); } - std::cout << " Options for Robust Minimizer :: " << std::endl; - std::cout << " Tolerance " << minimizerToleranceForMinos_ <getVal(); if (runtimedef::get("SETPARAMETERS_AFTER_NLL")) { utils::setModelParameters(setPhysicsModelParameterExpression_, allParameters_); - if (verbose >= 3) { - double nll_new = nll->getVal(); - std::cout << "DELTA NLL FROM SETPARAMETERS = " << nll_new - nll0 << std::endl; - } + if (verbose >= 3) CombineLogger::instance().log("FitterAlgoBase.cc",__LINE__,std::string(Form("DELTA NLL FROM SETPARAMETERS = %f",nll->getVal() - nll0 )),__func__); } double delta68 = 0.5*ROOT::Math::chisquared_quantile_c(1-0.68,ndim); double delta95 = 0.5*ROOT::Math::chisquared_quantile_c(1-0.95,ndim); @@ -239,27 +239,28 @@ RooFitResult *FitterAlgoBase::doFit(RooAbsPdf &pdf, RooAbsData &data, const RooA if (!autoBoundsPOIs_.empty()) minim.setAutoBounds(&autoBoundsPOISet_); if (!autoMaxPOIs_.empty()) minim.setAutoMax(&autoMaxPOISet_); CloseCoutSentry sentry(verbose < 3); - if (verbose>1) std::cout << "do first Minimization " << std::endl; + if (verbose>1) CombineLogger::instance().log("FitterAlgoBase.cc",__LINE__,"do first Minimization",__func__); TStopwatch tw; if (verbose) tw.Start(); bool ok = minim.minimize(verbose); - if (verbose>1) { - std::cout << "Minimized in : " ; tw.Print(); - } + if (verbose>1) CombineLogger::instance().log("FitterAlgoBase.cc",__LINE__,std::string(Form("Minimized in %f seconds (%f CPU time)",tw.RealTime(),tw.CpuTime())),__func__); nll0Value_ = nll0; nllValue_ = nll->getVal() - nll0; if (verbose >= 3) { - printf("FINAL NLL - NLL0 VALUE = %.10g\n", nllValue_); + CombineLogger::instance().log("FitterAlgoBase.cc",__LINE__,std::string(Form("FINAL NLL - NLL0 VALUE = %.10g\n", nllValue_)),__func__); if (CascadeMinimizerGlobalConfigs::O().pdfCategories.getSize()>0) { - printf("FINAL CATEGORIES: "); + CombineLogger::instance().log("FitterAlgoBase.cc",__LINE__,"FINAL CATEGORIES",__func__); for (unsigned int ic = 0, nc = CascadeMinimizerGlobalConfigs::O().pdfCategories.getSize(); ic != nc; ++ic) { const RooCategory *cat = (RooCategory*)(CascadeMinimizerGlobalConfigs::O().pdfCategories.at(ic)); - printf("%s%s=%d", (ic > 0 ? "," : ""), cat->GetName(), cat->getIndex()); + CombineLogger::instance().log("FitterAlgoBase.cc",__LINE__,std::string(Form("%s%s=%d", (ic > 0 ? "," : ""), cat->GetName(), cat->getIndex())),__func__); } - printf("\n"); } } - if (!ok && !keepFailures_) { std::cout << "Initial minimization failed. Aborting." << std::endl; return 0; } + if (!ok && !keepFailures_) { + std::cout << "Initial minimization failed. Aborting." << std::endl; + CombineLogger::instance().log("FitterAlgoBase.cc",__LINE__,"Initial minimization failed. Aborting.",__func__); + return 0; + } if (doHesse) minim.hesse(); sentry.clear(); ret = (saveFitResult || rs.getSize() ? minim.save() : new RooFitResult("dummy","success")); @@ -340,15 +341,13 @@ RooFitResult *FitterAlgoBase::doFit(RooAbsPdf &pdf, RooAbsData &data, const RooA minim.improve(verbose-1); } if (verbose) { - std::cout << "Running Minos for POI " << std::endl; - Logger::instance().log(std::string(Form("FitterAlgoBase.cc: %d -- Running Minos for POI %s",__LINE__,r.GetName())),Logger::kLogLevelInfo,__func__); + //std::cout << "Running Minos for POI " << std::endl; + CombineLogger::instance().log("FitterAlgoBase.cc",__LINE__,std::string(Form("Running Minos for POI %s",r.GetName())),__func__); } minim.minimizer().setPrintLevel(2); if (verbose>1) {tw.Reset(); tw.Start();} if (minim.minos(RooArgSet(r))) { - if (verbose>1) { - std::cout << "Run Minos in "; tw.Print(); std::cout << std::endl; - } + if (verbose>1)CombineLogger::instance().log("FitterAlgoBase.cc",__LINE__,std::string(Form("Run Minos in %f seconds (%f CPU time)",tw.RealTime(),tw.CpuTime() )),__func__); rf.setRange("err68", r.getVal() + r.getAsymErrorLo(), r.getVal() + r.getAsymErrorHi()); rf.setAsymError(r.getAsymErrorLo(), r.getAsymErrorHi()); } @@ -356,8 +355,8 @@ RooFitResult *FitterAlgoBase::doFit(RooAbsPdf &pdf, RooAbsData &data, const RooA r.setVal(r0); r.setConstant(true); if (verbose) { - std::cout << "Robus Fit for POI " << std::endl; - Logger::instance().log(std::string(Form("FitterAlgoBase.cc: %d -- Running RobustFit for POI %s. Configured with strategy %d ",__LINE__,r.GetName(), minimizerStrategyForMinos_)),Logger::kLogLevelInfo,__func__); + //std::cout << "Robus Fit for POI " << std::endl; + CombineLogger::instance().log("FitterAlgoBase.cc",__LINE__,std::string(Form("Running RobustFit for POI %s. Configured with strategy %d ",r.GetName(), minimizerStrategyForMinos_)),__func__); } CascadeMinimizer minim2(*nll, CascadeMinimizer::Constrained); @@ -402,8 +401,8 @@ double FitterAlgoBase::findCrossing(CascadeMinimizer &minim, RooAbsReal &nll, Ro //double minimizerTolerance_ = minim.tolerance(); Significance::MinimizerSentry minimizerConfig(minimizerAlgoForMinos_, minimizerToleranceForMinos_); if (verbose) { - std::cout << "Searching for crossing at nll = " << level << " in the interval " << rStart << ", " << rBound << std::endl; - Logger::instance().log(std::string(Form("FitterAlgoBase.cc: %d -- Searching for crossing at nll = %g, in the interval %g < %s < %g",__LINE__,level, rStart,r.GetName(),rBound)),Logger::kLogLevelInfo,__func__); + //std::cout << "Searching for crossing at nll = " << level << " in the interval " << rStart << ", " << rBound << std::endl; + CombineLogger::instance().log("FitterAlgoBase.cc",__LINE__,std::string(Form("Searching for crossing at nll = %g, in the interval %g < %s < %g",level, rStart,r.GetName(),rBound)),__func__); } double rInc = stepSize_*(rBound - rStart); r.setVal(rStart); @@ -416,15 +415,15 @@ double FitterAlgoBase::findCrossing(CascadeMinimizer &minim, RooAbsReal &nll, Ro checkpoint.reset(minim.save()); } if (!ok && !keepFailures_) { - std::cout << "Error: minimization failed at " << r.GetName() << " = " << rStart << std::endl; - if (verbose) Logger::instance().log(std::string(Form("FitterAlgoBase.cc: %d -- Minimization failed at %s = %g",__LINE__,r.GetName(), rStart)),Logger::kLogLevelError,__func__); + //std::cout << "Error: minimization failed at " << r.GetName() << " = " << rStart << std::endl; + CombineLogger::instance().log("FitterAlgoBase.cc",__LINE__,std::string(Form("[ERROR] Minimization failed at %s = %g",r.GetName(), rStart)),__func__); return NAN; } double here = nll.getVal(); int nfail = 0; if (verbose > 0) { - printf(" %s lvl-here lvl-there stepping\n", r.GetName()); fflush(stdout); - Logger::instance().log(std::string(Form("FitterAlgoBase.cc: %d -- %s lvl-here lvl-there stepping ",__LINE__,r.GetName())),Logger::kLogLevelInfo,__func__); + //printf(" %s lvl-here lvl-there stepping\n", r.GetName()); fflush(stdout); + CombineLogger::instance().log("FitterAlgoBase.cc",__LINE__,std::string(Form(" %s lvl-here lvl-there stepping ",r.GetName())),__func__); } do { rStart += rInc; @@ -443,8 +442,8 @@ double FitterAlgoBase::findCrossing(CascadeMinimizer &minim, RooAbsReal &nll, Ro if (!ok && !keepFailures_) { nfail++; if (nfail >= maxFailedSteps_) { - std::cout << "Error: minimization failed at " << r.GetName() << " = " << rStart << std::endl; - if (verbose) Logger::instance().log(std::string(Form("FitterAlgoBase.cc: %d -- Maximum failed steps (max=%d) reached and Minimization failed at %s = %g ",__LINE__,maxFailedSteps_,r.GetName(), rStart)),Logger::kLogLevelError,__func__); + //std::cout << "Error: minimization failed at " << r.GetName() << " = " << rStart << std::endl; + CombineLogger::instance().log("FitterAlgoBase.cc",__LINE__,std::string(Form("Maximum failed steps (max=%d) reached and Minimization failed at %s = %g ",maxFailedSteps_,r.GetName(), rStart)),__func__); return NAN; } RooArgSet oldparams(checkpoint->floatParsFinal()); @@ -456,8 +455,8 @@ double FitterAlgoBase::findCrossing(CascadeMinimizer &minim, RooAbsReal &nll, Ro double there = here; here = nll.getVal(); if (verbose > 0) { - printf("%f %+.5f %+.5f %f\n", rStart, level-here, level-there, rInc); fflush(stdout); - Logger::instance().log(std::string(Form("FitterAlgoBase.cc: %d -- %f %+.5f %+.5f %f",__LINE__,rStart, level-here, level-there, rInc)),Logger::kLogLevelInfo,__func__); + //printf("%f %+.5f %+.5f %f\n", rStart, level-here, level-there, rInc); fflush(stdout); + CombineLogger::instance().log("FitterAlgoBase.cc",__LINE__,std::string(Form(" %f %+.5f %+.5f %f",rStart, level-here, level-there, rInc)),__func__); } if ( fabs(here - level) < 4*crossingTolerance_) { // set to the right point with interpolation @@ -514,8 +513,8 @@ double FitterAlgoBase::findCrossing(CascadeMinimizer &minim, RooAbsReal &nll, Ro } } while (fabs(rInc) > crossingTolerance_*stepSize_*std::max(1.0,rBound-rStart)); if (fabs(here - level) > 0.01) { - std::cout << "Error: closed range without finding crossing." << std::endl; - if (verbose) Logger::instance().log(std::string(Form("FitterAlgoBase.cc: %d -- Closed range without finding crossing! ",__LINE__)),Logger::kLogLevelError,__func__); + //std::cout << "Error: closed range without finding crossing." << std::endl; + CombineLogger::instance().log("FitterAlgoBase.cc",__LINE__,"[ERROR] Closed range without finding crossing! ",__func__); return NAN; } else { return r.getVal(); @@ -527,16 +526,16 @@ double FitterAlgoBase::findCrossingNew(CascadeMinimizer &minim, RooAbsReal &nll, CloseCoutSentry sentry(verbose < 3); if (verbose) { - fprintf(sentry.trueStdOut(), "Searching for crossing at nll = %g in the interval [ %g , %g ]\n", level, rStart, rBound); - Logger::instance().log(std::string(Form("FitterAlgoBase.cc: %d -- Searching for crossing at nll = %g in the interval [ %g , %g ] ",__LINE__,level, rStart, rBound)),Logger::kLogLevelInfo,__func__); + //fprintf(sentry.trueStdOut(), "Searching for crossing at nll = %g in the interval [ %g , %g ]\n", level, rStart, rBound); + CombineLogger::instance().log("FitterAlgoBase.cc",__LINE__,std::string(Form("Searching for crossing at nll = %g in the interval [ %g , %g ] ",level, rStart, rBound)),__func__); } //std::unique_ptr allpars(nll.getParameters((const RooArgSet *)0)); //utils::CheapValueSnapshot checkpoint(*allpars); r.setVal(rStart); if (!minim.improve(verbose-1)) { - fprintf(sentry.trueStdOut(), "Error: minimization failed at %s = %g\n", r.GetName(), rStart); - if (verbose) Logger::instance().log(std::string(Form("FitterAlgoBase.cc: %d -- Minimization failed at %s = %g",__LINE__,r.GetName(), rStart)),Logger::kLogLevelError,__func__); + //fprintf(sentry.trueStdOut(), "Error: minimization failed at %s = %g\n", r.GetName(), rStart); + CombineLogger::instance().log("FitterAlgoBase.cc",__LINE__,std::string(Form("[ERROR] Minimization failed at %s = %g",r.GetName(), rStart)),__func__); return NAN; } double quadCorr = 0.0; @@ -551,26 +550,29 @@ double FitterAlgoBase::findCrossingNew(CascadeMinimizer &minim, RooAbsReal &nll, nll.clearEvalErrorLog(); double yStart = nll.getVal(); if (nll.numEvalErrors() > 0 || std::isnan(yStart) || std::isinf(yStart)) { - fprintf(sentry.trueStdOut(), "Error: logEvalErrors on stat of loop for iteration %d, x %+10.6f\n", iter, rVal); return NAN; - if (verbose > 0) Logger::instance().log(std::string(Form("FitterAlgoBase.cc: %d -- logEvalErrors reported from NLL on start of loop for iteration %d, x %+10.6f",__LINE__, iter, rVal)),Logger::kLogLevelDebug,__func__); + //fprintf(sentry.trueStdOut(), "Error: logEvalErrors on stat of loop for iteration %d, x %+10.6f\n", iter, rVal); return NAN; + CombineLogger::instance().log("FitterAlgoBase.cc",__LINE__,std::string(Form("[ERROR] logEvalErrors reported from NLL on start of loop for iteration %d, x %+10.6f", iter, rVal)),__func__); } double rInc = stepSize*(rBound - rStart); if (rInc == 0) break; if (verbose > 1) { - fprintf(sentry.trueStdOut(), "x %+10.6f y %+10.6f step %+10.6f [ START OF ITER %d, bound %+10.6f ]\n", rVal, yStart-level, rInc, iter, rBound); - Logger::instance().log(std::string(Form("FitterAlgoBase.cc: %d -- x %+10.6f y %+10.6f step %+10.6f [ START OF ITER %d, bound %+10.6f ]",__LINE__,rVal, yStart-level, rInc, iter, rBound)),Logger::kLogLevelInfo,__func__); + //fprintf(sentry.trueStdOut(), "x %+10.6f y %+10.6f step %+10.6f [ START OF ITER %d, bound %+10.6f ]\n", rVal, yStart-level, rInc, iter, rBound); + CombineLogger::instance().log("FitterAlgoBase.cc",__LINE__,std::string(Form(" x %+10.6f y %+10.6f step %+10.6f [ START OF ITER %d, bound %+10.6f ]",rVal, yStart-level, rInc, iter, rBound)),__func__); } // first move w/o profiling bool hitbound = true; //, hiterr = false; while (unbound || (rBound - rVal - rInc)*rInc >= 0) { // if I've not yet reached the boundary rVal += rInc; r.setVal(rVal); - if (r.getVal() != rVal) { fprintf(sentry.trueStdOut(), "Error: can't set %s = %g\n", r.GetName(), rVal); return NAN; } + if (r.getVal() != rVal) { + fprintf(sentry.trueStdOut(), "Error: can't set %s = %g\n", r.GetName(), rVal); return NAN; + CombineLogger::instance().log("FitterAlgoBase.cc",__LINE__,std::string(Form("[ERROR] can't set %s = %g\n", r.GetName(), rVal)),__func__); + } nll.clearEvalErrorLog(); double y = nll.getVal(); if (nll.numEvalErrors() > 0 || std::isnan(y) || std::isinf(y) || fabs(y-level) > 1e6) { - if (verbose > 1) fprintf(sentry.trueStdOut(), "logEvalErrors on stepping for iteration %d, set range to [ %+10.6f, %+10.6f ]\n", iter, rStart, rVal); - if (verbose > 0) Logger::instance().log(std::string(Form("FitterAlgoBase.cc: %d -- logEvalErrors reported from NLL on stepping for iteration %d, set range to [ %+10.6f, %+10.6f ]",__LINE__, iter, rStart, rVal)),Logger::kLogLevelDebug,__func__); + //if (verbose > 1) fprintf(sentry.trueStdOut(), "logEvalErrors on stepping for iteration %d, set range to [ %+10.6f, %+10.6f ]\n", iter, rStart, rVal); + if (verbose > 1) CombineLogger::instance().log("FitterAlgoBase.cc",__LINE__,std::string(Form("logEvalErrors reported from NLL on stepping for iteration %d, set range to [ %+10.6f, %+10.6f ]", iter, rStart, rVal)),__func__); rVal -= rInc; r.setVal(rVal); //hiterr = true; hitbound = false; @@ -580,29 +582,29 @@ double FitterAlgoBase::findCrossingNew(CascadeMinimizer &minim, RooAbsReal &nll, } double yCorr = y - quadCorr*std::pow(rVal-rStart,2); if (verbose > 1) { - fprintf(sentry.trueStdOut(), "x %+10.6f y %+10.6f yCorr %+10.6f\n", rVal, y-level, yCorr-level); - Logger::instance().log(std::string(Form("FitterAlgoBase.cc: %d -- x %+10.6f y %+10.6f yCorr %+10.6f",__LINE__,rVal, y-level, yCorr-level)),Logger::kLogLevelInfo,__func__); + //fprintf(sentry.trueStdOut(), "x %+10.6f y %+10.6f yCorr %+10.6f\n", rVal, y-level, yCorr-level); + CombineLogger::instance().log("FitterAlgoBase.cc",__LINE__,std::string(Form(" x %+10.6f y %+10.6f yCorr %+10.6f",rVal, y-level, yCorr-level)),__func__); } if (fabs(yCorr - yStart) > 0.7) { hitbound = false; if (verbose > 1) { - fprintf(sentry.trueStdOut(), " --------> accumulated big change in NLL, will go do minimize\n"); - Logger::instance().log(std::string(Form("FitterAlgoBase.cc: %d -- --------> accumulated big change in NLL, will go do minimize",__LINE__)),Logger::kLogLevelInfo,__func__); + //fprintf(sentry.trueStdOut(), " --------> accumulated big change in NLL, will go do minimize\n"); + CombineLogger::instance().log("FitterAlgoBase.cc",__LINE__," --------> accumulated big change in NLL, will go do minimize",__func__); } break; } if ((level-yCorr)*(level-yStart) < 0) { if (verbose > 1) { - fprintf(sentry.trueStdOut(), " --------> found crossing\n"); - Logger::instance().log(std::string(Form("FitterAlgoBase.cc: %d -- --------> found crossing",__LINE__)),Logger::kLogLevelInfo,__func__); + //fprintf(sentry.trueStdOut(), " --------> found crossing\n"); + CombineLogger::instance().log("FitterAlgoBase.cc",__LINE__," --------> found crossing",__func__); } double r2 = rVal - rInc; //r2 should be on the same side as yStart, yCorr(rVal) on the opposite for (int iter2 = 0; (fabs(yCorr - level) > minimizerTolerance_) && iter2 < 5; ++iter2) { double rMid = 0.5*(rVal+r2); r.setVal(rMid); y = nll.getVal(); yCorr = y - quadCorr*std::pow(rMid-rStart,2); if (verbose > 1) { - fprintf(sentry.trueStdOut(), "x %+10.6f y %+10.6f yCorr %+10.6f [ bisection iter %d in %+10.6f in %+10.6f ]\n", rMid, y-level, yCorr-level, iter2, r2, rVal); - Logger::instance().log(std::string(Form("FitterAlgoBase.cc: %d -- x %+10.6f y %+10.6f yCorr %+10.6f [ bisection iter %d in %+10.6f in %+10.6f ]",__LINE__,rMid, y-level, yCorr-level, iter2, r2, rVal)),Logger::kLogLevelInfo,__func__); + //fprintf(sentry.trueStdOut(), "x %+10.6f y %+10.6f yCorr %+10.6f [ bisection iter %d in %+10.6f in %+10.6f ]\n", rMid, y-level, yCorr-level, iter2, r2, rVal); + CombineLogger::instance().log("FitterAlgoBase.cc",__LINE__,std::string(Form("x %+10.6f y %+10.6f yCorr %+10.6f [ bisection iter %d in %+10.6f in %+10.6f ]",rMid, y-level, yCorr-level, iter2, r2, rVal)),__func__); } if ( (level-yCorr)*(level - yStart) < 0 ) { rVal = rMid; // yCorr(rMid) is on same side as yCorr(rVal), so rMid replaces rVal @@ -612,8 +614,8 @@ double FitterAlgoBase::findCrossingNew(CascadeMinimizer &minim, RooAbsReal &nll, } r.setVal(rVal); // save final value after bisection loop if (verbose > 1) { - fprintf(sentry.trueStdOut(), " --------> ending with x %+10.6f\n", rVal); - Logger::instance().log(std::string(Form("FitterAlgoBase.cc: %d -- --------> ending with x %+10.6f",__LINE__,rVal)),Logger::kLogLevelInfo,__func__); + //fprintf(sentry.trueStdOut(), " --------> ending with x %+10.6f\n", rVal); + CombineLogger::instance().log("FitterAlgoBase.cc",__LINE__,std::string(Form(" --------> ending with x %+10.6f",rVal)),__func__); } hitbound = false; break; } @@ -624,16 +626,16 @@ double FitterAlgoBase::findCrossingNew(CascadeMinimizer &minim, RooAbsReal &nll, // now we profile double yUnprof = nll.getVal(), yCorr = yUnprof - quadCorr*std::pow(rVal-rStart,2); if (!minim.improve(verbose-1)) { - fprintf(sentry.trueStdOut(), "Error: minimization failed at %s = %g\n", r.GetName(), rVal); - if (verbose) Logger::instance().log(std::string(Form("FitterAlgoBase.cc: %d -- Minimization failed at %s = %g",__LINE__,r.GetName(), rVal)),Logger::kLogLevelError,__func__); + //fprintf(sentry.trueStdOut(), "Error: minimization failed at %s = %g\n", r.GetName(), rVal); + CombineLogger::instance().log("FitterAlgoBase.cc",__LINE__,std::string(Form("[ERROR] Minimization failed at %s = %g",r.GetName(), rVal)),__func__); if (!neverGiveUp) return NAN; } double yProf = nll.getVal(); if (verbose > 1) { - fprintf(sentry.trueStdOut(), "x %+10.6f y %+10.6f yCorr %+10.6f yProf %+10.6f (P-U) %+10.6f (P-C) %+10.6f oldSlope %+10.6f newSlope %+10.6f\n", - rVal, yUnprof-level, yCorr-level, yProf-level, yProf - yUnprof, yProf - yCorr, quadCorr, (yUnprof-yProf)/std::pow(rVal-rStart,2)); - Logger::instance().log(std::string(Form("FitterAlgoBase.cc: %d x %+10.6f y %+10.6f yCorr %+10.6f yProf %+10.6f (P-U) %+10.6f (P-C) %+10.6f oldSlope %+10.6f newSlope %+10.6f",__LINE__, - rVal, yUnprof-level, yCorr-level, yProf-level, yProf - yUnprof, yProf - yCorr, quadCorr, (yUnprof-yProf)/std::pow(rVal-rStart,2))),Logger::kLogLevelInfo,__func__); + //fprintf(sentry.trueStdOut(), "x %+10.6f y %+10.6f yCorr %+10.6f yProf %+10.6f (P-U) %+10.6f (P-C) %+10.6f oldSlope %+10.6f newSlope %+10.6f\n", + // rVal, yUnprof-level, yCorr-level, yProf-level, yProf - yUnprof, yProf - yCorr, quadCorr, (yUnprof-yProf)/std::pow(rVal-rStart,2)); + CombineLogger::instance().log("FitterAlgoBase.cc",__LINE__,std::string(Form(" x %+10.6f y %+10.6f yCorr %+10.6f yProf %+10.6f (P-U) %+10.6f (P-C) %+10.6f oldSlope %+10.6f newSlope %+10.6f", + rVal, yUnprof-level, yCorr-level, yProf-level, yProf - yUnprof, yProf - yCorr, quadCorr, (yUnprof-yProf)/std::pow(rVal-rStart,2))),__func__); } // if on target, return best point from linear interpolation @@ -650,13 +652,13 @@ double FitterAlgoBase::findCrossingNew(CascadeMinimizer &minim, RooAbsReal &nll, // still on the same side as rStart rStart = rVal; if (hitbound) { - fprintf(sentry.trueStdOut(), "Error: closed range at %s = %g without finding any crossing \n", r.GetName(), rVal); - if (verbose) Logger::instance().log(std::string(Form("FitterAlgoBase.cc: %d -- Closed range without finding crossing! ",__LINE__)),Logger::kLogLevelError,__func__); + //fprintf(sentry.trueStdOut(), "Error: closed range at %s = %g without finding any crossing \n", r.GetName(), rVal); + CombineLogger::instance().log("FitterAlgoBase.cc",__LINE__,"Closed range without finding crossing! ",__func__); return rVal; } else { if (verbose > 1) { - fprintf(sentry.trueStdOut(), " ---> change search window to [ %g , %g ]\n", rStart, rBound); - Logger::instance().log(std::string(Form("FitterAlgoBase.cc: %d -- ---> change search window to [ %g , %g ]",__LINE__,rStart, rBound)),Logger::kLogLevelInfo,__func__); + //fprintf(sentry.trueStdOut(), " ---> change search window to [ %g , %g ]\n", rStart, rBound); + CombineLogger::instance().log("FitterAlgoBase.cc",__LINE__,std::string(Form(" ---> change search window to [ %g , %g ]",rStart, rBound)),__func__); } } } else { @@ -664,14 +666,14 @@ double FitterAlgoBase::findCrossingNew(CascadeMinimizer &minim, RooAbsReal &nll, rStart = rVal; unbound = true; // I did have a bracketing, so I don't need external bounds anymore if (verbose > 1) { - fprintf(sentry.trueStdOut(), " ---> all your brackets are belong to us!!\n"); - fprintf(sentry.trueStdOut(), " ---> change search window to [ %g , %g ]\n", rStart, rBound); - Logger::instance().log(std::string(Form("FitterAlgoBase.cc: %d -- ---> change search window to [ %g , %g ]",__LINE__,rStart, rBound)),Logger::kLogLevelInfo,__func__); + //fprintf(sentry.trueStdOut(), " ---> all your brackets are belong to us!!\n"); + //fprintf(sentry.trueStdOut(), " ---> change search window to [ %g , %g ]\n", rStart, rBound); + CombineLogger::instance().log("FitterAlgoBase.cc",__LINE__,std::string(Form(" ---> change search window to [ %g , %g ]",rStart, rBound)),__func__); } } } - fprintf(sentry.trueStdOut(), "Error: search did not converge, will return approximate answer %+.6f\n",rVal); - if (verbose) Logger::instance().log(std::string(Form("FitterAlgoBase.cc: %d -- Search for crossing did not converge, will return approximate answer %g",__LINE__,rVal)),Logger::kLogLevelDebug,__func__); + //fprintf(sentry.trueStdOut(), "Error: search did not converge, will return approximate answer %+.6f\n",rVal); + CombineLogger::instance().log("FitterAlgoBase.cc",__LINE__,std::string(Form("[WARNING] Search for crossing did not converge, will return approximate answer %g",rVal)),__func__); return rVal; } diff --git a/src/HybridNew.cc b/src/HybridNew.cc index 18e41b65777..0c4688c094c 100644 --- a/src/HybridNew.cc +++ b/src/HybridNew.cc @@ -43,7 +43,7 @@ #include "../interface/utils.h" #include "../interface/Significance.h" #include "../interface/ProfilingTools.h" -#include "../interface/Logger.h" +#include "../interface/CombineLogger.h" #include @@ -194,8 +194,8 @@ void HybridNew::applyOptions(const boost::program_options::variables_map &vm) { } if (genGlobalObs_ && genNuisances_) { - std::cerr << "ALERT: generating both global observables and nuisance parameters at the same time is not validated." << std::endl; - if (verbose) Logger::instance().log(std::string(Form("HybridNew.cc: %d -- generating both global observables and nuisance parameters at the same time is not validated!",__LINE__)),Logger::kLogLevelInfo,__func__); + //std::cerr << "ALERT: generating both global observables and nuisance parameters at the same time is not validated." << std::endl; + CombineLogger::instance().log("HybridNew.cc",__LINE__,"[WARNING] generating both global observables and nuisance parameters at the same time is not validated!",__func__); } if (!vm["singlePoint"].defaulted()) { if (doSignificance_) throw std::invalid_argument("HybridNew: Can't use --significance and --singlePoint at the same time"); @@ -398,7 +398,7 @@ bool HybridNew::runLimit(RooWorkspace *w, RooStats::ModelConfig *mc_s, RooStats: rMax = limitPlot_->GetX()[limitPlot_->GetN()-1]; for (int i = 0, n = limitPlot_->GetN(); i < n; ++i) { double x = limitPlot_->GetX()[i], y = limitPlot_->GetY()[i], ey = limitPlot_->GetErrorY(i); - if (verbose > 0) printf(" r %.2f: %s = %6.4f +/- %6.4f\n", x, CLs_ ? "CLs" : "Pmu", y, ey); + if (verbose > 0) CombineLogger::instance().log("HybridNew.cc",__LINE__,std::string(Form(" r %.2f: %s = %6.4f +/- %6.4f\n", x, CLs_ ? "CLs" : "Pmu", y, ey)),__func__); if (saveGrid_) { limit = x; limitErr = ey; Combine::commitPoint(false, y); } if (y-3*max(ey,0.01) >= clsTarget) { rMin = x; clsMin = CLs_t(y,ey); } if (fabs(y-clsTarget) < minDist) { nearest = x; minDist = fabs(y-clsTarget); } @@ -406,29 +406,30 @@ bool HybridNew::runLimit(RooWorkspace *w, RooStats::ModelConfig *mc_s, RooStats: if (y+3*max(ey,0.01) <= clsTarget && !fullGrid_) break; } limit = nearest; - if (verbose > 0) std::cout << " after scan x ~ " << limit << ", bounds [ " << rMin << ", " << rMax << "]" << std::endl; + if (verbose > 0) CombineLogger::instance().log("HybridNew.cc",__LINE__,std::string(Form(" after scan x ~ %f, bounds[%6.4f,%6.4f] ", limit,rMin,rMax)),__func__); limitErr = std::max(limit-rMin, rMax-limit); expoFit.SetRange(rMin,rMax); if (limitErr < std::max(rAbsAccuracy_, rRelAccuracy_ * limit) && (!doFC_) ) { // need to look for intervals for FC - if (verbose > 1) std::cout << " reached accuracy " << limitErr << " below " << std::max(rAbsAccuracy_, rRelAccuracy_ * limit) << std::endl; + if (verbose > 1) CombineLogger::instance().log("HybridNew.cc",__LINE__,std::string(Form(" reached accuracy %6.4f below %6.4f ", limitErr,std::max(rAbsAccuracy_, rRelAccuracy_ * limit))),__func__); done = true; } } else { limitPlot_.reset(new TGraphErrors()); - if (verbose > 0) std::cout << "Search for upper limit to the limit" << std::endl; + if (verbose > 0) CombineLogger::instance().log("HybridNew.cc",__LINE__,"Search for upper limit to the limit",__func__); for (int tries = 0; tries < 6; ++tries) { clsMax = eval(w, mc_s, mc_b, data, rMax); if (lowerLimit_) break; // we can't search for lower limits this way if (clsMax.first == 0 || clsMax.first + 3 * fabs(clsMax.second) < clsTarget ) break; rMax += rMax; if (tries == 5) { + CombineLogger::instance().log("HybridNew.cc",__LINE__,std::string(Form("Cannot set higher limit: at %s = %6.4f still get %s = %6.4f", r->GetName(),rMax,(CLs_ ? "CLs" : "Pmu"),clsMax.first)),__func__); std::cerr << "Cannot set higher limit: at " << r->GetName() << " = " << rMax << " still get " << (CLs_ ? "CLs" : "Pmu") << " = " << clsMax.first << std::endl; return false; } } - if (verbose > 0) std::cout << "Search for lower limit to the limit" << std::endl; + if (verbose > 0) CombineLogger::instance().log("HybridNew.cc",__LINE__,"Search for lower limit to the limit",__func__); clsMin = (CLs_ && rMin == 0 ? CLs_t(1,0) : eval(w, mc_s, mc_b, data, rMin)); if (!lowerLimit_ && clsMin.first != 1 && clsMin.first - 3 * fabs(clsMin.second) < clsTarget) { if (CLs_) { @@ -441,6 +442,7 @@ bool HybridNew::runLimit(RooWorkspace *w, RooStats::ModelConfig *mc_s, RooStats: if (clsMin.first == 1 || clsMin.first - 3 * fabs(clsMin.second) > clsTarget) break; rMin += rMin; if (tries == 5) { + CombineLogger::instance().log("HybridNew.cc",__LINE__,std::string(Form("Cannot set lower limit: at %s = %6.4f still get %s = %6.4f", r->GetName(),rMin,(CLs_ ? "CLs" : "Pmu"),clsMin.first)),__func__); std::cerr << "Cannot set lower limit: at " << r->GetName() << " = " << rMin << " still get " << (CLs_ ? "CLs" : "Pmu") << " = " << clsMin.first << std::endl; return false; } @@ -448,7 +450,7 @@ bool HybridNew::runLimit(RooWorkspace *w, RooStats::ModelConfig *mc_s, RooStats: } } - if (verbose > 0) std::cout << "Now doing proper bracketing & bisection" << std::endl; + if (verbose > 0) CombineLogger::instance().log("HybridNew.cc",__LINE__,"Now doing proper bracketing & bisection",__func__); do { // determine point by bisection or interpolation limit = 0.5*(rMin+rMax); limitErr = 0.5*(rMax-rMin); @@ -466,7 +468,7 @@ bool HybridNew::runLimit(RooWorkspace *w, RooStats::ModelConfig *mc_s, RooStats: // exit if reached accuracy on r if (limitErr < std::max(rAbsAccuracy_, rRelAccuracy_ * limit)) { - if (verbose > 1) std::cout << " reached accuracy " << limitErr << " below " << std::max(rAbsAccuracy_, rRelAccuracy_ * limit) << std::endl; + if (verbose > 1) CombineLogger::instance().log("HybridNew.cc",__LINE__,std::string(Form("Reached accuracy %6.4f below %6.4f.", limitErr,std::max(rAbsAccuracy_, rRelAccuracy_ * limit))),__func__); done = true; break; } @@ -474,6 +476,7 @@ bool HybridNew::runLimit(RooWorkspace *w, RooStats::ModelConfig *mc_s, RooStats: clsMid = eval(w, mc_s, mc_b, data, limit, true, clsTarget); if (clsMid.second == -1) { std::cerr << "Hypotest failed" << std::endl; + CombineLogger::instance().log("HybridNew.cc",__LINE__,"HypoTest failed",__func__); return false; } @@ -485,7 +488,7 @@ bool HybridNew::runLimit(RooWorkspace *w, RooStats::ModelConfig *mc_s, RooStats: rMin = limit; clsMin = clsMid; } } else { - if (verbose > 0) std::cout << "Trying to move the interval edges closer" << std::endl; + if (verbose > 0) CombineLogger::instance().log("HybridNew.cc",__LINE__,"Trying to move the interval edges closer",__func__); double rMinBound = rMin, rMaxBound = rMax; // try to reduce the size of the interval while (clsMin.second == 0 || fabs(rMin-limit) > std::max(rAbsAccuracy_, rRelAccuracy_ * limit)) { @@ -514,25 +517,25 @@ bool HybridNew::runLimit(RooWorkspace *w, RooStats::ModelConfig *mc_s, RooStats: if (doFC_) { points = findIntervalsFromSplines(limitPlot_.get(), clsTarget);// re use CLS_t ? if (points.size()<2) { - std::cout << " HybridNew -- Found no interval in which " << rule_.c_str() << " is less than target " << cl << ", no crossings found " << std::endl; - if (verbose) Logger::instance().log(std::string(Form("HybridNew.cc: %d Found no interval in which %s is less than target %g, no crossing found!",__LINE__,rule_.c_str(),cl)),Logger::kLogLevelError,__func__); + //std::cout << " HybridNew -- Found no interval in which " << rule_.c_str() << " is less than target " << cl << ", no crossings found " << std::endl; + CombineLogger::instance().log("HybridNew.cc",__LINE__,std::string(Form("Found no interval in which %s is less than target %g, no crossing found!",rule_.c_str(),cl)),__func__); } else if (points.size()==2) { - std::cout << "HybridNew -- One-sided boundary found for " << 100*cl << "%% confidence regions " << std::endl; - if (verbose) Logger::instance().log(std::string(Form("HybridNew.cc: %d One-sided boundary found for %g %% confidence regions",__LINE__,100*cl)),Logger::kLogLevelInfo,__func__); + //std::cout << "HybridNew -- One-sided boundary found for " << 100*cl << "%% confidence regions " << std::endl; + CombineLogger::instance().log("HybridNew.cc",__LINE__,std::string(Form("One-sided boundary found for %g %% confidence regions",100*cl)),__func__); int ib=0; if (points[0].second==0) ib=1; - std::cout << " " << points[ib].first << " (+/-" << points[ib].second << ")"<< ( ib==1 ? " < " : " > ") << r->GetName() << std::endl; - if (verbose) Logger::instance().log(std::string(Form("HybridNew.cc: %d %g (+/- %g) %s %s",__LINE__,points[ib].first,points[ib].second,( ib==1 ? " < " : " > "), r->GetName())),Logger::kLogLevelInfo,__func__); + //std::cout << " " << points[ib].first << " (+/-" << points[ib].second << ")"<< ( ib==1 ? " < " : " > ") << r->GetName() << std::endl; + CombineLogger::instance().log("HybridNew.cc",__LINE__,std::string(Form("%g (+/- %g) %s %s",points[ib].first,points[ib].second,( ib==1 ? " < " : " > "), r->GetName())),__func__); // Commit points to limit tree limit = points[ib].first; limitErr = points[ib].second; Combine::commitPoint(false, clsTarget); } else { - std::cout << "HybridNew -- found " << 100*cl << "%% confidence regions " << std::endl; - if (verbose) Logger::instance().log(std::string(Form("HybridNew.cc: %d found %g %% confidence regions",__LINE__,100*cl)),Logger::kLogLevelInfo,__func__); + //std::cout << "HybridNew -- found " << 100*cl << "%% confidence regions " << std::endl; + CombineLogger::instance().log("HybridNew.cc",__LINE__,std::string(Form("found %g %% confidence regions",100*cl)),__func__); for (unsigned int ib=1;ibGetName() << " < " << points[ib+1].first << " (+/-" << points[ib+1].second << ")" << std::endl; - if (verbose) Logger::instance().log(std::string(Form("HybridNew.cc: %d %g (+/- %g) < %s < %g (+/- %g) ",__LINE__,points[ib].first,points[ib].second,r->GetName(),points[ib+1].first, points[ib+1].second)),Logger::kLogLevelInfo,__func__); + //std::cout << " " << points[ib].first << " (+/-" << points[ib].second << ")"<< " < " << r->GetName() << " < " << points[ib+1].first << " (+/-" << points[ib+1].second << ")" << std::endl; + CombineLogger::instance().log("HybridNew.cc",__LINE__,std::string(Form(" %g (+/- %g) < %s < %g (+/- %g) ",points[ib].first,points[ib].second,r->GetName(),points[ib+1].first, points[ib+1].second)),__func__); // Commit points to limit tree limit = points[ib].first; limitErr = points[ib].second; Combine::commitPoint(false, clsTarget); @@ -561,9 +564,7 @@ bool HybridNew::runLimit(RooWorkspace *w, RooStats::ModelConfig *mc_s, RooStats: for (int i = 0, imax = (readHybridResults_ ? 0 : 8); i <= imax; ++i, ++npoints) { limitPlot_->Sort(); limitPlot_->Fit(&expoFit ,(verbose <= 1 ? "QNR EX0" : "NR EX0")); // For FC, might be more appropriate to fit pol2? - if (verbose) { - std::cout << "Fit to " << npoints << " points: " << expoFit.GetParameter(2) << " +/- " << expoFit.GetParError(2) << std::endl; - } + if (verbose) CombineLogger::instance().log("HybridNew.cc",__LINE__,std::string(Form(" Fit to %d points: %f +/- %f ",npoints,expoFit.GetParameter(2),expoFit.GetParError(2))),__func__); if ((rMinBound < expoFit.GetParameter(2)) && (expoFit.GetParameter(2) < rMaxBound) && (expoFit.GetParError(2) < 0.5*(rMaxBound-rMinBound))) { // sanity check fit result limit = expoFit.GetParameter(2); @@ -802,15 +803,18 @@ std::unique_ptr HybridNew::create(RooWorkspace *w, R fitZero.readFrom(*paramsToFit); } if (verbose > 1) { std::cout << "Zero signal fit" << std::endl; fitZero.Print("V"); } - if (verbose > 1) { std::cout << "Fitting of the background hypothesis done in " << timer.RealTime() << " s" << std::endl; } + //if (verbose > 1) { std::cout << "Fitting of the background hypothesis done in " << timer.RealTime() << " s" << std::endl; } + if (verbose > 1) { + CombineLogger::instance().log("HybridNew.cc",__LINE__,std::string(Form("Fitting of the background hypothesis done in %g s",timer.RealTime())),__func__); + } // print the values of the parameters used to generate the toy if (verbose > 2) { - Logger::instance().log(std::string(Form("HybridNew.cc: %d -- Using the following (post-fit) parameters for No signal hypothesis ",__LINE__)),Logger::kLogLevelInfo,__func__); + CombineLogger::instance().log("HybridNew.cc",__LINE__,"Using the following (post-fit) parameters for No signal hypothesis ",__func__); std::unique_ptr iter(paramsToFit->createIterator()); for (RooAbsArg *a = (RooAbsArg *) iter->Next(); a != 0; a = (RooAbsArg *) iter->Next()) { TString varstring = utils::printRooArgAsString(a); - Logger::instance().log(std::string(Form("HybridNew.cc: %d -- %s",__LINE__,varstring.Data())),Logger::kLogLevelInfo,__func__); + CombineLogger::instance().log("HybridNew.cc",__LINE__,std::string(Form(" %s",varstring.Data())),__func__); } } @@ -832,13 +836,13 @@ std::unique_ptr HybridNew::create(RooWorkspace *w, R // print the values of the parameters used to generate the toy if (verbose > 2) { - Logger::instance().log(std::string(Form("HybridNew.cc: %d -- Using the following (post-fit) parameters for S+B hypothesis ",__LINE__)),Logger::kLogLevelInfo,__func__); + CombineLogger::instance().log("HybridNew.cc",__LINE__,"Using the following (post-fit) parameters for S+B hypothesis ",__func__); RooArgSet reportParams; reportParams.add(*paramsToFit); reportParams.add(poi); std::unique_ptr iter(reportParams.createIterator()); for (RooAbsArg *a = (RooAbsArg *) iter->Next(); a != 0; a = (RooAbsArg *) iter->Next()) { TString varstring = utils::printRooArgAsString(a); - Logger::instance().log(std::string(Form("HybridNew.cc: %d -- %s",__LINE__,varstring.Data())),Logger::kLogLevelInfo,__func__); + CombineLogger::instance().log("HybridNew.cc",__LINE__,std::string(Form(" %s",varstring.Data())),__func__); } } } else { fitNuisances_ = false; } @@ -924,8 +928,8 @@ std::unique_ptr HybridNew::create(RooWorkspace *w, R params.add(*mc_s->GetNuisanceParameters(), true); paramsZero.addClone(*mc_b->GetNuisanceParameters(), true); } else { - std::cerr << "ALERT: using LEP test statistics with --fitNuisances is not validated and most likely broken" << std::endl; - if (verbose) Logger::instance().log(std::string(Form("HybridNew.cc: %d using LEP test statistics with --fitNuisances is not validated and most likely broken",__LINE__)),Logger::kLogLevelDebug,__func__); + //std::cerr << "ALERT: using LEP test statistics with --fitNuisances is not validated and most likely broken" << std::endl; + CombineLogger::instance().log("HybridNew.cc",__LINE__,"[WARNING] using LEP test statistics with --fitNuisances is not validated and most likely broken",__func__); params.assignValueOnly(*mc_s->GetNuisanceParameters()); paramsZero.assignValueOnly(*mc_s->GetNuisanceParameters()); } @@ -939,16 +943,14 @@ std::unique_ptr HybridNew::create(RooWorkspace *w, R setup.qvar.reset(new SimplerLikelihoodRatioTestStatOpt(*mc_s->GetObservables(), *pdfB, *factorizedPdf_s, paramsZero, params, withSystematics)); } } else { - std::cerr << "ALERT: LEP test statistics without optimization not validated." << std::endl; - if (verbose) Logger::instance().log(std::string(Form("HybridNew.cc: %d LEP test statistics not yet validated.",__LINE__)),Logger::kLogLevelDebug,__func__); + //std::cerr << "ALERT: LEP test statistics without optimization not validated." << std::endl; + CombineLogger::instance().log("HybridNew.cc",__LINE__,"[WARNING] LEP test statistics without optimization not yet validated.",__func__); RooArgSet paramsSnap; params.snapshot(paramsSnap); // needs a snapshot setup.qvar.reset(new SimpleLikelihoodRatioTestStat(*pdfB,*factorizedPdf_s)); ((SimpleLikelihoodRatioTestStat&)*setup.qvar).SetNullParameters(paramsZero); // Null is B ((SimpleLikelihoodRatioTestStat&)*setup.qvar).SetAltParameters(paramsSnap); } } else if (testStat_ == "TEV") { - std::cerr << "ALERT: Tevatron test statistics not yet validated." << std::endl; - if (verbose) Logger::instance().log(std::string(Form("HybridNew.cc: %d Tevatron test statistics not yet validated.",__LINE__)),Logger::kLogLevelDebug,__func__); RooAbsPdf *pdfB = factorizedPdf_b; if (poi.getSize() == 1) pdfB = factorizedPdf_s; // in this case we can remove the arbitrary constant from the test statistics. if (optimizeTestStatistics_) { @@ -960,7 +962,7 @@ std::unique_ptr HybridNew::create(RooWorkspace *w, R } } else if (testStat_ == "LHC" || testStat_ == "LHCFC" || testStat_ == "Profile") { if (poi.getSize() != 1 && testStat_ != "Profile") { - throw std::logic_error("ERROR: modified profile likelihood definitions (LHC, LHCFC) do not make sense in more than one dimension"); + throw std::logic_error("[ERROR] modified profile likelihood definitions (LHC, LHCFC) do not make sense in more than one dimension"); } if (optimizeTestStatistics_) { ProfiledLikelihoodTestStatOpt::OneSidedness side = ProfiledLikelihoodTestStatOpt::oneSidedDef; @@ -998,7 +1000,8 @@ std::unique_ptr HybridNew::create(RooWorkspace *w, R if (nCpu_ > 0) { std::cerr << "ALERT: running with proof not validated." << std::endl; - if (verbose > 1) std::cout << " Will use " << nCpu_ << " CPUs." << std::endl; + CombineLogger::instance().log("HybridNew.cc",__LINE__,"[WARNING] running with proof not validated.",__func__); + if (verbose > 1) CombineLogger::instance().log("HybridNew.cc",__LINE__,std::string(Form(" Will use %d CPUs.",nCpu_)),__func__); setup.pc.reset(new ProofConfig(*w, nCpu_, "", kFALSE)); setup.toymcsampler->SetProofConfig(setup.pc.get()); } @@ -1127,16 +1130,11 @@ HybridNew::eval(RooStats::HybridCalculator &hc, const RooAbsCollection & rVals, if (verbose > 0) { // Note that here, RooFit uses "CLsplusb" and "CLb", whereas we use Pmu and Pb - std::cout << - "\tCLs = " << hcResult->CLs() << " +/- " << hcResult->CLsError() << "\n" << - "\t1-Pb = " << hcResult->CLb() << " +/- " << hcResult->CLbError() << "\n" << - "\tPmu = " << hcResult->CLsplusb() << " +/- " << hcResult->CLsplusbError() << "\n" << - std::endl; - Logger::instance().log(std::string(Form("HybridNew.cc: %d -- CLs = %g +/- %g\n\t1-Pb = %g +/- %g\n\tPmu = %g +/- %g",__LINE__ + CombineLogger::instance().log("HybridNew.cc",__LINE__,std::string(Form(" CLs = %g +/- %g\n\t1-Pb = %g +/- %g\n\tPmu = %g +/- %g" ,hcResult->CLs(), hcResult->CLsError() ,hcResult->CLb(), hcResult->CLbError() ,hcResult->CLsplusb(), hcResult->CLsplusbError())) - ,Logger::kLogLevelInfo,__func__); + ,__func__); } perf_totalToysRun_ += (hcResult->GetAltDistribution()->GetSize() + hcResult->GetNullDistribution()->GetSize()); @@ -1229,7 +1227,7 @@ void HybridNew::applyExpectedQuantile(RooStats::HypoTestResult &hcres) { std::vector btoys = hcres.GetNullDistribution()->GetSamplingDistribution(); std::sort(btoys.begin(), btoys.end()); Double_t testStat = btoys[std::min(floor((1.-quantileForExpectedFromGrid_) * btoys.size()+0.5), btoys.size())]; - if (verbose > 0) std::cout << "Text statistics for " << quantileForExpectedFromGrid_ << " quantile: " << testStat << std::endl; + if (verbose > 0) CombineLogger::instance().log("HybridNew.cc",__LINE__,std::string(Form("Test statistics for %.3f quantile: %.3f",quantileForExpectedFromGrid_,testStat)),__func__); hcres.SetTestStatisticData(testStat); //std::cout << "CLs quantile = " << (CLs_ ? hcres.CLs() : hcres.CLsplusb()) << " for test stat = " << testStat << std::endl; } @@ -1317,7 +1315,7 @@ void HybridNew::applySignalQuantile(RooStats::HypoTestResult &hcres) { std::vector stoys = hcres.GetAltDistribution()->GetSamplingDistribution(); std::sort(stoys.begin(), stoys.end()); Double_t testStat = stoys[std::min(floor(quantileForExpectedFromGrid_ * stoys.size()+0.5), stoys.size())]; - if (verbose > 0) std::cout << "Text statistics for " << quantileForExpectedFromGrid_ << " quantile: " << testStat << std::endl; + if (verbose > 0) CombineLogger::instance().log("HybridNew.cc",__LINE__,std::string(Form("Test statistics for %.3f quantile: %.3f",quantileForExpectedFromGrid_,testStat)),__func__); hcres.SetTestStatisticData(testStat); } @@ -1326,7 +1324,7 @@ RooStats::HypoTestResult * HybridNew::evalGeneric(RooStats::HybridCalculator &hc else { TStopwatch timer; timer.Start(); RooStats::HypoTestResult * ret = hc.GetHypoTest(); - if (runtimedef::get("HybridNew_Timing")) std::cout << "Evaluated toys in " << timer.RealTime() << " s " << std::endl; + if (runtimedef::get("HybridNew_Timing")) CombineLogger::instance().log("HybridNew.cc",__LINE__,std::string(Form("Evaluated toys in %f",timer.RealTime())),__func__); return ret; } } @@ -1368,19 +1366,19 @@ RooStats::HypoTestResult * HybridNew::evalWithFork(RooStats::HybridCalculator &h RooRandom::randomGenerator()->SetSeed(newSeeds[ich]); freopen(TString::Format("%s.%d.out.txt", tmpfile, ich).Data(), "w", stdout); freopen(TString::Format("%s.%d.err.txt", tmpfile, ich).Data(), "w", stderr); - std::cout << " I'm child " << ich << ", seed " << newSeeds[ich] << std::endl; + CombineLogger::instance().log("HybridNew.cc",__LINE__,std::string(Form(" I am child %d, seed %d",ich, newSeeds[ich])),__func__); RooStats::HypoTestResult *hcResult = evalGeneric(hc, /*noFork=*/true); TFile *f = TFile::Open(TString::Format("%s.%d.root", tmpfile, ich), "RECREATE"); f->WriteTObject(hcResult, "result"); f->ls(); f->Close(); fflush(stdout); fflush(stderr); - std::cout << "And I'm done" << std::endl; + CombineLogger::instance().log("HybridNew.cc",__LINE__,"And I'm done",__func__); throw std::runtime_error("done"); // I have to throw instead of exiting, otherwise there's no proper stack unwinding // and deleting of intermediate objects, and when the statics get deleted it crashes // in 5.27.06 (but not in 5.28) } - if (verbose > 1) { std::cout << " Evaluation of p-values done in " << timer.RealTime() << " s" << std::endl; } + if (verbose > 1) CombineLogger::instance().log("HybridNew.cc",__LINE__,std::string(Form(" Evaluation of p-values done in %f s",timer.RealTime())),__func__); return result.release(); } @@ -1478,24 +1476,19 @@ RooStats::HypoTestResult * HybridNew::readToysFromFile(const RooAbsCollection & } if (ret.get() == 0) { - std::cout << "ERROR: parameter point not found in input root file.\n"; + //std::cout << "ERROR: parameter point not found in input root file.\n"; + CombineLogger::instance().log("HybridNew.cc",__LINE__,"[ERROR] Parameter point not foung in input root file!",__func__); rVals.Print("V"); if (verbose > 0) toyDir->ls(); - std::cout << "ERROR: parameter point not found in input root file" << std::endl; - if (verbose) Logger::instance().log(std::string(Form("HybridNew.cc: %d -- Parameter point not foung in input root file!",__LINE__)),Logger::kLogLevelError,__func__); + //std::cout << "ERROR: parameter point not found in input root file" << std::endl; throw std::invalid_argument("Missing input"); } if (verbose > 0) { - std::cout << - "\tCLs = " << ret->CLs() << " +/- " << ret->CLsError() << "\n" << - "\t1-Pb = " << ret->CLb() << " +/- " << ret->CLbError() << "\n" << - "\tPmu = " << ret->CLsplusb() << " +/- " << ret->CLsplusbError() << "\n" << - std::endl; - Logger::instance().log(std::string(Form("HybridNew.cc: %d -- CLs = %g +/- %g\n\t1-Pb = %g +/- %g\n\tPmu = %g +/- %g",__LINE__ + CombineLogger::instance().log("HybridNew.cc",__LINE__,std::string(Form(" CLs = %g +/- %g\n\t1-Pb = %g +/- %g\n\tPmu = %g +/- %g" ,ret->CLs(), ret->CLsError() ,ret->CLb(), ret->CLbError() ,ret->CLsplusb(), ret->CLsplusbError())) - ,Logger::kLogLevelInfo,__func__); + ,__func__); if (!plot_.empty() && workingMode_ != MakeLimit) { HypoTestPlot plot(*ret, 30); @@ -1522,8 +1515,8 @@ void HybridNew::readGrid(TDirectory *toyDir, double rMin, double rMax) { name.Remove(name.Index("_"),name.Length()); // remove it before calling atof } else if (name.Index("HypoTestResult_") == 0) { // let's put a warning here, since results of this form were supported in the past - std::cout << "HybridNew::readGrid: HypoTestResult with non-conformant name " << name << " will be skipped" << std::endl; - if (verbose) Logger::instance().log(std::string(Form("HybridNew.cc: %d -- HypoTestResult with non-conformant name %s found when reading grid, it will be skipped",__LINE__,k->GetName())),Logger::kLogLevelDebug,__func__); + //std::cout << "HybridNew::readGrid: HypoTestResult with non-conformant name " << name << " will be skipped" << std::endl; + CombineLogger::instance().log("HybridNew.cc",__LINE__,std::string(Form("[WARNING] HypoTestResult with non-conformant name %s found when reading grid, it will be skipped",k->GetName())),__func__); continue; } else continue; double rVal = atof(name.Data()); @@ -1647,20 +1640,13 @@ std::pair HybridNew::updateGridPoint(RooWorkspace *w, RooStats::M double testStat = setup.qvar->Evaluate(data, nullPOI); point->second->SetTestStatisticData(testStat + (isProfile ? -EPS : EPS)); } - if (verbose > 1) { - std::cout << "At " << r->GetName() << " = " << point->first << ":\n" << - "\tCLs = " << point->second->CLs() << " +/- " << point->second->CLsError() << "\n" << - "\t1-Pb = " << point->second->CLb() << " +/- " << point->second->CLbError() << "\n" << - "\tCPmu = " << point->second->CLsplusb() << " +/- " << point->second->CLsplusbError() << "\n" << - std::endl; - } - if (verbose){ - Logger::instance().log(std::string(Form("HybridNew.cc: %d -- At %s = %g:\n, \tCLs = %g +/- %g\n\t1-Pb = %g +/- %g\n\tPmu = %g +/- %g",__LINE__ + if (verbose > 0){ + CombineLogger::instance().log("HybridNew.cc",__LINE__,std::string(Form(" At %s = %g:\n, \tCLs = %g +/- %g\n\t1-Pb = %g +/- %g\n\tPmu = %g +/- %g" ,r->GetName(), point->first ,point->second->CLs(), point->second->CLsError() ,point->second->CLb(), point->second->CLbError() ,point->second->CLsplusb(), point->second->CLsplusbError())) - ,Logger::kLogLevelInfo,__func__); + ,__func__); } return eval(*point->second, point->first); @@ -1731,8 +1717,8 @@ std::vector > HybridNew::findIntervalsFromSplines(TGrap reverse->SetPoint(count,limitPlot_->GetY()[tpi],limitPlot_->GetX()[tpi]); reverse->SetPointError(count,limitPlot_->GetErrorY(tpi),0); if (verbose) { - std::cout << " Adding local point to calculate interval boundaries, " << count << ", cl="<GetY()[tpi] << ", poi=" << limitPlot_->GetX()[tpi] << std::endl; - Logger::instance().log(std::string(Form("HybridNew.cc: %d -- Adding local point to calculate interval boundaries, %d, cl=%g, poi=%g",__LINE__,count,limitPlot_->GetY()[tpi],limitPlot_->GetX()[tpi])),Logger::kLogLevelInfo,__func__); + //std::cout << " Adding local point to calculate interval boundaries, " << count << ", cl="<GetY()[tpi] << ", poi=" << limitPlot_->GetX()[tpi] << std::endl; + CombineLogger::instance().log("HybridNew.cc",__LINE__,std::string(Form(" Adding local point to calculate interval boundaries, %d, cl=%g, poi=%g",count,limitPlot_->GetY()[tpi],limitPlot_->GetX()[tpi])),__func__); } count++; } diff --git a/src/Logger.cc b/src/Logger.cc deleted file mode 100644 index 9d45fbadb50..00000000000 --- a/src/Logger.cc +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Logger adapted from - * Professional C++, 2nd Edition, Oct 2011 - * Marc Gregoire, Nicholas A. Solter, Scott J. Kleper - * ISBN: 978-0-470-93244-5 - * http://www.wiley.com/WileyCDA/WileyTitle/productCd-0470932449.html -*/ - -#include -#include "../interface/Logger.h" - -using namespace std; - -const string Logger::kLogLevelDebug = "DEBUG"; -const string Logger::kLogLevelInfo = "INFO"; -const string Logger::kLogLevelError = "ERROR"; - -int Logger::nLogLevelInfo=0; -int Logger::nLogLevelDebug=0; -int Logger::nLogLevelError=0; - -const char* const Logger::kLogFileName = "combine_logger.out"; - -Logger* Logger::pInstance = nullptr; - -mutex Logger::sMutex; - -Logger& Logger::instance() -{ - static Cleanup cleanup; - - lock_guard guard(sMutex); - if (pInstance == nullptr) - pInstance = new Logger(); - - return *pInstance; -} - -Logger::Cleanup::~Cleanup() -{ - lock_guard guard(Logger::sMutex); - delete Logger::pInstance; - Logger::pInstance = nullptr; -} - -Logger::~Logger() -{ - mOutputStream.close(); -} - -Logger::Logger() -{ - mOutputStream.open(kLogFileName, ios_base::out); - if (!mOutputStream.good()) { - throw runtime_error("Unable to initialize the Logger!"); - } -} - -void Logger::log(const string& inMessage, const string& inLogLevel, const string& inFunction) -{ - lock_guard guard(sMutex); - logHelper(inMessage, inLogLevel, inFunction); -} - -void Logger::log(const vector& inMessages, const string& inLogLevel, const string& inFunction) -{ - lock_guard guard(sMutex); - for (size_t i = 0; i < inMessages.size(); i++) { - logHelper(inMessages[i], inLogLevel, inFunction); - } -} - -void Logger::logHelper(const std::string& inMessage, const std::string& inLogLevel, const std::string& inFunction) -{ - mOutputStream << inLogLevel << ": (function: " << inFunction << ") " << inMessage << endl; - if (inLogLevel == kLogLevelInfo) nLogLevelInfo++; - if (inLogLevel == kLogLevelDebug) nLogLevelDebug++; - if (inLogLevel == kLogLevelError) nLogLevelError++; -} - -void Logger::printLog() -{ - std::cout << "Printing Message Summary From ... " << kLogFileName << std::endl; - std::cout << "----------------------------------------------" << std::endl; - std::cout << "Messages of type " << kLogLevelInfo << " : " << nLogLevelInfo << std::endl; - std::cout << "Messages of type " << kLogLevelDebug << " : " << nLogLevelDebug << std::endl; - std::cout << "Messages of type " << kLogLevelError << " : " << nLogLevelError << std::endl; - std::cout << "----------------------------------------------" << std::endl; - std::ifstream f(kLogFileName); - if (f.is_open()) std::cout << f.rdbuf(); -} diff --git a/src/MultiDimFit.cc b/src/MultiDimFit.cc index 743ac889a65..d8519559f56 100644 --- a/src/MultiDimFit.cc +++ b/src/MultiDimFit.cc @@ -19,6 +19,7 @@ #include "../interface/utils.h" #include "../interface/RobustHesse.h" #include "../interface/ProfilingTools.h" +#include "../interface/CombineLogger.h" #include #include @@ -254,22 +255,23 @@ bool MultiDimFit::runSpecific(RooWorkspace *w, RooStats::ModelConfig *mc_s, RooS if (savingSnapshot_) w->saveSnapshot("MultiDimFit",utils::returnAllVars(w)); if (autoRange_ > 0) { - std::cout << "Adjusting range of POIs to +/- " << autoRange_ << " standard deviations" << std::endl; + CombineLogger::instance().log("MultiDimFit.cc",__LINE__,std::string(Form("Adjusting range of POIs to +/- %.3f standard deviations",autoRange_)),__func__); for (int i = 0, n = poi_.size(); i < n; ++i) { double val = poiVars_[i]->getVal(), err = poiVars_[i]->getError(), min0 = poiVars_[i]->getMin(), max0 = poiVars_[i]->getMax(); double min1 = std::max(min0, val - autoRange_ * err); double max1 = std::min(max0, val + autoRange_ * err); - std::cout << poi_[i] << ": " << val << " +/- " << err << " [ " << min0 << " , " << max0 << " ] ==> [ " << min1 << " , " << max1 << " ]" << std::endl; + CombineLogger::instance().log("MultiDimFit.cc",__LINE__,std::string(Form("%s: %.3f +/- %.3f [%.5f,%.5f] ==> [%.5f,%.5f] ",poi_[i].c_str(), val, err, min0, max0, min1, max1)),__func__); poiVars_[i]->setRange(min1, max1); } } if (centeredRange_ > 0) { - std::cout << "Adjusting range of POIs to +/- " << centeredRange_ << std::endl; + CombineLogger::instance().log("MultiDimFit.cc",__LINE__,std::string(Form("Adjusting range of POIs to +/- %f",centeredRange_)),__func__); for (int i = 0, n = poi_.size(); i < n; ++i) { double val = poiVars_[i]->getVal(), min0 = poiVars_[i]->getMin(), max0 = poiVars_[i]->getMax(); double min1 = std::max(min0, val - centeredRange_); double max1 = std::min(max0, val + centeredRange_); - std::cout << poi_[i] << ": " << val << " [ " << min0 << " , " << max0 << " ] ==> [ " << min1 << " , " << max1 << " ]" << std::endl; + CombineLogger::instance().log("MultiDimFit.cc",__LINE__,std::string(Form("%s: %.3f [%.5f,%.5f] ==> [%.5f,%.5f] ",poi_[i].c_str(), val, min0, max0, min1, max1)),__func__); + //std::cout << poi_[i] << ": " << val << " [ " << min0 << " , " << max0 << " ] ==> [ " << min1 << " , " << max1 << " ]" << std::endl; poiVars_[i]->setRange(min1, max1); } } @@ -618,12 +620,8 @@ void MultiDimFit::doGrid(RooWorkspace *w, RooAbsReal &nll) + std::to_string(pointsPerPoi.size()) + " does not match number of POIs " + std::to_string(n)); } - std::cout << "Parsed number of points per POI: "; - for (unsigned int i = 0; i < n; i++) { - std::cout << poi_[i] << " -> " << pointsPerPoi[i]; - if (i < n - 1) std::cout << ", "; - } - std::cout << std::endl; + CombineLogger::instance().log("MultiDimFit.cc",__LINE__,"Parsed number of points per POI: ",__func__); + for (unsigned int i = 0; i < n; i++) CombineLogger::instance().log("MultiDimFit.cc",__LINE__,std::string(Form(" %d/%d) %s -> %d",i+1,n,poi_[i].c_str(),pointsPerPoi[i])),__func__); } if (n == 1) { @@ -666,7 +664,9 @@ void MultiDimFit::doGrid(RooWorkspace *w, RooAbsReal &nll) } //if (verbose > 1) std::cout << "Point " << i << "/" << points << " " << poiVars_[0]->GetName() << " = " << x << std::endl; - std::cout << "Point " << i << "/" << points << " " << poiVars_[0]->GetName() << " = " << x << std::endl; + //I suggest keeping this message on terminal as well, to let users monitor the progress + std::cout << "Point " << i << "/" << points << " " << poiVars_[0]->GetName() << " = " << x << std::endl; + CombineLogger::instance().log("MultiDimFit.cc",__LINE__,std::string(Form("Point %d/%d) %s = %f",i,points,poiVars_[0]->GetName(),x)),__func__); *params = snap; poiVals_[0] = x; poiVars_[0]->setVal(x); @@ -1056,7 +1056,7 @@ void MultiDimFit::doContour2D(RooWorkspace *, RooAbsReal &nll) RooRealVar *yv = poiVars_[1]; double y0 = poiVals_[1]; float &y = poiVals_[1]; double threshold = nll.getVal() + 0.5*ROOT::Math::chisquared_quantile_c(1-cl,2+nOtherFloatingPoi_); - if (verbose>0) std::cout << "Best fit point is for " << xv->GetName() << ", " << yv->GetName() << " = " << x0 << ", " << y0 << std::endl; + if (verbose>0) CombineLogger::instance().log("MultiDimFit.cc",__LINE__,std::string(Form("Best fit point is for %s, %s, = %.4f,%.4f",xv->GetName(),yv->GetName(),x0,y0)),__func__); // make a box doBox(nll, cl, "box"); @@ -1083,7 +1083,7 @@ void MultiDimFit::doContour2D(RooWorkspace *, RooAbsReal &nll) minimXI.minimize(verbose-1); } double xc = xv->getVal(); xv->setConstant(true); - if (verbose>-1) std::cout << "Best fit " << xv->GetName() << " for " << yv->GetName() << " = " << yv->getVal() << " is at " << xc << std::endl; + if (verbose>-1) CombineLogger::instance().log("MultiDimFit.cc",__LINE__,std::string(Form("Best fit %s for %s = %.4f is at %.4f",xv->GetName(),yv->GetName(),yv->getVal(),xc)),__func__); // ===== Then get the range ===== CascadeMinimizer minim(nll, CascadeMinimizer::Constrained); if (!autoBoundsPOIs_.empty()) minim.setAutoBounds(&autoBoundsPOISet_); @@ -1091,13 +1091,13 @@ void MultiDimFit::doContour2D(RooWorkspace *, RooAbsReal &nll) double xup = findCrossing(minim, nll, *xv, threshold, xc, xMax); if (!std::isnan(xup)) { x = xup; y = yv->getVal(); Combine::commitPoint(true, /*quantile=*/1-cl); - if (verbose>-1) std::cout << "Minimum of " << xv->GetName() << " at " << cl << " CL for " << yv->GetName() << " = " << y << " is " << x << std::endl; + if (verbose>-1) CombineLogger::instance().log("MultiDimFit.cc",__LINE__,std::string(Form("Minimum of %s at %.4f CL for %s = %.3f is %.3f",xv->GetName(),cl,yv->GetName(),y,x)),__func__); } double xdn = findCrossing(minim, nll, *xv, threshold, xc, xMin); if (!std::isnan(xdn)) { x = xdn; y = yv->getVal(); Combine::commitPoint(true, /*quantile=*/1-cl); - if (verbose>-1) std::cout << "Maximum of " << xv->GetName() << " at " << cl << " CL for " << yv->GetName() << " = " << y << " is " << x << std::endl; + if (verbose>-1) CombineLogger::instance().log("MultiDimFit.cc",__LINE__,std::string(Form("Maximum of %s at %.4f CL for %s = %.3f is %.3f",xv->GetName(),cl,yv->GetName(),y,x)),__func__); } } @@ -1178,7 +1178,7 @@ void MultiDimFit::doBox(RooAbsReal &nll, double cl, const char *name, bool commi for (unsigned int j = 0; j < n; ++j) poiVars_[j]->setVal(p0[j]); double xMin = findCrossing(minimX, nll, *xv, threshold, p0[i], xv->getMin()); if (!std::isnan(xMin)) { - if (verbose > -1) std::cout << "Minimum of " << xv->GetName() << " at " << cl << " CL for all others floating is " << xMin << std::endl; + if (verbose > -1) CombineLogger::instance().log("MultiDimFit.cc",__LINE__,std::string(Form("Minimum of %s at %.4f CL for all others floating is %.3f",xv->GetName(),cl,xMin)),__func__); for (unsigned int j = 0; j < n; ++j) poiVals_[j] = poiVars_[j]->getVal(); if (commitPoints) Combine::commitPoint(true, /*quantile=*/1-cl); } else { @@ -1186,13 +1186,13 @@ void MultiDimFit::doBox(RooAbsReal &nll, double cl, const char *name, bool commi for (unsigned int j = 0; j < n; ++j) poiVals_[j] = poiVars_[j]->getVal(); double prob = ROOT::Math::chisquared_cdf_c(2*(nll.getVal() - nll0), n+nOtherFloatingPoi_); if (commitPoints) Combine::commitPoint(true, /*quantile=*/prob); - if (verbose > -1) std::cout << "Minimum of " << xv->GetName() << " at " << cl << " CL for all others floating is " << xMin << " (on the boundary, p-val " << prob << ")" << std::endl; + if (verbose > -1) CombineLogger::instance().log("MultiDimFit.cc",__LINE__,std::string(Form("Minimum of %s at %.4f CL for all others floating is %.3f (on the boundary, p-val %f)",xv->GetName(),cl,xMin,prob)),__func__); } for (unsigned int j = 0; j < n; ++j) poiVars_[j]->setVal(p0[j]); double xMax = findCrossing(minimX, nll, *xv, threshold, p0[i], xv->getMax()); if (!std::isnan(xMax)) { - if (verbose > -1) std::cout << "Maximum of " << xv->GetName() << " at " << cl << " CL for all others floating is " << xMax << std::endl; + if (verbose > -1) CombineLogger::instance().log("MultiDimFit.cc",__LINE__,std::string(Form("Maximum of %s at %.4f CL for all others floating is %.3f",xv->GetName(),cl,xMax)),__func__); for (unsigned int j = 0; j < n; ++j) poiVals_[j] = poiVars_[j]->getVal(); if (commitPoints) Combine::commitPoint(true, /*quantile=*/1-cl); } else { @@ -1200,7 +1200,7 @@ void MultiDimFit::doBox(RooAbsReal &nll, double cl, const char *name, bool commi double prob = ROOT::Math::chisquared_cdf_c(2*(nll.getVal() - nll0), n+nOtherFloatingPoi_); for (unsigned int j = 0; j < n; ++j) poiVals_[j] = poiVars_[j]->getVal(); if (commitPoints) Combine::commitPoint(true, /*quantile=*/prob); - if (verbose > -1) std::cout << "Maximum of " << xv->GetName() << " at " << cl << " CL for all others floating is " << xMax << " (on the boundary, p-val " << prob << ")" << std::endl; + if (verbose > -1) CombineLogger::instance().log("MultiDimFit.cc",__LINE__,std::string(Form("Maximum of %s at %.4f CL for all others floating is %.3f (on the boundary, p-val %f)",xv->GetName(),cl,xMax,prob)),__func__); } xv->setRange(name, xMin, xMax); diff --git a/src/ToyMCSamplerOpt.cc b/src/ToyMCSamplerOpt.cc index eb8ca7ebb3c..bbe2e8803c9 100644 --- a/src/ToyMCSamplerOpt.cc +++ b/src/ToyMCSamplerOpt.cc @@ -1,6 +1,6 @@ #include "../interface/ToyMCSamplerOpt.h" #include "../interface/utils.h" -#include "../interface/Logger.h" +#include "../interface/CombineLogger.h" #include #include #include @@ -143,7 +143,7 @@ toymcoptutils::SinglePdfGenInfo::generateAsimov(RooRealVar *&weightVar, double w int nPA = runtimedef::get("TMCSO_PseudoAsimov"); // Will trigger the use of weighted data int boostAPA = runtimedef::get("TMCSO_AdaptivePseudoAsimov"); if (boostAPA>0) { // trigger adaptive PA (setting boostAPA=1 will just use internal logic) - if ( verbose > 0 ) Logger::instance().log(std::string(Form("ToyMCSamplerOpt.cc: %d -- Using internal logic for binned/unbinned Asimov dataset generation",__LINE__)),Logger::kLogLevelInfo,__func__); + if ( verbose > 0 ) CombineLogger::instance().log("ToyMCSamplerOpt.cc",__LINE__, "Using internal logic for binned/unbinned Asimov dataset generation",__func__); int nbins = 1; RooLinkedListIter iter = observables_.iterator(); for (RooAbsArg *a = (RooAbsArg *) iter.Next(); a != 0; a = (RooAbsArg *) iter.Next()) { @@ -171,8 +171,8 @@ RooDataSet * toymcoptutils::SinglePdfGenInfo::generatePseudoAsimov(RooRealVar *&weightVar, int nPoints, double weightScale,int verbose) { if (mode_ == Unbinned) { - if ( verbose > 2 ) printf(" ToyMCSamplerOpt -- Generating PseudoAsimov dataset for pdf %s: with %d weighted events\n", pdf_->GetName(), nPoints); - if ( verbose > 0 ) Logger::instance().log(std::string(Form("ToyMCSamplerOpt.cc: %d -- Generating PseudoAsimov dataset for pdf %s: with %d weighted events",__LINE__,pdf_->GetName(),nPoints)),Logger::kLogLevelInfo,__func__); + //if ( verbose > 2 ) printf(" ToyMCSamplerOpt -- Generating PseudoAsimov dataset for pdf %s: with %d weighted events\n", pdf_->GetName(), nPoints); + if ( verbose > 0 ) CombineLogger::instance().log("ToyMCSamplerOpt.cc",__LINE__,std::string(Form("Generating PseudoAsimov dataset for pdf %s: with %d weighted events",pdf_->GetName(),nPoints)),__func__); double expEvents = pdf_->expectedEvents(observables_); std::unique_ptr data(pdf_->generate(observables_, nPoints)); if (weightVar == 0) weightVar = new RooRealVar("_weight_","",1.0); @@ -210,17 +210,11 @@ toymcoptutils::SinglePdfGenInfo::generateWithHisto(RooRealVar *&weightVar, bool histoSpec_->SetDirectory(0); } - if ( verbose > 2 ){ - printf(" ToyMCSampleOpt -- Generating Asimov with histogram for pdf %s: in %d x-bins ", pdf_->GetName(), histoSpec_->GetNbinsX() ); - if (y) printf(", %d y-bins ",histoSpec_->GetNbinsY() ); - if (z) printf(", %d z-bins ",histoSpec_->GetNbinsZ() ); - printf("\n"); - } if ( verbose >0 ) { - Logger::instance().log(std::string(Form("ToyMCSamplerOpt.cc: %d -- Generating asimov with histogram for pdf %s: in %d x-bins",__LINE__,pdf_->GetName(),histoSpec_->GetNbinsX())),Logger::kLogLevelInfo,__func__); - if (y) Logger::instance().log(std::string(Form("ToyMCSamplerOpt.cc: %d -- , in %d y-bins",__LINE__,histoSpec_->GetNbinsY())),Logger::kLogLevelInfo,__func__); - if (z) Logger::instance().log(std::string(Form("ToyMCSamplerOpt.cc: %d -- , in %d z-bins",__LINE__,histoSpec_->GetNbinsZ())),Logger::kLogLevelInfo,__func__); + CombineLogger::instance().log("ToyMCSamplerOpt.cc",__LINE__,std::string(Form("Generating asimov with histogram for pdf %s: in %d x-bins",pdf_->GetName(),histoSpec_->GetNbinsX())),__func__); + if (y) CombineLogger::instance().log("ToyMCSamplerOpt.cc",__LINE__,std::string(Form(" , in %d y-bins",histoSpec_->GetNbinsY())),__func__); + if (z) CombineLogger::instance().log("ToyMCSamplerOpt.cc",__LINE__,std::string(Form(" , in %d z-bins",histoSpec_->GetNbinsZ())),__func__); } double expectedEvents = pdf_->expectedEvents(observables_); diff --git a/src/utils.cc b/src/utils.cc index df4a53c2d04..13c6b144e3c 100644 --- a/src/utils.cc +++ b/src/utils.cc @@ -38,7 +38,7 @@ #include "../interface/CloseCoutSentry.h" #include "../interface/ProfilingTools.h" -#include "../interface/Logger.h" +#include "../interface/CombineLogger.h" #include "../interface/RooMultiPdf.h" using namespace std; @@ -1029,14 +1029,9 @@ bool utils::anyParameterAtBoundaries( const RooArgSet ¶ms, int verbosity ){ if(isBad){ std::string varName((*a).GetName()); - - if( verbosity >= 9 || (timesFoundAtBoundary[varName] < 3 && verbosity > -1) ){ - fprintf(CloseCoutSentry::trueStdOutGlobal()," [WARNING] Found [%s] at boundary. \n", (*a).GetName()); - std::cout << " "; (*a).Print(); - } if( verbosity > 0 ){ - Logger::instance().log(std::string(Form("utils.cc: %d -- Found parameter %s at boundary (within ~1sigma): %g+/-%g",__LINE__,(*a).GetName(),(*a).getVal(),(*a).getError())),Logger::kLogLevelInfo,__func__); + CombineLogger::instance().log("utils.cc",__LINE__,std::string(Form("[WARNING] Found parameter %s at boundary (within ~1sigma): %g+/-%g",(*a).GetName(),(*a).getVal(),(*a).getError())),__func__); } timesFoundAtBoundary[varName]++; From 6282b682b76625d84d4c81bdc153e099f04feafa Mon Sep 17 00:00:00 2001 From: nckw Date: Mon, 11 Dec 2023 14:04:38 +0000 Subject: [PATCH 79/98] Update physicsmodels.md Fix issue with math presentation --- docs/part2/physicsmodels.md | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/docs/part2/physicsmodels.md b/docs/part2/physicsmodels.md index a00cf0249d8..e7c3c54c1d8 100644 --- a/docs/part2/physicsmodels.md +++ b/docs/part2/physicsmodels.md @@ -255,7 +255,11 @@ with the number of POIs, and can get extremely expensive for 10 or more, as may be encountered often with EFT analyses. To alleviate this issue, an accelerated interference modeling technique is implemented for template-based analyses via the `interferenceModel` physics model. In this model, each bin yield $y$ is parameterized -$$y(\theta) = y_0 (\theta^\top M \theta)$$ + +$$ +y(\theta) = y_0 (\theta^\top M \theta) +$$ + as a function of the POI vector $\theta$, a nominal template $y_0$, and a scaling matrix $M$. To see how this parameterization relates to that of the previous section, we can define: @@ -297,7 +301,10 @@ where the parameters are declared using RooFit's [factory syntax](https://root.cern.ch/doc/v622/classRooWorkspace.html#a0ddded1d65f5c6c4732a7a3daa8d16b0) and each row of the `scaling` field represents the scaling information of a bin, e.g. if $y_0 = |A_b|^2$ then each row would contain three entries: -$$|A_s|^2 / |A_b|^2,\quad \Re(A_s^* A_b)/|A_b|^2,\quad 1$$ + +$$ +|A_s|^2 / |A_b|^2,\quad \Re(A_s^* A_b)/|A_b|^2,\quad 1 +$$ For several coefficients, one would enumerate as follows: ```python From 37dd7e2b6ec0aff3f48a2bc092fbb7058de8665b Mon Sep 17 00:00:00 2001 From: nckw Date: Wed, 13 Dec 2023 10:39:17 +0000 Subject: [PATCH 80/98] Update BayesianFlatPrior.cc --- src/BayesianFlatPrior.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/BayesianFlatPrior.cc b/src/BayesianFlatPrior.cc index 3e12bd58144..f4263ab4ad7 100644 --- a/src/BayesianFlatPrior.cc +++ b/src/BayesianFlatPrior.cc @@ -66,7 +66,7 @@ bool BayesianFlatPrior::run(RooWorkspace *w, RooStats::ModelConfig *mc_s, RooSta } if (verbose > -1) { std::cout << "\n -- BayesianSimple -- " << "\n"; - std::cout << "Limit: " << r->GetName() << " < " << limit << " @ " << cl * 100 << "% CL" << std::endl; + std::cout << "Limit: " << r->GetName() << " < " << limit << " @ " << cl * 100 << "% credibility" << std::endl; } if (verbose > 200) { // FIXME!!!!! From f201038e30eea1566a3c56997ae126a9b8841c0a Mon Sep 17 00:00:00 2001 From: nckw Date: Wed, 13 Dec 2023 10:39:53 +0000 Subject: [PATCH 81/98] Update BayesianToyMC.cc --- src/BayesianToyMC.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/BayesianToyMC.cc b/src/BayesianToyMC.cc index 920559cd247..a2673c8c739 100644 --- a/src/BayesianToyMC.cc +++ b/src/BayesianToyMC.cc @@ -108,9 +108,9 @@ bool BayesianToyMC::run(RooWorkspace *w, RooStats::ModelConfig *mc_s, RooStats:: if (verbose > -1) { std::cout << "\n -- BayesianToyMC -- " << "\n"; if (limitErr > 0) { - std::cout << "Limit: " << r->GetName() << " < " << limit << " +/- " << limitErr << " @ " << cl * 100 << "% CL" << std::endl; + std::cout << "Limit: " << r->GetName() << " < " << limit << " +/- " << limitErr << " @ " << cl * 100 << "% credibility" << std::endl; } else { - std::cout << "Limit: " << r->GetName() << " < " << limit << " @ " << cl * 100 << "% CL" << std::endl; + std::cout << "Limit: " << r->GetName() << " < " << limit << " @ " << cl * 100 << "% credibility" << std::endl; } } break; From e6e574af65891a7cb0d90e82b37e1ec3816ba9dd Mon Sep 17 00:00:00 2001 From: nckw Date: Wed, 13 Dec 2023 10:40:32 +0000 Subject: [PATCH 82/98] Update MarkovChainMC.cc --- src/MarkovChainMC.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/MarkovChainMC.cc b/src/MarkovChainMC.cc index 8397209ccd3..fe2e73e1864 100644 --- a/src/MarkovChainMC.cc +++ b/src/MarkovChainMC.cc @@ -179,10 +179,10 @@ bool MarkovChainMC::run(RooWorkspace *w, RooStats::ModelConfig *mc_s, RooStats:: std::cout << "\n -- MarkovChainMC -- " << "\n"; RooRealVar *r = dynamic_cast(mc_s->GetParametersOfInterest()->first()); if (num > 1) { - std::cout << "Limit: " << r->GetName() <<" < " << limit << " +/- " << limitErr << " @ " << cl * 100 << "% CL (" << num << " tries)" << std::endl; + std::cout << "Limit: " << r->GetName() <<" < " << limit << " +/- " << limitErr << " @ " << cl * 100 << "% credibility (" << num << " tries)" << std::endl; if (verbose > 0 && !readChains_) std::cout << "Average chain acceptance: " << suma << std::endl; } else { - std::cout << "Limit: " << r->GetName() <<" < " << limit << " @ " << cl * 100 << "% CL" << std::endl; + std::cout << "Limit: " << r->GetName() <<" < " << limit << " @ " << cl * 100 << "% credibility" << std::endl; } } return true; From f27aa021dc52d7d7efb5766ae45618eec8ab0bb3 Mon Sep 17 00:00:00 2001 From: nckw Date: Thu, 14 Dec 2023 08:58:48 +0000 Subject: [PATCH 83/98] Remove overlaps with IvyFramework (#878) Co-authored-by: Nick Wardle --- interface/AsymQuad.h | 50 --- interface/RooFuncPdf.h | 44 --- interface/RooNCSplineCore.h | 108 ------ interface/RooNCSplineFactory_1D.h | 65 ---- interface/RooNCSplineFactory_2D.h | 101 ----- interface/RooNCSplineFactory_3D.h | 104 ----- interface/RooNCSpline_1D_fast.h | 68 ---- interface/RooNCSpline_2D_fast.h | 84 ----- interface/RooNCSpline_3D_fast.h | 105 ------ interface/RooPiecewisePolynomial.h | 50 --- interface/RooRealFlooredSumPdf.h | 95 ----- src/AsymQuad.cc | 128 ------- src/RooFuncPdf.cc | 3 - src/RooNCSplineCore.cc | 284 -------------- src/RooNCSplineFactory_1D.cc | 88 ----- src/RooNCSplineFactory_2D.cc | 124 ------ src/RooNCSplineFactory_3D.cc | 146 -------- src/RooNCSpline_1D_fast.cc | 226 ----------- src/RooNCSpline_2D_fast.cc | 394 ------------------- src/RooNCSpline_3D_fast.cc | 550 --------------------------- src/RooPiecewisePolynomial.cc | 215 ----------- src/RooRealFlooredSumPdf.cc | 583 ----------------------------- src/classes.h | 8 - src/classes_def.xml | 9 - 24 files changed, 3632 deletions(-) delete mode 100644 interface/AsymQuad.h delete mode 100644 interface/RooFuncPdf.h delete mode 100644 interface/RooNCSplineCore.h delete mode 100644 interface/RooNCSplineFactory_1D.h delete mode 100644 interface/RooNCSplineFactory_2D.h delete mode 100644 interface/RooNCSplineFactory_3D.h delete mode 100644 interface/RooNCSpline_1D_fast.h delete mode 100644 interface/RooNCSpline_2D_fast.h delete mode 100644 interface/RooNCSpline_3D_fast.h delete mode 100644 interface/RooPiecewisePolynomial.h delete mode 100755 interface/RooRealFlooredSumPdf.h delete mode 100644 src/AsymQuad.cc delete mode 100644 src/RooFuncPdf.cc delete mode 100644 src/RooNCSplineCore.cc delete mode 100644 src/RooNCSplineFactory_1D.cc delete mode 100644 src/RooNCSplineFactory_2D.cc delete mode 100644 src/RooNCSplineFactory_3D.cc delete mode 100644 src/RooNCSpline_1D_fast.cc delete mode 100644 src/RooNCSpline_2D_fast.cc delete mode 100644 src/RooNCSpline_3D_fast.cc delete mode 100644 src/RooPiecewisePolynomial.cc delete mode 100755 src/RooRealFlooredSumPdf.cc diff --git a/interface/AsymQuad.h b/interface/AsymQuad.h deleted file mode 100644 index 56dee3d63cd..00000000000 --- a/interface/AsymQuad.h +++ /dev/null @@ -1,50 +0,0 @@ -#ifndef HiggsAnalysis_CombinedLimit_AsymQuad_h -#define HiggsAnalysis_CombinedLimit_AsymQuad_h - -#include "RooFit.h" -#include "Riostream.h" -#include "TIterator.h" -#include "TList.h" -#include -#include "RooRealVar.h" -#include -#include "RooListProxy.h" -#include "RooMsgService.h" - - -//_________________________________________________ -/* -BEGIN_HTML -

    -AsymQuad is helper class for implementing asymmetric additive interpolation. -

    -END_HTML -*/ -// -class AsymQuad : public RooAbsReal { - -public: - AsymQuad(); - AsymQuad(const char *name, const char *title, const RooArgList& inFuncList, const RooArgList& inCoefList, Double_t smoothRegion=1., Int_t smoothAlgo=0); - AsymQuad(const AsymQuad& other, const char* name=0); - ~AsymQuad(); - - TObject* clone(const char* newname) const { return new AsymQuad(*this, newname); } - -protected: - Double_t evaluate() const; - - RooListProxy _funcList; // List of component functions - RooListProxy _coefList; // List of coefficients - Double_t smoothRegion_; - Int_t smoothAlgo_; - TIterator* _funcIter; //! Iterator over FUNC list - TIterator* _coefIter; //! Iterator over coefficient list - -private: - Double_t interpolate(Double_t theta_, Double_t valueCenter_, Double_t valueHigh_, Double_t valueLow_) const; - - ClassDef(AsymQuad, 1) // Asymmetric power -}; - -#endif diff --git a/interface/RooFuncPdf.h b/interface/RooFuncPdf.h deleted file mode 100644 index 96aab546912..00000000000 --- a/interface/RooFuncPdf.h +++ /dev/null @@ -1,44 +0,0 @@ -#ifndef RooFUNCPDF -#define RooFUNCPDF - -#include "RooRealProxy.h" -#include "RooAbsPdf.h" - -class RooFuncPdf : public RooAbsPdf{ -protected: - RooRealProxy theFunc; - -public: - RooFuncPdf() : RooAbsPdf(){} - RooFuncPdf( - const char* name, - const char* title - ) : RooAbsPdf(name, title), theFunc("theFunc","theFunc",this){} - RooFuncPdf( - const char* name, - const char* title, - RooAbsReal& inFunc - ) : RooAbsPdf(name, title), theFunc("theFunc", "theFunc", this, inFunc){} - RooFuncPdf(const RooFuncPdf& other, const char* name=0) : RooAbsPdf(other, name), theFunc("theFunc", this, other.theFunc){} - TObject* clone(const char* newname)const{ return new RooFuncPdf(*this, newname); } - inline virtual ~RooFuncPdf(){} - - Int_t getAnalyticalIntegral(RooArgSet& allVars, RooArgSet& analVars, const char* rangeName=0)const{ return dynamic_cast(theFunc.absArg())->getAnalyticalIntegral(allVars, analVars, rangeName); } - Double_t analyticalIntegral(Int_t code, const char* rangeName=0)const{ return dynamic_cast(theFunc.absArg())->analyticalIntegral(code, rangeName); } - - Int_t getAnalyticalIntegralWN(RooArgSet& allVars, RooArgSet& analVars, const RooArgSet *normSet, const char* rangeName=0)const{ return dynamic_cast(theFunc.absArg())->getAnalyticalIntegralWN(allVars, analVars, normSet, rangeName); } - Double_t analyticalIntegralWN(Int_t code, const RooArgSet* normSet, const char* rangeName=0)const{ - RooAbsPdf* pdfcast = dynamic_cast(theFunc.absArg()); - if (pdfcast!=0) return pdfcast->analyticalIntegralWN(code, normSet, rangeName); - else return RooAbsPdf::analyticalIntegralWN(code, normSet, rangeName); - } - -protected: - Double_t evaluate()const{ return theFunc; } - - - ClassDef(RooFuncPdf, 0) - -}; - -#endif diff --git a/interface/RooNCSplineCore.h b/interface/RooNCSplineCore.h deleted file mode 100644 index ead0aa44c55..00000000000 --- a/interface/RooNCSplineCore.h +++ /dev/null @@ -1,108 +0,0 @@ -#ifndef ROONCSPLINECORE -#define ROONCSPLINECORE - -#include -#include "Accumulators.h" -#include "TMatrixD.h" -#include "TVectorD.h" -#include "RooAbsReal.h" -#include "RooRealVar.h" -#include "RooRealProxy.h" -#include "RooConstVar.h" -#include "RooArgList.h" -#include "RooMsgService.h" -#include "RooListProxy.h" - -class RooNCSplineCore : public RooAbsReal{ -public: - typedef Float_t T; - typedef TMatrixT TMatrix_t; - typedef TVectorT TVector_t; - - enum VerbosityLevel{ - kSilent, - kError, - kVerbose - }; - - enum BoundaryCondition{ - bcApproximatedSlope, // D1 is the same as deltaY/deltaX in the first/last segment - bcClamped, // D1=0 at endpoint - bcApproximatedSecondDerivative, // D2 is approximated - bcNaturalSpline, // D2=0 at endpoint - bcQuadratic, // Coefficient D=0 - bcQuadraticWithNullSlope, // Coefficient D=0 and D1=0 at endpoint - NBoundaryConditions - }; - - RooNCSplineCore(); - RooNCSplineCore( - const char* name, - const char* title - ); - RooNCSplineCore( - const char* name, - const char* title, - RooAbsReal& inXVar, - const std::vector& inXList, - Bool_t inUseFloor=true, - T inFloorEval=1e-15, - T inFloorInt=1e-10 - ); - RooNCSplineCore(const RooNCSplineCore& other, const char* name=0); - virtual TObject* clone(const char* newname)const = 0; - inline virtual ~RooNCSplineCore(){} - - virtual void setVerbosity(VerbosityLevel flag); - void setEvalFloor(T val); - void setIntFloor(T val); - void doFloor(Bool_t flag); - - virtual void setRangeValidity(const T valmin, const T valmax, const Int_t whichDirection) = 0; - - virtual Int_t getAnalyticalIntegral(RooArgSet& allVars, RooArgSet& analVars, const char* rangeName=0)const = 0; - virtual Double_t analyticalIntegral(Int_t code, const char* rangeName=0)const = 0; - -protected: - VerbosityLevel verbosity; - Bool_t useFloor; - T floorEval; - T floorInt; - - T rangeXmin; - T rangeXmax; - - RooRealProxy theXVar; - RooListProxy leafDepsList; - std::vector XList; - - virtual void emptyFcnList() = 0; - - void getLeafDependents(RooRealProxy& proxy, RooArgSet& set); - void addLeafDependents(RooArgSet& set); - - unsigned int npointsX()const{ return XList.size(); } - - virtual Int_t getWhichBin(const T& val, const Int_t whichDirection)const = 0; - virtual void getKappas(std::vector& kappas, const Int_t whichDirection) = 0; - virtual T getTVar(const std::vector& kappas, const T& val, const Int_t& bin, const Int_t whichDirection)const = 0; - - virtual Bool_t testRangeValidity(const T& val, const Int_t whichDirection)const = 0; - virtual void cropValueForRange(T& val, const Int_t whichDirection)const = 0; - - virtual T interpolateFcn(Int_t code, const char* rangeName=0)const = 0; - virtual Double_t evaluate()const = 0; - - virtual void getBArray(const std::vector& kappas, const std::vector& fcnList, std::vector& BArray, BoundaryCondition const& bcBegin, BoundaryCondition const& bcEnd)const; - virtual void getAArray(const std::vector& kappas, std::vector>& AArray, BoundaryCondition const& bcBegin, BoundaryCondition const& bcEnd)const; - virtual std::vector> getCoefficientsAlongDirection(const std::vector& kappas, const TMatrix_t& Ainv, const std::vector& fcnList, BoundaryCondition const& bcBegin, BoundaryCondition const& bcEnd, const Int_t pickBin)const; - virtual std::vector getCoefficients(const TVector_t& S, const std::vector& kappas, const std::vector& fcnList, const Int_t& bin)const; - - virtual T evalSplineSegment(const std::vector& coefs, const T& kappa, const T& tup, const T& tdn, Bool_t doIntegrate=false)const; - - - ClassDef(RooNCSplineCore, 3) - -}; - -#endif diff --git a/interface/RooNCSplineFactory_1D.h b/interface/RooNCSplineFactory_1D.h deleted file mode 100644 index bd1e2c61175..00000000000 --- a/interface/RooNCSplineFactory_1D.h +++ /dev/null @@ -1,65 +0,0 @@ -#ifndef ROONCSPLINEFACTORY_1D -#define ROONCSPLINEFACTORY_1D - -#include -#include -#include -#include "TGraph.h" -#include "TTree.h" -#include "RooNCSpline_1D_fast.h" -#include "RooFuncPdf.h" - -class RooNCSplineFactory_1D{ -protected: - TString appendName; - - RooNCSplineCore::BoundaryCondition bcBeginX; - RooNCSplineCore::BoundaryCondition bcEndX; - - RooAbsReal* splineVar; - RooNCSpline_1D_fast* fcn; - RooFuncPdf* PDF; - - const std::vector> getPoints(const std::vector& XList, const std::vector& FcnList); - - void destroyPDF(); - void initPDF(const std::vector>& pList); - -public: - RooNCSplineFactory_1D( - RooAbsReal& splineVar_, TString appendName_="", - RooNCSplineCore::BoundaryCondition const bcBeginX_=RooNCSplineCore::bcNaturalSpline, - RooNCSplineCore::BoundaryCondition const bcEndX_=RooNCSplineCore::bcNaturalSpline - ); - ~RooNCSplineFactory_1D(); - - RooNCSpline_1D_fast* getFunc(){ return fcn; } - RooFuncPdf* getPDF(){ return PDF; } - - void setEndConditions( - RooNCSplineCore::BoundaryCondition const bcBegin, - RooNCSplineCore::BoundaryCondition const bcEnd, - const unsigned int direction=0 - ); - - void setPoints(TTree* tree); - void setPoints(TGraph* tg); - void setPoints(const std::vector>& pList){ initPDF(pList); } - template void setPoints(const std::vector& XList, const std::vector& FcnList){ - std::vector transXList; - std::vector transFcnList; - for (unsigned int ip=0; ip> pList = getPoints(transXList, transFcnList); - initPDF(pList); - } - -}; - -template void RooNCSplineFactory_1D::setPoints(const std::vector& XList, const std::vector& FcnList); -template void RooNCSplineFactory_1D::setPoints(const std::vector& XList, const std::vector& FcnList); - -#endif - - - diff --git a/interface/RooNCSplineFactory_2D.h b/interface/RooNCSplineFactory_2D.h deleted file mode 100644 index 902c874c3df..00000000000 --- a/interface/RooNCSplineFactory_2D.h +++ /dev/null @@ -1,101 +0,0 @@ -#ifndef ROONCSPLINEFACTORY_2D -#define ROONCSPLINEFACTORY_2D - -#include -#include -#include -#include "TTree.h" -#include "RooNCSpline_2D_fast.h" -#include "RooFuncPdf.h" - - -namespace NumUtils{ - template struct triplet{ - T value[3]; - triplet(T i1, T i2, T i3){ - value[0]=i1; - value[1]=i2; - value[2]=i3; - - } - triplet(T i1){ - value[0]=i1; - value[1]=i1; - value[2]=i1; - - } - triplet(){} - T& operator[](std::size_t ipos){ return value[ipos]; } // Return by reference - const T& operator[](std::size_t ipos)const{ return value[ipos]; } // Return by const reference - }; - - typedef triplet intTriplet_t; - typedef triplet floatTriplet_t; - typedef triplet doubleTriplet_t; -} - -typedef NumUtils::triplet splineTriplet_t; - - -class RooNCSplineFactory_2D{ -protected: - TString appendName; - - RooNCSplineCore::BoundaryCondition bcBeginX; - RooNCSplineCore::BoundaryCondition bcEndX; - RooNCSplineCore::BoundaryCondition bcBeginY; - RooNCSplineCore::BoundaryCondition bcEndY; - - RooAbsReal* XVar; - RooAbsReal* YVar; - RooNCSpline_2D_fast* fcn; - RooFuncPdf* PDF; - - const std::vector getPoints(const std::vector& XList, const std::vector& YList, const std::vector& FcnList); - - void destroyPDF(); - void initPDF(const std::vector& pList); - - void addUnique(std::vector& list, RooNCSplineCore::T val); - -public: - RooNCSplineFactory_2D( - RooAbsReal& XVar_, RooAbsReal& YVar_, TString appendName_="", - RooNCSplineCore::BoundaryCondition const bcBeginX_=RooNCSplineCore::bcNaturalSpline, - RooNCSplineCore::BoundaryCondition const bcEndX_=RooNCSplineCore::bcNaturalSpline, - RooNCSplineCore::BoundaryCondition const bcBeginY_=RooNCSplineCore::bcNaturalSpline, - RooNCSplineCore::BoundaryCondition const bcEndY_=RooNCSplineCore::bcNaturalSpline - ); - ~RooNCSplineFactory_2D(); - - RooNCSpline_2D_fast* getFunc(){ return fcn; } - RooFuncPdf* getPDF(){ return PDF; } - - void setEndConditions( - RooNCSplineCore::BoundaryCondition const bcBegin, - RooNCSplineCore::BoundaryCondition const bcEnd, - const unsigned int direction - ); - - void setPoints(TTree* tree); - void setPoints(const std::vector& pList){ initPDF(pList); } - template void setPoints(const std::vector& XList, const std::vector& YList, const std::vector& FcnList){ - std::vector transXList; - std::vector transYList; - std::vector transFcnList; - for (unsigned int ip=0; ip pList = getPoints(transXList, transYList, transFcnList); - setPoints(pList); - } - -}; - -template void RooNCSplineFactory_2D::setPoints(const std::vector& XList, const std::vector& YList, const std::vector& FcnList); -template void RooNCSplineFactory_2D::setPoints(const std::vector& XList, const std::vector& YList, const std::vector& FcnList); - -#endif - - - diff --git a/interface/RooNCSplineFactory_3D.h b/interface/RooNCSplineFactory_3D.h deleted file mode 100644 index 1f0b68c0e4b..00000000000 --- a/interface/RooNCSplineFactory_3D.h +++ /dev/null @@ -1,104 +0,0 @@ -#ifndef ROONCSPLINEFACTORY_3D -#define ROONCSPLINEFACTORY_3D - -#include -#include -#include -#include "TTree.h" -#include "RooNCSpline_3D_fast.h" -#include "RooFuncPdf.h" - - -namespace NumUtils{ - template struct quadruplet{ - T value[4]; - quadruplet(T i1, T i2, T i3, T i4){ - value[0]=i1; - value[1]=i2; - value[2]=i3; - value[3]=i4; - } - quadruplet(T i1){ for (unsigned int idim=0; idim<4; idim++) value[idim] = i1; } - quadruplet(){} - T& operator[](std::size_t ipos){ return value[ipos]; } // Return by reference - const T& operator[](std::size_t ipos)const{ return value[ipos]; } // Return by const reference - }; - - typedef quadruplet intQuad_t; - typedef quadruplet floatQuad_t; - typedef quadruplet doubleQuad_t; -} - -typedef NumUtils::quadruplet splineQuadruplet_t; - - -class RooNCSplineFactory_3D{ -protected: - TString appendName; - - RooNCSplineCore::BoundaryCondition bcBeginX; - RooNCSplineCore::BoundaryCondition bcEndX; - RooNCSplineCore::BoundaryCondition bcBeginY; - RooNCSplineCore::BoundaryCondition bcEndY; - RooNCSplineCore::BoundaryCondition bcBeginZ; - RooNCSplineCore::BoundaryCondition bcEndZ; - - RooAbsReal* XVar; - RooAbsReal* YVar; - RooAbsReal* ZVar; - RooNCSpline_3D_fast* fcn; - RooFuncPdf* PDF; - - const std::vector getPoints(const std::vector& XList, const std::vector& YList, const std::vector& ZList, const std::vector& FcnList); - - void destroyPDF(); - void initPDF(const std::vector& pList); - - void addUnique(std::vector& list, RooNCSplineCore::T val); - -public: - RooNCSplineFactory_3D( - RooAbsReal& XVar_, RooAbsReal& YVar_, RooAbsReal& ZVar_, TString appendName_="", - RooNCSplineCore::BoundaryCondition const bcBeginX_=RooNCSplineCore::bcNaturalSpline, - RooNCSplineCore::BoundaryCondition const bcEndX_=RooNCSplineCore::bcNaturalSpline, - RooNCSplineCore::BoundaryCondition const bcBeginY_=RooNCSplineCore::bcNaturalSpline, - RooNCSplineCore::BoundaryCondition const bcEndY_=RooNCSplineCore::bcNaturalSpline, - RooNCSplineCore::BoundaryCondition const bcBeginZ_=RooNCSplineCore::bcNaturalSpline, - RooNCSplineCore::BoundaryCondition const bcEndZ_=RooNCSplineCore::bcNaturalSpline - ); - ~RooNCSplineFactory_3D(); - - RooNCSpline_3D_fast* getFunc(){ return fcn; } - RooFuncPdf* getPDF(){ return PDF; } - - void setEndConditions( - RooNCSplineCore::BoundaryCondition const bcBegin, - RooNCSplineCore::BoundaryCondition const bcEnd, - const unsigned int direction - ); - - void setPoints(TTree* tree); - void setPoints(const std::vector& pList){ initPDF(pList); } - template void setPoints(const std::vector& XList, const std::vector& YList, const std::vector& ZList, const std::vector& FcnList){ - std::vector transXList; - std::vector transYList; - std::vector transZList; - std::vector transFcnList; - for (unsigned int ip=0; ip pList = getPoints(transXList, transYList, transZList, transFcnList); - setPoints(pList); - } - -}; - -template void RooNCSplineFactory_3D::setPoints(const std::vector& XList, const std::vector& YList, const std::vector& ZList, const std::vector& FcnList); -template void RooNCSplineFactory_3D::setPoints(const std::vector& XList, const std::vector& YList, const std::vector& ZList, const std::vector& FcnList); - - -#endif - - - diff --git a/interface/RooNCSpline_1D_fast.h b/interface/RooNCSpline_1D_fast.h deleted file mode 100644 index 46cbbb1dd6b..00000000000 --- a/interface/RooNCSpline_1D_fast.h +++ /dev/null @@ -1,68 +0,0 @@ -#ifndef ROONCSPLINE_1D_FAST -#define ROONCSPLINE_1D_FAST - -#include -#include "RooAbsPdf.h" -#include "RooRealProxy.h" -#include "RooRealVar.h" -#include "RooAbsReal.h" -#include "RooNCSplineCore.h" - - -class RooNCSpline_1D_fast : public RooNCSplineCore{ -protected: - BoundaryCondition const bcBeginX; - BoundaryCondition const bcEndX; - - std::vector FcnList; // List of function values - - std::vector kappaX; - std::vector> coefficients; - -public: - RooNCSpline_1D_fast(); - RooNCSpline_1D_fast( - const char* name, - const char* title - ); - RooNCSpline_1D_fast( - const char* name, - const char* title, - RooAbsReal& inXVar, - const std::vector& inXList, - const std::vector& inFcnList, - RooNCSplineCore::BoundaryCondition const bcBeginX_=RooNCSplineCore::bcNaturalSpline, - RooNCSplineCore::BoundaryCondition const bcEndX_=RooNCSplineCore::bcNaturalSpline, - Bool_t inUseFloor=true, - T inFloorEval=0, - T inFloorInt=0 - ); - RooNCSpline_1D_fast(const RooNCSpline_1D_fast& other, const char* name=0); - virtual TObject* clone(const char* newname)const { return new RooNCSpline_1D_fast(*this, newname); } - inline virtual ~RooNCSpline_1D_fast(){} - - void setRangeValidity(const T valmin, const T valmax, const Int_t whichDirection=0); - - virtual Int_t getAnalyticalIntegral(RooArgSet& allVars, RooArgSet& analVars, const char* rangeName=0)const; - virtual Double_t analyticalIntegral(Int_t code, const char* rangeName=0)const; - -protected: - virtual void emptyFcnList(){ std::vector tmp; FcnList.swap(tmp); } - - virtual Int_t getWhichBin(const T& val, const Int_t whichDirection)const; - virtual T getTVar(const std::vector& kappas, const T& val, const Int_t& bin, const Int_t whichDirection)const; - virtual void getKappas(std::vector& kappas, const Int_t whichDirection); - - Bool_t testRangeValidity(const T& val, const Int_t whichDirection=0)const; - void cropValueForRange(T& val, const Int_t whichDirection=0)const; - - virtual T interpolateFcn(Int_t code, const char* rangeName=0)const; - - virtual Double_t evaluate()const; - - - ClassDef(RooNCSpline_1D_fast, 2) - -}; - -#endif diff --git a/interface/RooNCSpline_2D_fast.h b/interface/RooNCSpline_2D_fast.h deleted file mode 100644 index 8f8ae2b4a16..00000000000 --- a/interface/RooNCSpline_2D_fast.h +++ /dev/null @@ -1,84 +0,0 @@ -#ifndef ROONCSPLINE_2D_FAST -#define ROONCSPLINE_2D_FAST - -#include -#include "RooAbsPdf.h" -#include "RooRealProxy.h" -#include "RooRealVar.h" -#include "RooAbsReal.h" -#include "RooNCSplineCore.h" - -class RooNCSpline_2D_fast : public RooNCSplineCore{ -protected: - T rangeYmin; - T rangeYmax; - - BoundaryCondition const bcBeginX; - BoundaryCondition const bcEndX; - BoundaryCondition const bcBeginY; - BoundaryCondition const bcEndY; - - RooRealProxy theYVar; - std::vector YList; - - std::vector> FcnList; - - std::vector kappaX; - std::vector kappaY; - std::vector>>> coefficients; // [ix][A_x,B_x,C_x,D_x][iy][A_x_y,B_x_y,C_x_y,D_x_y] - -public: - RooNCSpline_2D_fast(); - RooNCSpline_2D_fast( - const char* name, - const char* title - ); - RooNCSpline_2D_fast( - const char* name, - const char* title, - RooAbsReal& inXVar, - RooAbsReal& inYVar, - const std::vector& inXList, - const std::vector& inYList, - const std::vector>& inFcnList, - RooNCSplineCore::BoundaryCondition const bcBeginX_=RooNCSplineCore::bcNaturalSpline, - RooNCSplineCore::BoundaryCondition const bcEndX_=RooNCSplineCore::bcNaturalSpline, - RooNCSplineCore::BoundaryCondition const bcBeginY_=RooNCSplineCore::bcNaturalSpline, - RooNCSplineCore::BoundaryCondition const bcEndY_=RooNCSplineCore::bcNaturalSpline, - Bool_t inUseFloor=true, - T inFloorEval=0, - T inFloorInt=0 - ); - RooNCSpline_2D_fast(const RooNCSpline_2D_fast& other, const char* name=0); - virtual TObject* clone(const char* newname)const { return new RooNCSpline_2D_fast(*this, newname); } - inline virtual ~RooNCSpline_2D_fast(){} - - void setRangeValidity(const T valmin, const T valmax, const Int_t whichDirection); - - virtual Int_t getAnalyticalIntegral(RooArgSet& allVars, RooArgSet& analVars, const char* rangeName=0) const; - virtual Double_t analyticalIntegral(Int_t code, const char* rangeName=0)const; - -protected: - virtual void emptyFcnList(){ std::vector> tmp; FcnList.swap(tmp); } - - unsigned int npointsY()const{ return YList.size(); } - - virtual Int_t getWhichBin(const T& val, const Int_t whichDirection)const; - virtual T getTVar(const std::vector& kappas, const T& val, const Int_t& bin, const Int_t whichDirection)const; - virtual void getKappas(std::vector& kappas, const Int_t whichDirection); - - Bool_t testRangeValidity(const T& val, const Int_t whichDirection)const; - void cropValueForRange(T& val, const Int_t whichDirection)const; - - virtual std::vector> getCoefficientsPerY(const std::vector& kappaX, const TMatrix_t& xAinv, const Int_t& ybin, RooNCSplineCore::BoundaryCondition const& bcBegin, RooNCSplineCore::BoundaryCondition const& bcEnd, const Int_t xbin)const; // xbin can be -1, which means push all of them - - virtual T interpolateFcn(Int_t code, const char* rangeName=0)const; - - virtual Double_t evaluate()const; - - - ClassDef(RooNCSpline_2D_fast, 2) - -}; - -#endif diff --git a/interface/RooNCSpline_3D_fast.h b/interface/RooNCSpline_3D_fast.h deleted file mode 100644 index d32b8dcbf64..00000000000 --- a/interface/RooNCSpline_3D_fast.h +++ /dev/null @@ -1,105 +0,0 @@ -#ifndef ROONCSPLINE_3D_FAST -#define ROONCSPLINE_3D_FAST - -#include -#include "RooAbsPdf.h" -#include "RooRealProxy.h" -#include "RooRealVar.h" -#include "RooAbsReal.h" -#include "RooNCSplineCore.h" - -class RooNCSpline_3D_fast : public RooNCSplineCore{ -protected: - T rangeYmin; - T rangeYmax; - T rangeZmin; - T rangeZmax; - - BoundaryCondition const bcBeginX; - BoundaryCondition const bcEndX; - BoundaryCondition const bcBeginY; - BoundaryCondition const bcEndY; - BoundaryCondition const bcBeginZ; - BoundaryCondition const bcEndZ; - - RooRealProxy theYVar; - RooRealProxy theZVar; - std::vector YList; - std::vector ZList; - - std::vector>> FcnList; - - std::vector kappaX; - std::vector kappaY; - std::vector kappaZ; - std::vector> - >> - >> coefficients; // [ix][A_x,B_x,C_x,D_x][iy][A_x_y,B_x_y,C_x_y,D_x_y][iz][A_x_y_z,B_x_y_z,C_x_y_z,D_x_y_z] - -public: - RooNCSpline_3D_fast(); - RooNCSpline_3D_fast( - const char* name, - const char* title - ); - RooNCSpline_3D_fast( - const char* name, - const char* title, - RooAbsReal& inXVar, - RooAbsReal& inYVar, - RooAbsReal& inZVar, - const std::vector& inXList, - const std::vector& inYList, - const std::vector& inZList, - const std::vector>>& inFcnList, - RooNCSplineCore::BoundaryCondition const bcBeginX_=RooNCSplineCore::bcNaturalSpline, - RooNCSplineCore::BoundaryCondition const bcEndX_=RooNCSplineCore::bcNaturalSpline, - RooNCSplineCore::BoundaryCondition const bcBeginY_=RooNCSplineCore::bcNaturalSpline, - RooNCSplineCore::BoundaryCondition const bcEndY_=RooNCSplineCore::bcNaturalSpline, - RooNCSplineCore::BoundaryCondition const bcBeginZ_=RooNCSplineCore::bcNaturalSpline, - RooNCSplineCore::BoundaryCondition const bcEndZ_=RooNCSplineCore::bcNaturalSpline, - Bool_t inUseFloor=true, - T inFloorEval=0, - T inFloorInt=0 - ); - RooNCSpline_3D_fast(const RooNCSpline_3D_fast& other, const char* name=0); - virtual TObject* clone(const char* newname)const { return new RooNCSpline_3D_fast(*this, newname); } - inline virtual ~RooNCSpline_3D_fast(){} - - void setRangeValidity(const T valmin, const T valmax, const Int_t whichDirection); - - virtual Int_t getAnalyticalIntegral(RooArgSet& allVars, RooArgSet& analVars, const char* rangeName=0) const; - virtual Double_t analyticalIntegral(Int_t code, const char* rangeName=0)const; - -protected: - virtual void emptyFcnList(){ std::vector>> tmp; FcnList.swap(tmp); } - - unsigned int npointsY()const{ return YList.size(); } - unsigned int npointsZ()const{ return ZList.size(); } - - virtual Int_t getWhichBin(const T& val, const Int_t whichDirection)const; - virtual T getTVar(const std::vector& kappas, const T& val, const Int_t& bin, const Int_t whichDirection)const; - virtual void getKappas(std::vector& kappas, const Int_t whichDirection); - - Bool_t testRangeValidity(const T& val, const Int_t whichDirection)const; - void cropValueForRange(T& val, const Int_t whichDirection)const; - - virtual std::vector> getCoefficientsPerYPerZ( - const std::vector& kappaX, const TMatrix_t& xAinv, - const Int_t& ybin, const Int_t& zbin, - RooNCSplineCore::BoundaryCondition const& bcBegin, RooNCSplineCore::BoundaryCondition const& bcEnd, - const Int_t xbin - )const; // xbin can be -1, which means push all of them - - virtual T interpolateFcn(Int_t code, const char* rangeName=0)const; - - virtual Double_t evaluate()const; - - - ClassDef(RooNCSpline_3D_fast, 2) - -}; - -#endif diff --git a/interface/RooPiecewisePolynomial.h b/interface/RooPiecewisePolynomial.h deleted file mode 100644 index a548af454cb..00000000000 --- a/interface/RooPiecewisePolynomial.h +++ /dev/null @@ -1,50 +0,0 @@ -#ifndef ROOPIECEWISEPOLYNOMIAL_H -#define ROOPIECEWISEPOLYNOMIAL_H -#include -#include "RooAbsReal.h" -#include "RooArgList.h" -#include "RooRealProxy.h" -#include "RooListProxy.h" - -// Piecewise polynomial that looks like -// -- . -- ... -- . -- -class RooPiecewisePolynomial : public RooAbsReal{ -protected: - RooRealProxy xvar; - - // First [0,...,nnodes-1] parameters are nodes - // There should be 2*ndof_endfcn+(nfcn-2)*ndof_middlefcn more parameters for the free dofs in the functions - // where ndof_endfcn=polyndof-1 and ndof_middlefcn=polyndof-2 - // For nfcn=4, polyndof=4, the order of parameters is - // node 0, node 1, node 2 (nnodes=nfcn-1), and then - // a0 + a1*x + a2*x^2 + not_a_par*x^3 (= fcn 0) - // b0 + b1*x + not_a_par*x^2 + not_a_par*x^3 (= fcn 1) - // c0 + c1*x + not_a_par*x^2 + not_a_par*x^3 (= fcn 2) - // d0 + d1*x + not_a_par*x^2 + d3*x^3 (= fcn 3) - // Continuity between the fcns is guaranteed, but notice that smoothness is not. - RooListProxy parList; - - const int nfcn; // Number of piecewise functions - const int polyndof; // Ndof of the polynomial (e.g. 4: cubic) - const int nnodes; // How many nodes are in between (= nfcn-1) - const int ndof_endfcn; // Number of degrees of freedom in fcns in the middle of the nodes (= polyndof-1) - const int ndof_middlefcn; // Number of degrees of freedom in fcns outside the nodes (= polyndof-2) - - double eval(double x, std::vector const& par)const; - -public: - RooPiecewisePolynomial(const int nfcn_=1, const int polyndof_=1); - RooPiecewisePolynomial(const char* name, const char* title, const int nfcn_=1, const int polyndof_=1); - RooPiecewisePolynomial(const char* name, const char* title, RooAbsReal& xvar_, RooArgList const& parList_, const int nfcn_, const int polyndof_); - RooPiecewisePolynomial(RooPiecewisePolynomial const& other, const char* name=0); - virtual TObject* clone(const char* newname)const{ return new RooPiecewisePolynomial(*this, newname); } - inline virtual ~RooPiecewisePolynomial(){} - - double evaluate()const; - double evaluate(double* x, double* p)const; // For calling in a TF1 object - - ClassDef(RooPiecewisePolynomial, 1) - -}; - -#endif diff --git a/interface/RooRealFlooredSumPdf.h b/interface/RooRealFlooredSumPdf.h deleted file mode 100755 index 660fa784c01..00000000000 --- a/interface/RooRealFlooredSumPdf.h +++ /dev/null @@ -1,95 +0,0 @@ -/***************************************************************************** - * Project: RooFit * - * * - * This code was autogenerated by RooClassFactory * - *****************************************************************************/ - -#ifndef ROOREALFLOOREDSUMPDF -#define ROOREALFLOOREDSUMPDF - - -#include -#include "RooAbsReal.h" -#include "RooAbsPdf.h" -#include "RooRealVar.h" -#include "RooRealProxy.h" -#include "RooAbsCategory.h" -#include "RooCategoryProxy.h" -#include "RooListProxy.h" -#include "RooAICRegistry.h" -#include "RooObjCacheManager.h" -#include "TH3F.h" -#include "TH1.h" -#include "RooDataHist.h" -#include "RooHistFunc.h" - - -class RooRealFlooredSumPdf : public RooAbsPdf { -public: - - RooRealFlooredSumPdf(); - RooRealFlooredSumPdf(const char *name, const char *title); - RooRealFlooredSumPdf(const char *name, const char *title, const RooArgList& funcList, const RooArgList& coefList, Bool_t extended = kFALSE); - RooRealFlooredSumPdf(const RooRealFlooredSumPdf& other, const char* name = 0); - virtual TObject* clone(const char* newname) const { return new RooRealFlooredSumPdf(*this, newname); } - virtual ~RooRealFlooredSumPdf(); - - Double_t evaluate() const; - virtual Bool_t checkObservables(const RooArgSet* nset) const; - - virtual Bool_t forceAnalyticalInt(const RooAbsArg&) const { return kTRUE; } - Int_t getAnalyticalIntegralWN(RooArgSet& allVars, RooArgSet& numVars, const RooArgSet* normSet, const char* rangeName = 0) const; - Double_t analyticalIntegralWN(Int_t code, const RooArgSet* normSet, const char* rangeName = 0) const; - - const RooArgList& funcList() const { return _funcList; } - const RooArgList& coefList() const { return _coefList; } - - void setFloor(Double_t val); - - virtual ExtendMode extendMode() const; - - virtual Double_t expectedEvents(const RooArgSet* nset) const; - virtual Double_t expectedEvents(const RooArgSet& nset) const { - // Return expected number of events for extended likelihood calculation - // which is the sum of all coefficients - return expectedEvents(&nset); - } - - void printMetaArgs(std::ostream& os) const; - - - virtual std::list* binBoundaries(RooAbsRealLValue& /*obs*/, Double_t /*xlo*/, Double_t /*xhi*/) const; - virtual std::list* plotSamplingHint(RooAbsRealLValue& /*obs*/, Double_t /*xlo*/, Double_t /*xhi*/) const; - Bool_t isBinnedDistribution(const RooArgSet& obs) const; - - -protected: - - class CacheElem : public RooAbsCacheElement { - public: - CacheElem() {}; - virtual ~CacheElem() {}; - virtual RooArgList containedArgs(Action) { RooArgList ret(_funcIntList); ret.add(_funcNormList); return ret; } - RooArgList _funcIntList; - RooArgList _funcNormList; - }; - mutable RooObjCacheManager _normIntMgr; // The integration cache manager - - - Bool_t _haveLastCoef; - - RooListProxy _funcList; // List of component FUNCs - RooListProxy _coefList; // List of coefficients - TIterator* _funcIter; //! Iterator over FUNC list - TIterator* _coefIter; //! Iterator over coefficient list - Bool_t _extended; // Allow use as extended p.d.f. - Bool_t _doFloor; - Double_t _floorVal; - -private: - - ClassDef(RooRealFlooredSumPdf, 2) // PDF constructed from a sum of (non-pdf) functions -}; - - -#endif diff --git a/src/AsymQuad.cc b/src/AsymQuad.cc deleted file mode 100644 index e9886929c44..00000000000 --- a/src/AsymQuad.cc +++ /dev/null @@ -1,128 +0,0 @@ -#include "../interface/AsymQuad.h" - -#include -#include -#include - -AsymQuad::AsymQuad() : -RooAbsReal(), -_funcList("funcList", "List of functions", this), -_coefList("coefList", "List of coefficients", this), -smoothRegion_(0), -smoothAlgo_(0) -{ - _funcIter = _funcList.createIterator(); - _coefIter = _coefList.createIterator(); -} - -AsymQuad::AsymQuad(const char *name, const char *title, const RooArgList& inFuncList, const RooArgList& inCoefList, Double_t smoothRegion, Int_t smoothAlgo) : -RooAbsReal(name, title), -_funcList("funcList", "List of functions", this), -_coefList("coefList", "List of coefficients", this), -smoothRegion_(smoothRegion), -smoothAlgo_(smoothAlgo) -{ - if (inFuncList.getSize()!=2*inCoefList.getSize()+1) { - coutE(InputArguments) << "AsymQuad::AsymQuad(" << GetName() - << ") number of functions and coefficients inconsistent, must have Nfunc=1+2*Ncoef" << std::endl; - assert(0); - } - - TIterator* funcIter = inFuncList.createIterator(); - RooAbsArg* func; - while ((func = (RooAbsArg*)funcIter->Next())) { - if (!dynamic_cast(func)) { - coutE(InputArguments) << "ERROR: AsymQuad::AsymQuad(" << GetName() << ") function " << func->GetName() << " is not of type RooAbsReal" << std::endl; - assert(0); - } - _funcList.add(*func); - } - delete funcIter; - - TIterator* coefIter = inCoefList.createIterator(); - RooAbsArg* coef; - while ((coef = (RooAbsArg*)coefIter->Next())) { - if (!dynamic_cast(coef)) { - coutE(InputArguments) << "ERROR: AsymQuad::AsymQuad(" << GetName() << ") coefficient " << coef->GetName() << " is not of type RooAbsReal" << std::endl; - assert(0); - } - _coefList.add(*coef); - } - delete coefIter; - - _funcIter = _funcList.createIterator(); - _coefIter = _coefList.createIterator(); -} - -AsymQuad::AsymQuad(const AsymQuad& other, const char* name): -RooAbsReal(other, name), -_funcList("!funcList", this, other._funcList), -_coefList("!coefList", this, other._coefList), -smoothRegion_(other.smoothRegion_), -smoothAlgo_(other.smoothAlgo_) -{ - _funcIter = _funcList.createIterator(); - _coefIter = _coefList.createIterator(); -} - -AsymQuad::~AsymQuad() { - delete _funcIter; - delete _coefIter; -} - -Double_t AsymQuad::evaluate() const { - Double_t result(0); - - _funcIter->Reset(); - _coefIter->Reset(); - RooAbsReal* coef; - RooAbsReal* func = (RooAbsReal*)_funcIter->Next(); - - Double_t central = func->getVal(); - result = central; - - while ((coef=(RooAbsReal*)_coefIter->Next())) { - Double_t coefVal = coef->getVal(); - RooAbsReal* funcUp = (RooAbsReal*)_funcIter->Next(); - RooAbsReal* funcDn = (RooAbsReal*)_funcIter->Next(); - result += interpolate(coefVal, central, funcUp->getVal(), funcDn->getVal()); - } - - return result; -} - -Double_t AsymQuad::interpolate(Double_t theta_, Double_t valueCenter_, Double_t valueHigh_, Double_t valueLow_) const { - if (smoothAlgo_<0) return 0; - else{ - if (fabs(theta_)>=smoothRegion_) return theta_ * (theta_ > 0 ? valueHigh_ - valueCenter_ : valueCenter_ - valueLow_); - if (smoothAlgo_ == 0) { - // Quadratic interpolation null at zero and continuous at boundaries but not smooth at boundaries - Double_t c_up = +theta_ * (smoothRegion_ + theta_) / (2 * smoothRegion_); - Double_t c_dn = -theta_ * (smoothRegion_ - theta_) / (2 * smoothRegion_); - Double_t c_cen = -theta_ * theta_ / smoothRegion_; - return c_up * valueHigh_ + c_dn * valueLow_ + c_cen * valueCenter_; - } - else if (smoothAlgo_ == 1){ - // Quadratic interpolation that is everywhere differentiable but not null at zero - Double_t c_up = (smoothRegion_ + theta_) * (smoothRegion_ + theta_) / (4 * smoothRegion_); - Double_t c_dn = (smoothRegion_ - theta_) * (smoothRegion_ - theta_) / (4 * smoothRegion_); - Double_t c_cen = -c_up - c_dn; - return c_up * valueHigh_ + c_dn * valueLow_ + c_cen * valueCenter_; - } - else/* if (smoothAlgo_ == 2)*/{ - // Quadratic interpolation that is everywhere differentiable and null at zero - Double_t cnorm = theta_/smoothRegion_; - Double_t cnorm2 = pow(cnorm, 2); - Double_t hi = valueHigh_ - valueCenter_; - Double_t lo = valueLow_ - valueCenter_; - Double_t sum = hi+lo; - Double_t diff = hi-lo; - Double_t a = theta_/2.; // cnorm*smoothRegion_ - Double_t b = 0.125 * cnorm * (cnorm2 * (3.*cnorm2 - 10.) + 15.); - Double_t result = a*(diff + b*sum); - return result; - } - } -} - -ClassImp(AsymQuad) diff --git a/src/RooFuncPdf.cc b/src/RooFuncPdf.cc deleted file mode 100644 index 1bfac2e790a..00000000000 --- a/src/RooFuncPdf.cc +++ /dev/null @@ -1,3 +0,0 @@ -#include "../interface/RooFuncPdf.h" - -ClassImp(RooFuncPdf) diff --git a/src/RooNCSplineCore.cc b/src/RooNCSplineCore.cc deleted file mode 100644 index 68df9d9e025..00000000000 --- a/src/RooNCSplineCore.cc +++ /dev/null @@ -1,284 +0,0 @@ -#include "../interface/RooNCSplineCore.h" -#include -#include "TMath.h" -#include "TIterator.h" -#include "Riostream.h" - -using namespace TMath; -using namespace RooFit; -using namespace std; - - -ClassImp(RooNCSplineCore) - -RooNCSplineCore::RooNCSplineCore() : -RooAbsReal(), -verbosity(RooNCSplineCore::kSilent), -useFloor(true), floorEval(0), floorInt(0), -rangeXmin(1), rangeXmax(-1), -theXVar("theXVar", "theXVar", this), -leafDepsList("leafDepsList", "leafDepsList", this) -{} - -RooNCSplineCore::RooNCSplineCore( - const char* name, - const char* title - ) : - RooAbsReal(name, title), - verbosity(RooNCSplineCore::kSilent), - useFloor(true), floorEval(0), floorInt(0), - rangeXmin(1), rangeXmax(-1), - theXVar("theXVar", "theXVar", this), - leafDepsList("leafDepsList", "leafDepsList", this) -{} - -RooNCSplineCore::RooNCSplineCore( - const char* name, - const char* title, - RooAbsReal& inXVar, - const std::vector& inXList, - Bool_t inUseFloor, - T inFloorEval, - T inFloorInt - ) : - RooAbsReal(name, title), - verbosity(RooNCSplineCore::kSilent), - useFloor(inUseFloor), floorEval(inFloorEval), floorInt(inFloorInt), - rangeXmin(1), rangeXmax(-1), - theXVar("theXVar", "theXVar", this, inXVar), - leafDepsList("leafDepsList", "leafDepsList", this), - XList(inXList) -{} - -RooNCSplineCore::RooNCSplineCore( - const RooNCSplineCore& other, - const char* name - ) : - RooAbsReal(other, name), - verbosity(other.verbosity), - useFloor(other.useFloor), floorEval(other.floorEval), floorInt(other.floorInt), - rangeXmin(other.rangeXmin), rangeXmax(other.rangeXmax), - theXVar("theXVar", this, other.theXVar), - leafDepsList("leafDepsList", this, other.leafDepsList), - XList(other.XList) -{} - -void RooNCSplineCore::setVerbosity(VerbosityLevel flag){ verbosity = flag; } -void RooNCSplineCore::setEvalFloor(RooNCSplineCore::T val){ floorEval = val; } -void RooNCSplineCore::setIntFloor(RooNCSplineCore::T val){ floorInt = val; } -void RooNCSplineCore::doFloor(Bool_t flag){ useFloor = flag; } - -void RooNCSplineCore::getBArray(const std::vector& kappas, const vector& fcnList, std::vector& BArray, BoundaryCondition const& bcBegin, BoundaryCondition const& bcEnd)const{ - BArray.clear(); - int npoints=kappas.size(); - if (npoints!=(int)fcnList.size()){ - coutE(InputArguments) << "RooNCSplineCore::getBArray: Dim(kappas)=" << npoints << " != Dim(fcnList)=" << fcnList.size() << endl; - assert(0); - } - if ( - bcBegin==bcQuadraticWithNullSlope || bcEnd==bcQuadraticWithNullSlope - || - bcBegin==bcQuadratic || bcEnd==bcQuadratic - ){ - int nthr=1+(bcBegin==bcQuadraticWithNullSlope || bcBegin==bcQuadratic ? 1 : 0) + (bcEnd==bcQuadraticWithNullSlope || bcEnd==bcQuadratic ? 1 : 0); - if (npoints<=nthr){ - cerr << "Npoints " << npoints << " <= " << nthr << endl; - assert(0); - } - } - if (npoints>1){ - RooNCSplineCore::T bcval=0, ecval=0; - // First point constraint - switch (bcBegin){ - case bcApproximatedSecondDerivative: - bcval=(npoints<3 ? 0 : ((fcnList.at(2)-fcnList.at(1))*kappas.at(1)-(fcnList.at(1)-fcnList.at(0))*kappas.at(0))/(0.5/kappas.at(0)+0.5/kappas.at(1))); - case bcNaturalSpline: - BArray.push_back(3.*(fcnList.at(1)-fcnList.at(0)) - bcval/2./pow(kappas.at(0), 2)); - break; - case bcApproximatedSlope: - bcval=(fcnList.at(1)-fcnList.at(0))*kappas.at(0); - case bcClamped: - BArray.push_back(bcval/kappas.at(0)); - break; - case bcQuadratic: - bcval=2.*(fcnList.at(1)-fcnList.at(0)); - BArray.push_back(bcval); - break; - case bcQuadraticWithNullSlope: - bcval=2.*(fcnList.at(1)-fcnList.at(0)); - BArray.push_back(0); - BArray.push_back(bcval*kappas.at(0)/kappas.at(1)); - break; - default: - cerr << "RooNCSplineCore::getBArray: bcBegin " << bcBegin << " is not implemented!" << endl; - assert(0); - } - // Intermediate point constraint is always D0, D1 and D2 continuous - for (int j=1; j& kappas, vector>& AArray, BoundaryCondition const& bcBegin, BoundaryCondition const& bcEnd)const{ - AArray.clear(); - Int_t npoints = kappas.size(); - for (int i=0; i Ai(npoints, 0.); - if (npoints==1) Ai[0]=1; - else if (i==0){ - switch(bcBegin){ - case bcNaturalSpline: - case bcApproximatedSecondDerivative: - Ai[0]=2; Ai[1]=kappas.at(1)/kappas.at(0); - break; - case bcClamped: - case bcApproximatedSlope: - case bcQuadraticWithNullSlope: - Ai[0]=1; - break; - case bcQuadratic: - Ai[0]=1; Ai[1]=kappas.at(1)/kappas.at(0); - break; - default: - cerr << "RooNCSplineCore::getAArray: bcBegin " << bcBegin << " is not implemented!" << endl; - assert(0); - } - } - else if (i==npoints-1){ - switch(bcEnd){ - case bcNaturalSpline: - case bcApproximatedSecondDerivative: - Ai[npoints-2]=1; Ai[npoints-1]=2.*kappas.at(npoints-1)/kappas.at(npoints-2); - break; - case bcClamped: - case bcApproximatedSlope: - case bcQuadraticWithNullSlope: - Ai[npoints-1]=1; - break; - case bcQuadratic: - Ai[npoints-2]=1; Ai[npoints-1]=kappas.at(npoints-1)/kappas.at(npoints-2); - break; - default: - cerr << "RooNCSplineCore::getAArray: bcEnd " << bcEnd << " is not implemented!" << endl; - assert(0); - } - } - else{ - if ((i==1 && bcBegin==bcQuadraticWithNullSlope) || (i==npoints-2 && bcEnd==bcQuadraticWithNullSlope)) Ai[i]=1; - else{ - RooNCSplineCore::T kappa_j = kappas.at(i); - RooNCSplineCore::T kappa_jmo = kappas.at(i-1); - RooNCSplineCore::T kappa_jpo = kappas.at(i+1); - - Ai[i-1]=1; - Ai[i]=2.*kappa_j/kappa_jmo*(1.+kappa_j/kappa_jmo); - Ai[i+1]=kappa_j*kappa_jpo/pow(kappa_jmo, 2); - } - } - AArray.push_back(Ai); - } -} - -vector RooNCSplineCore::getCoefficients(const TVector_t& S, const vector& kappas, const vector& fcnList, const Int_t& bin)const{ - DefaultAccumulator A, B, C, D; - vector res; - - const int fcnsize = fcnList.size(); - if (fcnsize>bin){ - A=fcnList.at(bin); - B=S[bin]; - if (fcnsize>(bin+1)){ - DefaultAccumulator dFcn = fcnList.at(bin+1); - dFcn -= A; - - C += RooNCSplineCore::T(3.)*dFcn; - C -= 2.*B; - C -= S[bin+1]*kappas.at(bin+1)/kappas.at(bin); - - D += RooNCSplineCore::T(-2.)*dFcn; - D += B; - D += S[bin+1]*kappas.at(bin+1)/kappas.at(bin); - } - } - - res.push_back(A); - res.push_back(B); - res.push_back(C); - res.push_back(D); - return res; -} -vector> RooNCSplineCore::getCoefficientsAlongDirection(const std::vector& kappas, const TMatrix_t& Ainv, const vector& fcnList, BoundaryCondition const& bcBegin, BoundaryCondition const& bcEnd, const Int_t pickBin)const{ - vector BArray; - getBArray(kappas, fcnList, BArray, bcBegin, bcEnd); - - Int_t npoints = BArray.size(); - TVector_t Btrans(npoints); - for (int i=0; i> coefs; - for (Int_t bin=0; bin<(npoints>1 ? npoints-1 : 1); bin++){ - if (pickBin>=0 && bin!=pickBin) continue; - vector coef = getCoefficients(Strans, kappas, fcnList, bin); - coefs.push_back(coef); - } - return coefs; -} - -RooNCSplineCore::T RooNCSplineCore::evalSplineSegment(const std::vector& coefs, const RooNCSplineCore::T& kappa, const RooNCSplineCore::T& tup, const RooNCSplineCore::T& tdn, Bool_t doIntegrate)const{ - DefaultAccumulator res; - for (unsigned int ic=0; icleafNodeServerList(&deps, 0, true); - set.add(deps); -} -void RooNCSplineCore::addLeafDependents(RooArgSet& set){ - TIterator* iter = set.createIterator(); - RooAbsArg* absarg; - while ((absarg = (RooAbsArg*)iter->Next())){ if (dynamic_cast(absarg)) leafDepsList.add(*absarg); } - delete iter; -} diff --git a/src/RooNCSplineFactory_1D.cc b/src/RooNCSplineFactory_1D.cc deleted file mode 100644 index 2555d2e029c..00000000000 --- a/src/RooNCSplineFactory_1D.cc +++ /dev/null @@ -1,88 +0,0 @@ -#include "../interface/RooNCSplineFactory_1D.h" -#include - -using namespace std; - - -RooNCSplineFactory_1D::RooNCSplineFactory_1D( - RooAbsReal& splineVar_, TString appendName_, - RooNCSplineCore::BoundaryCondition const bcBeginX_, - RooNCSplineCore::BoundaryCondition const bcEndX_ -) : - appendName(appendName_), - bcBeginX(bcBeginX_), bcEndX(bcEndX_), - splineVar(&splineVar_), - fcn(0), - PDF(0) -{} -RooNCSplineFactory_1D::~RooNCSplineFactory_1D(){ - destroyPDF(); -} -void RooNCSplineFactory_1D::setPoints(TTree* tree){ - vector> pList; - RooNCSplineCore::T x, fcn; - tree->SetBranchAddress("X", &x); - tree->SetBranchAddress("Fcn", &fcn); - int n = tree->GetEntries(); - for (int ip=0; ipGetEntry(ip); pList.push_back(pair(x, fcn)); } - setPoints(pList); -} -void RooNCSplineFactory_1D::setPoints(TGraph* tg){ - vector> pList; - double* xx = tg->GetX(); - double* yy = tg->GetY(); - int n = tg->GetN(); - for (int ip=0; ip(xx[ip], yy[ip])); - setPoints(pList); -} -const std::vector> RooNCSplineFactory_1D::getPoints(const std::vector& XList, const std::vector& FcnList){ - const unsigned int nX = XList.size(); - const unsigned int n = FcnList.size(); - if (nX!=n){ - cerr << "RooNCSplineFactory_1D::getPoints: nX=" << nX << " != nFcn=" << n << endl; - assert(0); - } - std::vector> pList; pList.reserve(n); - for (unsigned int ip=0; ip(XList.at(ip), FcnList.at(ip))); - return pList; -} - -void RooNCSplineFactory_1D::destroyPDF(){ delete PDF; PDF=0; delete fcn; fcn=0; } -void RooNCSplineFactory_1D::initPDF(const std::vector>& pList){ - destroyPDF(); - - const unsigned int n = pList.size(); - std::vector XList; - std::vector FcnList; - for (unsigned int ip=0; ip& list, RooNCSplineCore::T val){ - for (unsigned int ip=0; ip RooNCSplineFactory_2D::getPoints( - const std::vector& XList, - const std::vector& YList, - const std::vector& FcnList - ){ - const unsigned int nX = XList.size(); - const unsigned int nY = YList.size(); - const unsigned int n = FcnList.size(); - if (nX*nY!=n){ - cerr << "RooNCSplineFactory_2D::getPoints: nX=" << nX << " x nY=" << nY << " != nFcn=" << n << endl; - assert(0); - } - - std::vector pList; pList.reserve(n); - for (unsigned int ix=0; ix& pList){ - destroyPDF(); - - const unsigned int n = pList.size(); - vector XList; - vector YList; - vector> FcnList; - for (unsigned int ip=0; ip dum; dum.reserve(XList.size()); - for (unsigned int ix=0; ix pList; - RooNCSplineCore::T x, y, fcn; - tree->SetBranchAddress("X", &x); - tree->SetBranchAddress("Y", &y); - tree->SetBranchAddress("Fcn", &fcn); - int n = tree->GetEntries(); - for (int ip=0; ipGetEntry(ip); pList.push_back(splineTriplet_t(x, y, fcn)); } - setPoints(pList); -} - -void RooNCSplineFactory_2D::setEndConditions( - RooNCSplineCore::BoundaryCondition const bcBegin, - RooNCSplineCore::BoundaryCondition const bcEnd, - const unsigned int direction -){ - switch (direction){ - case 0: - bcBeginX=bcBegin; - bcEndX=bcEnd; - break; - case 1: - bcBeginY=bcBegin; - bcEndY=bcEnd; - break; - default: - // Do nothing - break; - } -} diff --git a/src/RooNCSplineFactory_3D.cc b/src/RooNCSplineFactory_3D.cc deleted file mode 100644 index 1b51a056bf5..00000000000 --- a/src/RooNCSplineFactory_3D.cc +++ /dev/null @@ -1,146 +0,0 @@ -#include "../interface/RooNCSplineFactory_3D.h" - -using namespace std; - - -RooNCSplineFactory_3D::RooNCSplineFactory_3D( - RooAbsReal& XVar_, RooAbsReal& YVar_, RooAbsReal& ZVar_, TString appendName_, - RooNCSplineCore::BoundaryCondition const bcBeginX_, - RooNCSplineCore::BoundaryCondition const bcEndX_, - RooNCSplineCore::BoundaryCondition const bcBeginY_, - RooNCSplineCore::BoundaryCondition const bcEndY_, - RooNCSplineCore::BoundaryCondition const bcBeginZ_, - RooNCSplineCore::BoundaryCondition const bcEndZ_ -) : - appendName(appendName_), - bcBeginX(bcBeginX_), bcEndX(bcEndX_), - bcBeginY(bcBeginY_), bcEndY(bcEndY_), - bcBeginZ(bcBeginZ_), bcEndZ(bcEndZ_), - XVar(&XVar_), YVar(&YVar_), ZVar(&ZVar_), - fcn(0), - PDF(0) -{} -RooNCSplineFactory_3D::~RooNCSplineFactory_3D(){ - destroyPDF(); -} - -void RooNCSplineFactory_3D::addUnique(std::vector& list, RooNCSplineCore::T val){ - for (unsigned int ip=0; ip RooNCSplineFactory_3D::getPoints( - const std::vector& XList, - const std::vector& YList, - const std::vector& ZList, - const std::vector& FcnList - ){ - const unsigned int nX = XList.size(); - const unsigned int nY = YList.size(); - const unsigned int nZ = ZList.size(); - const unsigned int n = FcnList.size(); - if (nX*nY*nZ!=n){ - cerr << "RooNCSplineFactory_3D::getPoints: nX=" << nX << " x nY=" << nY << " x nZ=" << nZ << " != nFcn=" << n << endl; - assert(0); - } - - std::vector pList; pList.reserve(n); - for (unsigned int ix=0; ix& pList){ - destroyPDF(); - - const unsigned int n = pList.size(); - vector XList; - vector YList; - vector ZList; - vector>> FcnList; - for (unsigned int ip=0; ip> dumz; - dumz.reserve(YList.size()); - for (unsigned int iy=0; iy dumy; - dumy.reserve(XList.size()); - for (unsigned int ix=0; ix pList; - RooNCSplineCore::T x, y, z, fcn; - tree->SetBranchAddress("X", &x); - tree->SetBranchAddress("Y", &y); - tree->SetBranchAddress("Z", &z); - tree->SetBranchAddress("Fcn", &fcn); - int n = tree->GetEntries(); - for (int ip=0; ipGetEntry(ip); pList.push_back(splineQuadruplet_t(x, y, z, fcn)); } - setPoints(pList); -} - -void RooNCSplineFactory_3D::setEndConditions( - RooNCSplineCore::BoundaryCondition const bcBegin, - RooNCSplineCore::BoundaryCondition const bcEnd, - const unsigned int direction -){ - switch (direction){ - case 0: - bcBeginX=bcBegin; - bcEndX=bcEnd; - break; - case 1: - bcBeginY=bcBegin; - bcEndY=bcEnd; - break; - case 2: - bcBeginZ=bcBegin; - bcEndZ=bcEnd; - break; - default: - // Do nothing - break; - } -} diff --git a/src/RooNCSpline_1D_fast.cc b/src/RooNCSpline_1D_fast.cc deleted file mode 100644 index fd0de69a443..00000000000 --- a/src/RooNCSpline_1D_fast.cc +++ /dev/null @@ -1,226 +0,0 @@ -#include "../interface/RooNCSpline_1D_fast.h" -#include -#include "TMath.h" -#include "Riostream.h" -#include "RooAbsReal.h" - -using namespace TMath; -using namespace RooFit; -using namespace std; - - -ClassImp(RooNCSpline_1D_fast) - -RooNCSpline_1D_fast::RooNCSpline_1D_fast() : - RooNCSplineCore(), - bcBeginX(RooNCSplineCore::bcNaturalSpline), bcEndX(RooNCSplineCore::bcNaturalSpline) -{} - -RooNCSpline_1D_fast::RooNCSpline_1D_fast( - const char* name, - const char* title - ) : - RooNCSplineCore(name, title), - bcBeginX(RooNCSplineCore::bcNaturalSpline), bcEndX(RooNCSplineCore::bcNaturalSpline) -{} - -RooNCSpline_1D_fast::RooNCSpline_1D_fast( - const char* name, - const char* title, - RooAbsReal& inXVar, - const std::vector& inXList, - const std::vector& inFcnList, - RooNCSplineCore::BoundaryCondition const bcBeginX_, - RooNCSplineCore::BoundaryCondition const bcEndX_, - Bool_t inUseFloor, - T inFloorEval, - T inFloorInt - ) : - RooNCSplineCore(name, title, inXVar, inXList, inUseFloor, inFloorEval, inFloorInt), - bcBeginX(bcBeginX_), bcEndX(bcEndX_), - FcnList(inFcnList) -{ - if (npointsX()>1){ - int npoints; - - vector> xA; getKappas(kappaX, 0); getAArray(kappaX, xA, bcBeginX, bcEndX); - npoints=kappaX.size(); - TMatrix_t xAtrans(npoints, npoints); - for (int i=0; i res; - - if (verbosity==RooNCSplineCore::kVerbose) cout << "RooNCSpline_1D_fast(" << GetName() << ")::interpolateFcn begin with code: " << code << endl; - - // Get bins - Int_t xbin=-1, xbinmin=-1, xbinmax=-1; - RooNCSplineCore::T tx=0, txmin=0, txmax=0; - if (code==0 || code%2!=0){ // Case to just compute the value at x - if (!testRangeValidity(theXVar)) return 0; - xbin = getWhichBin(theXVar, 0); - tx = getTVar(kappaX, theXVar, xbin, 0); - } - else{ // Case to integrate along x - RooNCSplineCore::T coordmin = theXVar.min(rangeName); cropValueForRange(coordmin); - RooNCSplineCore::T coordmax = theXVar.max(rangeName); cropValueForRange(coordmax); - xbinmin = getWhichBin(coordmin, 0); - txmin = getTVar(kappaX, coordmin, xbinmin, 0); - xbinmax = getWhichBin(coordmax, 0); - txmax = getTVar(kappaX, coordmax, xbinmax, 0); - } - - int nxbins = (int)coefficients.size(); - for (int ix=0; ix=0 && ix!=xbin) - || - (xbinmin>=0 && xbinmax>=xbinmin && !(xbinmin<=ix && ix<=xbinmax)) - ) continue; - - RooNCSplineCore::T txlow=0, txhigh=1; - if (code>0 && code%2==0){ - if (ix==xbinmin) txlow=txmin; - if (ix==xbinmax) txhigh=txmax; - } - else txhigh=tx; - - // Get the x coefficients at bin ix and evaluate value of spline at x - res += evalSplineSegment(coefficients.at(ix), kappaX.at(ix), txhigh, txlow, (code>0 && code%2==0)); - } - - return res; -} - -void RooNCSpline_1D_fast::getKappas(vector& kappas, const Int_t /*whichDirection*/){ - kappas.clear(); - RooNCSplineCore::T kappa=1; - - Int_t npoints; - vector const* coord; - npoints=npointsX(); - coord=&XList; - - for (Int_t j=0; jat(j); - RooNCSplineCore::T val_jpo = coord->at(j+1); - RooNCSplineCore::T val_diff = (val_jpo-val_j); - if (fabs(val_diff)>RooNCSplineCore::T(0)) kappa = 1./val_diff; - else kappa = 0; - kappas.push_back(kappa); - } - kappas.push_back(kappa); // Push the same kappa_(N-1)=kappa_(N-2) at the end point -} -Int_t RooNCSpline_1D_fast::getWhichBin(const RooNCSplineCore::T& val, const Int_t /*whichDirection*/)const{ - Int_t bin=-1; - RooNCSplineCore::T valj, valjpo; - Int_t npoints; - vector const* coord; - coord=&XList; - npoints=npointsX(); - - if (npoints<=1) bin=0; - else{ - valjpo = coord->at(0); - for (Int_t j=0; jat(j); - valjpo = coord->at(j+1); - if (val=valj){ bin=j; break; } - } - if (bin==-1 && val>=valjpo) bin=npoints-2; - else if (bin==-1) bin=0; - } - - return bin; -} -RooNCSplineCore::T RooNCSpline_1D_fast::getTVar(const vector& kappas, const RooNCSplineCore::T& val, const Int_t& bin, const Int_t /*whichDirection*/)const{ - const RooNCSplineCore::T& K=kappas.at(bin); - return (val-XList.at(bin))*K; -} - -Double_t RooNCSpline_1D_fast::evaluate() const{ - Double_t value = interpolateFcn(0); - if (useFloor && value=RooNCSplineCore::kError) coutE(Eval) << "RooNCSpline_1D_fast ERROR::RooNCSpline_1D_fast(" << GetName() << ") evaluation returned " << value << " at x = " << theXVar << endl; - value = floorEval; - } - if (verbosity==RooNCSplineCore::kVerbose){ - cout << "RooNCSpline_1D_fast(" << GetName() << ")::evaluate = " << value << " at x = " << theXVar << endl; - RooArgSet Xdeps; theXVar.absArg()->leafNodeServerList(&Xdeps, 0, true); - TIterator* iter = Xdeps.createIterator(); - RooAbsArg* var; - while ((var = (RooAbsArg*)iter->Next())){ - cout << var->GetName() << " value = " << dynamic_cast(var)->getVal() << endl; - } - delete iter; - cout << endl; - } - return value; -} -Int_t RooNCSpline_1D_fast::getAnalyticalIntegral(RooArgSet& allVars, RooArgSet& analVars, const char* /*rangeName*/) const{ - if (_forceNumInt) return 0; - Int_t code=0; - if (dynamic_cast(theXVar.absArg())!=0){ - if (matchArgs(allVars, analVars, theXVar)) code=2; - } - return code; -} -Double_t RooNCSpline_1D_fast::analyticalIntegral(Int_t code, const char* rangeName) const{ - Double_t value = interpolateFcn(code, rangeName); - if (useFloor && value=RooNCSplineCore::kError) coutE(Integration) << "RooNCSpline_1D_fast ERROR::RooNCSpline_1D_fast(" << GetName() << ") integration returned " << value << " for code = " << code << endl; - value = floorInt; - } - if (verbosity==RooNCSplineCore::kVerbose){ cout << "RooNCSpline_1D_fast(" << GetName() << ")::analyticalIntegral = " << value << " for code = " << code << endl; } - return value; -} - -Bool_t RooNCSpline_1D_fast::testRangeValidity(const T& val, const Int_t /*whichDirection*/) const{ - const T* range[2]; - range[0] = &rangeXmin; - range[1] = &rangeXmax; - return (*(range[0])>*(range[1]) || (val>=*(range[0]) && val<=*(range[1]))); -} -void RooNCSpline_1D_fast::setRangeValidity(const T valmin, const T valmax, const Int_t /*whichDirection*/){ - T* range[2]; - range[0] = &rangeXmin; - range[1] = &rangeXmax; - *(range[0])=valmin; - *(range[1])=valmax; -} -void RooNCSpline_1D_fast::cropValueForRange(T& val, const Int_t /*whichDirection*/)const{ - if (testRangeValidity(val)) return; - const T* range[2]; - range[0] = &rangeXmin; - range[1] = &rangeXmax; - if (val<*(range[0])) val = *(range[0]); - if (val>*(range[1])) val = *(range[1]); -} diff --git a/src/RooNCSpline_2D_fast.cc b/src/RooNCSpline_2D_fast.cc deleted file mode 100644 index 1067b075e88..00000000000 --- a/src/RooNCSpline_2D_fast.cc +++ /dev/null @@ -1,394 +0,0 @@ -#include "../interface/RooNCSpline_2D_fast.h" -#include -#include "TMath.h" -#include "Riostream.h" -#include "RooAbsReal.h" - -using namespace TMath; -using namespace RooFit; -using namespace std; - - -ClassImp(RooNCSpline_2D_fast) - -RooNCSpline_2D_fast::RooNCSpline_2D_fast() : - RooNCSplineCore(), - rangeYmin(1), rangeYmax(-1), - bcBeginX(RooNCSplineCore::bcNaturalSpline), bcEndX(RooNCSplineCore::bcNaturalSpline), - bcBeginY(RooNCSplineCore::bcNaturalSpline), bcEndY(RooNCSplineCore::bcNaturalSpline), - theYVar("theYVar", "theYVar", this) -{} - -RooNCSpline_2D_fast::RooNCSpline_2D_fast( - const char* name, - const char* title - ) : - RooNCSplineCore(name, title), - rangeYmin(1), rangeYmax(-1), - bcBeginX(RooNCSplineCore::bcNaturalSpline), bcEndX(RooNCSplineCore::bcNaturalSpline), - bcBeginY(RooNCSplineCore::bcNaturalSpline), bcEndY(RooNCSplineCore::bcNaturalSpline), - theYVar("theYVar", "theYVar", this) -{} - -RooNCSpline_2D_fast::RooNCSpline_2D_fast( - const char* name, - const char* title, - RooAbsReal& inXVar, - RooAbsReal& inYVar, - const std::vector& inXList, - const std::vector& inYList, - const std::vector>& inFcnList, - RooNCSplineCore::BoundaryCondition const bcBeginX_, - RooNCSplineCore::BoundaryCondition const bcEndX_, - RooNCSplineCore::BoundaryCondition const bcBeginY_, - RooNCSplineCore::BoundaryCondition const bcEndY_, - Bool_t inUseFloor, - T inFloorEval, - T inFloorInt - ) : - RooNCSplineCore(name, title, inXVar, inXList, inUseFloor, inFloorEval, inFloorInt), - rangeYmin(1), rangeYmax(-1), - bcBeginX(bcBeginX_), bcEndX(bcEndX_), - bcBeginY(bcBeginY_), bcEndY(bcEndY_), - theYVar("theYVar", "theYVar", this, inYVar), - YList(inYList), - FcnList(inFcnList) -{ - if (npointsX()>1 && npointsY()>1){ - // Prepare A and kappa arrays for x and y coordinates - int npoints; - Double_t det; - - vector> xA; getKappas(kappaX, 0); getAArray(kappaX, xA, bcBeginX, bcEndX); - npoints=kappaX.size(); - TMatrix_t xAtrans(npoints, npoints); - for (int i=0; i> yA; getKappas(kappaY, 1); getAArray(kappaY, yA, bcBeginY, bcEndY); - npoints=kappaY.size(); - TMatrix_t yAtrans(npoints, npoints); - for (int i=0; i>> coefsAlongY; // [Ax(y),Bx(y),Cx(y),Dx(y)][xbin][ybin] - int npoldim=0; - int nxbins=0; - for (unsigned int j=0; j> xcoefsAtYj = getCoefficientsPerY(kappaX, xAinv, j, bcBeginX, bcEndX, -1); // [ix][Ax,Bx,Cx,Dx] at each y_j - if (j==0){ - nxbins=xcoefsAtYj.size(); - npoldim=xcoefsAtYj.at(0).size(); - for (int ipow=0; ipow> dum_xycoefarray; - for (int ix=0; ix dum_ycoefarray; - dum_xycoefarray.push_back(dum_ycoefarray); - } - coefsAlongY.push_back(dum_xycoefarray); - } - } - if (nxbins!=(int)xcoefsAtYj.size() || npoldim!=(int)xcoefsAtYj.at(0).size()){ - coutE(InputArguments) << "RooNCSpline_2D_fast::interpolateFcn: nxbins!=(int)xcoefsAtYj.size() || npoldim!=(int)xcoefsAtYj.at(0).size()!" << endl; - assert(0); - } - for (int ix=0; ix>> xCoefs; - for (int ic=0; ic> yCoefs = getCoefficientsAlongDirection(kappaY, yAinv, coefsAlongY.at(ic).at(ix), bcBeginY, bcEndY, -1); // [iy][A,B,C,D] - xCoefs.push_back(yCoefs); - } - coefficients.push_back(xCoefs); - } - } - else assert(0); - - RooArgSet leafset; - getLeafDependents(theXVar, leafset); - getLeafDependents(theYVar, leafset); - addLeafDependents(leafset); - - emptyFcnList(); -} - -RooNCSpline_2D_fast::RooNCSpline_2D_fast( - const RooNCSpline_2D_fast& other, - const char* name - ) : - RooNCSplineCore(other, name), - rangeYmin(other.rangeYmin), rangeYmax(other.rangeYmax), - bcBeginX(other.bcBeginX), bcEndX(other.bcEndX), - bcBeginY(other.bcBeginY), bcEndY(other.bcEndY), - theYVar("theYVar", this, other.theYVar), - YList(other.YList), - FcnList(other.FcnList), - kappaX(other.kappaX), - kappaY(other.kappaY), - coefficients(other.coefficients) -{} - - -RooNCSplineCore::T RooNCSpline_2D_fast::interpolateFcn(Int_t code, const char* rangeName)const{ - DefaultAccumulator res; - - if (verbosity==RooNCSplineCore::kVerbose){ cout << "RooNCSpline_2D_fast(" << GetName() << ")::interpolateFcn begin with code: " << code << endl; } - - // Get bins - Int_t xbin=-1, xbinmin=-1, xbinmax=-1, ybin=-1, ybinmin=-1, ybinmax=-1; - RooNCSplineCore::T tx=0, txmin=0, txmax=0, ty=0, tymin=0, tymax=0; - if (code==0 || code%2!=0){ // Case to just compute the value at x - if (!testRangeValidity(theXVar, 0)) return 0; - xbin = getWhichBin(theXVar, 0); - tx = getTVar(kappaX, theXVar, xbin, 0); - } - else{ // Case to integrate along x - RooNCSplineCore::T coordmin = theXVar.min(rangeName); cropValueForRange(coordmin, 0); - RooNCSplineCore::T coordmax = theXVar.max(rangeName); cropValueForRange(coordmax, 0); - xbinmin = getWhichBin(coordmin, 0); - txmin = getTVar(kappaX, coordmin, xbinmin, 0); - xbinmax = getWhichBin(coordmax, 0); - txmax = getTVar(kappaX, coordmax, xbinmax, 0); - } - if (code==0 || code%3!=0){ // Case to just compute the value at y - if (!testRangeValidity(theYVar, 1)) return 0; - ybin = getWhichBin(theYVar, 1); - ty = getTVar(kappaY, theYVar, ybin, 1); - } - else{ // Case to integrate along y - RooNCSplineCore::T coordmin = theYVar.min(rangeName); cropValueForRange(coordmin, 1); - RooNCSplineCore::T coordmax = theYVar.max(rangeName); cropValueForRange(coordmax, 1); - ybinmin = getWhichBin(coordmin, 1); - tymin = getTVar(kappaY, coordmin, ybinmin, 1); - ybinmax = getWhichBin(coordmax, 1); - tymax = getTVar(kappaY, coordmax, ybinmax, 1); - } - - for (int ix=0; ix<(int)coefficients.size(); ix++){ - if ( - (xbin>=0 && ix!=xbin) - || - (xbinmin>=0 && xbinmax>=xbinmin && !(xbinmin<=ix && ix<=xbinmax)) - ) continue; - - RooNCSplineCore::T txlow=0, txhigh=1; - if (code>0 && code%2==0){ - if (ix==xbinmin) txlow=txmin; - if (ix==xbinmax) txhigh=txmax; - } - else txhigh=tx; - - if (verbosity==RooNCSplineCore::kVerbose){ - if (code==0 || code%2!=0) cout << "Evaluating tx=" << txhigh << " in bin " << ix << endl; - else cout << "Evaluating tx[" << txlow << ", " << txhigh << "] in bin " << ix << endl; - } - - // Get the x coefficients interpolated across y - vector xCoefs; - for (int ic=0; ic<(int)coefficients.at(ix).size(); ic++){ - const vector>& yCoefs = coefficients.at(ix).at(ic); - - if (verbosity==RooNCSplineCore::kVerbose) cout << "\tCoefficient " << ic << ":\n"; - - DefaultAccumulator theCoef; - for (int iy=0; iy<(int)yCoefs.size(); iy++){ - if ( - (ybin>=0 && iy!=ybin) - || - (ybinmin>=0 && ybinmax>=ybinmin && !(ybinmin<=iy && iy<=ybinmax)) - ) continue; - - RooNCSplineCore::T tylow=0, tyhigh=1; - if (code>0 && code%3==0){ - if (iy==ybinmin) tylow=tymin; - if (iy==ybinmax) tyhigh=tymax; - } - else tyhigh=ty; - - if (verbosity==RooNCSplineCore::kVerbose){ - if (code==0 || code%3!=0) cout << "\tEvaluating ty=" << tyhigh << " in bin " << iy << endl; - else cout << "\tEvaluating ty[" << tylow << ", " << tyhigh << "] in bin " << iy << endl; - } - - theCoef += evalSplineSegment(yCoefs.at(iy), kappaY.at(iy), tyhigh, tylow, (code>0 && code%3==0)); - } - - //if (code==0) cout << "\tCoefficient is " << theCoef << endl; - - xCoefs.push_back(theCoef); - } - - // Evaluate value of spline at x with coefficients evaluated at y - res += evalSplineSegment(xCoefs, kappaX.at(ix), txhigh, txlow, (code>0 && code%2==0)); - } - - return res; -} - -void RooNCSpline_2D_fast::getKappas(vector& kappas, const Int_t whichDirection){ - kappas.clear(); - RooNCSplineCore::T kappa=1; - - Int_t npoints; - vector const* coord; - if (whichDirection==0){ - npoints=npointsX(); - coord=&XList; - } - else{ - npoints=npointsY(); - coord=&YList; - } - - for (Int_t j=0; jat(j); - RooNCSplineCore::T val_jpo = coord->at(j+1); - RooNCSplineCore::T val_diff = (val_jpo-val_j); - if (fabs(val_diff)>RooNCSplineCore::T(0)) kappa = 1./val_diff; - else kappa = 0; - kappas.push_back(kappa); - } - kappas.push_back(kappa); // Push the same kappa_(N-1)=kappa_(N-2) at the end point -} -Int_t RooNCSpline_2D_fast::getWhichBin(const RooNCSplineCore::T& val, const Int_t whichDirection)const{ - Int_t bin=-1; - RooNCSplineCore::T valj, valjpo; - Int_t npoints; - vector const* coord; - if (whichDirection==0){ - coord=&XList; - npoints=npointsX(); - } - else{ - coord=&YList; - npoints=npointsY(); - } - - if (npoints<=1) bin=0; - else{ - valjpo = coord->at(0); - for (Int_t j=0; jat(j); - valjpo = coord->at(j+1); - if (val=valj){ bin=j; break; } - } - if (bin==-1 && val>=valjpo) bin=npoints-2; - else if (bin==-1) bin=0; - } - - return bin; -} -RooNCSplineCore::T RooNCSpline_2D_fast::getTVar(const vector& kappas, const RooNCSplineCore::T& val, const Int_t& bin, const Int_t whichDirection)const{ - const RooNCSplineCore::T& K=kappas.at(bin); - vector const* coord; - if (whichDirection==0) coord=&XList; - else coord=&YList; - return (val-coord->at(bin))*K; -} - -vector> RooNCSpline_2D_fast::getCoefficientsPerY(const std::vector& kappaX, const TMatrix_t& xAinv, const Int_t& ybin, RooNCSplineCore::BoundaryCondition const& bcBegin, RooNCSplineCore::BoundaryCondition const& bcEnd, const Int_t xbin)const{ - vector fcnList; - for (unsigned int bin=0; bin> coefs = getCoefficientsAlongDirection(kappaX, xAinv, fcnList, bcBegin, bcEnd, xbin); - return coefs; -} - -Double_t RooNCSpline_2D_fast::evaluate() const{ - Double_t value = interpolateFcn(0); - if (useFloor && value=RooNCSplineCore::kError) coutE(Eval) << "RooNCSpline_2D_fast ERROR::RooNCSpline_2D_fast(" << GetName() << ") evaluation returned " << value << " at (x, y) = (" << theXVar << ", " << theYVar << ")" << endl; - value = floorEval; - } - if (verbosity==RooNCSplineCore::kVerbose){ cout << "RooNCSpline_2D_fast(" << GetName() << ")::evaluate = " << value << " at (x, y) = (" << theXVar << ", " << theYVar << ")" << endl; } - return value; -} -Int_t RooNCSpline_2D_fast::getAnalyticalIntegral(RooArgSet& allVars, RooArgSet& analVars, const char* /*rangeName*/) const{ - if (_forceNumInt) return 0; - - Int_t code=1; - - RooArgSet Xdeps, Ydeps; - RooRealVar* rrv_x = dynamic_cast(theXVar.absArg()); - RooRealVar* rrv_y = dynamic_cast(theYVar.absArg()); - if (rrv_x==0) theXVar.absArg()->leafNodeServerList(&Xdeps, 0, true); - if (rrv_y==0) theYVar.absArg()->leafNodeServerList(&Ydeps, 0, true); - - if (rrv_x!=0){ - if (Ydeps.find(*rrv_x)==0 || rrv_y!=0){ - if (matchArgs(allVars, analVars, theXVar)) code*=2; - } - } - if (rrv_y!=0){ - if (Xdeps.find(*rrv_y)==0 || rrv_x!=0){ - if (matchArgs(allVars, analVars, theYVar)) code*=3; - } - } - - if (code==1) code=0; - return code; -} -Double_t RooNCSpline_2D_fast::analyticalIntegral(Int_t code, const char* rangeName) const{ - Double_t value = interpolateFcn(code, rangeName); - if (useFloor && value=RooNCSplineCore::kError) coutE(Integration) << "RooNCSpline_2D_fast ERROR::RooNCSpline_2D_fast(" << GetName() << ") integration returned " << value << " for code = " << code << endl; - value = floorInt; - } - if (verbosity==RooNCSplineCore::kVerbose){ cout << "RooNCSpline_2D_fast(" << GetName() << ")::analyticalIntegral = " << value << " for code = " << code << endl; } - return value; -} - -Bool_t RooNCSpline_2D_fast::testRangeValidity(const T& val, const Int_t whichDirection) const{ - const T* range[2]; - if (whichDirection==0){ - range[0] = &rangeXmin; - range[1] = &rangeXmax; - } - else{ - range[0] = &rangeYmin; - range[1] = &rangeYmax; - } - return (*(range[0])>*(range[1]) || (val>=*(range[0]) && val<=*(range[1]))); -} -void RooNCSpline_2D_fast::setRangeValidity(const T valmin, const T valmax, const Int_t whichDirection){ - T* range[2]; - if (whichDirection==0){ - range[0] = &rangeXmin; - range[1] = &rangeXmax; - } - else{ - range[0] = &rangeYmin; - range[1] = &rangeYmax; - } - *(range[0])=valmin; - *(range[1])=valmax; -} -void RooNCSpline_2D_fast::cropValueForRange(T& val, const Int_t whichDirection)const{ - if (testRangeValidity(val, whichDirection)) return; - const T* range[2]; - if (whichDirection==0){ - range[0] = &rangeXmin; - range[1] = &rangeXmax; - } - else{ - range[0] = &rangeYmin; - range[1] = &rangeYmax; - } - if (val<*(range[0])) val = *(range[0]); - if (val>*(range[1])) val = *(range[1]); -} diff --git a/src/RooNCSpline_3D_fast.cc b/src/RooNCSpline_3D_fast.cc deleted file mode 100644 index 19ef55de6c3..00000000000 --- a/src/RooNCSpline_3D_fast.cc +++ /dev/null @@ -1,550 +0,0 @@ -#include "../interface/RooNCSpline_3D_fast.h" -#include -#include "TMath.h" -#include "Riostream.h" -#include "RooAbsReal.h" - -using namespace TMath; -using namespace RooFit; -using namespace std; - - -ClassImp(RooNCSpline_3D_fast) - -RooNCSpline_3D_fast::RooNCSpline_3D_fast() : - RooNCSplineCore(), - rangeYmin(1), rangeYmax(-1), - rangeZmin(1), rangeZmax(-1), - bcBeginX(RooNCSplineCore::bcNaturalSpline), bcEndX(RooNCSplineCore::bcNaturalSpline), - bcBeginY(RooNCSplineCore::bcNaturalSpline), bcEndY(RooNCSplineCore::bcNaturalSpline), - bcBeginZ(RooNCSplineCore::bcNaturalSpline), bcEndZ(RooNCSplineCore::bcNaturalSpline), - theYVar("theYVar", "theYVar", this), - theZVar("theZVar", "theZVar", this) -{} - -RooNCSpline_3D_fast::RooNCSpline_3D_fast( - const char* name, - const char* title - ) : - RooNCSplineCore(name, title), - rangeYmin(1), rangeYmax(-1), - rangeZmin(1), rangeZmax(-1), - bcBeginX(RooNCSplineCore::bcNaturalSpline), bcEndX(RooNCSplineCore::bcNaturalSpline), - bcBeginY(RooNCSplineCore::bcNaturalSpline), bcEndY(RooNCSplineCore::bcNaturalSpline), - bcBeginZ(RooNCSplineCore::bcNaturalSpline), bcEndZ(RooNCSplineCore::bcNaturalSpline), - theYVar("theYVar", "theYVar", this), - theZVar("theZVar", "theZVar", this) -{} - -RooNCSpline_3D_fast::RooNCSpline_3D_fast( - const char* name, - const char* title, - RooAbsReal& inXVar, - RooAbsReal& inYVar, - RooAbsReal& inZVar, - const std::vector& inXList, - const std::vector& inYList, - const std::vector& inZList, - const std::vector>>& inFcnList, - RooNCSplineCore::BoundaryCondition const bcBeginX_, - RooNCSplineCore::BoundaryCondition const bcEndX_, - RooNCSplineCore::BoundaryCondition const bcBeginY_, - RooNCSplineCore::BoundaryCondition const bcEndY_, - RooNCSplineCore::BoundaryCondition const bcBeginZ_, - RooNCSplineCore::BoundaryCondition const bcEndZ_, - Bool_t inUseFloor, - T inFloorEval, - T inFloorInt - ) : - RooNCSplineCore(name, title, inXVar, inXList, inUseFloor, inFloorEval, inFloorInt), - rangeYmin(1), rangeYmax(-1), - rangeZmin(1), rangeZmax(-1), - bcBeginX(bcBeginX_), bcEndX(bcEndX_), - bcBeginY(bcBeginY_), bcEndY(bcEndY_), - bcBeginZ(bcBeginZ_), bcEndZ(bcEndZ_), - theYVar("theYVar", "theYVar", this, inYVar), - theZVar("theZVar", "theZVar", this, inZVar), - YList(inYList), - ZList(inZList), - FcnList(inFcnList) -{ - if (npointsX()>1 && npointsY()>1 && npointsZ()>1){ - // Prepare A and kappa arrays for x, y and z coordinates - int npoints; - Double_t det; - - vector> xA; getKappas(kappaX, 0); getAArray(kappaX, xA, bcBeginX, bcEndX); - npoints=kappaX.size(); - TMatrix_t xAtrans(npoints, npoints); - for (int i=0; i> yA; getKappas(kappaY, 1); getAArray(kappaY, yA, bcBeginY, bcEndY); - npoints=kappaY.size(); - TMatrix_t yAtrans(npoints, npoints); - for (int i=0; i> zA; getKappas(kappaZ, 2); getAArray(kappaZ, zA, bcBeginZ, bcEndZ); - npoints=kappaZ.size(); - TMatrix_t zAtrans(npoints, npoints); - for (int i=0; i> - >> - > coefsAlongZ; // [ix][A_x,B_x,C_x,D_x][iy][A_x_y,B_x_y,C_x_y,D_x_y][z_k] at each z_k - for (unsigned int k=0; k> - >> coefficients_perZ; // [ix][A_x,B_x,C_x,D_x][iy][A_x_y,B_x_y,C_x_y,D_x_y] at each z_k - - vector>> coefsAlongY; // [xbin][Ax(y),Bx(y),Cx(y),Dx(y)][ybin] in each z - for (unsigned int j=0; j> xcoefsAtYjZk = getCoefficientsPerYPerZ(kappaX, xAinv, j, k, bcBeginX, bcEndX, -1); // [ix][Ax,Bx,Cx,Dx] at each y_j z_k - //cout << "\tCoefficients in y line " << j << " are found" << endl; - if (j==0){ - if (k==0){ - nxbins=xcoefsAtYjZk.size(); - nxpoldim=xcoefsAtYjZk.at(0).size(); - } - for (int ix=0; ix> dum_xycoefarray; - for (int icx=0; icx dum_ycoefarray; - dum_xycoefarray.push_back(dum_ycoefarray); - } - coefsAlongY.push_back(dum_xycoefarray); - } - } - if (nxbins!=(int)xcoefsAtYjZk.size() || nxpoldim!=(int)xcoefsAtYjZk.at(0).size()){ - coutE(InputArguments) << "RooNCSpline_3D_fast::interpolateFcn: nxbins!=(int)xcoefsAtYjZk.size() || nxpoldim!=(int)xcoefsAtYjZk.at(0).size()!" << endl; - assert(0); - } - for (int ix=0; ix>> xCoefs; - for (int icx=0; icx> yCoefs = getCoefficientsAlongDirection(kappaY, yAinv, coefsAlongY.at(ix).at(icx), bcBeginY, bcEndY, -1); // [iy][A,B,C,D] - xCoefs.push_back(yCoefs); - } - coefficients_perZ.push_back(xCoefs); - } - - if (k==0){ - nybins = coefficients_perZ.at(0).at(0).size(); - nypoldim = coefficients_perZ.at(0).at(0).at(0).size(); - for (int ix=0; ix>>> xCoefs; - for (int icx=0; icx>> xCoefsAlongY; - for (int iy=0; iy> yCoefs; - for (int icy=0; icy yCoefAtZj; - yCoefs.push_back(yCoefAtZj); - } - xCoefsAlongY.push_back(yCoefs); - } - xCoefs.push_back(xCoefsAlongY); - } - coefsAlongZ.push_back(xCoefs); - } - } - for (int ix=0; ix>>>> xCoefs; - for (int icx=0; icx>>> xCoefsAlongY; - for (int iy=0; iy>> yCoefs; - for (int icy=0; icy> yCoefsAlongZ = getCoefficientsAlongDirection(kappaZ, zAinv, coefsAlongZ.at(ix).at(icx).at(iy).at(icy), bcBeginZ, bcEndZ, -1); // [iz][A,B,C,D] - yCoefs.push_back(yCoefsAlongZ); - } - xCoefsAlongY.push_back(yCoefs); - } - xCoefs.push_back(xCoefsAlongY); - } - coefficients.push_back(xCoefs); - } - - } - else assert(0); - - RooArgSet leafset; - getLeafDependents(theXVar, leafset); - getLeafDependents(theYVar, leafset); - getLeafDependents(theZVar, leafset); - addLeafDependents(leafset); - - emptyFcnList(); -} - -RooNCSpline_3D_fast::RooNCSpline_3D_fast( - const RooNCSpline_3D_fast& other, - const char* name - ) : - RooNCSplineCore(other, name), - rangeYmin(other.rangeYmin), rangeYmax(other.rangeYmax), - rangeZmin(other.rangeZmin), rangeZmax(other.rangeZmax), - bcBeginX(other.bcBeginX), bcEndX(other.bcEndX), - bcBeginY(other.bcBeginY), bcEndY(other.bcEndY), - bcBeginZ(other.bcBeginZ), bcEndZ(other.bcEndZ), - theYVar("theYVar", this, other.theYVar), - theZVar("theZVar", this, other.theZVar), - YList(other.YList), - ZList(other.ZList), - FcnList(other.FcnList), - kappaX(other.kappaX), - kappaY(other.kappaY), - kappaZ(other.kappaZ), - coefficients(other.coefficients) -{} - -RooNCSplineCore::T RooNCSpline_3D_fast::interpolateFcn(Int_t code, const char* rangeName)const{ - DefaultAccumulator res; - - if (verbosity==RooNCSplineCore::kVerbose) cout << "RooNCSpline_3D_fast(" << GetName() << ")::interpolateFcn begin with code: " << code << endl; - - // Get bins - vector varprime; varprime.push_back(2); varprime.push_back(3); varprime.push_back(5); - const Int_t ndims=(const Int_t)varprime.size(); - vector varbin; - vector varbinmin; - vector varbinmax; - vector tvar; - vector tvarmin; - vector tvarmax; - vector*> varkappa; varkappa.push_back(&kappaX); varkappa.push_back(&kappaY); varkappa.push_back(&kappaZ); - vector varcoord; varcoord.push_back(&theXVar); varcoord.push_back(&theYVar); varcoord.push_back(&theZVar); - for (Int_t idim=0; idimmin(rangeName); cropValueForRange(coordmin, idim); - RooNCSplineCore::T coordmax = varcoord.at(idim)->max(rangeName); cropValueForRange(coordmax, idim); - const std::vector& kappadim = *(varkappa.at(idim)); - binmin = getWhichBin(coordmin, idim); - tmin = getTVar(kappadim, coordmin, binmin, idim); - binmax = getWhichBin(coordmax, idim); - tmax = getTVar(kappadim, coordmax, binmax, idim); - } - varbin.push_back(binval); - varbinmin.push_back(binmin); - varbinmax.push_back(binmax); - tvar.push_back(tval); - tvarmin.push_back(tmin); - tvarmax.push_back(tmax); - } - - for (int ix=0; ix<(int)coefficients.size(); ix++){ - if ( - (varbin[0]>=0 && ix!=varbin[0]) - || - (varbinmin[0]>=0 && varbinmax[0]>=varbinmin[0] && !(varbinmin[0]<=ix && ix<=varbinmax[0])) - ) continue; - RooNCSplineCore::T txlow=0, txhigh=1; - if (code>0 && code%varprime[0]==0){ - if (ix==varbinmin[0]) txlow=tvarmin[0]; - if (ix==varbinmax[0]) txhigh=tvarmax[0]; - } - else txhigh=tvar[0]; - // Get the x coefficients interpolated across y - vector xCoefs; - for (int icx=0; icx<(int)coefficients.at(ix).size(); icx++){ - DefaultAccumulator theXCoef; - for (int iy=0; iy<(int)coefficients.at(ix).at(icx).size(); iy++){ - if ( - (varbin[1]>=0 && iy!=varbin[1]) - || - (varbinmin[1]>=0 && varbinmax[1]>=varbinmin[1] && !(varbinmin[1]<=iy && iy<=varbinmax[1])) - ) continue; - RooNCSplineCore::T tylow=0, tyhigh=1; - if (code>0 && code%varprime[1]==0){ - if (iy==varbinmin[1]) tylow=tvarmin[1]; - if (iy==varbinmax[1]) tyhigh=tvarmax[1]; - } - else tyhigh=tvar[1]; - // Get the y coefficients interpolated across z - vector yCoefs; - for (int icy=0; icy<(int)coefficients.at(ix).at(icx).at(iy).size(); icy++){ - DefaultAccumulator theYCoef; - for (int iz=0; iz<(int)coefficients.at(ix).at(icx).at(iy).at(icy).size(); iz++){ - if ( - (varbin[2]>=0 && iz!=varbin[2]) - || - (varbinmin[2]>=0 && varbinmax[2]>=varbinmin[2] && !(varbinmin[2]<=iz && iz<=varbinmax[2])) - ) continue; - - RooNCSplineCore::T tzlow=0, tzhigh=1; - if (code>0 && code%varprime[2]==0){ - if (iz==varbinmin[2]) tzlow=tvarmin[2]; - if (iz==varbinmax[2]) tzhigh=tvarmax[2]; - } - else tzhigh=tvar[2]; - - theYCoef += evalSplineSegment(coefficients.at(ix).at(icx).at(iy).at(icy).at(iz), varkappa[2]->at(iz), tzhigh, tzlow, (code>0 && code%varprime[2]==0)); - } - yCoefs.push_back(theYCoef); - } - theXCoef += evalSplineSegment(yCoefs, varkappa[1]->at(iy), tyhigh, tylow, (code>0 && code%varprime[1]==0)); - } - xCoefs.push_back(theXCoef); - } - // Evaluate value of spline at x with coefficients evaluated at y - res += evalSplineSegment(xCoefs, varkappa[0]->at(ix), txhigh, txlow, (code>0 && code%varprime[0]==0)); - } - - return res; -} - -void RooNCSpline_3D_fast::getKappas(vector& kappas, const Int_t whichDirection){ - kappas.clear(); - RooNCSplineCore::T kappa=1; - - Int_t npoints; - vector const* coord; - if (whichDirection==0){ - npoints=npointsX(); - coord=&XList; - } - else if (whichDirection==1){ - npoints=npointsY(); - coord=&YList; - } - else{ - npoints=npointsZ(); - coord=&ZList; - } - - for (Int_t j=0; jat(j); - RooNCSplineCore::T val_jpo = coord->at(j+1); - RooNCSplineCore::T val_diff = (val_jpo-val_j); - if (fabs(val_diff)>RooNCSplineCore::T(0)) kappa = 1./val_diff; - else kappa = 0; - kappas.push_back(kappa); - } - kappas.push_back(kappa); // Push the same kappa_(N-1)=kappa_(N-2) at the end point -} -Int_t RooNCSpline_3D_fast::getWhichBin(const RooNCSplineCore::T& val, const Int_t whichDirection)const{ - Int_t bin=-1; - RooNCSplineCore::T valj, valjpo; - Int_t npoints; - vector const* coord; - if (whichDirection==0){ - npoints=npointsX(); - coord=&XList; - } - else if (whichDirection==1){ - npoints=npointsY(); - coord=&YList; - } - else{ - npoints=npointsZ(); - coord=&ZList; - } - - if (npoints<=1) bin=0; - else{ - valjpo = coord->at(0); - for (Int_t j=0; jat(j); - valjpo = coord->at(j+1); - if (val=valj){ bin=j; break; } - } - if (bin==-1 && val>=valjpo) bin=npoints-2; - else if (bin==-1) bin=0; - } - - return bin; -} -RooNCSplineCore::T RooNCSpline_3D_fast::getTVar(const vector& kappas, const RooNCSplineCore::T& val, const Int_t& bin, const Int_t whichDirection)const{ - const RooNCSplineCore::T& K=kappas.at(bin); - vector const* coord; - if (whichDirection==0) coord=&XList; - else if (whichDirection==1) coord=&YList; - else coord=&ZList; - return (val-coord->at(bin))*K; -} - -vector> RooNCSpline_3D_fast::getCoefficientsPerYPerZ( - const std::vector& kappaX, const TMatrix_t& xAinv, - const Int_t& ybin, const Int_t& zbin, - RooNCSplineCore::BoundaryCondition const& bcBegin, RooNCSplineCore::BoundaryCondition const& bcEnd, - const Int_t xbin - )const{ - vector fcnList; - for (unsigned int bin=0; bin> coefs = getCoefficientsAlongDirection(kappaX, xAinv, fcnList, bcBegin, bcEnd, xbin); - return coefs; -} - -Double_t RooNCSpline_3D_fast::evaluate() const{ - Double_t value = interpolateFcn(0); - if (useFloor && value=RooNCSplineCore::kError) coutE(Eval) << "RooNCSpline_3D_fast ERROR::RooNCSpline_3D_fast(" << GetName() << ") evaluation returned " << value << " at (x, y, z) = (" << theXVar << ", " << theYVar << ", " << theZVar << ")" << endl; - value = floorEval; - } - if (verbosity==RooNCSplineCore::kVerbose){ cout << "RooNCSpline_3D_fast(" << GetName() << ")::evaluate = " << value << " at (x, y, z) = (" << theXVar << ", " << theYVar << ", " << theZVar << ")" << endl; } - return value; -} -Int_t RooNCSpline_3D_fast::getAnalyticalIntegral(RooArgSet& allVars, RooArgSet& analVars, const char* /*rangeName*/) const{ - if (_forceNumInt) return 0; - - Int_t code=1; - - RooArgSet Xdeps, Ydeps, Zdeps; - RooRealVar* rrv_x = dynamic_cast(theXVar.absArg()); - RooRealVar* rrv_y = dynamic_cast(theYVar.absArg()); - RooRealVar* rrv_z = dynamic_cast(theZVar.absArg()); - if (rrv_x==0) theXVar.absArg()->leafNodeServerList(&Xdeps, 0, true); - if (rrv_y==0) theYVar.absArg()->leafNodeServerList(&Ydeps, 0, true); - if (rrv_z==0) theZVar.absArg()->leafNodeServerList(&Zdeps, 0, true); - - if (rrv_x!=0){ - if ( - (Ydeps.find(*rrv_x)==0 || rrv_y!=0) - && - (Zdeps.find(*rrv_x)==0 || rrv_z!=0) - ){ - if (matchArgs(allVars, analVars, theXVar)) code*=2; - } - } - if (rrv_y!=0){ - if ( - (Xdeps.find(*rrv_y)==0 || rrv_x!=0) - && - (Zdeps.find(*rrv_y)==0 || rrv_z!=0) - ){ - if (matchArgs(allVars, analVars, theYVar)) code*=3; - } - } - if (rrv_z!=0){ - if ( - (Xdeps.find(*rrv_z)==0 || rrv_x!=0) - && - (Ydeps.find(*rrv_z)==0 || rrv_y!=0) - ){ - if (matchArgs(allVars, analVars, theZVar)) code*=5; - } - } - - if (code==1) code=0; - return code; -} -Double_t RooNCSpline_3D_fast::analyticalIntegral(Int_t code, const char* rangeName) const{ - Double_t value = interpolateFcn(code, rangeName); - if (useFloor && value=RooNCSplineCore::kError) coutE(Integration) << "RooNCSpline_3D_fast ERROR::RooNCSpline_3D_fast(" << GetName() << ") integration returned " << value << " for code = " << code << endl; - value = floorInt; - } - if (verbosity==RooNCSplineCore::kVerbose){ cout << "RooNCSpline_3D_fast(" << GetName() << ")::analyticalIntegral = " << value << " for code = " << code << endl; } - return value; -} - -Bool_t RooNCSpline_3D_fast::testRangeValidity(const T& val, const Int_t whichDirection) const{ - const T* range[2]; - if (whichDirection==0){ - range[0] = &rangeXmin; - range[1] = &rangeXmax; - } - else if (whichDirection==1){ - range[0] = &rangeYmin; - range[1] = &rangeYmax; - } - else{ - range[0] = &rangeZmin; - range[1] = &rangeZmax; - } - return (*(range[0])>*(range[1]) || (val>=*(range[0]) && val<=*(range[1]))); -} -void RooNCSpline_3D_fast::setRangeValidity(const T valmin, const T valmax, const Int_t whichDirection){ - T* range[2]; - if (whichDirection==0){ - range[0] = &rangeXmin; - range[1] = &rangeXmax; - } - else if (whichDirection==1){ - range[0] = &rangeYmin; - range[1] = &rangeYmax; - } - else{ - range[0] = &rangeZmin; - range[1] = &rangeZmax; - } - *(range[0])=valmin; - *(range[1])=valmax; -} -void RooNCSpline_3D_fast::cropValueForRange(T& val, const Int_t whichDirection)const{ - if (testRangeValidity(val, whichDirection)) return; - const T* range[2]; - if (whichDirection==0){ - range[0] = &rangeXmin; - range[1] = &rangeXmax; - } - else if (whichDirection==1){ - range[0] = &rangeYmin; - range[1] = &rangeYmax; - } - else{ - range[0] = &rangeZmin; - range[1] = &rangeZmax; - } - if (val<*(range[0])) val = *(range[0]); - if (val>*(range[1])) val = *(range[1]); -} diff --git a/src/RooPiecewisePolynomial.cc b/src/RooPiecewisePolynomial.cc deleted file mode 100644 index d3b9557dd05..00000000000 --- a/src/RooPiecewisePolynomial.cc +++ /dev/null @@ -1,215 +0,0 @@ -#include "../interface/RooPiecewisePolynomial.h" -#include -#include -#include -#include "TVectorD.h" -#include "TMatrixD.h" -#include "TIterator.h" - - -using namespace std; - - -RooPiecewisePolynomial::RooPiecewisePolynomial(const int nfcn_, const int polyndof_) : - RooAbsReal(), - xvar("xvar", "xvar", this), - parList("parList", "parList", this), - nfcn(nfcn_), polyndof(polyndof_), - nnodes(nfcn-1), // How many nodes are in between - ndof_endfcn(polyndof-1), // 1 degree for the function value - ndof_middlefcn(polyndof-2) // +1 for slope of the other node -{ - assert((nfcn>2 && polyndof>=2) || (nfcn==2 && polyndof>=1) || (nfcn==1 && polyndof>=0)); -} -RooPiecewisePolynomial::RooPiecewisePolynomial(const char* name, const char* title, const int nfcn_, const int polyndof_) : - RooAbsReal(name, title), - xvar("xvar", "xvar", this), - parList("parList", "parList", this), - nfcn(nfcn_), polyndof(polyndof_), - nnodes(nfcn-1), // How many nodes are in between - ndof_endfcn(polyndof-1), // 1 degree for the function value - ndof_middlefcn(polyndof-2) // +1 for slope of the other node -{ - assert((nfcn>2 && polyndof>=2) || (nfcn==2 && polyndof>=1) || (nfcn==1 && polyndof>=0)); -} -RooPiecewisePolynomial::RooPiecewisePolynomial(const char* name, const char* title, RooAbsReal& xvar_, RooArgList const& parList_, const int nfcn_, const int polyndof_) : - RooAbsReal(name, title), - xvar("xvar", "xvar", this, xvar_), - parList("parList", "parList", this), - nfcn(nfcn_), polyndof(polyndof_), - nnodes(nfcn-1), // How many nodes are in between - ndof_endfcn(polyndof-1), // 1 degree for the function value - ndof_middlefcn(polyndof-2) // +1 for slope of the other node -{ - assert((nfcn>2 && polyndof>=2) || (nfcn==2 && polyndof>=1) || (nfcn==1 && polyndof>=0)); - - TIterator* coefIter = parList_.createIterator(); - RooAbsArg* func; - while ((func = (RooAbsArg*) coefIter->Next())) { - if (!dynamic_cast(func)) { - cerr << "RooPiecewisePolynomial::RooPiecewisePolynomial(" << GetName() << ") funcficient " << func->GetName() << " is not of type RooAbsReal" << endl; - assert(0); - } - parList.add(*func); - } - delete coefIter; -} -RooPiecewisePolynomial::RooPiecewisePolynomial(RooPiecewisePolynomial const& other, const char* name) : - RooAbsReal(other, name), - xvar("xvar", this, other.xvar), - parList("parList", this, other.parList), - nfcn(other.nfcn), polyndof(other.polyndof), - nnodes(other.nnodes), - ndof_endfcn(other.ndof_endfcn), - ndof_middlefcn(other.ndof_middlefcn) -{} - -double RooPiecewisePolynomial::eval(double x, std::vector const& par)const{ - // If we say the form of the polynomial is [0] + [1]*x + [2]*x2 + [3]*x3 + [4]*x4..., - // use the highest two orders for matching at the nodes and free the rest. - const double d_epsilon = 0; - if ( - (nfcn>=2 && (int) par.size()!=2*ndof_endfcn+(nfcn-2)*ndof_middlefcn+nnodes) - || - (nfcn==1 && (int) par.size()!=polyndof) - || - nfcn<=0 - ) assert(0); - - if (nfcn==1){ - double res = 0; - for (int ip=0; ip node(nnodes, 0); // First [0,...,nnodes-1] parameters are nodes - vector> pars_full(nfcn, vector(polyndof, 0)); // The full coefficients array - - for (int ip=0; ipnode[ip2]) return d_epsilon; - } - } - int pos_ctr = nnodes; - for (int index=0; index> xton(nnodes, vector(polyndof, 0)); // Array of node^power - vector> nxtom(nnodes, vector(polyndof, 0)); // Array of power*node^(power-1) - for (int inode=0; inode ysbar_nodes(2*nnodes, 0); - vector> coeff_ysbar(2*nnodes, vector(2*nnodes, 0)); - int cstart=-1; - for (int inode=0; inode=0){ - coeff_ysbar[inode][cstart] = -sign_i*xton[inode][polyndof-2]; - coeff_ysbar[nnodes + inode][cstart] = -sign_i*nxtom[inode][polyndof-2]; - } - coeff_ysbar[inode][cstart+1] = -sign_i*xton[inode][polyndof-1]; - coeff_ysbar[nnodes + inode][cstart+1] = -sign_i*nxtom[inode][polyndof-1]; - coeff_ysbar[inode][cstart+2] = -sign_j*xton[inode][polyndof-2]; - coeff_ysbar[nnodes + inode][cstart+2] = -sign_j*nxtom[inode][polyndof-2]; - if ((cstart+3)<2*nnodes){ - coeff_ysbar[inode][cstart+3] = -sign_j*xton[inode][polyndof-1]; - coeff_ysbar[nnodes + inode][cstart+3] = -sign_j*nxtom[inode][polyndof-1]; - } - cstart+=2; - } - - TVectorD polyvec(2*nnodes, ysbar_nodes.data()); - TMatrixD polycoeff(2*nnodes, 2*nnodes); - for (int i=0; i<2*nnodes; i++){ for (int j=0; j<2*nnodes; j++) polycoeff(i, j)=coeff_ysbar[i][j]; } - double testdet=0; - TMatrixD polycoeff_inv = polycoeff.Invert(&testdet); - if (testdet!=0){ - TVectorD unknowncoeffs = polycoeff_inv*polyvec; - pos_ctr=0; - for (int index=0; index=node[index] && x=node[nnodes-1]) index_chosen = nfcn-1; - - double res = 0; - for (int ip=0; ip par; par.reserve(parList.getSize()); - for (int ip=0; ip(parList.at(ip)))->getVal()); - return eval(xvar, par); -} -double RooPiecewisePolynomial::evaluate(double* x, double* p)const{ // For calling in a TF1 object - // No size check is done, so be careful! - unsigned int psize=2*ndof_endfcn+(nfcn-2)*ndof_middlefcn+nnodes; - //cout << "RooPiecewisePolynomial::evaluate: N parameters = " << psize << endl; - std::vector par; par.reserve(psize); - for (unsigned int ip=0; ip -#include -#include - -using namespace std; -using namespace RooFit; -using namespace TMath; - - -ClassImp(RooRealFlooredSumPdf) - - - -//_____________________________________________________________________________ -RooRealFlooredSumPdf::RooRealFlooredSumPdf() -{ - // Default constructor - // coverity[UNINIT_CTOR] - _funcIter = _funcList.createIterator() ; - _coefIter = _coefList.createIterator() ; - _extended = kFALSE ; - _doFloor = kTRUE ; - _floorVal = 1e-100 ; -} - - - -//_____________________________________________________________________________ -RooRealFlooredSumPdf::RooRealFlooredSumPdf(const char *name, const char *title) : - RooAbsPdf(name,title), - _normIntMgr(this,10), - _haveLastCoef(kFALSE), - _funcList("!funcList","List of functions",this), - _coefList("!coefList","List of coefficients",this), - _extended(kFALSE), - _doFloor(kTRUE), - _floorVal(1e-100) -{ - // Constructor with name and title - _funcIter = _funcList.createIterator() ; - _coefIter = _coefList.createIterator() ; -} - - - -//_____________________________________________________________________________ -RooRealFlooredSumPdf::RooRealFlooredSumPdf(const char *name, const char *title, const RooArgList& inFuncList, const RooArgList& inCoefList, Bool_t extended) : -RooAbsPdf(name, title), -_normIntMgr(this, 10), -_haveLastCoef(kFALSE), -_funcList("!funcList", "List of functions", this), -_coefList("!coefList", "List of coefficients", this), -_extended(extended), -_doFloor(kTRUE), -_floorVal(1e-100) -{ - // Constructor p.d.f implementing sum_i [ coef_i * func_i ], if N_coef==N_func - // or sum_i [ coef_i * func_i ] + (1 - sum_i [ coef_i ] )* func_N if Ncoef==N_func-1 - // - // All coefficients and functions are allowed to be negative - // but the sum is not, which is enforced at runtime. - - if (!(inFuncList.getSize() == inCoefList.getSize() + 1 || inFuncList.getSize() == inCoefList.getSize())) { - coutE(InputArguments) << "RooRealFlooredSumPdf::RooRealFlooredSumPdf(" << GetName() - << ") number of pdfs and coefficients inconsistent, must have Nfunc=Ncoef or Nfunc=Ncoef+1" << endl; - assert(0); - } - - _funcIter = _funcList.createIterator(); - _coefIter = _coefList.createIterator(); - - // Constructor with N functions and N or N-1 coefs - TIterator* funcIter = inFuncList.createIterator(); - TIterator* coefIter = inCoefList.createIterator(); - RooAbsArg* func; - RooAbsArg* coef; - - while ((coef = (RooAbsArg*)coefIter->Next())) { - func = (RooAbsArg*)funcIter->Next(); - - if (!dynamic_cast(coef)) { - coutW(InputArguments) << "RooRealFlooredSumPdf::RooRealFlooredSumPdf(" << GetName() << ") coefficient " << coef->GetName() << " is not of type RooAbsReal, ignored" << endl; - continue; - } - if (!dynamic_cast(func)) { - coutW(InputArguments) << "RooRealFlooredSumPdf::RooRealFlooredSumPdf(" << GetName() << ") func " << func->GetName() << " is not of type RooAbsReal, ignored" << endl; - continue; - } - _funcList.add(*func); - _coefList.add(*coef); - } - - func = (RooAbsReal*)funcIter->Next(); - if (func) { - if (!dynamic_cast(func)) { - coutE(InputArguments) << "RooRealFlooredSumPdf::RooRealFlooredSumPdf(" << GetName() << ") last func " << func->GetName() << " is not of type RooAbsReal, fatal error" << endl; - assert(0); - } - _funcList.add(*func); - } - else _haveLastCoef = kTRUE; - - - delete funcIter; - delete coefIter; -} - - - - -//_____________________________________________________________________________ -RooRealFlooredSumPdf::RooRealFlooredSumPdf(const RooRealFlooredSumPdf& other, const char* name) : -RooAbsPdf(other, name), -_normIntMgr(other._normIntMgr, this), -_haveLastCoef(other._haveLastCoef), -_funcList("!funcList", this, other._funcList), -_coefList("!coefList", this, other._coefList), -_extended(other._extended), -_doFloor(other._doFloor), -_floorVal(other._floorVal) -{ - // Copy constructor - - _funcIter = _funcList.createIterator(); - _coefIter = _coefList.createIterator(); -} - - -//_____________________________________________________________________________ -void RooRealFlooredSumPdf::setFloor(Double_t val) -{ - _floorVal = val; -} - - - -//_____________________________________________________________________________ -RooRealFlooredSumPdf::~RooRealFlooredSumPdf() -{ - // Destructor - delete _funcIter; - delete _coefIter; -} - - - - - -//_____________________________________________________________________________ -RooAbsPdf::ExtendMode RooRealFlooredSumPdf::extendMode() const -{ - return (_extended && (_funcList.getSize() == _coefList.getSize())) ? CanBeExtended : CanNotBeExtended; -} - - - - -//_____________________________________________________________________________ -Double_t RooRealFlooredSumPdf::evaluate() const -{ - // Calculate the current value - - Double_t value(0); - - // Do running sum of coef/func pairs, calculate lastCoef. - RooFIter funcIter = _funcList.fwdIterator(); - RooFIter coefIter = _coefList.fwdIterator(); - RooAbsReal* coef; - RooAbsReal* func; - - // N funcs, N-1 coefficients - Double_t lastCoef(1); - while ((coef = (RooAbsReal*)coefIter.next())) { - func = (RooAbsReal*)funcIter.next(); - Double_t coefVal = coef->getVal(); - if (coefVal) { - cxcoutD(Eval) << "RooRealFlooredSumPdf::eval(" << GetName() << ") coefVal = " << coefVal << " funcVal = " << func->ClassName() << "::" << func->GetName() << " = " << func->getVal() << endl; - value += func->getVal()*coefVal; - lastCoef -= coef->getVal(); - } - } - - if (!_haveLastCoef) { - // Add last func with correct coefficient - func = (RooAbsReal*)funcIter.next(); - value += func->getVal()*lastCoef; - - cxcoutD(Eval) << "RooRealFlooredSumPdf::eval(" << GetName() << ") lastCoef = " << lastCoef << " funcVal = " << func->getVal() << endl; - - // Warn about coefficient degeneration - if (lastCoef<0 || lastCoef>1) { - coutW(Eval) << "RooRealFlooredSumPdf::evaluate(" << GetName() - << " WARNING: sum of FUNC coefficients not in range [0-1], value=" - << 1 - lastCoef << endl; - } - } - - // Introduce floor - if (value <= 0. && _doFloor) value = _floorVal; - - return value; -} - - - - -//_____________________________________________________________________________ -Bool_t RooRealFlooredSumPdf::checkObservables(const RooArgSet* nset) const -{ - // Check if FUNC is valid for given normalization set. - // Coeffient and FUNC must be non-overlapping, but func-coefficient - // pairs may overlap each other - // - // In the present implementation, coefficients may not be observables or derive - // from observables - - Bool_t ret(kFALSE); - - _funcIter->Reset(); - _coefIter->Reset(); - RooAbsReal* coef; - RooAbsReal* func; - while ((coef = (RooAbsReal*)_coefIter->Next())) { - func = (RooAbsReal*)_funcIter->Next(); - if (func->observableOverlaps(nset, *coef)) { - coutE(InputArguments) << "RooRealFlooredSumPdf::checkObservables(" << GetName() << "): ERROR: coefficient " << coef->GetName() - << " and FUNC " << func->GetName() << " have one or more observables in common" << endl; - ret = kTRUE; - } - if (coef->dependsOn(*nset)) { - coutE(InputArguments) << "RooRealPdf::checkObservables(" << GetName() << "): ERROR coefficient " << coef->GetName() - << " depends on one or more of the following observables"; nset->Print("1"); - ret = kTRUE; - } - } - - return ret; -} - - - - -//_____________________________________________________________________________ -Int_t RooRealFlooredSumPdf::getAnalyticalIntegralWN(RooArgSet& allVars, RooArgSet& analVars, const RooArgSet* normSet2, const char* rangeName) const -{ - //cout << "RooRealFlooredSumPdf::getAnalyticalIntegralWN:"<") << endl; - // Advertise that all integrals can be handled internally. - - // Handle trivial no-integration scenario - if (allVars.getSize() == 0) return 0; - if (_forceNumInt) return 0; - - // Select subset of allVars that are actual dependents - analVars.add(allVars); - RooArgSet* normSet = normSet2 ? getObservables(normSet2) : 0; - - - // Check if this configuration was created before - Int_t sterileIdx(-1); - CacheElem* cache = (CacheElem*)_normIntMgr.getObj(normSet, &analVars, &sterileIdx, RooNameReg::ptr(rangeName)); - if (cache) { - //cout << "RooRealFlooredSumPdf("<") << " -> " << _normIntMgr.lastIndex()+1 << " (cached)" << endl; - return _normIntMgr.lastIndex() + 1; - } - - // Create new cache element - cache = new CacheElem; - - // Make list of function projection and normalization integrals - _funcIter->Reset(); - RooAbsReal *func; - while ((func = (RooAbsReal*)_funcIter->Next())) { - RooAbsReal* funcInt = func->createIntegral(analVars, rangeName); - cache->_funcIntList.addOwned(*funcInt); - if (normSet && normSet->getSize() > 0) { - RooAbsReal* funcNorm = func->createIntegral(*normSet); - cache->_funcNormList.addOwned(*funcNorm); - } - } - - // Store cache element - Int_t code = _normIntMgr.setObj(normSet, &analVars, (RooAbsCacheElement*)cache, RooNameReg::ptr(rangeName)); - - if (normSet) delete normSet; - - //cout << "RooRealFlooredSumPdf("<") << " -> " << code+1 << endl; - return code + 1; -} - - - - -//_____________________________________________________________________________ -Double_t RooRealFlooredSumPdf::analyticalIntegralWN(Int_t code, const RooArgSet* normSet2, const char* rangeName) const -{ - //cout << "RooRealFlooredSumPdf::analyticalIntegralWN:"<") << endl; - // Implement analytical integrations by deferring integration of component - // functions to integrators of components - - // Handle trivial passthrough scenario - if (code == 0) return getVal(normSet2); - - - // WVE needs adaptation for rangeName feature - CacheElem* cache = (CacheElem*)_normIntMgr.getObjByIndex(code - 1); - if (cache == 0) { // revive the (sterilized) cache - //cout << "RooRealFlooredSumPdf("<") << ": reviving cache "<< endl; - std::unique_ptr vars(getParameters(RooArgSet())); - RooArgSet dummy; -#if ROOT_VERSION_CODE < ROOT_VERSION(6,26,0) - std::unique_ptr iset(_normIntMgr.nameSet2ByIndex(code - 1)->select(*vars)); - std::unique_ptr nset(_normIntMgr.nameSet1ByIndex(code - 1)->select(*vars)); - Int_t code2 = getAnalyticalIntegralWN(*iset, dummy, nset.get(), rangeName); -#else - // In ROOT 6.26, the RooNameSet was removed and the "selectFromSet*" - // functions were introduced to replace its functionality - RooArgSet iset{_normIntMgr.selectFromSet2(*vars, code - 1)}; - RooArgSet nset{_normIntMgr.selectFromSet1(*vars, code - 1)}; - Int_t code2 = getAnalyticalIntegralWN(iset, dummy, &nset, rangeName); -#endif - assert(code == code2); // must have revived the right (sterilized) slot... - cache = (CacheElem*)_normIntMgr.getObjByIndex(code - 1); - assert(cache != 0); - } - - RooFIter funcIntIter = cache->_funcIntList.fwdIterator(); - RooFIter coefIter = _coefList.fwdIterator(); - RooFIter funcIter = _funcList.fwdIterator(); - RooAbsReal *coef(0), *funcInt(0), *func(0); - Double_t value(0); - - // N funcs, N-1 coefficients - Double_t lastCoef(1); - while ((coef = (RooAbsReal*)coefIter.next())) { - funcInt = (RooAbsReal*)funcIntIter.next(); - func = (RooAbsReal*)funcIter.next(); - Double_t coefVal = coef->getVal(normSet2); - if (coefVal) { - assert(func); - assert(funcInt); - value += funcInt->getVal()*coefVal; - lastCoef -= coef->getVal(normSet2); - } - } - - if (!_haveLastCoef) { - // Add last func with correct coefficient - funcInt = (RooAbsReal*)funcIntIter.next(); - assert(funcInt); - value += funcInt->getVal()*lastCoef; - - // Warn about coefficient degeneration - if (lastCoef<0 || lastCoef>1) { - coutW(Eval) << "RooRealFlooredSumPdf::integral(" << GetName() - << ") WARNING: Sum of FUNC coefficients not in range [0-1], value=" - << 1 - lastCoef << endl; - } - } - - Double_t normVal(1); - if (normSet2 && normSet2->getSize() > 0) { - normVal = 0; - - // N funcs, N-1 coefficients - RooAbsReal* funcNorm; - RooFIter funcNormIter = cache->_funcNormList.fwdIterator(); - RooFIter coefIter2 = _coefList.fwdIterator(); - while ((coef = (RooAbsReal*)coefIter2.next())) { - funcNorm = (RooAbsReal*)funcNormIter.next(); - Double_t coefVal = coef->getVal(normSet2); - if (coefVal) { - assert(funcNorm); - normVal += funcNorm->getVal()*coefVal; - } - } - - // Add last func with correct coefficient - if (!_haveLastCoef) { - funcNorm = (RooAbsReal*)funcNormIter.next(); - assert(funcNorm); - normVal += funcNorm->getVal()*lastCoef; - } - } - - Double_t result = 0; - if(normVal>0) result = value / normVal; - if (result<=0. && _doFloor){ - coutW(Eval) << "RooRealFlooredSumPdf::integral(" << GetName() - << ") WARNING: Integral " << result << " below threshold." << endl; - result = _floorVal; - } - return result; -} - - -//_____________________________________________________________________________ -Double_t RooRealFlooredSumPdf::expectedEvents(const RooArgSet* nset) const -{ - Double_t n = getNorm(nset); - if (n < 0) { - logEvalError("Expected number of events is negative"); - } - return n; -} - - -//_____________________________________________________________________________ -std::list* RooRealFlooredSumPdf::binBoundaries(RooAbsRealLValue& obs, Double_t xlo, Double_t xhi) const -{ - - list* sumBinB = 0; - Bool_t needClean(kFALSE); - - RooFIter iter = _funcList.fwdIterator(); - RooAbsReal* func; - // Loop over components pdf - while ((func = (RooAbsReal*)iter.next())) { - - list* funcBinB = func->binBoundaries(obs, xlo, xhi); - - // Process hint - if (funcBinB) { - if (!sumBinB) { - // If this is the first hint, then just save it - sumBinB = funcBinB; - } - else { - - list* newSumBinB = new list(sumBinB->size() + funcBinB->size()); - - // Merge hints into temporary array - merge(funcBinB->begin(), funcBinB->end(), sumBinB->begin(), sumBinB->end(), newSumBinB->begin()); - - // Copy merged array without duplicates to new sumBinBArrau - delete sumBinB; - delete funcBinB; - sumBinB = newSumBinB; - needClean = kTRUE; - } - } - } - - // Remove consecutive duplicates - if (needClean) { - list::iterator new_end = unique(sumBinB->begin(), sumBinB->end()); - sumBinB->erase(new_end, sumBinB->end()); - } - - return sumBinB; -} - - - -//_____________________________________________________________________________B -Bool_t RooRealFlooredSumPdf::isBinnedDistribution(const RooArgSet& obs) const -{ - // If all components that depend on obs are binned that so is the product - - RooFIter iter = _funcList.fwdIterator(); - RooAbsReal* func; - while ((func = (RooAbsReal*)iter.next())) { - if (func->dependsOn(obs) && !func->isBinnedDistribution(obs)) { - return kFALSE; - } - } - - return kTRUE; -} - - - - - -//_____________________________________________________________________________ -std::list* RooRealFlooredSumPdf::plotSamplingHint(RooAbsRealLValue& obs, Double_t xlo, Double_t xhi) const -{ - list* sumHint = 0; - Bool_t needClean(kFALSE); - - RooFIter iter = _funcList.fwdIterator(); - RooAbsReal* func; - // Loop over components pdf - while ((func = (RooAbsReal*)iter.next())) { - - list* funcHint = func->plotSamplingHint(obs, xlo, xhi); - - // Process hint - if (funcHint) { - if (!sumHint) { - - // If this is the first hint, then just save it - sumHint = funcHint; - - } - else { - - list* newSumHint = new list(sumHint->size() + funcHint->size()); - - // Merge hints into temporary array - merge(funcHint->begin(), funcHint->end(), sumHint->begin(), sumHint->end(), newSumHint->begin()); - - // Copy merged array without duplicates to new sumHintArrau - delete sumHint; - sumHint = newSumHint; - needClean = kTRUE; - } - } - } - - // Remove consecutive duplicates - if (needClean) { - list::iterator new_end = unique(sumHint->begin(), sumHint->end()); - sumHint->erase(new_end, sumHint->end()); - } - - return sumHint; -} - - - - -//_____________________________________________________________________________ -void RooRealFlooredSumPdf::printMetaArgs(ostream& os) const -{ - // Customized printing of arguments of a RooRealFlooredSumPdf to more intuitively reflect the contents of the - // product operator construction - - _funcIter->Reset(); - _coefIter->Reset(); - - Bool_t first(kTRUE); - - RooAbsArg* coef, *func; - if (_coefList.getSize() != 0) { - while ((coef = (RooAbsArg*)_coefIter->Next())) { - if (!first) { - os << " + "; - } - else { - first = kFALSE; - } - func = (RooAbsArg*)_funcIter->Next(); - os << coef->GetName() << " * " << func->GetName(); - } - func = (RooAbsArg*)_funcIter->Next(); - if (func) { - os << " + [%] * " << func->GetName(); - } - } - else { - - while ((func = (RooAbsArg*)_funcIter->Next())) { - if (!first) { - os << " + "; - } - else { - first = kFALSE; - } - os << func->GetName(); - } - } - - os << " "; -} diff --git a/src/classes.h b/src/classes.h index 867ffeee1c9..ae1a054339a 100644 --- a/src/classes.h +++ b/src/classes.h @@ -3,7 +3,6 @@ #include "HiggsAnalysis/CombinedLimit/interface/VerticalInterpPdf.h" #include "HiggsAnalysis/CombinedLimit/interface/VerticalInterpHistPdf.h" #include "HiggsAnalysis/CombinedLimit/interface/AsymPow.h" -#include "HiggsAnalysis/CombinedLimit/interface/AsymQuad.h" #include "HiggsAnalysis/CombinedLimit/interface/CombDataSetFactory.h" #include "HiggsAnalysis/CombinedLimit/interface/TH1Keys.h" #include "HiggsAnalysis/CombinedLimit/interface/RooSimultaneousOpt.h" @@ -19,7 +18,6 @@ #include "HiggsAnalysis/CombinedLimit/interface/HZGRooPdfs.h" #include "HiggsAnalysis/CombinedLimit/interface/SequentialMinimizer.h" #include "HiggsAnalysis/CombinedLimit/interface/ProcessNormalization.h" -#include "HiggsAnalysis/CombinedLimit/interface/RooRealFlooredSumPdf.h" #include "HiggsAnalysis/CombinedLimit/interface/RooSpline1D.h" #include "HiggsAnalysis/CombinedLimit/interface/RooSplineND.h" #include "HiggsAnalysis/CombinedLimit/interface/RooScaleLOSM.h" @@ -56,13 +54,7 @@ #include "HiggsAnalysis/CombinedLimit/interface/RooTaylorExpansion.h" #include "HiggsAnalysis/CombinedLimit/interface/SimpleTaylorExpansion1D.h" -#include "HiggsAnalysis/CombinedLimit/interface/RooPiecewisePolynomial.h" -#include "HiggsAnalysis/CombinedLimit/interface/RooNCSplineCore.h" -#include "HiggsAnalysis/CombinedLimit/interface/RooNCSpline_1D_fast.h" -#include "HiggsAnalysis/CombinedLimit/interface/RooNCSpline_2D_fast.h" -#include "HiggsAnalysis/CombinedLimit/interface/RooNCSpline_3D_fast.h" -#include "HiggsAnalysis/CombinedLimit/interface/RooFuncPdf.h" #include "HiggsAnalysis/CombinedLimit/interface/RooCheapProduct.h" #include "HiggsAnalysis/CombinedLimit/interface/CMSHggFormula.h" #include "HiggsAnalysis/CombinedLimit/interface/SimpleProdPdf.h" diff --git a/src/classes_def.xml b/src/classes_def.xml index 3bf3eb4f689..6656870b2e7 100644 --- a/src/classes_def.xml +++ b/src/classes_def.xml @@ -36,7 +36,6 @@ - @@ -88,13 +87,6 @@ - - - - - - - @@ -154,7 +146,6 @@ - From 598297d368a336078b22231633233e5617af479c Mon Sep 17 00:00:00 2001 From: adewit Date: Thu, 14 Dec 2023 09:59:18 +0100 Subject: [PATCH 84/98] Documentation language edit /spell check (#871) * First iteration of spell check * Spell check for setup * physics model spell check * Add commonstatsmethods language check * Finish spellcheck part 3-4-5 * Fixing Combine small caps text in docs --- contributing.md | 20 +- docs/index.md | 60 +++--- docs/part2/bin-wise-stats.md | 22 +-- docs/part2/physicsmodels.md | 56 +++--- docs/part2/settinguptheanalysis.md | 280 +++++++++++++------------- docs/part3/commonstatsmethods.md | 302 ++++++++++++++--------------- docs/part3/debugging.md | 2 +- docs/part3/nonstandard.md | 254 ++++++++++++------------ docs/part3/regularisation.md | 48 ++--- docs/part3/runningthetool.md | 204 +++++++++---------- docs/part3/simplifiedlikelihood.md | 60 +++--- docs/part3/validation.md | 54 +++--- docs/part4/usefullinks.md | 42 ++-- docs/part5/longexercise.md | 50 ++--- docs/part5/roofit.md | 98 +++++----- 15 files changed, 777 insertions(+), 775 deletions(-) diff --git a/contributing.md b/contributing.md index 172ed36f2b3..4f0992a2461 100644 --- a/contributing.md +++ b/contributing.md @@ -1,6 +1,6 @@ # Contributing -Contributions to combine of all sizes, from minor documentation updates to big code improvements, are welcome and encouraged. +Contributions to Combine of all sizes, from minor documentation updates to big code improvements, are welcome and encouraged. To ensure good development of the tool, we try to coordinate contributions. However, we are happy to help overcome any steps that may pose issues for contributors. @@ -42,19 +42,19 @@ ensure `flake8` and `black` are installed: and then from the main directory of this repository run -flake8: +`flake8`: ``` flake8 . ``` -and black: +and `black`: ``` black -l 160 --check --diff . ``` If you'd like to see the details of the configuration `flake8` is using, check the `.flake8` file in the main directory. -The black linting uses the default [black style](https://black.readthedocs.io/en/stable/the_black_code_style/current_style.html) (for v23.3.0), with only the command line options shown above. +The `black` linting uses the default [black style](https://black.readthedocs.io/en/stable/the_black_code_style/current_style.html) (for v23.3.0), with only the command line options shown above. ## Updating Documentation @@ -65,7 +65,7 @@ For that reason, whenever you make a change you should consider whether this req If the change is user-facing it almost certainly does require a documentation update. Documentation is **very important** to us. -Therefore, we will be picky and make sure it is done well! +Therefore, we will be meticulous and make sure it is done well! However, we don't want to put extra burden on you, so we are happy to help and will make our own edits and updates to improve the documentation of your change. We appreciate you putting in some effort and thought to ensure: @@ -76,7 +76,7 @@ We appreciate you putting in some effort and thought to ensure: ### Technical details of the documentation -We use [mkdocs](www.mkdocs.org) to produce the static website that documents combine. +We use [mkdocs](www.mkdocs.org) to produce the static website that documents Combine. The documentation files are all under the `docs/` folder. Which pages get included in the site, and other configuration details are set in the `mkdocs.yml` file. @@ -97,17 +97,17 @@ mkdocs serve from the main repository directory. mkdocs will then print a link you can open to check the page generated in your browser. -**NOTE:** mkdocs builds which use internal links (or images etc) with absolute paths will work for local deployment, but will break when deployed to the public documentations pages. -Please ensure you use relative paths. Currently, this is the only known feature where the behvaiour differs between local mkdocs and public pages deployment. +**NOTE:** mkdocs builds that use internal links (or images, etc.) with absolute paths will work for local deployment, but will break when deployed to the public documentations pages. +Please ensure you use relative paths. Currently, this is the only known feature where the behvaiour differs between local mkdocs and public page deployment. If you'd like to test the deployment directly, the suggested method is to set up a docs page using your personal github account; this should mimic the exact settings of the official page. ## Big Contributions -We welcome large contributions to combine. +We welcome large contributions to Combine. Note, however, that we also follow long term planning, and there is a dedicated group stewarding the overall direction and development of the code. This means that the code development should fit in with our long term vision; -if you have an idea for a big improvement or change it will be most efficient if you [contact us](mailto:cms-cat-stats-conveners@cern.ch) first, in order to ensure that we can integrate it as seemlessly as possible into our plans. +if you have an idea for a big improvement or change it will be most efficient if you [contact us](mailto:cms-cat-stats-conveners@cern.ch) first, in order to ensure that we can integrate it as seamlessly as possible into our plans. This will simplify any potential conflicts when you make your pull request. ## Requested Contributions diff --git a/docs/index.md b/docs/index.md index e21061d2aa4..da40bb43012 100644 --- a/docs/index.md +++ b/docs/index.md @@ -2,16 +2,16 @@ These pages document the [RooStats](https://twiki.cern.ch/twiki/bin/view/RooStats/WebHome) / -[RooFit](https://root.cern.ch/roofit) - based software tools used for -statistical analysis within the [Higgs PAG](HiggsWG) - **combine**. +[RooFit](https://root.cern.ch/roofit) - based software tool used for +statistical analysis within the CMS experiment - Combine. Note that while this tool was originally developed in the [Higgs PAG](HiggsWG), its usage is now widespread within CMS. -Combine provides a command line interface to many different statistical techniques available inside RooFit/RooStats used widely inside CMS. +Combine provides a command-line interface to many different statistical techniques, available inside RooFit/RooStats, that are used widely inside CMS. -The package exists in GIT under [https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit) +The package exists on GitHub under [https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit) -For more information about GIT and its usage in CMS, see [http://cms-sw.github.io/cmssw/faq.html](http://cms-sw.github.io/cmssw/faq.html) +For more information about Git, GitHub and its usage in CMS, see [http://cms-sw.github.io/cmssw/faq.html](http://cms-sw.github.io/cmssw/faq.html) -The code can be checked out from GIT and compiled on top of a CMSSW release that includes a recent RooFit/RooStats +The code can be checked out from GitHub and compiled on top of a CMSSW release that includes a recent RooFit/RooStats # Installation instructions @@ -22,7 +22,7 @@ Earlier versions are not guaranteed to follow the standard. ## Within CMSSW (recommended for CMS users) The instructions below are for installation within a CMSSW environment. For end -users that don't need to commit or do any development, the following recipes +users that do not need to commit or do any development, the following recipes should be sufficient. To choose a release version, you can find the latest releases on github under [https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/releases](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/releases) @@ -30,9 +30,9 @@ releases on github under ### Combine v9 - recommended version The nominal installation method is inside CMSSW. The current release targets -CMSSW `11_3_X` series because this release has both python2 and python3 ROOT -bindings, allowing a more gradual migration of user code to python3. Combine is -fully python3-compatible and can work also in 12_X releases. +the CMSSW `11_3_X` series because this release has both python2 and python3 ROOT +bindings, allowing a more gradual migration of user code to python3. Combine is +fully python3-compatible and, with some adaptations, can also work in 12_X releases. ```sh cmsrel CMSSW_11_3_4 @@ -99,11 +99,11 @@ scramv1 b clean; scramv1 b # always make a clean build ## Standalone compilation The standalone version can be easily compiled using -[cvmfs](https://cernvm.cern.ch/fs/) as it relies on dependencies which are +[cvmfs](https://cernvm.cern.ch/fs/) as it relies on dependencies that are already installed at `/cvmfs/cms.cern.ch/`. Access to `/cvmfs/cms.cern.ch/` can be obtained from lxplus machines or via `CernVM`. See [CernVM](CernVM.md) for further details on the latter. In case you do not want to use the `cvmfs` -area, you will need to adapt the location of the dependencies listed in both +area, you will need to adapt the locations of the dependencies listed in both the `Makefile` and `env_standalone.sh` files. ``` @@ -114,18 +114,20 @@ cd HiggsAnalysis/CombinedLimit/ make -j 4 ``` -You will need to source `env_standalone.sh` each time you want to use the package, or add it to your login. +You will need to source `env_standalone.sh` each time you want to use the package, or add it to your login environment. ### Standalone compilation with LCG -For compilation outside of CMSSW, for example to use ROOT versions not yet available in CMSSW, one can compile against LCG releases. The current default is to compile with LCG_102 which contains ROOT 6.26: +For compilation outside of CMSSW, for example to use ROOT versions not yet available in CMSSW, one can compile against LCG releases. The current default is to compile with LCG_102, which contains ROOT 6.26: ```sh git clone https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit.git HiggsAnalysis/CombinedLimit cd HiggsAnalysis/CombinedLimit source env_lcg.sh make LCG=1 -j 8 ``` -To change the LCG version, edit `env_lcg.sh`. The resulting binaries can be relocated (e.g. for use in a -batch job) if the following files are included in the job tarball: +To change the LCG version, edit `env_lcg.sh`. + +The resulting binaries can be moved for use in a +batch job if the following files are included in the job tarball: ```sh tar -zcf Combine_LCG_env.tar.gz build interface src/classes.h --exclude=obj ``` @@ -148,40 +150,42 @@ conda activate combine make CONDA=1 -j 8 ``` -Using combine from then on should only require sourcing the conda environment +Using Combine from then on should only require sourcing the conda environment ``` conda activate combine ``` -**Note:** on OS X, `combine` can only accept workspaces, so run `text2workspace.py` first. -This is due to some ridiculous issue with child processes and `LD_LIBRARY_PATH` (see note in Makefile) +**Note:** on OS X, Combine can only accept workspaces, so run `text2workspace.py` first. +This is due to an issue with child processes and `LD_LIBRARY_PATH` (see note in Makefile) # What has changed between tags? -You can generate a diff of any two tags (eg for `v7.0.8` and `v7.0.6`) by using following the url: +You can generate a diff of any two tags (eg for `v9.1.0` and `v9.0.0`) by using the following url: -[https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/compare/v7.0.6...v7.0.7](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/compare/v7.0.6...v7.0.7) +[https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/compare/v9.0.0...v9.1.0](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/compare/v9.0.0...v9.1.0) -Replace the tag names in the url to any tags you which to compare. +Replace the tag names in the url to any tags you would like to compare. # For developers -We use the _Fork and Pull_ model for development: each user creates a copy of the repository on github, commits their requests there and then sends pull requests for the administrators to merge. +We use the _Fork and Pull_ model for development: each user creates a copy of the repository on GitHub, commits their requests there, and then sends pull requests for the administrators to merge. _Prerequisites_ -1. Register on github, as needed anyway for CMSSW development: [http://cms-sw.github.io/cmssw/faq.html](http://cms-sw.github.io/cmssw/faq.html) +1. Register on GitHub, as needed anyway for CMSSW development: [http://cms-sw.github.io/cmssw/faq.html](http://cms-sw.github.io/cmssw/faq.html) + +2. Register your SSH key on GitHub: [https://help.github.com/articles/generating-ssh-keys](https://help.github.com/articles/generating-ssh-keys) -2. Register your SSH key on github: [https://help.github.com/articles/generating-ssh-keys](https://help.github.com/articles/generating-ssh-keys) 1 Fork the repository to create your copy of it: [https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/fork](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/fork) (more documentation at [https://help.github.com/articles/fork-a-repo](https://help.github.com/articles/fork-a-repo) ) +3. Fork the repository to create your copy of it: [https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/fork](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/fork) (more documentation at [https://help.github.com/articles/fork-a-repo](https://help.github.com/articles/fork-a-repo) ) You will now be able to browse your fork of the repository from [https://github.com/your-github-user-name/HiggsAnalysis-CombinedLimit](https://github.com/your-github-user-name/HiggsAnalysis-CombinedLimit) -We strongly encourage you to contribute any developments you make back into the main repository. +We strongly encourage you to contribute any developments you make back to the main repository. See [contributing.md](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/contributing.md) for details about contributing. -# Combine Tool +# CombineHarvester/CombineTools -An additional tool for submitting combine jobs to batch/crab, developed originally for HiggsToTauTau. Since the repository contains a certain amount of analysis-specific code, the following scripts can be used to clone it with a sparse checkout for just the core [`CombineHarvester/CombineTools`](https://github.com/cms-analysis/CombineHarvester/blob/master/CombineTools/) subpackage, speeding up the checkout and compile times: +CombineTools is an additional tool for submitting Combine jobs to batch systems or crab, which was originally developed in the context of Higgs to tau tau analyses. Since the repository contains a certain amount of analysis-specific code, the following scripts can be used to clone it with a sparse checkout for just the core [`CombineHarvester/CombineTools`](https://github.com/cms-analysis/CombineHarvester/blob/master/CombineTools/) subpackage, speeding up the checkout and compile times: git clone via ssh: diff --git a/docs/part2/bin-wise-stats.md b/docs/part2/bin-wise-stats.md index 15aaeba808e..10a02591bab 100644 --- a/docs/part2/bin-wise-stats.md +++ b/docs/part2/bin-wise-stats.md @@ -1,9 +1,9 @@ # Automatic statistical uncertainties ## Introduction -The `text2workspace.py` script is now able to produce a new type of workspace in which bin-wise statistical uncertainties are added automatically. This can be built for shape-based datacards where the inputs are in TH1 format. Datacards that use RooDataHists are not supported. The bin errrors (i.e. values returned by TH1::GetBinError) are used to model the uncertainties. +The `text2workspace.py` script is able to produce a type of workspace, using a set of new histogram classes, in which bin-wise statistical uncertainties are added automatically. This can be built for shape-based datacards where the inputs are in TH1 format. Datacards that use RooDataHists are not supported. The bin errrors (i.e. values returned by `TH1::GetBinError`) are used to model the uncertainties. -By default the script will attempt to assign a single nuisance parameter to scale the sum of the process yields in each bin, constrained by the total uncertainty, instead of requiring separate parameters, one per process. This is sometimes referred to as the [Barlow-Beeston](http://inspirehep.net/record/35053)-lite approach, and is useful as it minimises the number of parameters required in the maximum-likelihood fit. A useful description of this approach may be found in section 5 of [this report](https://arxiv.org/pdf/1103.0354.pdf). +By default the script will attempt to assign a single nuisance parameter to scale the sum of the process yields in each bin, constrained by the total uncertainty, instead of requiring separate parameters, one per process. This is sometimes referred to as the [Barlow-Beeston](http://inspirehep.net/record/35053)-lite approach, and is useful as it minimises the number of parameters required in the maximum likelihood fit. A useful description of this approach may be found in section 5 of [this report](https://arxiv.org/pdf/1103.0354.pdf). ## Usage instructions @@ -15,22 +15,22 @@ The following line should be added at the bottom of the datacard, underneath the The first string `channel` should give the name of the channels (bins) in the datacard for which the new histogram classes should be used. The wildcard `*` is supported for selecting multiple channels in one go. The value of `threshold` should be set to a value greater than or equal to zero to enable the creation of automatic bin-wise uncertainties, or `-1` to use the new histogram classes without these uncertainties. A positive value sets the threshold on the effective number of unweighted events above which the uncertainty will be modeled with the Barlow-Beeston-lite approach described above. Below the threshold an individual uncertainty per-process will be created. The algorithm is described in more detail below. -The last two settings are optional. The first of these, `include-signal` has a default value of `0` but can be set to `1` as an alternative. By default the total nominal yield and uncertainty used to test the threshold excludes signal processes, as typically the initial signal normalisation is arbitrary, and could unduly lead to a bin being considered well-populated despite poorly populated background templates. Setting this flag will include the signal processes in the uncertainty analysis. Note that this option only affects the logic for creating a single Barlow-Beeston-lite parameter vs. separate per-process parameters - the uncertainties on all signal processes are always included in the actual model! The second flag changes the way the normalisation effect of shape-altering uncertainties is handled. In the default mode (`1`) the normalisation is handled separately from the shape morphing via a an asymmetric log-normal term. This is identical to how combine has always handled shape morphing. When set to `2`, the normalisation will be adjusted in the shape morphing directly. Unless there is a strong motivation we encourage users to leave this on the default setting. +The last two settings are optional. The first of these, `include-signal` has a default value of `0` but can be set to `1` as an alternative. By default, the total nominal yield and uncertainty used to test the threshold excludes signal processes. The reason for this is that typically the initial signal normalization is arbitrary, and could unduly lead to a bin being considered well-populated despite poorly populated background templates. Setting this flag will include the signal processes in the uncertainty analysis. Note that this option only affects the logic for creating a single Barlow-Beeston-lite parameter vs. separate per-process parameters - the uncertainties on all signal processes are always included in the actual model! The second flag changes the way the normalization effect of shape-altering uncertainties is handled. In the default mode (`1`) the normalization is handled separately from the shape morphing via a an asymmetric log-normal term. This is identical to how Combine has always handled shape morphing. When set to `2`, the normalization will be adjusted in the shape morphing directly. Unless there is a strong motivation we encourage users to leave this on the default setting. ## Description of the algorithm When `threshold` is set to a number of effective unweighted events greater than or equal to zero, denoted $n^{\text{threshold}}$, the following algorithm is applied to each bin: - 1. Sum the yields $n_{i}$ and uncertainities $e_{i}$ of each background process $i$ in the bin. Note that the $n_i$ and $e_i$ include the nominal effect of any scaling parameters that have been set in the datacard, for example [`rateParams`](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part2/settinguptheanalysis/#rate-parameters). + 1. Sum the yields $n_{i}$ and uncertainties $e_{i}$ of each background process $i$ in the bin. Note that the $n_i$ and $e_i$ include the nominal effect of any scaling parameters that have been set in the datacard, for example [`rateParams`](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part2/settinguptheanalysis/#rate-parameters). $n_{\text{tot}} = \sum_{i\,\in\,\text{bkg}}n_i$, $e_{\text{tot}} = \sqrt{\sum_{i\,\in\,\text{bkg}}e_i^{2}}$ - 2. If $e_{\text{tot}} = 0$, the bin is skipped and no parameters are created. (Though you might want to check why there is no uncertainty on the background prediction in this bin!) + 2. If $e_{\text{tot}} = 0$, the bin is skipped and no parameters are created. If this is the case, it is a good idea to check why there is no uncertainty in the background prediction in this bin! 3. The effective number of unweighted events is defined as $n_{\text{tot}}^{\text{eff}} = n_{\text{tot}}^{2} / e_{\text{tot}}^{2}$, rounded to the nearest integer. 4. If $n_{\text{tot}}^{\text{eff}} \leq n^{\text{threshold}}$: separate uncertainties will be created for each process. Processes where $e_{i} = 0$ are skipped. If the number of effective events for a given process is lower than $n^{\text{threshold}}$ a Poisson-constrained parameter will be created. Otherwise a Gaussian-constrained parameter is used. 5. If $n_{\text{tot}}^{\text{eff}} \gt n^{\text{threshold}}$: A single Gaussian-constrained Barlow-Beeston-lite parameter is created that will scale the total yield in the bin. - 6. Note that the values of $e_{i}$ and therefore $e_{tot}$ will be updated automatically in the model whenever the process normalisations change. + 6. Note that the values of $e_{i}$, and therefore $e_{tot}$, will be updated automatically in the model whenever the process normalizations change. 7. A Gaussian-constrained parameter $x$ has a nominal value of zero and scales the yield as $n_{\text{tot}} + x \cdot e_{\text{tot}}$. The Poisson-constrained parameters are expressed as a yield multiplier with nominal value one: $n_{\text{tot}} \cdot x$. -The output from `text2workspace.py` will give details on how each bin has been treated by this alogorithm, for example: +The output from `text2workspace.py` will give details on how each bin has been treated by this algorithm, for example:
    Show example output @@ -68,9 +68,9 @@ Bin Contents Error Notes
    ## Analytic minimisation -One significant advantage of the Barlow-Beeston-lite approach is that the maximum likelihood estimate of each nuisance parameter has a simple analytic form that depends only on $n_{\text{tot}}$, $e_{\text{tot}}$ and the observed number of data events in the relevant bin. Therefore when minimising the negative log-likelihood of the whole model it is possible to remove these parameters from the fit and set them to their best-fit values automatically. For models with large numbers of bins this can reduce the fit time and increase the fit stability. The analytic minimisation is enabled by default starting in combine v8.2.0, you can disable it by adding the option `--X-rtd MINIMIZER_no_analytic` when running combine. +One significant advantage of the Barlow-Beeston-lite approach is that the maximum likelihood estimate of each nuisance parameter has a simple analytic form that depends only on $n_{\text{tot}}$, $e_{\text{tot}}$ and the observed number of data events in the relevant bin. Therefore when minimising the negative log-likelihood of the whole model it is possible to remove these parameters from the fit and set them to their best-fit values automatically. For models with large numbers of bins this can reduce the fit time and increase the fit stability. The analytic minimisation is enabled by default starting in combine v8.2.0, you can disable it by adding the option `--X-rtd MINIMIZER_no_analytic` when running Combine. -The figure below shows a performance comparison of the analytical minimization versus the number of bins in the likelihood function. The real time (in sections) for a typical minimisation of a binned likelihood is shown as a function of the number of bins when invoking the analytic minimisation of the nuisance parameters versus the default numerical approach. +The figure below shows a performance comparison of the analytical minimisation versus the number of bins in the likelihood function. The real time (in sections) for a typical minimisation of a binned likelihood is shown as a function of the number of bins when invoking the analytic minimisation of the nuisance parameters versus the default numerical approach. /// details | **Show Comparison** @@ -81,10 +81,10 @@ The figure below shows a performance comparison of the analytical minimization v ## Technical details -Up until recently `text2workspace.py` would only construct the PDF for each channel using a `RooAddPdf`, i.e. each component process is represented by a separate PDF and normalisation coefficient. However in order to model bin-wise statistical uncertainties the alternative `RooRealSumPdf` can be more useful, as each process is represented by a RooFit function object instead of a PDF, and we can vary the bin yields directly. As such, a new RooFit histogram class `CMSHistFunc` is introduced, which offers the same vertical template morphing algorithms offered by the current default histogram PDF, `FastVerticalInterpHistPdf2`. Accompanying this is the `CMSHistErrorPropagator` class. This evaluates a sum of `CMSHistFunc` objects, each multiplied by a coefficient. It is also able to scale the summed yield of each bin to account for bin-wise statistical uncertainty nuisance parameters. +Up until recently `text2workspace.py` would only construct the PDF for each channel using a `RooAddPdf`, i.e. each component process is represented by a separate PDF and normalization coefficient. However, in order to model bin-wise statistical uncertainties, the alternative `RooRealSumPdf` can be more useful, as each process is represented by a RooFit function object instead of a PDF, and we can vary the bin yields directly. As such, a new RooFit histogram class `CMSHistFunc` is introduced, which offers the same vertical template morphing algorithms offered by the current default histogram PDF, `FastVerticalInterpHistPdf2`. Accompanying this is the `CMSHistErrorPropagator` class. This evaluates a sum of `CMSHistFunc` objects, each multiplied by a coefficient. It is also able to scale the summed yield of each bin to account for bin-wise statistical uncertainty nuisance parameters. !!! warning - One disadvantage of this new approach comes when evaluating the expectation for individual processes, for example when using the `--saveShapes` option in the `FitDiagnostics` mode of combine. The Barlow-Beeston-lite parameters scale the sum of the process yields directly, so extra work is needed in the distribution this total scaling back to each individual process. To achieve this an additional class `CMSHistFuncWrapper` has been created that, given a particular `CMSHistFunc`, the `CMSHistErrorPropagator` will distribute an appropriate fraction of the total yield shift to each bin. As a consequence of the extra computation needed to distribute the yield shifts in this way the evaluation of individual process shapes in `--saveShapes` can take longer then previously. + One disadvantage of this new approach comes when evaluating the expectation for individual processes, for example when using the `--saveShapes` option in the `FitDiagnostics` mode of Combine. The Barlow-Beeston-lite parameters scale the sum of the process yields directly, so extra work is needed to distribute this total scaling back to each individual process. To achieve this, an additional class `CMSHistFuncWrapper` has been created that, given a particular `CMSHistFunc`, the `CMSHistErrorPropagator` will distribute an appropriate fraction of the total yield shift to each bin. As a consequence of the extra computation needed to distribute the yield shifts in this way, the evaluation of individual process shapes in `--saveShapes` can take longer then previously. diff --git a/docs/part2/physicsmodels.md b/docs/part2/physicsmodels.md index e7c3c54c1d8..d779aaf4adb 100644 --- a/docs/part2/physicsmodels.md +++ b/docs/part2/physicsmodels.md @@ -1,6 +1,6 @@ # Physics Models -Combine can be run directly on the text based datacard. However, for more advanced physics models, the internal step to convert the datacard to a binary workspace can be performed by the user. To create a binary workspace starting from a `datacard.txt`, just do +Combine can be run directly on the text-based datacard. However, for more advanced physics models, the internal step to convert the datacard to a binary workspace should be performed by the user. To create a binary workspace starting from a `datacard.txt`, you can run ```sh text2workspace.py datacard.txt -o workspace.root @@ -8,12 +8,12 @@ text2workspace.py datacard.txt -o workspace.root By default (without the `-o` option), the binary workspace will be named `datacard.root` - i.e the **.txt** suffix will be replaced by **.root**. -A full set of options for `text2workspace` can be found by using `--help`. +A full set of options for `text2workspace` can be found by running `text2workspace.py --help`. -The default model which will be produced when running `text2workspace` is one in which all processes identified as signal are multiplied by a common multiplier **r**. This is all that is needed for simply setting limits or calculating significances. +The default model that will be produced when running `text2workspace` is one in which all processes identified as signal are multiplied by a common multiplier **r**. This is all that is needed for simply setting limits or calculating significances. -`text2workspace` will convert the datacard into a pdf which summaries the analysis. -For example, lets take a look at the [data/tutorials/counting/simple-counting-experiment.txt](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/data/tutorials/counting/simple-counting-experiment.txt) datacard. +`text2workspace` will convert the datacard into a PDF that summarizes the analysis. +For example, let's take a look at the [data/tutorials/counting/simple-counting-experiment.txt](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/data/tutorials/counting/simple-counting-experiment.txt) datacard. ```nohighlight # Simple counting experiment, with one signal and one background process @@ -40,9 +40,9 @@ deltaS lnN 1.20 - 20% uncertainty on signal deltaB lnN - 1.50 50% uncertainty on background ``` -If we run `text2workspace.py` on this datacard and take a look at the workspace (`w`) inside the `.root` file produced, we will find a number of different objects representing the signal, background and observed event rates as well as the nuisance parameters and signal strength **r**. +If we run `text2workspace.py` on this datacard and take a look at the workspace (`w`) inside the `.root` file produced, we will find a number of different objects representing the signal, background, and observed event rates, as well as the nuisance parameters and signal strength **r**. -From these objects, the necessary pdf has been constructed (named `model_s`). For this counting experiment we will expect a simple pdf of the form +From these objects, the necessary PDF has been constructed (named `model_s`). For this counting experiment we will expect a simple PDF of the form $$ p(n_{\mathrm{obs}}| r,\delta_{S},\delta_{B})\propto @@ -54,9 +54,9 @@ $$ where the expected signal and background rates are expressed as functions of the nuisance parameters, $n_{S}(\delta_{S}) = 4.76(1+0.2)^{\delta_{S}}~$ and $~n_{B}(\delta_{B}) = 1.47(1+0.5)^{\delta_{B}}$. -The first term represents the usual Poisson expression for observing $n_{\mathrm{obs}}$ events while the second two are the Gaussian constraint terms for the nuisance parameters. In this case ${\delta^{\mathrm{In}}_S}={\delta^{\mathrm{In}}_B}=0$, and the widths of both Gaussians are 1. +The first term represents the usual Poisson expression for observing $n_{\mathrm{obs}}$ events, while the second two are the Gaussian constraint terms for the nuisance parameters. In this case ${\delta^{\mathrm{In}}_S}={\delta^{\mathrm{In}}_B}=0$, and the widths of both Gaussians are 1. -A combination of counting experiments (or a binned shape datacard) will look like a product of pdfs of this kind. For a parametric/unbinned analyses, the pdf for each process in each channel is provided instead of the using the Poisson terms and a product is over the bin counts/events. +A combination of counting experiments (or a binned shape datacard) will look like a product of PDFs of this kind. For parametric/unbinned analyses, the PDF for each process in each channel is provided instead of the using the Poisson terms and a product runs over the bin counts/events. ## Model building @@ -68,13 +68,13 @@ text2workspace.py datacard -P HiggsAnalysis.CombinedLimit.PythonFile:modelName Generic models can be implemented by writing a python class that: -- defines the model parameters (by default it's just the signal strength modifier **`r`**) -- defines how signal and background yields depend on the parameters (by default, signal scale linearly with **`r`**, backgrounds are constant) -- potentially also modifies the systematics (e.g. switch off theory uncertainties on cross section when measuring the cross section itself) +- defines the model parameters (by default it is just the signal strength modifier **`r`**) +- defines how signal and background yields depend on the parameters (by default, the signal scales linearly with **`r`**, backgrounds are constant) +- potentially also modifies the systematic uncertainties (e.g. switch off theory uncertainties on cross section when measuring the cross section itself) -In the case of SM-like Higgs searches the class should inherit from **`SMLikeHiggsModel`** (redefining **`getHiggsSignalYieldScale`**), while beyond that one can inherit from **`PhysicsModel`**. You can find some examples in [PhysicsModel.py](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/python/PhysicsModel.py). +In the case of SM-like Higgs boson measurements, the class should inherit from **`SMLikeHiggsModel`** (redefining **`getHiggsSignalYieldScale`**), while beyond that one can inherit from **`PhysicsModel`**. You can find some examples in [PhysicsModel.py](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/python/PhysicsModel.py). -In the 4-process model (`PhysicsModel:floatingXSHiggs`, you will see that each of the 4 dominant Higgs production modes get separate scaling parameters, **`r_ggH`**, **`r_qqH`**, **`r_ttH`** and **`r_VH`** (or **`r_ZH`** and **`r_WH`**) as defined in, +In the 4-process model (`PhysicsModel:floatingXSHiggs`, you will see that each of the 4 dominant Higgs boson production modes get separate scaling parameters, **`r_ggH`**, **`r_qqH`**, **`r_ttH`** and **`r_VH`** (or **`r_ZH`** and **`r_WH`**) as defined in, ```python def doParametersOfInterest(self): @@ -106,27 +106,27 @@ You should note that `text2workspace` will look for the python module in `PYTHON A number of models used in the LHC Higgs combination paper can be found in [LHCHCGModels.py](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/python/LHCHCGModels.py). These can be easily accessed by providing for example `-P HiggsAnalysis.CombinedLimit.HiggsCouplings:c7` and others defined un [HiggsCouplings.py](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/python/HiggsCouplings.py). -Below are some (more generic) example models which also exist in gitHub. +Below are some (more generic) example models that also exist in GitHub. ### MultiSignalModel ready made model for multiple signal processes -Combine already contains a model **`HiggsAnalysis.CombinedLimit.PhysicsModel:multiSignalModel`** that can be used to assign different signal strengths to multiple processes in a datacard, configurable from the command line. +Combine already contains a model **`HiggsAnalysis.CombinedLimit.PhysicsModel:multiSignalModel`** that can be used to assign different signal strengths to multiple processes in a datacard, configurable from the command line. -The model is configured passing to text2workspace one or more mappings in the form **`--PO 'map=bin/process:parameter'`** +The model is configured by passing one or more mappings in the form **`--PO 'map=bin/process:parameter'`** to text2workspace: -- **`bin`** and **`process`** can be arbitrary regular expressions matching the bin names and process names in the datacard +- **`bin`** and **`process`** can be arbitrary regular expressions matching the bin names and process names in the datacard. Note that mappings are applied both to signals and to background processes; if a line matches multiple mappings, precedence is given to the last one in the order they are in the command line. - it is suggested to put quotes around the argument of **`--PO`** so that the shell does not try to expand any **`*`** signs in the patterns. -- **`parameter`** is the POI to use to scale that process (`name[starting_value,min,max]` the first time a parameter is defined, then just `name` if used more than once) - Special values are **`1`** and **`0==; ==0`** means to drop the process completely from the card, while **`1`** means to keep the yield as is in the card with no scaling (as normally done for backgrounds); **`1`** is the default that is applied to processes that have no mappings, so it's normally not needed, but it may be used either to make the thing explicit, or to override a previous more generic match on the same command line (e.g. `--PO 'map=.*/ggH:r[1,0,5]' --PO 'map=bin37/ggH:1'` would treat ggH as signal in general, but count it as background in the channel `bin37`) + It is suggested to put quotes around the argument of **`--PO`** so that the shell does not try to expand any **`*`** signs in the patterns. +- **`parameter`** is the POI to use to scale that process (`name[starting_value,min,max]` the first time a parameter is defined, then just `name` if used more than once). + Special values are **`1`** and **`0==; ==0`** means "drop the process completely from the model", while **`1`** means to "keep the yield as is in the card with no scaling" (as normally done for backgrounds); **`1`** is the default that is applied to processes that have no mappings. Therefore it is normally not needed, but it may be used to override a previous more generic match in the same command line (e.g. `--PO 'map=.*/ggH:r[1,0,5]' --PO 'map=bin37/ggH:1'` would treat ggH as signal in general, but count it as background in the channel `bin37`). -Passing the additional option **`--PO verbose`** will set the code to verbose mode, printing out the scaling factors for each process; people are encouraged to use this option to make sure that the processes are being scaled correctly. +Passing the additional option **`--PO verbose`** will set the code to verbose mode, printing out the scaling factors for each process; we encourage the use this option to make sure that the processes are being scaled correctly. -The MultiSignalModel will define all parameters as parameters of interest, but that can be then changed from the command line of combine, as described in the following sub-section. +The MultiSignalModel will define all parameters as parameters of interest, but that can be then changed from the command line, as described in the following subsection. Some examples, taking as reference the toy datacard [test/multiDim/toy-hgg-125.txt](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/test/multiDim/toy-hgg-125.txt): -- Scale both `ggH` and `qqH` with the same signal strength `r` (that's what the default physics model of combine does for all signals; if they all have the same systematic uncertainties, it is also equivalent to adding up their yields and writing them as a single column in the card) +- Scale both `ggH` and `qqH` with the same signal strength `r` (that is what the default physics model of Combine does for all signals; if they all have the same systematic uncertainties, it is also equivalent to adding up their yields and writing them as a single column in the card) ```nohighlight $ text2workspace.py -P HiggsAnalysis.CombinedLimit.PhysicsModel:multiSignalModel --PO verbose --PO 'map=.*/ggH:r[1,0,10]' --PO 'map=.*/qqH:r' toy-hgg-125.txt -o toy-1d.root @@ -197,7 +197,7 @@ Some examples, taking as reference the toy datacard [test/multiDim/toy-hgg-125.t ### Two Hypothesis testing -The `PhysicsModel` that encodes the signal model above is the [twoHypothesisHiggs](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/python/HiggsJPC.py), which assumes that there will exist signal processes with suffix **_ALT** in the datacard. An example of such a datacard can be found under [data/benchmarks/simple-counting/twoSignals-3bin-bigBSyst.txt](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/data/benchmarks/simple-counting/twoSignals-3bin-bigBSyst.txt) +The `PhysicsModel` that encodes the signal model above is the [twoHypothesisHiggs](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/python/HiggsJPC.py), which assumes signal processes with suffix **_ALT** will exist in the datacard. An example of such a datacard can be found under [data/benchmarks/simple-counting/twoSignals-3bin-bigBSyst.txt](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/data/benchmarks/simple-counting/twoSignals-3bin-bigBSyst.txt) ```nohighlight $ text2workspace.py twoSignals-3bin-bigBSyst.txt -P HiggsAnalysis.CombinedLimit.HiggsJPC:twoHypothesisHiggs -m 125.7 --PO verbose -o jcp_hww.root @@ -211,11 +211,11 @@ The `PhysicsModel` that encodes the signal model above is the [twoHypothesisHigg Process S_ALT will get norm x ``` -The two processes (S and S_ALT) will get different scaling parameters. The LEP-style likelihood for hypothesis testing can now be performed by setting **x** or **not_x** to 1 and 0 and comparing two likelihood evaluations. +The two processes (S and S_ALT) will get different scaling parameters. The LEP-style likelihood for hypothesis testing can now be used by setting **x** or **not_x** to 1 and 0 and comparing the two likelihood evaluations. ### Signal-background interference -Since there are no such things as negative probability distribution functions, the recommended way to implement this is to start from the expression for the individual amplitudes $A$ and the parameter of interest $k$, +Since negative probability distribution functions do not exist, the recommended way to implement this is to start from the expression for the individual amplitudes $A$ and the parameter of interest $k$, $$ \mathrm{Yield} = |k * A_{s} + A_{b}|^2 @@ -330,7 +330,7 @@ is helpful for extracting the lower triangle of a square matrix. You could pick any nominal template, and adjust the scaling as appropriate. Generally it is advisable to use a nominal template corresponding to near where you expect the -POIs to land so that the shape systematic effects are well-modeled in that +best-fit values of the POIs to be so that the shape systematic effects are well-modeled in that region. It may be the case that the relative contributions of the terms are themselves diff --git a/docs/part2/settinguptheanalysis.md b/docs/part2/settinguptheanalysis.md index 48cc5a46d64..7a695f23e91 100644 --- a/docs/part2/settinguptheanalysis.md +++ b/docs/part2/settinguptheanalysis.md @@ -1,41 +1,41 @@ # Preparing the datacard -The input to combine, which defines the details of the experiment, is a datacard file is a plain ASCII file. This is true whether the experiment is a simple counting experiment or a shape analysis. +The input to Combine, which defines the details of the analysis, is a plain ASCII file we will refer to as datacard. This is true whether the analysis is a simple counting experiment or a shape analysis. ## A simple counting experiment The file [data/tutorials/counting/realistic-counting-experiment.txt](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/data/tutorials/counting/realistic-counting-experiment.txt) shows an example of a counting experiment. -The first lines can be used as a description and are not parsed by the program. They have to begin with a "#": +The first lines can be used to add some descriptive information. Those lines must start with a "#", and they are not parsed by Combine: ```nohighlight # Simple counting experiment, with one signal and a few background processes # Simplified version of the 35/pb H->WW analysis for mH = 160 GeV ``` -Then one declares the **number of observables**, **`imax`**, that are present in the model used to calculate limits/significances. The number of observables will typically be the number of channels in a counting experiment or the number of bins in a binned shape fit. (If one specifies for **`imax`** the value **`*`** it means "figure it out from the rest of the datacard", but in order to better catch mistakes it's recommended to specify it explicitly) +Following this, one declares the **number of observables**, **`imax`**, that are present in the model used to set limits / extract confidence intervals. The number of observables will typically be the number of channels in a counting experiment. The value **`*`** can be specified for **`imax`**, which tells Combine to determine the number of observables from the rest of the datacard. In order to better catch mistakes, it is recommended to explicitly specify the value. ```nohighlight imax 1 number of channels ``` -Then one declares the number of background sources to be considered, **`jmax`**, and the number of **independent sources of systematic uncertainties**, **`kmax`**: +This declaration is followed by a specification of the number of background sources to be considered, **`jmax`**, and the number of **independent sources of systematic uncertainty**, **`kmax`**: ```nohighlight jmax 3 number of backgrounds -kmax 5 number of nuisance parameters (sources of systematic uncertainties) +kmax 5 number of nuisance parameters (sources of systematic uncertainty) ``` In the example there is 1 channel, there are 3 background sources, and there are 5 independent sources of systematic uncertainty. -Then there are the lines describing what is actually observed: the number of events observed in each channel. The first line, starting with **`bin`** defines the label used for each channel. In the example we have 1 channel, labelled **`1`**, and in the following line, **`observation`**, are listed the events observed, **`0`** in this example: +After providing this information, the following lines describe what is observed in data: the number of events observed in each channel. The first line, starting with **`bin`**, defines the label used for each channel. In the example we have 1 channel, labelled **`1`**, and in the following line, **`observation`**, the number of observed events is given: **`0`** in this example. ```nohighlight # we have just one channel, in which we observe 0 events bin bin1 observation 0 ``` -Following is the part related to the number of events expected, for each bin and process, arranged in (#channels)*(#processes) columns. +This is followed by information related to the expected number of events, for each bin and process, arranged in (#channels)*(#processes) columns. ```nohighlight bin bin1 bin1 bin1 bin1 @@ -44,14 +44,14 @@ process 0 1 2 3 rate 1.47 0.63 0.06 0.22 ``` -- The **`bin`** line identifies the channel the column is referring to. It goes from **`1`** to the **`imax`** declared above. -- The first **`process`** line contains the labels of the various sources -- The second **`process`** line must have a positive number for backgrounds, and **`0`** or a negative number for the signals. You should use different process ids for different processes. -- The last line, **`rate`**, tells the expected yield of events in the specified bin and process +- The **`bin`** line identifies the channel that the column refers to. It ranges from **`1`** to the value of **`imax`** declared above. +- The first **`process`** line contains the names of the various process sources +- The second **`process`** line is a numerical process identifier. Backgrounds are given a positive number, while **`0`** and negative numbers are used for signal processes. Different process identifiers must be used for different processes. +- The last line, **`rate`**, gives the expected number of events for the given process in the specified bin -All bins should be declared in increasing order, and within each bin one should include all processes in increasing order, specifying a **0** for processes that do not contribute. +If a process does not contribute in a given bin, it can be removed from the datacard, or the rate can be set to **0**. -The last section contains the description of the systematic uncertainties: +The final section of the datacard describes the systematic uncertainties: ```nohighlight lumi lnN 1.11 - 1.11 - lumi affects both signal and gg->WW (mc-driven). lnN = lognormal @@ -61,68 +61,68 @@ xs_ggWW lnN - - 1.50 - 50% uncertainty on gg->WW cross section bg_others lnN - - - 1.30 30% uncertainty on the rest of the backgrounds ``` -- the first columns is a label identifying the uncertainty -- the second column identifies the type of distribution used +- The first column is the name of the nuisance parameter, a label that is used to identify the uncertainty +- The second column identifies the type of distribution used to describe the nuisance parameter - **`lnN`** stands for [Log-normal](http://en.wikipedia.org/wiki/Log-normal_distribution), which is the recommended choice for multiplicative corrections (efficiencies, cross sections, ...). - If **Δx/x** is the relative uncertainty on the multiplicative correction, one should put **1+Δx/x** in the column corresponding to the process and channel. Asymmetric log-normals are instead supported by providing κdownup where κdown is the ratio of the the yield to the nominal value for a -1σ deviation of the nuisance and κup is the ratio of thyield to the nominal value for $+1\sigma$ deviation. Note that for single-value log-normal with value $\kappa=1+\Delta x/x$, the yield of the process it is associated with is multiplied by $\kappa^{\theta}$. At $\theta=0$ the nominal yield is retained, at $\theta=1\sigma$ the yield is multiplied by $\kappa$ and at $\theta=-1\sigma$ the yield is multiplied by $1/\kappa$. This means that an uncertainty represented as 1.2 does not multiply the nominal yield by 0.8 for $\theta=-1\sigma$; but by 0.8333. For large uncertainties that have a symmetric effect on the yield it may therefore be desirable to encode them as asymmetric log-normals instead. - - **`gmN`** stands for [Gamma](http://en.wikipedia.org/wiki/Gamma_distribution), and is the recommended choice for the statistical uncertainty on a background coming from the number of events in a control region (or in a MC sample with limited statistics). - If the control region or MC contains **N** events, and the extrapolation factor from the control region to the signal region is **α** then one shoud put **N** just after the **`gmN`** keyword, and then the value of **α** in the proper column. Also, the yield in the **`rate`** row should match with **Nα** - - **`lnU`** stands for log-uniform distribution. A value of **1+ε** in the column will imply that the yield of this background is allowed to float freely between **x(1+ε)** and **x/(1+ε)** (in particular, if ε is small, then this is approximately **(x-Δx,x+Δx)** with **ε=Δx/x** ) - This is normally useful when you want to set a large a-priori uncertainty on a given background and then rely on the correlation between channels to constrain it. Beware that while Gaussian-like uncertainties behave in a similar way under profiling and marginalization, uniform uncertainties do not, so the impact of the uncertainty on the result will depend on how the nuisances are treated. -- then there are (#channels)*(#processes) columns reporting the relative effect of the systematic uncertainty on the rate of each process in each channel. The columns are aligned with the ones in the previous lines declaring bins, processes and rates. + If **Δx/x** is the relative uncertainty in the multiplicative correction, one should put **1+Δx/x** in the column corresponding to the process and channel. Asymmetric log-normals are instead supported by providing κdownup where κdown is the ratio of the the yield to the nominal value for a -1σ deviation of the nuisance parameter and κup is the ratio of the yield to the nominal value for a $+1\sigma$ deviation. Note that for a single-value log-normal with value $\kappa=1+\Delta x/x$, the yield of the process it is associated with is multiplied by $\kappa^{\theta}$. At $\theta=0$ the nominal yield is retained, at $\theta=1\sigma$ the yield is multiplied by $\kappa$ and at $\theta=-1\sigma$ the yield is multiplied by $1/\kappa$. This means that an uncertainty represented as 1.2 does not multiply the nominal yield by 0.8 for $\theta=-1\sigma$; but by 0.8333. It may therefore be desirable to encode large uncertainties that have a symmetric effect on the yield as asymmetric log-normals instead. + - **`gmN`** stands for [Gamma](http://en.wikipedia.org/wiki/Gamma_distribution), and is the recommended choice for the statistical uncertainty in a background determined from the number of events in a control region (or in an MC sample with limited sample size). + If the control region or simulated sample contains **N** events, and the extrapolation factor from the control region to the signal region is **α**, one shoud put **N** just after the **`gmN`** keyword, and then the value of **α** in the relevant (bin,process) column. The yield specified in the **`rate`** line for this (bin,process) combination should equal **Nα**. + - **`lnU`** stands for log-uniform distribution. A value of **1+ε** in the column will imply that the yield of this background is allowed to float freely between **x(1+ε)** and **x/(1+ε)**. In particular, if ε is small, this is approximately **(x-Δx,x+Δx)** with **ε=Δx/x**. + This distribution is typically useful when you want to set a large a-priori uncertainty on a given background process, and then rely on the correlation between channels to constrain it. Note that for this use case, we usually recommend using [a `rateParam`](#rate-parameters) instead. If you do use **`lnU`**, please be aware that while Gaussian-like uncertainties behave in a similar way under profiling and marginalization, uniform uncertainties do not. This means the impact of the uncertainty on the result will depend on how the nuisance parameters are treated. +- The next (#channels)*(#processes) columns indicate the relative effect of the systematic uncertainty on the rate of each process in each channel. The columns are aligned with those in the previous lines declaring bins, processes, and rates. In the example, there are 5 uncertainties: -- the first uncertainty affects the signal by 11%, and affects the **`ggWW`** process by 11% -- the second uncertainty affects the signal by 16% leaving the backgrounds unaffected -- the third line specifies that the **`qqWW`** background comes from a sideband with 4 observed events and an extrapolation factor of 0.16; the resulting uncertainty on the expected yield is $1/\sqrt{4+1}$ = 45% -- the fourth uncertainty does not affect the signal, affects the **`ggWW`** background by 50%, leaving the other backgrounds unaffected -- the last uncertainty does not affect the signal, affects by 30% the **`others`** backgrounds, leaving the rest of the backgrounds unaffected +- The first uncertainty has an 11% effect on the signal and on the **`ggWW`** process. +- The second uncertainty affects the signal by 16%, but leaves the background processes unaffected +- The third line specifies that the **`qqWW`** background comes from a sideband with 4 observed events and an extrapolation factor of 0.16; the resulting uncertainty in the expected yield is $1/\sqrt{4+1}$ = 45% +- The fourth uncertainty does not affect the signal, has a 50% effect on the **`ggWW`** background, and leaves the other backgrounds unaffected +- The fifth uncertainty does not affect the signal, has a 30% effect on the **`others`** background process, and does not affect the remaining backgrounds. -## Shape analysis +## Shape analyses The datacard has to be supplemented with two extensions: - * A new block of lines defining how channels and processes are mapped into shapes - * The block for systematics that can contain also rows with shape uncertainties. + * A new block of lines defining how channels and processes are mapped into shapes. + * The block for systematics can now also contain rows with shape uncertainties. -The expected shape can be parametric or not parametric. In the first case the parametric pdfs have to be given as input to the tool. In the latter case, for each channel, histograms have to be provided for the expected shape of each process. For what concerns data, they have to be provided as input to the tool as a histogram to perform a ***binned*** shape analysis and as a RooDataSet to perform an ***unbinned*** shape analysis. +The expected shape can be parametric, or not. In the first case the parametric PDFs have to be given as input to the tool. In the latter case, for each channel, histograms have to be provided for the expected shape of each process. The data have to be provided as input as a histogram to perform a ***binned*** shape analysis, and as a RooDataSet to perform an ***unbinned*** shape analysis. !!! warning - If using RooFit based inputs (RooDataHists/RooDataSets/RooAbsPdfs) then you should be careful to use *different* RooRealVars as the observable in each category being combined. It is possible to use the same RooRealVar if the observable has the same range (and binning if using binned data) in each category though in most cases it is simpler to avoid doing so. + If using RooFit-based inputs (RooDataHists/RooDataSets/RooAbsPdfs) then you need to ensure you are using *different* RooRealVars as the observable in each category entering the statistical analysis. It is possible to use the same RooRealVar if the observable has the same range (and binning if using binned data) in each category, although in most cases it is simpler to avoid doing this. -### Rates for shape analysis +### Rates for shape analyses -As with the counting experiment, the total nominal *rate* of a given process must be identified in the **rate** line of the datacard. However, there are special options for shape based analyses as follows +As with the counting experiment, the total nominal *rate* of a given process must be identified in the **rate** line of the datacard. However, there are special options for shape-based analyses, as follows: - * A value of **-1** in the rate line indicates to combine to calculate the rate from the input TH1 (via TH1::Integral) or RooDataSet/RooDataHist (via RooAbsData::sumEntries) - * For parametric shapes (RooAbsPdf), if a parameter is found in the input workspace with the name pdfname**_norm** the rate will be multiplied by the value of that parameter. Note that since this parameter can be freely floating, the normalization of a shape can be made to freely float this way. This can also be achieved through the use of [`rateParams`](#rate-parameters) + * A value of **-1** in the rate line means Combine will calculate the rate from the input TH1 (via TH1::Integral) or RooDataSet/RooDataHist (via RooAbsData::sumEntries). + * For parametric shapes (RooAbsPdf), if a parameter with the name pdfname**_norm** is found in the input workspace, the rate will be multiplied by the value of that parameter. Note that since this parameter can be freely floating, the normalization of a process can be set freely float this way. This can also be achieved through the use of [`rateParams`](#rate-parameters). -### Binned shape analysis +### Binned shape analyses For each channel, histograms have to be provided for the observed shape and for the expected shape of each process. - Within each channel, all histograms must have the same binning. -- The normalization of the data histogram must correspond to the number of observed events -- The normalization of the expected histograms must match the expected yields +- The normalization of the data histogram must correspond to the number of observed events. +- The normalization of the expected histograms must match the expected event yields. -The combine tool can take as input histograms saved as TH1, as RooAbsHist in a RooFit workspace (an example of how to create a RooFit workspace and save histograms is available in [github](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/data/benchmarks/shapes/make_simple_shapes.cxx)), or from a pandas dataframe ([example](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/data/tutorials/shapes/simple-shapes-df.txt)) +The Combine tool can take as input histograms saved as TH1, as RooAbsHist in a RooFit workspace (an example of how to create a RooFit workspace and save histograms is available in [github](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/data/benchmarks/shapes/make_simple_shapes.cxx)), or from a pandas dataframe ([example](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/data/tutorials/shapes/simple-shapes-df.txt)). -The block of lines defining the mapping (first block in the datacard) contains one or more rows in the form +The block of lines defining the mapping (first block in the datacard) contains one or more rows of the form - **shapes *process* *channel* *file* *histogram* *[histogram_with_systematics]* ** -In this line +In this line, -- ***process*** is any one the process names, or **\*** for all processes, or **data_obs** for the observed data -- ***channel*** is any one the process names, or **\*** for all channels -- *file*, *histogram* and *histogram_with_systematics* identify the names of the files and of the histograms within the file, after doing some replacements (if any are found): - - **$PROCESS** is replaced with the process name (or "**data_obs**" for the observed data) - - **$CHANNEL** is replaced with the channel name - - **$SYSTEMATIC** is replaced with the name of the systematic + (**Up, Down**) - - **$MASS** is replaced with the higgs mass value which is passed as option in the command line used to run the limit tool +- ***process*** is any one the process names, or **\*** for all processes, or **data_obs** for the observed data; +- ***channel*** is any one the process names, or **\*** for all channels; +- *file*, *histogram* and *histogram_with_systematics* identify the names of the files and of the histograms within the file, after making some replacements (if any are found): + - **$PROCESS** is replaced with the process name (or "**data_obs**" for the observed data); + - **$CHANNEL** is replaced with the channel name; + - **$SYSTEMATIC** is replaced with the name of the systematic + (**Up, Down**); + - **$MASS** is replaced with the chosen (Higgs boson) mass value that is passed as a command-line option when running the tool -In addition, user defined keywords can be included to be replaced. Any word in the datacard **$WORD** will be replaced by **VALUE** when including the option `--keyword-value WORD=VALUE`. The option can be repeated multiple times for multiple keywords. +In addition, user-defined keywords can be used. Any word in the datacard **$WORD** will be replaced by **VALUE** when including the option `--keyword-value WORD=VALUE`. This option can be repeated multiple times for multiple keywords. #### Template shape uncertainties @@ -130,27 +130,27 @@ Shape uncertainties can be taken into account by vertical interpolation of the h $$ f(\theta) = \frac{1}{2} \left( (\delta^{+}-\delta^{-})\theta + \frac{1}{8}(\delta^{+}+\delta^{-})(3\theta^6 - 10\theta^4 + 15\theta^2) \right) $$ -and for $|\theta|> 1$ ($|\theta|<-1$), $f(\theta)$ is a straight line with gradient $\delta^{+}$ ($\delta^{-}$), where $\delta^{+}=f(\theta=1)-f(\theta=0)$, and $\delta^{-}=f(\theta=-1)-f(\theta=0)$, derived using the nominal and up/down histograms. and +and for $|\theta|> 1$ ($|\theta|<-1$), $f(\theta)$ is a straight line with gradient $\delta^{+}$ ($\delta^{-}$), where $\delta^{+}=f(\theta=1)-f(\theta=0)$, and $\delta^{-}=f(\theta=-1)-f(\theta=0)$, derived using the nominal and up/down histograms. This interpolation is designed so that the values of $f(\theta)$ and its derivatives are continuous for all values of $\theta$. -The normalizations are interpolated linearly in log scale just like we do for log-normal uncertainties. If the value in a given bin is negative for some value of $\theta$, the value will be truncated at 0. +The normalizations are interpolated linearly in log scale, just like we do for log-normal uncertainties. If the value in a given bin is negative for some value of $\theta$, the value will be truncated at 0. -For each shape uncertainty and process/channel affected by it, two additional input shapes have to be provided, obtained shifting that parameter up and down by one standard deviation. When building the likelihood, each shape uncertainty is associated to a nuisance parameter taken from a unit gaussian distribution, which is used to interpolate or extrapolate using the specified histograms. +For each shape uncertainty and process/channel affected by it, two additional input shapes have to be provided. These are obtained by shifting the parameter up and down by one standard deviation. When building the likelihood, each shape uncertainty is associated to a nuisance parameter taken from a unit gaussian distribution, which is used to interpolate or extrapolate using the specified histograms. -For each given source of shape uncertainty, in the part of the datacard containing shape uncertainties (last block), there must be a row +For each given shape uncertainty, the part of the datacard describing shape uncertainties must contain a row - ** *name* *shape* *effect_for_each_process_and_channel* ** -The effect can be "-" or 0 for no effect, 1 for normal effect, and possibly something different from 1 to test larger or smaller effects (in that case, the unit gaussian is scaled by that factor before using it as parameter for the interpolation) +The effect can be "-" or 0 for no effect, 1 for the normal effect, and something different from 1 to test larger or smaller effects (in that case, the unit gaussian is scaled by that factor before using it as parameter for the interpolation). -The datacard in [data/tutorials/shapes/simple-shapes-TH1.txt](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/data/tutorials/shapes/simple-shapes-TH1.txt) is a clear example of how to include shapes in the datacard. In the first block the following line specifies the shape mapping: +The datacard in [data/tutorials/shapes/simple-shapes-TH1.txt](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/data/tutorials/shapes/simple-shapes-TH1.txt) provides an example of how to include shapes in the datacard. In the first block the following line specifies the shape mapping: ```nohighlight shapes * * simple-shapes-TH1.root $PROCESS $PROCESS_$SYSTEMATIC ``` -The last block concerns the treatment of the systematics affecting shapes. In this part the two uncertainties effecting on the shape are listed. +The last block concerns the treatment of the systematic uncertainties that affect shapes. In this case there are two uncertainties with a shape-altering effect. ```nohighlight alpha shape - 1 uncertainty on background shape and normalization @@ -158,13 +158,13 @@ sigma shape 0.5 - uncertainty on signal resolution. Assume the his # so divide the unit gaussian by 2 before doing the interpolation ``` -There are two options for the interpolation algorithm in the "shape" uncertainty. Putting **`shape`** will result in a of the **fraction of events in each bin** - i.e the histograms are first normalised before interpolation. Putting **`shapeN`** while instead base the interpolation on the logs of the fraction in each bin. For _both_ **`shape`** and **`shapeN`**, the total normalisation is interpolated using an asymmetric log-normal so that the effect of the systematic on both the shape and normalisation are accounted for. The following image shows a comparison of those two algorithms for this datacard. +There are two options for the interpolation algorithm in the "shape" uncertainty. Putting **`shape`** will result in an interpolation of the **fraction of events in each bin**. That is, the histograms are first normalized before interpolation. Putting **`shapeN`** while instead base the interpolation on the logs of the fraction in each bin. For _both_ **`shape`** and **`shapeN`**, the total normalization is interpolated using an asymmetric log-normal, so that the effect of the systematic on both the shape and normalization are accounted for. The following image shows a comparison of the two algorithms for the example datacard. ![](images/compare-shape-algo.png) -In this case there are two processes, *signal* and *background*, and two uncertainties affecting background (*alpha*) and signal shape (*sigma*). Within the root file 2 histograms per systematic have to be provided, they are the shape obtained, for the specific process, shifting up and down the parameter associated to the uncertainty: `background_alphaUp` and `background_alphaDown`, `signal_sigmaUp` and `signal_sigmaDown`. +In this case there are two processes, *signal* and *background*, and two uncertainties affecting the background (*alpha*) and signal shapes (*sigma*). In the ROOT file, two histograms per systematic have to be provided, they are the shapes obtained, for the specific process, by shifting the parameter associated with the uncertainty up and down by a standard deviation: `background_alphaUp` and `background_alphaDown`, `signal_sigmaUp` and `signal_sigmaDown`. -This is the content of the root file [simple-shapes-TH1.root ](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/data/benchmarks/shapes/simple-shapes-TH1.root) associated to the datacard [data/tutorials/shapes/simple-shapes-TH1.txt](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/data/benchmarks/shapes/simple-shapes-TH1.txt): +The content of the ROOT file [simple-shapes-TH1.root ](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/data/benchmarks/shapes/simple-shapes-TH1.root) associated with the datacard [data/tutorials/shapes/simple-shapes-TH1.txt](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/data/benchmarks/shapes/simple-shapes-TH1.txt) is: ```nohighlight root [0] @@ -182,9 +182,9 @@ TFile** simple-shapes-TH1.root KEY: TH1F data_sig;1 Histogram of data_sig__x ``` -For example, without shape uncertainties you could have just one row with +For example, without shape uncertainties there would only be one row with `shapes * * shapes.root $CHANNEL/$PROCESS` -Then for a simple example for two channels "e", "mu" with three processes "higgs", "zz", "top" you should create a rootfile that contains the following +Then, to give a simple example for two channels ("e", "mu") with three processes ()"higgs", "zz", "top"), the ROOT file contents should look like: | histogram | meaning | |:--------------|:---------------------------------------------| @@ -197,35 +197,35 @@ Then for a simple example for two channels "e", "mu" with three processes "higgs | `mu/zz` | expected shape for ZZ in muon channel | | `mu/top` | expected shape for top in muon channel | -If you also have one uncertainty that affects the shape, e.g. jet energy scale, you should create shape histograms for the jet energy scale shifted up by one sigma, you could for example do one folder for each process and write a like like +If there is also an uncertainty that affects the shape, e.g. the jet energy scale, shape histograms for the jet energy scale shifted up and down by one sigma need to be included. This could be done by creating a folder for each process and writing a line like `shapes * * shapes.root $CHANNEL/$PROCESS/nominal $CHANNEL/$PROCESS/$SYSTEMATIC` -or just attach a postifx to the name of the histogram +or a postifx can be added to the histogram name: `shapes * * shapes.root $CHANNEL/$PROCESS $CHANNEL/$PROCESS_$SYSTEMATIC` !!! warning - If you have a nuisance parameter which has shape effects (using `shape`) *and* rate effects (using `lnN`) you should use a single line for the systemstic uncertainty with `shape?`. This will tell combine to fist look for Up/Down systematic templates for that process and if it doesnt find them, it will interpret the number that you put for the process as a `lnN` instead. + If you have a nuisance parameter that has shape effects on some processes (using `shape`) *and* rate effects on other processes (using `lnN`) you should use a single line for the systematic uncertainty with `shape?`. This will tell Combine to fist look for Up/Down systematic templates for that process and if it doesnt find them, it will interpret the number that you put for the process as a `lnN` instead. -For a detailed example of a template based binned analysis see the [H→ττ 2014 DAS tutorial](https://twiki.cern.ch/twiki/bin/viewauth/CMS/SWGuideCMSDataAnalysisSchool2014HiggsCombPropertiesExercise#A_shape_analysis_using_templates) +For a detailed example of a template-based binned analysis, see the [H→ττ 2014 DAS tutorial](https://twiki.cern.ch/twiki/bin/viewauth/CMS/SWGuideCMSDataAnalysisSchool2014HiggsCombPropertiesExercise#A_shape_analysis_using_templates) -### Unbinned or parametric shape analysis +### Unbinned or parametric shape analyses -In some cases, it can be convenient to describe the expected signal and background shapes in terms of analytical functions rather than templates; a typical example are the searches where the signal is apparent as a narrow peak over a smooth continuum background. In this context, uncertainties affecting the shapes of the signal and backgrounds can be implemented naturally as uncertainties on the parameters of those analytical functions. It is also possible to adapt an agnostic approach in which the parameters of the background model are left freely floating in the fit to the data, i.e. only requiring the background to be well described by a smooth function. +In some cases, it can be convenient to describe the expected signal and background shapes in terms of analytical functions, rather than templates. Typical examples are searches/measurements where the signal is apparent as a narrow peak over a smooth continuum background. In this context, uncertainties affecting the shapes of the signal and backgrounds can be implemented naturally as uncertainties in the parameters of those analytical functions. It is also possible to adopt an agnostic approach in which the parameters of the background model are left freely floating in the fit to the data, i.e. only requiring the background to be well described by a smooth function. -Technically, this is implemented by means of the RooFit package, that allows writing generic probability density functions, and saving them into ROOT files. The pdfs can be either taken from RooFit's standard library of functions (e.g. Gaussians, polynomials, ...) or hand-coded in C++, and combined together to form even more complex shapes. +Technically, this is implemented by means of the RooFit package, which allows writing generic probability density functions, and saving them into ROOT files. The PDFs can be either taken from RooFit's standard library of functions (e.g. Gaussians, polynomials, ...) or hand-coded in C++, and combined together to form even more complex shapes. -In the datacard using templates, the column after the file name would have been the name of the histogram. For the parametric analysis we need two names to identify the mapping, separated by a colon (**`:`**). +In the datacard using templates, the column after the file name would have been the name of the histogram. For parametric analysis we need two names to identify the mapping, separated by a colon (**`:`**). **shapes process channel shapes.root *workspace_name:pdf_name*** -The first part identifies the name of the input [RooWorkspace](http://root.cern.ch/root/htmldoc/RooWorkspace.html) containing the pdf, and the second part the name of the [RooAbsPdf](http://root.cern.ch/root/htmldoc/RooAbsPdf.html) inside it (or, for the observed data, the [RooAbsData](http://root.cern.ch/root/htmldoc/RooAbsData.html)). There can be multiple input workspaces, just as there can be multiple input root files. You can use any of the usual RooFit pre-defined pdfs for your signal and background models. +The first part identifies the name of the input [RooWorkspace](http://root.cern.ch/root/htmldoc/RooWorkspace.html) containing the PDF, and the second part the name of the [RooAbsPdf](http://root.cern.ch/root/htmldoc/RooAbsPdf.html) inside it (or, for the observed data, the [RooAbsData](http://root.cern.ch/root/htmldoc/RooAbsData.html)). It is possible to have multiple input workspaces, just as there can be multiple input ROOT files. You can use any of the usual RooFit pre-defined PDFs for your signal and background models. !!! warning - If you are using RooAddPdfs in your model in which the coefficients are *not defined recursively*, combine will not interpret them properly. You can add the option `--X-rtd ADDNLL_RECURSIVE=0` to any combine command in order to recover the correct interpretation, however we recommend that you instead redefine your pdf so that the coefficients are recursive (as described on the [RooAddPdf documentation](https://root.cern.ch/doc/master/classRooAddPdf.html)) and keep the total normalisation (i.e extended term) as a separate object as in the case of the tutorial datacard. + If in your model you are using RooAddPdfs, in which the coefficients are *not defined recursively*, Combine will not interpret them correctly. You can add the option `--X-rtd ADDNLL_RECURSIVE=0` to any Combine command in order to recover the correct interpretation, however we recommend that you instead re-define your PDF so that the coefficients are recursive (as described in the [RooAddPdf documentation](https://root.cern.ch/doc/master/classRooAddPdf.html)) and keep the total normalization (i.e the extended term) as a separate object, as in the case of the tutorial datacard. -For example, take a look at the [data/tutorials/shapes/simple-shapes-parametric.txt](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/data/tutorials/shapes/simple-shapes-parametric.txt). We see the following line. +For example, take a look at the [data/tutorials/shapes/simple-shapes-parametric.txt](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/data/tutorials/shapes/simple-shapes-parametric.txt). We see the following line: ```nohighlight shapes * * simple-shapes-parametric_input.root w:$PROCESS @@ -234,7 +234,7 @@ bin 1 1 process sig bkg ``` -which indicates that the input file `simple-shapes-parametric_input.root` should contain an input workspace (`w`) with pdfs named `sig` and `bkg` since these are the names of the two processes in the datacard. Additionally, we expect there to be a dataset named `data_obs`. If we look at the contents of the workspace inside `data/tutorials/shapes/simple-shapes-parametric_input.root`, this is indeed what we see... +which indicates that the input file `simple-shapes-parametric_input.root` should contain an input workspace (`w`) with PDFs named `sig` and `bkg`, since these are the names of the two processes in the datacard. Additionally, we expect there to be a data set named `data_obs`. If we look at the contents of the workspace in `data/tutorials/shapes/simple-shapes-parametric_input.root`, this is indeed what we see: ```nohighlight root [1] w->Print() @@ -256,17 +256,17 @@ RooDataSet::data_obs(j) ``` -In this datacard, the signal is parameterised in terms of the hypothesised mass (`MH`). Combine will use this variable, instead of creating its own, which will be interpreted as the value for `-m`. For this reason, we should add the option `-m 30` (or something else within the observable range) when running combine. You will also see there is a variable named `bkg_norm`. This is used to normalize the background rate (see the section on [Rate parameters](#rate-parameters) below for details). +In this datacard, the signal is parameterized in terms of the hypothesized mass (`MH`). Combine will use this variable, instead of creating its own, which will be interpreted as the value for `-m`. For this reason, we should add the option `-m 30` (or something else within the observable range) when running Combine. You will also see there is a variable named `bkg_norm`. This is used to normalize the background rate (see the section on [Rate parameters](#rate-parameters) below for details). !!! warning - Combine will not accept RooExtendedPdfs as an input. This is to alleviate a bug that lead to improper treatment of normalization when using multiple RooExtendedPdfs to describe a single process. You should instead use RooAbsPdfs and provide the rate as a separate object (see the [Rate parameters](#rate-parameters) section). + Combine will not accept RooExtendedPdfs as input. This is to alleviate a bug that lead to improper treatment of the normalization when using multiple RooExtendedPdfs to describe a single process. You should instead use RooAbsPdfs and provide the rate as a separate object (see the [Rate parameters](#rate-parameters) section). The part of the datacard related to the systematics can include lines with the syntax - **name *param* X Y** -These lines encode uncertainties on the parameters of the signal and background pdfs. The parameter is to be assigned a Gaussian uncertainty of **Y** around its mean value of **X**. One can change the mean value from 0 to 1 (or really any value, if one so chooses) if the parameter in question is multiplicative instead of additive. +These lines encode uncertainties in the parameters of the signal and background PDFs. The parameter is to be assigned a Gaussian uncertainty of **Y** around its mean value of **X**. One can change the mean value from 0 to 1 (or any value, if one so chooses) if the parameter in question is multiplicative instead of additive. In the [data/tutorials/shapes/simple-shapes-parametric.txt](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/data/tutorials/shapes/simple-shapes-parametric.txt) datacard, there are lines for one such parametric uncertainty, @@ -274,36 +274,36 @@ In the [data/tutorials/shapes/simple-shapes-parametric.txt](https://github.com/c sigma param 1.0 0.1 ``` -meaning there is a parameter already contained in the input workspace called **`sigma`** which should be *constrained* with a Gaussian centered at 1.0 with a width of 0.1. Note that, the exact interpretation (i.e all combine knows is that 1.0 should be the most likely value and 0.1 is its 1σ uncertainy) of these parameters is left to the user since the signal pdf is constructed externally by you. Asymmetric uncertainties are written as with `lnN` using the syntax **-1σ/+1σ** in the datacard. +meaning there is a parameter in the input workspace called **`sigma`**, that should be *constrained* with a Gaussian centered at 1.0 with a width of 0.1. Note that the exact interpretation of these parameters is left to the user since the signal PDF is constructed externally by you. All Combine knows is that 1.0 should be the most likely value and 0.1 is its 1σ uncertainy. Asymmetric uncertainties are written using the syntax **-1σ/+1σ** in the datacard, as is the case for `lnN` uncertainties. -If one wants to specify a parameter that is freely floating across its given range, and not gaussian constrained, the following syntax is used: +If one wants to specify a parameter that is freely floating across its given range, and not Gaussian constrained, the following syntax is used: - **name *flatParam* ** -Though this is *not strictly necessary* in frequentist methods using profiled likelihoods as combine will still profile these nuisances when performing fits (as is the case for the `simple-shapes-parametric.txt` datacard). +Though this is *not strictly necessary* in frequentist methods using profiled likelihoods, as Combine will still profile these nuisances when performing fits (as is the case for the `simple-shapes-parametric.txt` datacard). !!! warning - All parameters which are floating or constant in the user's input workspaces will remain floating or constant. Combine will ***not*** modify those for you! + All parameters that are floating or constant in the user's input workspaces will remain floating or constant. Combine will ***not*** modify those for you! -A full example of a parametric analysis can be found in this [H→γγ 2014 DAS tutorial](https://twiki.cern.ch/twiki/bin/viewauth/CMS/SWGuideCMSDataAnalysisSchool2014HiggsCombPropertiesExercise#A_parametric_shape_analysis_H) +A full example of a parametric analysis can be found in this [H→γγ 2014 DAS tutorial](https://twiki.cern.ch/twiki/bin/viewauth/CMS/SWGuideCMSDataAnalysisSchool2014HiggsCombPropertiesExercise#A_parametric_shape_analysis_H). -#### Caveat on using parametric pdfs with binned datasets +#### Caveat on using parametric PDFs with binned datasets -Users should be aware of a feature that affects the use of parametric pdfs together with binned datasets. +Users should be aware of a feature that affects the use of parametric PDFs together with binned datasets. -RooFit uses the integral of the pdf, computed analytically (or numerically, but disregarding the binning), to normalize it, but then computes the expected event yield in each bin evaluating only the pdf at the bin center. This means that if the variation of the pdf is sizeable within the bin then there is a mismatch between the sum of the event yields per bin and the pdf normalization, and that can cause a bias in the fits (more properly, the bias is there if the contribution of the second derivative integrated on the bin size is not negligible, since for linear functions evaluating them at the bin center is correct). There are two reccomended ways to work around this ... +RooFit uses the integral of the PDF, computed analytically (or numerically, but disregarding the binning), to normalize it, but computes the expected event yield in each bin by evaluating the PDF at the bin center. This means that if the variation of the pdf is sizeable within the bin, there is a mismatch between the sum of the event yields per bin and the PDF normalization, which can cause a bias in the fits. More specifically, the bias is present if the contribution of the second derivative integrated in the bin size is not negligible. For linear functions, an evaluation at the bin center is correct. There are two recommended ways to work around this issue: **1. Use narrow bins** -It is recommended to use bins that are significantly finer than the characteristic scale of the pdfs - which would anyway be the recommended thing even in the absence of this feature. Obviously, this caveat does not apply to analyses using templates (they're constant across each bin, so there's no bias), or using unbinned datasets. +It is recommended to use bins that are significantly finer than the characteristic scale of the PDFs. Even in the absence of this feature, this would be advisable. Note that this caveat does not apply to analyses using templates (they are constant across each bin, so there is no bias), or using unbinned datasets. **2. Use a RooParametricShapeBinPdf** -Another solution (currently implemented for 1-dimensional histograms only) is to use a custom pdf which performs the correct integrals internally as in [RooParametricShapeBinPdf](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/src/RooParametricShapeBinPdf.cc) +Another solution (currently only implemented for 1-dimensional histograms) is to use a custom PDF that performs the correct integrals internally, as in [RooParametricShapeBinPdf](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/src/RooParametricShapeBinPdf.cc). -Note that this pdf class now allows parameters that are themselves **RooAbsReal** objects (i.e. functions of other variables). The integrals are handled internally by calling the underlying pdf’s `createIntegral()` method with named ranges created for each of the bins. This means that if the analytical integrals for the underlying pdf are available, they will be used. +Note that this PDF class now allows parameters that are themselves **RooAbsReal** objects (i.e. functions of other variables). The integrals are handled internally by calling the underlying PDF's `createIntegral()` method with named ranges created for each of the bins. This means that if the analytical integrals for the underlying PDF are available, they will be used. -The constructor for this class requires a **RooAbsReal** (eg any **RooAbsPdf**)along with a list of **RooRealVars** (the parameters, excluding the observable $x$), +The constructor for this class requires a **RooAbsReal** (eg any **RooAbsPdf**) along with a list of **RooRealVars** (the parameters, excluding the observable $x$), ```c++ RooParametricShapeBinPdf(const char *name, const char *title, RooAbsReal& _pdf, RooAbsReal& _x, RooArgList& _pars, const TH1 &_shape ) @@ -314,15 +314,15 @@ Below is a comparison of a fit to a binned dataset containing 1000 events with o ![Narrow bins](images/narrow.png) ![Wide bins](images/wide.png) -In the upper plot, the data are binned in 100 evenly spaced bins, while in the lower plot, there are 3 irregular bins. The blue lines show the result of the fit -when using the **RooExponential** directly while the red shows the result when wrapping the pdf inside a **RooParametricShapeBinPdf**. In the narrow binned case, the two -agree well while for wide bins, accounting for the integral over the bin yields a better fit. +In the upper plot, the data are binned in 100 evenly-spaced bins, while in the lower plot, there are three irregular bins. The blue lines show the result of the fit +when using the **RooExponential** directly, while the red lines show the result when wrapping the PDF inside a **RooParametricShapeBinPdf**. In the narrow binned case, the two +agree well, while for wide bins, accounting for the integral over the bin yields a better fit. -You should note that using this class will result in slower fits so you should first decide if the added accuracy is enough to justify the reduced efficiency. +You should note that using this class will result in slower fits, so you should first decide whether the added accuracy is enough to justify the reduced efficiency. ## Beyond simple datacards -Datacards can be extended in order to provide additional functionality and flexibility during runtime. These can also allow for the production of more complicated models and performing advanced computation of results beyond limits and significances. +Datacards can be extended in order to provide additional functionality and flexibility during runtime. These can also allow for the production of more complicated models and for producing more advanced results. ### Rate parameters @@ -332,25 +332,25 @@ The overall rate "expected" of a particular process in a particular bin does not name rateParam bin process initial_value [min,max] ``` -The `[min,max]` argument is optional and if not included, combine will remove the range of this parameter. This will produce a new parameter in the model (unless it already exists) which multiplies the rate of that particular **process** in the given **bin** by its value. +The `[min,max]` argument is optional. If it is not included, Combine will remove the range of this parameter. This will produce a new parameter, which multiplies the rate of that particular **process** in the given **bin** by its value, in the model (unless it already exists). -You can attach the same `rateParam` to multiple processes/bins by either using a wild card (eg `*` will match everything, `QCD_*` will match everything starting with `QCD_` etc.) in the name of the bin and/or process or by repeating the `rateParam` line in the datacard for different bins/processes with the same name. +You can attach the same `rateParam` to multiple processes/bins by either using a wild card (eg `*` will match everything, `QCD_*` will match everything starting with `QCD_`, etc.) in the name of the bin and/or process, or by repeating the `rateParam` line in the datacard for different bins/processes with the same name. !!! warning - `rateParam` is not a shortcut to evaluate the post-fit yield of a process since **other nuisances can also change the normalisation**. E.g., finding that the `rateParam` best-fit value is 0.9 does not necessarily imply that the process yield is 0.9 times the initial one. The best is to evaluate the yield taking into account the values of all nuisance parameters using [`--saveNormalizations`](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part3/nonstandard/#normalizations). + `rateParam` is not a shortcut to evaluate the post-fit yield of a process since **other nuisance parameters can also change the normalization**. E.g., finding that the `rateParam` best-fit value is 0.9 does not necessarily imply that the process yield is 0.9 times the initial yield. The best is to evaluate the yield taking into account the values of all nuisance parameters using [`--saveNormalizations`](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part3/nonstandard/#normalizations). -This parameter is by default, freely floating. It is possible to include a Gaussian constraint on any `rateParam` which is floating (i.e not a `formula` or spline) by adding a `param` nuisance line in the datacard with the same name. +This parameter is, by default, freely floating. It is possible to include a Gaussian constraint on any `rateParam` that is floating (i.e not a `formula` or spline) by adding a `param` nuisance line in the datacard with the same name. -In addition to rate modifiers which are freely floating, modifiers which are functions of other parameters can be included using the following syntax, +In addition to rate modifiers that are freely floating, modifiers that are functions of other parameters can be included using the following syntax, ```nohighlight name rateParam bin process formula args ``` -where `args` is a comma separated list of the arguments for the string `formula`. You can include other nuisance parameters in the `formula`, including ones which are Gaussian constrained (i,e via the `param` directive.) +where `args` is a comma-separated list of the arguments for the string `formula`. You can include other nuisance parameters in the `formula`, including ones that are Gaussian constrained (i,e via the `param` directive.) -Below is an example datacard which uses the `rateParam` directive to implement an ABCD like method in combine. For a more realistic description of it's use for ABCD, see the single-lepton SUSY search implementation described [here](http://cms.cern.ch/iCMS/jsp/openfile.jsp?tp=draft&files=AN2015_207_v5.pdf) +Below is an example datacard that uses the `rateParam` directive to implement an ABCD-like method in Combine. For a more realistic description of its use for ABCD, see the single-lepton SUSY search implementation described [here](http://cms.cern.ch/iCMS/jsp/openfile.jsp?tp=draft&files=AN2015_207_v5.pdf). ```nohighlight imax 4 number of channels @@ -372,20 +372,20 @@ gamma rateParam C bkg 100 delta rateParam D bkg 500 ``` -For more examples of using `rateParam` (eg for fitting process normalisations in control regions and signal regions simultaneously) see this [2016 CMS tutorial](https://indico.cern.ch/event/577649/contributions/2339440/attachments/1380196/2097805/beyond_simple_datacards.pdf) +For more examples of using `rateParam` (eg for fitting process normalizations in control regions and signal regions simultaneously) see this [2016 CMS tutorial](https://indico.cern.ch/event/577649/contributions/2339440/attachments/1380196/2097805/beyond_simple_datacards.pdf) -Finally, any pre-existing RooAbsReal inside some rootfile with a workspace can be imported using the following +Finally, any pre-existing RooAbsReal inside some ROOT file with a workspace can be imported using the following: ```nohighlight name rateParam bin process rootfile:workspacename ``` -The name should correspond to the name of the object which is being picked up inside the RooWorkspace. A simple example using the SM XS and BR splines available in HiggsAnalysis/CombinedLimit can be found under [data/tutorials/rate_params/simple_sm_datacard.txt](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/data/tutorials/rate_params/simple_sm_datacard.txt) +The name should correspond to the name of the object that is being picked up inside the RooWorkspace. A simple example using the SM XS and BR splines available in HiggsAnalysis/CombinedLimit can be found under [data/tutorials/rate_params/simple_sm_datacard.txt](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/data/tutorials/rate_params/simple_sm_datacard.txt) ### Extra arguments -If a parameter is intended to be used and it is *not* a user defined `param` or `rateParam`, it can be picked up by first issuing an `extArgs` directive before this line in the datacard. The syntax for `extArgs` is +If a parameter is intended to be used, and it is *not* a user-defined `param` or `rateParam`, it can be picked up by first issuing an `extArgs` directive before this line in the datacard. The syntax for `extArgs` is: ```nohighlight name extArg rootfile:workspacename @@ -401,69 +401,69 @@ Note that the `[min,max]` argument is optional and if not included, the code wil ### Manipulation of Nuisance parameters -It can often be useful to modify datacards, or the runtime behavior, without having to modify individual systematics lines. This can be acheived through the following. +It can often be useful to modify datacards, or the runtime behavior, without having to modify individual systematic lines. This can be achieved through nuisance parameter modifiers. #### Nuisance modifiers -If a nuisance parameter needs to be renamed for certain processes/channels, it can be done so using a single `nuisance edit` directive at the end of a datacard +If a nuisance parameter needs to be renamed for certain processes/channels, it can be done using a single `nuisance edit` directive at the end of a datacard ```nohighlight nuisance edit rename process channel oldname newname [options] ``` -Note that the wildcard (**\***) can be used for either/both of process and channel. -This will have the effect that nuisance parameter effecting a given process/channel will be renamed, thereby de-correlating it from other processes/channels. Use options `ifexists` to skip/avoid error if nuisance not found. -This kind of command will only effect nuisances of the type **`shape[N]`**, **`lnN`**. Instead, if you also want to change the names of **`param`** type nuisances, you can use a global version +Note that the wildcard (**\***) can be used for either a process, a channel, or both. +This will have the effect that nuisance parameters affecting a given process/channel will be renamed, thereby de-correlating between processes/channels. Use the option `ifexists` to skip/avoid an error if the nuisance paremeter is not found. +This kind of command will only affect nuisances of the type **`shape[N]`**, **`lnN`**. Instead, if you also want to change the names of **`param`** type nuisances, you can use a global version ```nohighlight nuisance edit rename oldname newname ``` which will rename all **`shape[N]`**, **`lnN`** and **`param`** nuisances found in one go. You should make sure these commands come after any process/channel specific ones in the datacard. This version does not accept options. -Other edits are also supported as follows, +Other edits are also supported, as follows: - * `nuisance edit add process channel name pdf value [options]` -> add a new or add to a nuisance. - * `nuisance edit drop process channel name [options]` -> remove this nuisance from the process/channel. Use options `ifexists` to skip/avoid error if nuisance not found. - * `nuisance edit changepdf name newpdf` -> change the pdf type of a given nuisance to `newpdf`. - * `nuisance edit split process channel oldname newname1 newname2 value1 value2` -> split a nuisance line into two separate nuisances called `newname1` and `newname2` with values `value1` and `value2`. Will produce two separate lines to that the original nuisance `oldname` becomes two uncorrelated nuisances. - * `nuisance edit freeze name [options]` -> set nuisance to frozen by default. Can be over-ridden in `combine` command line using `--floatNuisances` option Use options `ifexists` to skip/avoid error if nuisance not found. - * `nuisance edit merge process channel name1 name2` -> merge systematic `name2` into `name1` by adding their values in quadrature and removing `name2`. This only works if, for each process and channel included, they go in the same direction. For example, you can add 1.1 to 1.2, but not to 0.9. + * `nuisance edit add process channel name pdf value [options]` -> add a new nuisance parameter to a process + * `nuisance edit drop process channel name [options]` -> remove this nuisance from the process/channel. Use the option `ifexists` to skip/avoid errors if the nuisance parameter is not found. + * `nuisance edit changepdf name newpdf` -> change the PDF type of a given nuisance parameter to `newpdf`. + * `nuisance edit split process channel oldname newname1 newname2 value1 value2` -> split a nuisance parameter line into two separate nuisance parameters called `newname1` and `newname2` with values `value1` and `value2`. This will produce two separate lines so that the original nuisance parameter `oldname` is split into two uncorrelated nuisances. + * `nuisance edit freeze name [options]` -> set nuisance parameter frozen by default. Can be overridden on the command line using the `--floatNuisances` option. Use the option `ifexists` to skip/avoid errors if the nuisance parameter not found. + * `nuisance edit merge process channel name1 name2` -> merge systematic `name2` into `name1` by adding their values in quadrature and removing `name2`. This only works if, for each process and channel included, the uncertainties both increase or both reduce the process yield. For example, you can add 1.1 to 1.2, but not to 0.9. -The above edits (excluding the renaming) support nuisances which are any of **`shape[N]`**, **`lnN`**, **`lnU`**, **`gmN`**, **`param`**, **`flatParam`**, **`rateParam`** or **`discrete`** types. +The above edits (excluding the renaming) support nuisance parameters of the types **`shape[N]`**, **`lnN`**, **`lnU`**, **`gmN`**, **`param`**, **`flatParam`**, **`rateParam`**, or **`discrete`**. #### Groups of nuisances -Often it is desirable to freeze one or more nuisances to check the impact they have on limits, likelihood scans, significances etc. +Often it is desirable to freeze one or more nuisance parameters to check the impact they have on limits, likelihood scans, significances etc. -However, for large groups of nuisances (eg everything associated to theory) it is easier to define ***nuisance groups*** in the datacard. The following line in a datacard will, for example, produce a group of nuisances with the group name -`theory` which contains two parameters, `QCDscale` and `pdf`. +However, for large groups of nuisance parameters (eg everything associated to theory) it is easier to define ***nuisance groups*** in the datacard. The following line in a datacard will, for example, produce a group of nuisance parameters with the group name +`theory` that contains two parameters, `QCDscale` and `pdf`. ```nohighlight theory group = QCDscale pdf ``` -Multiple groups can be defined in this way. It is also possible to extend nuisance groups in datacards using **+=** in place of **=**. +Multiple groups can be defined in this way. It is also possible to extend nuisance parameters groups in datacards using **+=** in place of **=**. -These groups can be manipulated at runtime (eg for freezing all nuisances associated to a group at runtime, see [Running the tool](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part3/runningthetool/)). You can find more info on groups of nuisances [here](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/tree/81x-root606/data/tutorials/groups) +These groups can be manipulated at runtime (eg for freezing all nuisance parameterss associated to a group at runtime, see [Running the tool](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part3/runningthetool/)). You can find more info on groups of nuisances [here](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/tree/81x-root606/data/tutorials/groups) -Note that when using the automatic addition of statistical uncertainties (autoMCStats), the corresponding nuisance parameters are created by `text2workspace.py` and so do not exist in the datacards. It is therefore not possible to add autoMCStats parameters to groups of nuisances in the way described above. However, `text2workspace.py` will automatically create a group labelled **`autoMCStats`** which contains all autoMCStats parameters. +Note that when using the automatic addition of statistical uncertainties (autoMCStats), the corresponding nuisance parameters are created by `text2workspace.py` and so do not exist in the datacards. It is therefore not possible to add autoMCStats parameters to groups of nuisances in the way described above. However, `text2workspace.py` will automatically create a group labelled **`autoMCStats`**, which contains all autoMCStats parameters. -This group is useful for freezing all parameters created by autoMCStats. For freezing subsets of the parameters, for example if the datacard contains two categories, **cat_label_1** and **cat_label_2**, to only freeze the autoMCStat parameters created for category **cat_label_1** the regular expression features can be used. In this example this can be achieved by using `--freezeParameters 'rgx{prop_bincat_label_1_bin.*}'`. +This group is useful for freezing all parameters created by autoMCStats. For freezing subsets of the parameters, for example if the datacard contains two categories, **cat_label_1** and **cat_label_2**, to only freeze the autoMCStat parameters created for category **cat_label_1**, the regular expression features can be used. In this example this can be achieved by using `--freezeParameters 'rgx{prop_bincat_label_1_bin.*}'`. ### Combination of multiple datacards -If you have separate channels each with it's own datacard, it is possible to produce a combined datacard using the script **`combineCards.py`** +If you have separate channels, each with their own datacard, it is possible to produce a combined datacard using the script **`combineCards.py`** The syntax is simple: **`combineCards.py Name1=card1.txt Name2=card2.txt .... > card.txt`** -If the input datacards had just one bin each, then the output channels will be called `Name1`, `Name2`, and so on. Otherwise, a prefix `Name1_` ... `Name2_` will be added to the bin labels in each datacard. The supplied bin names `Name1`, `Name2`, etc. must themselves conform to valid C++/python identifier syntax. +If the input datacards had just one bin each, the output channels will be called `Name1`, `Name2`, and so on. Otherwise, a prefix `Name1_` ... `Name2_` will be added to the bin labels in each datacard. The supplied bin names `Name1`, `Name2`, etc. must themselves conform to valid C++/python identifier syntax. !!! warning - When combining datacards, you should pay attention that systematics which have different names will be assumed to be uncorrelated, and the ones with the same name will be assumed 100% correlated. A systematic correlated across channels must have the same p.d.f. in all cards (i.e. always **`lnN`**, or all **`gmN`** with same `N`). Furthermore, when using *parametric models*, "parameter" objects such as `RooRealVar`, `RooAbsReal`, and `RooAbsCategory` (parameters, pdf indices etc) with the same name will be assumed to be the same object. If this is not intended, you may find unintended behaviour such as the order of combining cards having an impact on the results! Make sure that such objects are named differently in your inputs if they represent different things! Instead, Combine will try to rename other "shape" objects (such as pdfs) automatically. + When combining datacards, you should keep in mind that systematic uncertainties that have different names will be assumed to be uncorrelated, and those with the same name will be assumed 100% correlated. An uncertainty correlated across channels must have the same PDF. in all cards (i.e. always **`lnN`**, or all **`gmN`** with same `N`. Note that `shape` and `lnN` can be interchanged via the `shape?` directive). Furthermore, when using *parametric models*, "parameter" objects such as `RooRealVar`, `RooAbsReal`, and `RooAbsCategory` (parameters, PDF indices etc) with the same name will be assumed to be the same object. If this is not intended, you may encounter unexpected behaviour, such as the order of combining cards having an impact on the results. Make sure that such objects are named differently in your inputs if they represent different things! Instead, Combine will try to rename other "shape" objects (such as PDFs) automatically. -The `combineCards.py` script will complain if you are trying to combine a *shape* datacard with a *counting* datacard. You can however convert a *counting* datacard in an equivalent shape-based one by adding a line `shapes * * FAKE` in the datacard after the `imax`, `jmax` and `kmax` section. Alternatively, you can add the option `-S` in `combineCards.py` which will do this for you while making the combination. +The `combineCards.py` script will fail if you are trying to combine a *shape* datacard with a *counting* datacard. You can however convert a *counting* datacard into an equivalent shape-based one by adding a line `shapes * * FAKE` in the datacard after the `imax`, `jmax`, and `kmax` section. Alternatively, you can add the option `-S` to `combineCards.py`, which will do this for you while creating the combined datacard. ### Automatic production of datacards and workspaces -For complicated analyses or cases in which multiple datacards are needed (e.g. optimisation studies), you can avoid writing these by hand. The object [Datacard](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/python/Datacard.py) defines the analysis and can be created as a python object. The template python script below will produce the same workspace as running `textToWorkspace.py` (see the section on [Physics Models](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part2/physicsmodels/)) on the [realistic-counting-experiment.txt](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/data/tutorials/counting/realistic-counting-experiment.txt) datacard. +For complicated analyses or cases in which multiple datacards are needed (e.g. optimization studies), you can avoid writing these by hand. The object [Datacard](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/python/Datacard.py) defines the analysis and can be created as a python object. The template python script below will produce the same workspace as running `textToWorkspace.py` (see the section on [Physics Models](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part2/physicsmodels/)) on the [realistic-counting-experiment.txt](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/data/tutorials/counting/realistic-counting-experiment.txt) datacard. ```python from HiggsAnalysis.CombinedLimit.DatacardParser import * @@ -522,26 +522,26 @@ MB.setPhysics(defaultModel) MB.doModel() ``` -Any existing datacard can be converted into such a template python script by using the `--dump-datacard` option in `text2workspace.py` in case a more complicated template is needed. +Any existing datacard can be converted into such a template python script by using the `--dump-datacard` option in `text2workspace.py`, in case a more complicated template is needed. !!! warning - The above is **not advised** for final results as this script is not easily combined with other analyses so should only be used for internal studies. + The above is **not advised** for final results, as this script is not easily combined with other analyses so should only be used for internal studies. -For the automatic generation of datacards (which are combinable), you should instead use the [CombineHarvester](http://cms-analysis.github.io/CombineHarvester/) package which includes many features for producing complex datacards in a reliable, automated way. +For the automatic generation of datacards that **are** combinable, you should instead use the [CombineHarvester](http://cms-analysis.github.io/CombineHarvester/) package, which includes many features for producing complex datacards in a reliable, automated way. ## Sanity checking the datacard -For large combinations with multiple channels/processes etc, the `.txt` file can get unweildy to read through. There are some simple tools to help check and disseminate the contents of the cards. +For large combinations with multiple channels/processes etc, the `.txt` file can get unwieldy to read through. There are some simple tools to help check and disseminate the contents of the cards. -In order to get a quick view of the systematic uncertainties included in the datacard, you can use the `test/systematicsAnalyzer.py` tool. This will produce a list of the systematic uncertainties (normalisation and shape), indicating what type they are, which channels/processes they affect and the size of the affect on the normalisation (for shape uncertainties, this will just be the overall uncertaintly on the normalisation information). +In order to get a quick view of the systematic uncertainties included in the datacard, you can use the `test/systematicsAnalyzer.py` tool. This will produce a list of the systematic uncertainties (normalization and shape), indicating what type they are, which channels/processes they affect and the size of the effect on the normalization (for shape uncertainties, this will just be the overall uncertainty on the normalization). -The default output is a `.html` file which allows you to expand to give more details about the affect of the systematic for each channel/process. Add the option `--format brief` to give a simpler summary report direct to the terminal. An example output for the tutorial card `data/tutorials/shapes/simple-shapes-TH1.txt` is shown below. +The default output is a `.html` file that can be expanded to give more details about the effect of the systematic uncertainty for each channel/process. Add the option `--format brief` to obtain a simpler summary report direct to the terminal. An example output for the tutorial card `data/tutorials/shapes/simple-shapes-TH1.txt` is shown below. ```nohighlight $ python test/systematicsAnalyzer.py data/tutorials/shapes/simple-shapes-TH1.txt --all -f html > out.html ``` -which will produce the following output in html format. +This will produce the following output in html format: @@ -616,9 +616,9 @@ function toggleChann(id) { -In case you only have a cut-and-count style card, include the option `--noshape`. +In case you only have a counting experiment datacard, include the option `--noshape`. -If you have a datacard which uses several `rateParams` or a Physics model which includes some complicated product of normalisation terms in each process, you can check the values of the normalisation (and which objects in the workspace comprise them) using the `test/printWorkspaceNormalisations.py` tool. As an example, below is the first few blocks of output for the tutorial card `data/tutorials/counting/realistic-multi-channel.txt`. +If you have a datacard that uses several `rateParams` or a Physics model that includes a complicated product of normalization terms in each process, you can check the values of the normalization (and which objects in the workspace comprise them) using the `test/printWorkspaceNormalisations.py` tool. As an example, the first few blocks of output for the tutorial card `data/tutorials/counting/realistic-multi-channel.txt` are given below: /// details | **Show example output**
    
    @@ -690,7 +690,7 @@ Dumping ProcessNormalization n_exp_bine_mu_proc_ZTT @ 0x6bc8910
     ///
     
     
    -As you can see, for each channel, a report is given for the top-level rate object in the workspace, for each process contributing to that channel. You can also see the various terms which make up that rate. The default value is for the default parameters in the workspace (i.e when running `text2workspace`, these are the values created as default).
    +As you can see, for each channel, a report is given for the top-level rate object in the workspace, for each process contributing to that channel. You can also see the various terms that make up that rate. The default value is for the default parameters in the workspace (i.e when running `text2workspace`, these are the values created as default).
     
     Another example is shown below for the workspace produced from the [data/tutorials/shapes/simple-shapes-parametric.txt](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/data/tutorials/shapes/simple-shapes-parametric.txt) datacard.
     
    @@ -728,5 +728,5 @@ Another example is shown below for the workspace produced from the [data/tutoria
     
    /// -This tells us that the normalisation for the background process, named `n_exp_final_binbin1_proc_bkg` is a product of two objects `n_exp_binbin1_proc_bkg * shapeBkg_bkg_bin1__norm`. The first object is just from the **rate** line in the datacard (equal to 1) and the second is a floating parameter. For the signal, the normalisation is called `n_exp_binbin1_proc_sig` and is a `ProcessNormalization` object which contains the rate modifications due to the systematic uncertainties. You can see that it also has a "*nominal value*" which again is just from the value given in the **rate** line of the datacard (again=1). +This tells us that the normalization for the background process, named `n_exp_final_binbin1_proc_bkg` is a product of two objects `n_exp_binbin1_proc_bkg * shapeBkg_bkg_bin1__norm`. The first object is just from the **rate** line in the datacard (equal to 1) and the second is a floating parameter. For the signal, the normalisation is called `n_exp_binbin1_proc_sig` and is a `ProcessNormalization` object that contains the rate modifications due to the systematic uncertainties. You can see that it also has a "*nominal value*", which again is just from the value given in the **rate** line of the datacard (again=1). diff --git a/docs/part3/commonstatsmethods.md b/docs/part3/commonstatsmethods.md index 059b2f4bc87..e1087812115 100644 --- a/docs/part3/commonstatsmethods.md +++ b/docs/part3/commonstatsmethods.md @@ -1,27 +1,27 @@ # Common Statistical Methods -In this section, the most commonly used statistical methods from combine will be covered including specific instructions on how to obtain limits, significances and likelihood scans. For all of these methods, the assumed parameters of interest (POI) is the overall signal strength **r** (i.e the default PhysicsModel). In general however, the first POI in the list of POIs (as defined by the PhysicsModel) will be taken instead of **r** which may or may not make sense for a given method ... use your judgment! +In this section, the most commonly used statistical methods from Combine will be covered, including specific instructions on how to obtain limits, significances, and likelihood scans. For all of these methods, the assumed parameter of interest (POI) is the overall signal strength **r** (i.e the default PhysicsModel). In general however, the first POI in the list of POIs (as defined by the PhysicsModel) will be taken instead of **r**. This may or may not make sense for any particular method, so care must be taken. -This section will assume that you are using the default model unless otherwise specified. +This section will assume that you are using the default physics model, unless otherwise specified. ## Asymptotic Frequentist Limits -The `AsymptoticLimits` method allows to compute quickly an estimate of the observed and expected limits, which is fairly accurate when the event yields are not too small and the systematic uncertainties don't play a major role in the result. -The limit calculation relies on an asymptotic approximation of the distributions of the **LHC** test-statistic, which is based on a profile likelihood ratio, under signal and background hypotheses to compute two p-values $p_{\mu}, p_{b}$ and therefore $CL_s=p_{\mu}/(1-p_{b})$ (see the (see the [FAQ](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part4/usefullinks/#faq) section for a description of these) - i.e it is the asymptotic approximation of computing limits with frequentist toys using the LHC test-statistic for limits: +The `AsymptoticLimits` method can be used to quickly compute an estimate of the observed and expected limits, which is accurate when the event yields are not too small and the systematic uncertainties do not play a major role in the result. +The limit calculation relies on an asymptotic approximation of the distributions of the **LHC** test statistic, which is based on a profile likelihood ratio, under the signal and background hypotheses to compute two p-values $p_{\mu}, p_{b}$ and therefore $CL_s=p_{\mu}/(1-p_{b})$ (see the [FAQ](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part4/usefullinks/#faq) section for a description). This means it is the asymptotic approximation for evaluating limits with frequentist toys using the LHC test statistic for limits. - * The test statistic is defined using the ratio of likelihoods $q_{r} = -2\ln[\mathcal{L}(\mathrm{data}|r,\hat{\theta}_{r})/\mathcal{L}(\mathrm{data}|r=\hat{r},\hat{\theta})]$ , in which the nuisance parameters are profiled separately for $r=\hat{r}$ and $r$. The value of $q_{r}$ set to 0 when $\hat{r}>r$ giving a one sided limit. Furthermore, the constraint $r>0$ is enforced in the fit. This means that if the unconstrained value of $\hat{r}$ would be negative, the test statistic $q_{r}$ is evaluated as $-2\ln[\mathcal{L}(\mathrm{data}|r,\hat{\theta}_{r})/\mathcal{L}(\mathrm{data}|r=0,\hat{\theta}_{0})]$ + * The test statistic is defined using the ratio of likelihoods $q_{r} = -2\ln[\mathcal{L}(\mathrm{data}|r,\hat{\theta}_{r})/\mathcal{L}(\mathrm{data}|r=\hat{r},\hat{\theta})]$ , in which the nuisance parameters are profiled separately for $r=\hat{r}$ and $r$. The value of $q_{r}$ is set to 0 when $\hat{r}>r$, giving a one-sided limit. Furthermore, the constraint $r>0$ is enforced in the fit. This means that if the unconstrained value of $\hat{r}$ would be negative, the test statistic $q_{r}$ is evaluated as $-2\ln[\mathcal{L}(\mathrm{data}|r,\hat{\theta}_{r})/\mathcal{L}(\mathrm{data}|r=0,\hat{\theta}_{0})]$ -This method is so commonly used that it is the default method (i.e not specifying `-M` will run `AsymptoticLimits`) +This method is the default Combine method: if you call Combine without specifying `-M`, the `AsymptoticLimits` method will be run. -A realistic example of datacard for a counting experiment can be found in the HiggsCombination package: [data/tutorials/counting/realistic-counting-experiment.txt](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/data/tutorials/counting/realistic-counting-experiment.txt) +A realistic example of a datacard for a counting experiment can be found in the HiggsCombination package: [data/tutorials/counting/realistic-counting-experiment.txt](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/data/tutorials/counting/realistic-counting-experiment.txt) -The method can be run using +The `AsymptoticLimits` method can be run using ```sh combine -M AsymptoticLimits realistic-counting-experiment.txt ``` -The program will print out the limit on the signal strength r (number of signal events / number of expected signal events) e .g. `Observed Limit: r < 1.6297 @ 95% CL` , the median expected limit `Expected 50.0%: r < 2.3111` and edges of the 68% and 95% ranges for the expected limits. +The program will print the limit on the signal strength r (number of signal events / number of expected signal events) e .g. `Observed Limit: r < 1.6297 @ 95% CL` , the median expected limit `Expected 50.0%: r < 2.3111`, and edges of the 68% and 95% ranges for the expected limits. ```nohighlight <<< Combine >>> @@ -43,13 +43,13 @@ By default, the limits are calculated using the CLs prescription, as !!! warning - You may find that combine issues a warning that the best fit for the background-only Asimov dataset returns a non-zero value for the signal strength for example; + You may find that Combine issues a warning that the best fit for the background-only Asimov dataset returns a nonzero value for the signal strength; `WARNING: Best fit of asimov dataset is at r = 0.220944 (0.011047 times` `rMax), while it should be at zero` - If this happens, you should check to make sure that there are no issues with the datacard or the Asimov generation used for your setup. For details on debugging it is recommended that you follow the simple checks used by the HIG PAG [here](https://twiki.cern.ch/twiki/bin/view/CMS/HiggsWG/HiggsPAGPreapprovalChecks). + If this happens, you should check to make sure that there are no issues with the datacard or the Asimov generation used for your setup. For details on debugging, it is recommended that you follow the simple checks used by the HIG PAG [here](https://twiki.cern.ch/twiki/bin/view/CMS/HiggsWG/HiggsPAGPreapprovalChecks). -The program will also create a rootfile `higgsCombineTest.AsymptoticLimits.mH120.root` containing a root tree `limit` that contains the limit values and other bookeeping information. The important columns are `limit` (the limit value) and `quantileExpected` (-1 for observed limit, 0.5 for median expected limit, 0.16/0.84 for the edges of the 65% interval band of expected limits, 0.025/0.975 for 95%). +The program will also create a ROOT file `higgsCombineTest.AsymptoticLimits.mH120.root` containing a ROOT tree `limit` that contains the limit values and other bookkeeping information. The important columns are `limit` (the limit value) and `quantileExpected` (-1 for observed limit, 0.5 for median expected limit, 0.16/0.84 for the edges of the 65% interval band of expected limits, 0.025/0.975 for 95%). ```nohighlight $ root -l higgsCombineTest.AsymptoticLimits.mH120.root @@ -68,17 +68,17 @@ root [0] limit->Scan("*") ### Blind limits -The `AsymptoticLimits` calculation follows the frequentist paradigm for calculating expected limits. This means that the routine will first fit the observed data, conditionally for a fixed value of **r** and set the nuisance parameters to the values obtained in the fit for generating the Asimov data, i.e it calculates the **post-fit** or **a-posteriori** expected limit. In order to use the **pre-fit** nuisance parameters (to calculate an **a-priori** limit), you must add the option `--noFitAsimov` or `--bypassFrequentistFit`. +The `AsymptoticLimits` calculation follows the frequentist paradigm for calculating expected limits. This means that the routine will first fit the observed data, conditionally for a fixed value of **r**, and set the nuisance parameters to the values obtained in the fit for generating the Asimov data set. This means it calculates the **post-fit** or **a-posteriori** expected limit. In order to use the **pre-fit** nuisance parameters (to calculate an **a-priori** limit), you must add the option `--noFitAsimov` or `--bypassFrequentistFit`. For blinding the results completely (i.e not using the data) you can include the option `--run blind`. !!! warning - You should *never* use `-t -1` to get blind limits! + While you *can* use `-t -1` to get blind limits, if the correct options are passed, we strongly recommend to use `--run blind`. ### Splitting points -In case your model is particularly complex, you can perform the asymptotic calculation by determining the value of CLs for a set grid of points (in `r`) and merging the results. This is done by using the option `--singlePoint X` for multiple values of X, hadding the output files and reading them back in, +In case your model is particularly complex, you can perform the asymptotic calculation by determining the value of CLs for a set grid of points (in `r`) and merging the results. This is done by using the option `--singlePoint X` for multiple values of X, hadd'ing the output files and reading them back in, ```sh combine -M AsymptoticLimits realistic-counting-experiment.txt --singlePoint 0.1 -n 0.1 @@ -93,14 +93,14 @@ combine -M AsymptoticLimits realistic-counting-experiment.txt --getLimitFromGrid ## Asymptotic Significances -The significance of a result is calculated using a ratio of profiled likelihoods, one in which the signal strength is set to 0 and the other in which it is free to float, i.e the quantity is $-2\ln[\mathcal{L}(\textrm{data}|r=0,\hat{\theta}_{0})/\mathcal{L}(\textrm{data}|r=\hat{r},\hat{\theta})]$, in which the nuisance parameters are profiled separately for $r=\hat{r}$ and $r=0$. +The significance of a result is calculated using a ratio of profiled likelihoods, one in which the signal strength is set to 0 and the other in which it is free to float. The evaluated quantity is $-2\ln[\mathcal{L}(\textrm{data}|r=0,\hat{\theta}_{0})/\mathcal{L}(\textrm{data}|r=\hat{r},\hat{\theta})]$, in which the nuisance parameters are profiled separately for $r=\hat{r}$ and $r=0$. -The distribution of this test-statistic can be determined using Wilke's theorem provided the number of events is large enough (i.e in the *Asymptotic limit*). The significance (or p-value) can therefore be calculated very quickly and uses the `Significance` method. +The distribution of this test statistic can be determined using Wilks' theorem provided the number of events is large enough (i.e in the *Asymptotic limit*). The significance (or p-value) can therefore be calculated very quickly. The `Significance` method can be used for this. -It is also possible to calculate the ratio of likelihoods between the freely floating signal strength to that of a fixed signal strength *other than 0*, by specifying it with the option `--signalForSignificance=X` +It is also possible to calculate the ratio of likelihoods between the freely floating signal strength to that of a fixed signal strength *other than 0*, by specifying it with the option `--signalForSignificance=X`. !!! info - This calculation assumes that the signal strength can only be positive (i.e we are not interested in negative signal strengths). This can be altered by including the option `--uncapped` + This calculation assumes that the signal strength can only be positive (i.e we are not interested in negative signal strengths). This behaviour can be altered by including the option `--uncapped`. ### Compute the observed significance @@ -123,13 +123,13 @@ Done in 0.00 min (cpu), 0.01 min (real) which is not surprising since 0 events were observed in that datacard. -The output root file will contain the significance value in the branch **limit**. To store the p-value instead, include the option `--pval`. These can be converted between one another using the RooFit functions `RooFit::PValueToSignificance` and `RooFit::SignificanceToPValue`. +The output ROOT file will contain the significance value in the branch **limit**. To store the p-value instead, include the option `--pval`. The significance and p-value can be converted between one another using the RooFit functions `RooFit::PValueToSignificance` and `RooFit::SignificanceToPValue`. -You may find it useful to resort to a brute-force fitting algorithm when calculating the significance which scans the nll (repeating fits until a tolerance is reached), bypassing MINOS, which can be activated with the option `bruteForce`. This can be tuned using the options `setBruteForceAlgo`, `setBruteForceTypeAndAlgo` and `setBruteForceTolerance`. +When calculating the significance, you may find it useful to resort to a brute-force fitting algorithm that scans the nll (repeating fits until a certain tolerance is reached), bypassing MINOS, which can be activated with the option `bruteForce`. This can be tuned using the options `setBruteForceAlgo`, `setBruteForceTypeAndAlgo` and `setBruteForceTolerance`. ### Computing the expected significance -The expected significance can be computed from an Asimov dataset of signal+background. There are two options for this +The expected significance can be computed from an Asimov data set of signal+background. There are two options for this: * a-posteriori expected: will depend on the observed dataset. * a-priori expected (the default behavior): does not depend on the observed dataset, and so is a good metric for optimizing an analysis when still blinded. @@ -140,9 +140,9 @@ The **a-priori** expected significance from the Asimov dataset is calculated as combine -M Significance datacard.txt -t -1 --expectSignal=1 ``` -In order to produced the **a-posteriori** expected significance, just generate a post-fit Asimov (i.e add the option `--toysFreq` in the command above). +In order to produce the **a-posteriori** expected significance, just generate a post-fit Asimov data set by adding the option `--toysFreq` in the command above. -The output format is the same as for observed signifiances: the variable **limit** in the tree will be filled with the significance (or with the p-value if you put also the option `--pvalue`) +The output format is the same as for observed significances: the variable **limit** in the tree will be filled with the significance (or with the p-value if you put also the option `--pvalue`) ## Bayesian Limits and Credible regions @@ -151,7 +151,7 @@ Bayesian calculation of limits requires the user to assume a particular prior di ### Computing the observed bayesian limit (for simple models) -The `BayesianSimple` method computes a Bayesian limit performing classical numerical integration; very fast and accurate but only works for simple models (a few channels and nuisance parameters). +The `BayesianSimple` method computes a Bayesian limit performing classical numerical integration. This is very fast and accurate, but only works for simple models (a few channels and nuisance parameters). ```nohighlight combine -M BayesianSimple simple-counting-experiment.txt @@ -162,11 +162,11 @@ Limit: r < 0.672292 @ 95% CL Done in 0.04 min (cpu), 0.05 min (real) ``` -The output tree will contain a single entry corresponding to the observed 95% upper limit. The confidence level can be modified to **100*X%** using `--cl X`. +The output tree will contain a single entry corresponding to the observed 95% confidence level upper limit. The confidence level can be modified to **100*X%** using `--cl X`. ### Computing the observed bayesian limit (for arbitrary models) -The `MarkovChainMC` method computes a Bayesian limit performing a monte-carlo integration. From the statistics point of view it is identical to the `BayesianSimple` method, only the technical implementation is different. The method is slower, but can also handle complex models. For this method, you can increase the accuracy of the result by increasing the number of markov chains at the expense of a longer running time (option `--tries`, default is 10). Let's use the realistic counting experiment datacard to test the method +The `MarkovChainMC` method computes a Bayesian limit performing a Monte Carlo integration. From the statistical point of view it is identical to the `BayesianSimple` method, only the technical implementation is different. The method is slower, but can also handle complex models. For this method you can increase the accuracy of the result by increasing the number of Markov Chains, at the expense of a longer running time (option `--tries`, default is 10). Let's use the realistic counting experiment datacard to test the method. To use the MarkovChainMC method, users need to specify this method in the command line, together with the options they want to use. For instance, to set the number of times the algorithm will run with different random seeds, use option `--tries`: @@ -180,9 +180,9 @@ Average chain acceptance: 0.078118 Done in 0.14 min (cpu), 0.15 min (real) ``` -Again, the resulting limit tree will contain the result. You can also save the chains using the option `--saveChain` which will then also be included in the output file. +Again, the resulting limit tree will contain the result. You can also save the chains using the option `--saveChain`, which will then also be included in the output file. -Exclusion regions can be made from the posterior once an ordering principle is defined to decide how to grow the contour (there's infinite possible regions that contain 68% of the posterior pdf). Below is a simple example script which can be used to plot the posterior distribution from these chains and calculate the *smallest* such region. Note that in this example we are ignoring the burn-in (but you can add it by just editing `for i in range(mychain.numEntries()):` to `for i in range(200,mychain.numEntries()):` eg for a burn-in of 200. +Exclusion regions can be made from the posterior once an ordering principle is defined to decide how to grow the contour (there is an infinite number of possible regions that contain 68% of the posterior pdf). Below is a simple example script that can be used to plot the posterior distribution from these chains and calculate the *smallest* such region. Note that in this example we are ignoring the burn-in. This can be added by e.g. changing `for i in range(mychain.numEntries()):` to `for i in range(200,mychain.numEntries()):` for a burn-in of 200. /// details | **Show example script**
    
    @@ -253,57 +253,57 @@ Running the script on the output file produced for the same datacard (including
     
     	0.950975 % (0.95 %) interval (target)  = 0 < r < 2.2
     
    -along with a plot of the posterior shown below. This is the same as the output from combine but the script can also be used to find lower limits (for example) or credible intervals.
    +along with a plot of the posterior distribution shown below. This is the same as the output from Combine, but the script can also be used to find lower limits (for example) or credible intervals.
     
     ![](images/bayes1D.png)
     
    -An example to make contours when ordering by probability density is in [bayesContours.cxx](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/test/multiDim/bayesContours.cxx), but the implementation is very simplistic, with no clever handling of bin sizes nor any smoothing of statistical fluctuations.
    +An example to make contours when ordering by probability density can be found in [bayesContours.cxx](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/test/multiDim/bayesContours.cxx). Note that the implementation is simplistic, with no clever handling of bin sizes nor smoothing of statistical fluctuations.
     
    -The `MarkovChainMC` algorithm has many configurable parameters, and you're encouraged to experiment with those because the default configuration might not be the best for you (or might not even work for you at all).
    +The `MarkovChainMC` algorithm has many configurable parameters, and you are encouraged to experiment with those. The default configuration might not be the best for your analysis.
     
     #### Iterations, burn-in, tries
     
     Three parameters control how the MCMC integration is performed:
     
    --   the number of **tries** (option `--tries`): the algorithm will run multiple times with different ransom seeds and report as result the truncated mean and rms of the different results. The default value is 10, which should be ok for a quick computation, but for something more accurate you might want to increase this number even up to ~200.
    --   the number of **iterations** (option `-i`) determines how many points are proposed to fill a single Markov Chain. The default value is 10k, and a plausible range is between 5k (for quick checks) and 20-30k for lengthy calculations. Usually beyond 30k you get a better tradeoff in time vs accuracy by increasing the number of chains (option `--tries`)
    --   the number of **burn-in steps** (option `-b`) is the number of points that are removed from the beginning of the chain before using it to compute the limit. The default is 200. If your chain is very long, you might want to try increase this a bit (e.g. to some hundreds). Instead using a burn-on below 50 is likely to result in bias towards earlier stages of the chain before a reasonable convergence.
    +-   the number of **tries** (option `--tries`): the algorithm will run multiple times with different random seeds. The truncated mean and RMS of the different results are reported. The default value is 10, which should be sufficient for a quick computation. For a more accurate result you might want to increase this number up to even ~200.
    +-   the number of **iterations** (option `-i`) determines how many points are proposed to fill a single Markov Chain. The default value is 10k, and a plausible range is between 5k (for quick checks) and 20-30k for lengthy calculations. Beyond 30k, the time vs accuracy can be balanced better by increasing the number of chains (option `--tries`).
    +-   the number of **burn-in steps** (option `-b`) is the number of points that are removed from the beginning of the chain before using it to compute the limit. The default is 200. If the chain is very long, we recommend to increase this value a bit (e.g. to several hundreds). Using a number of burn-in steps below 50 is likely to result in a bias towards earlier stages of the chain before a reasonable convergence.
     
     #### Proposals
     
     The option `--proposal` controls the way new points are proposed to fill in the MC chain.
     
     -   **uniform**: pick points at random. This works well if you have very few nuisance parameters (or none at all), but normally fails if you have many.
    --   **gaus**: Use a product of independent gaussians one for each nuisance parameter; the sigma of the gaussian for each variable is 1/5 of the range of the variable (this can be controlled using the parameter `--propHelperWidthRangeDivisor`). This proposal appears to work well for a reasonable number of nuisances (up to ~15), provided that the range of the nuisance parameters is reasonable - something like ±5σ. This method does **not** work when there are no nuisance parameters.
    --   **ortho** (**default**): This proposal is similar to the multi-gaussian proposal but at every step only a single coordinate of the point is varied, so that the acceptance of the chain is high even for a large number of nuisances (i.e. more than 20).
    --   **fit**: Run a fit and use the uncertainty matrix from HESSE to construct a proposal (or the one from MINOS if the option `--runMinos` is specified). This sometimes work fine, but sometimes gives biased results, so we don't recommend it in general.
    +-   **gaus**: Use a product of independent gaussians, one for each nuisance parameter. The sigma of the gaussian for each variable is 1/5 of the range of the variable. This behaviour can be controlled using the parameter `--propHelperWidthRangeDivisor`. This proposal appears to work well for up to around 15 nuisance parameters, provided that the range of the nuisance parameters is in the range ±5σ. This method does **not** work when there are no nuisance parameters.
    +-   **ortho** (**default**): This proposal is similar to the multi-gaussian proposal. However, at every step only a single coordinate of the point is varied, so that the acceptance of the chain is high even for a large number of nuisance parameters (i.e. more than 20).
    +-   **fit**: Run a fit and use the uncertainty matrix from HESSE to construct a proposal (or the one from MINOS if the option `--runMinos` is specified). This can give biased results, so this method is not recommended in general.
     
    -If you believe there's something going wrong, e.g. if your chain remains stuck after accepting only a few events, the option `--debugProposal` can be used to have a printout of the first *N* proposed points to see what's going on (e.g. if you have some region of the phase space with probability zero, the **gaus** and **fit** proposal can get stuck there forever)
    +If you believe there is something going wrong, e.g. if your chain remains stuck after accepting only a few events, the option `--debugProposal` can be used to obtain a printout of the first *N* proposed points. This can help you understand what is happening; for example if you have a region of the phase space with probability zero, the **gaus** and **fit** proposal can get stuck there forever.
     
     
     ### Computing the expected bayesian limit
     
    -The expected limit is computed by generating many toy mc observations and compute the limit for each of them. This can be done passing the option `-t` . E.g. to run 100 toys with the `BayesianSimple` method, just do
    +The expected limit is computed by generating many toy MC data sets and computing the limit for each of them. This can be done passing the option `-t` . E.g. to run 100 toys with the `BayesianSimple` method, you can run
     
         combine -M BayesianSimple datacard.txt -t 100 
     
    -The program will print out the mean and median limit, and the 68% and 95% quantiles of the distributions of the limits. This time, the output root tree will contain **one entry per toy**.
    +The program will print out the mean and median limit, as well as the 68% and 95% quantiles of the distributions of the limits. This time, the output ROOT tree will contain **one entry per toy**.
     
    -For more heavy methods (eg the `MarkovChainMC`) you'll probably want to split this in multiple jobs. To do this, just run `combine` multiple times specifying a smaller number of toys (can be as low as `1`) each time using a different seed to initialize the random number generator (option `-s` if you set it to -1, the starting seed will be initialized randomly at the beginning of the job), then merge the resulting trees with `hadd` and look at the distribution in the merged file.
    +For more heavy methods (eg the `MarkovChainMC`) you will probably want to split this calculation into multiple jobs. To do this, just run Combine multiple times specifying a smaller number of toys (as low as `1`), using a different seed to initialize the random number generator each time. The option `-s` can be used for this; if you set it to -1, the starting seed will be initialized randomly at the beginning of the job. Finally, you can merge the resulting trees with `hadd` and look at the distribution in the merged file.
     
     ### Multidimensional bayesian credible regions
     
    -The `MarkovChainMC` method allows the user to produce the posterior pdf as a function of (in principle) any number of parameter of interest. In order to do so, you first need to create a workspace with more than one parameter, as explained in the [physics models](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part2/physicsmodels/) section.
    +The `MarkovChainMC` method allows the user to produce the posterior PDF as a function of (in principle) any number of POIs. In order to do so, you first need to create a workspace with more than one parameter, as explained in the [physics models](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part2/physicsmodels/) section.
     
    -For example, lets use the toy datacard [data/tutorials/multiDim/toy-hgg-125.txt](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/data/tutorials/multiDim/toy-hgg-125.txt) (counting experiment which vaguely resembles the H→γγ analysis at 125 GeV) and convert the datacard into a workspace with 2 parameters, ggH and qqH cross sections using `text2workspace`.
    +For example, let us use the toy datacard [data/tutorials/multiDim/toy-hgg-125.txt](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/data/tutorials/multiDim/toy-hgg-125.txt) (counting experiment that vaguely resembles an early H→γγ analysis at 125 GeV) and convert the datacard into a workspace with 2 parameters, the ggH and qqH cross sections, using `text2workspace`.
     
         text2workspace.py data/tutorials/multiDim/toy-hgg-125.txt -P HiggsAnalysis.CombinedLimit.PhysicsModel:floatingXSHiggs --PO modes=ggH,qqH -o workspace.root
     
    -Now we just run one (or more) MCMC chain(s) and save them in the output tree.By default, the nuisance parameters will be marginalized (integrated) over their pdfs. You can ignore the complaints about not being able to compute an upper limit (since for more than 1D, this isn't well defined),
    +Now we just run one (or more) MCMC chain(s) and save them in the output tree. By default, the nuisance parameters will be marginalized (integrated) over their PDFs. You can ignore the complaints about not being able to compute an upper limit (since for more than 1D, this is not well-defined),
     
         combine -M MarkovChainMC workspace.root --tries 1 --saveChain -i 1000000 -m 125 -s 12345 
     
    -The output of the markov chain is again a RooDataSet of weighted events distributed according to the posterior pdf (after you cut out the burn in part), so it can be used to make histograms or other distributions of the posterior pdf. See as an example [bayesPosterior2D.cxx](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/test/multiDim/bayesPosterior2D.cxx).
    +The output of the Markov Chain is again a RooDataSet of weighted events distributed according to the posterior PDF (after you cut out the burn in part), so it can be used to make histograms or other distributions of the posterior PDF. See as an example [bayesPosterior2D.cxx](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/test/multiDim/bayesPosterior2D.cxx).
     
     Below is an example of the output of the macro,
     
    @@ -317,15 +317,15 @@ bayesPosterior2D("bayes2D","Posterior PDF")
     
     ## Computing Limits with toys
     
    -The `HybridNew` method is used to compute either the hybrid bayesian-frequentist limits popularly known as "CLs of LEP or Tevatron type" or the fully frequentist limits which are the current recommended method by the LHC Higgs Combination Group. Note that these methods can be resource intensive for complex models.
    +The `HybridNew` method is used to compute either the hybrid bayesian-frequentist limits, popularly known as "CLs of LEP or Tevatron type", or the fully frequentist limits, which are the current recommended method by the LHC Higgs Combination Group. Note that these methods can be resource intensive for complex models.
     
    -It is possible to define the criterion used for setting limits using `--rule CLs` (to use the CLs criterion) or `--rule CLsplusb` (to calculate the limit using $p_{\mu}$) and as always the confidence level desired using `--cl=X`
    +It is possible to define the criterion used for setting limits using `--rule CLs` (to use the CLs criterion) or `--rule CLsplusb` (to calculate the limit using $p_{\mu}$) and as always the confidence level desired using `--cl=X`.
     
    -The choice of test-statistic can be made via the option `--testStat` and different methodologies for treatment of the nuisance parameters are available. While it is possible to mix different test-statistics with different nuisance parameter treatments, this is highly **not-reccomended**. Instead one should follow one of the following three procedures,
    +The choice of test statistic can be made via the option `--testStat`. Different methodologies for the treatment of the nuisance parameters are available. While it is possible to mix different test statistics with different nuisance parameter treatments, **we strongly do not recommend  this**. Instead one should follow one of the following three procedures,
     
     * **LEP-style**: `--testStat LEP --generateNuisances=1 --fitNuisances=0`
         * The test statistic is defined using the ratio of likelihoods $q_{\mathrm{LEP}}=-2\ln[\mathcal{L}(\mathrm{data}|r=0)/\mathcal{L}(\mathrm{data}|r)]$.
    -    * The nuisance parameters are fixed to their nominal values for the purpose of evaluating the likelihood, while for generating toys, the nuisance parameters are first randomized within their pdfs before generation of the toy.
    +    * The nuisance parameters are fixed to their nominal values for the purpose of evaluating the likelihood, while for generating toys, the nuisance parameters are first randomized within their PDFs before generation of the toy.
     
     * **TEV-style**: `--testStat TEV --generateNuisances=0 --generateExternalMeasurements=1 --fitNuisances=1`
         * The test statistic is defined using the ratio of likelihoods $q_{\mathrm{TEV}}=-2\ln[\mathcal{L}(\mathrm{data}|r=0,\hat{\theta}_{0})/\mathcal{L}(\mathrm{data}|r,\hat{\theta}_{r})]$, in which the nuisance parameters are profiled separately for $r=0$ and $r$.
    @@ -334,23 +334,23 @@ The choice of test-statistic can be made via the option `--testStat` and differe
     * **LHC-style**: `--LHCmode LHC-limits`
     , which is the shortcut for `--testStat LHC --generateNuisances=0 --generateExternalMeasurements=1 --fitNuisances=1`
         * The test statistic is defined using the ratio of likelihoods $q_{r} = -2\ln[\mathcal{L}(\mathrm{data}|r,\hat{\theta}_{r})/\mathcal{L}(\mathrm{data}|r=\hat{r},\hat{\theta})]$ , in which the nuisance parameters are profiled separately for $r=\hat{r}$ and $r$.
    -    * The value of $q_{r}$ set to 0 when $\hat{r}>r$ giving a one sided limit. Furthermore, the constraint $r>0$ is enforced in the fit. This means that if the unconstrained value of $\hat{r}$ would be negative, the test statistic $q_{r}$ is evaluated as $-2\ln[\mathcal{L}(\mathrm{data}|r,\hat{\theta}_{r})/\mathcal{L}(\mathrm{data}|r=0,\hat{\theta}_{0})]$
    +    * The value of $q_{r}$ set to 0 when $\hat{r}>r$ giving a one-sided limit. Furthermore, the constraint $r>0$ is enforced in the fit. This means that if the unconstrained value of $\hat{r}$ would be negative, the test statistic $q_{r}$ is evaluated as $-2\ln[\mathcal{L}(\mathrm{data}|r,\hat{\theta}_{r})/\mathcal{L}(\mathrm{data}|r=0,\hat{\theta}_{0})]$
         * For the purposes of toy generation, the nuisance parameters are fixed to their **post-fit** values from the data (conditionally on the value of **r**), while the constraint terms are randomized in the evaluation of the likelihood.
     
     !!! warning
    -    The recommended style is the **LHC-style**. Please note that this method is sensitive to the *observation in data* since the *post-fit* (after a fit to the data) values of the nuisance parameters (assuming different values of **r**) are used when generating the toys. For completely blind limits you can first generate a *pre-fit* asimov toy dataset (described in the [toy data generation](runningthetool.md#toy-data-generation) section) and use that in place of the data.  You can then use this toy by passing `-D toysFileName.root:toys/toy_asimov`
    +    The recommended style is the **LHC-style**. Please note that this method is sensitive to the *observation in data* since the *post-fit* (after a fit to the data) values of the nuisance parameters (assuming different values of **r**) are used when generating the toys. For completely blind limits you can first generate a *pre-fit* asimov toy data set (described in the [toy data generation](runningthetool.md#toy-data-generation) section) and use that in place of the data.  You can use this toy by passing the argument `-D toysFileName.root:toys/toy_asimov`
     
    -While the above shortcuts are the common variants, you can also try others. The treatment of the nuisances can be changed to the so-called "Hybrid-Bayesian" method which effectively integrates over the nuisance parameters. This is especially relevant when you have very few expected events in your data and you are using those events to constrain background processes. This can be achieved by setting `--generateNuisances=1 --generateExternalMeasurements=0`. You might also want to avoid first fitting to the data to choose the nominal values in this case, which can be done by also setting `--fitNuisances=0`. 
    +While the above shortcuts are the commonly used versions, variations can be tested. The treatment of the nuisances can be changed to the so-called "Hybrid-Bayesian" method, which effectively integrates over the nuisance parameters. This is especially relevant when you have very few expected events in your data, and you are using those events to constrain background processes. This can be achieved by setting `--generateNuisances=1 --generateExternalMeasurements=0`. In case you want to avoid first fitting to the data to choose the nominal values you can additionally pass `--fitNuisances=0`. 
     
     !!! warning
    -    If you have unconstrained parameters in your model (`rateParam` or if using a `_norm` variable for a pdf) and you want to use the "Hybrid-Bayesian" method, you **must** declare these as `flatParam` in your datacard and when running text2workspace you must add the option `--X-assign-flatParam-prior` in the command line. This will create uniform priors for these parameters, which is needed for this method and which otherwise would not get created.   
    +    If you have unconstrained parameters in your model (`rateParam`, or if you are using a `_norm` variable for a PDF) and you want to use the "Hybrid-Bayesian" method, you **must** declare these as `flatParam` in your datacard. When running text2workspace you must add the option `--X-assign-flatParam-prior` in the command line. This will create uniform priors for these parameters. These are needed for this method and they would otherwise not get created.   
     
     !!! info
    -    Note that (observed and toy) values of the test statistic stored in the instances of `RooStats::HypoTestResult` when the option `--saveHybridResult` has been specified, are defined without the factor 2 and therefore are twice as small as the values given by the formulas above. This factor is however included automatically by all plotting script supplied within the Combine package.
    +    Note that (observed and expected) values of the test statistic stored in the instances of `RooStats::HypoTestResult` when the option `--saveHybridResult` is passed are defined without the factor 2. They are therefore twice as small as the values given by the formulas above. This factor is however included automatically by all plotting scripts supplied within the Combine package. If you use your own plotting scripts, you need to make sure to incorporate the factor 2. 
     
     ### Simple models
     
    -For relatively simple models, the observed and expected limits can be calculated interactively. Since the **LHC-style** is the reccomended procedure for calculating limits using toys, we will use that in this section but the same applies to the other methods.
    +For relatively simple models, the observed and expected limits can be calculated interactively. Since the **LHC-style** is the recommended set of options for calculating limits using toys, we will use that in this section. However, the same procedure can be followed with the other sets of options.
     
     ```sh
     combine realistic-counting-experiment.txt -M HybridNew --LHCmode LHC-limits
    @@ -530,75 +530,75 @@ Failed to delete temporary file roostats-Sprxsw.root: No such file or directory
     
    /// -The result stored in the **limit** branch of the output tree will be the upper limit (and its error stored in **limitErr**). The default behavior will be, as above, to search for the upper limit on **r** however, the values of $p_{\mu}, p_{b}$ and CLs can be calculated for a particular value **r=X** by specifying the option `--singlePoint=X`. In this case, the value stored in the branch **limit** will be the value of CLs (or $p_{\mu}$) (see the [FAQ](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part4/usefullinks/#faq) section). +The result stored in the **limit** branch of the output tree will be the upper limit (and its error, stored in **limitErr**). The default behaviour will be, as above, to search for the upper limit on **r**. However, the values of $p_{\mu}, p_{b}$ and CLs can be calculated for a particular value **r=X** by specifying the option `--singlePoint=X`. In this case, the value stored in the branch **limit** will be the value of CLs (or $p_{\mu}$) (see the [FAQ](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part4/usefullinks/#faq) section). #### Expected Limits -For the simple models, we can just run interactively 5 times to compute the median expected and the 68% and 95% interval boundaries. Use the `HybridNew` method with the same options as per the observed limit but adding a `--expectedFromGrid=` where the quantile is 0.5 for the median, 0.84 for the +ve side of the 68% band, 0.16 for the -ve side of the 68% band, 0.975 for the +ve side of the 95% band, 0.025 for the -ve side of the 95% band. +For simple models, we can run interactively 5 times to compute the median expected and the 68% and 95% central interval boundaries. For this, we can use the `HybridNew` method with the same options as for the observed limit, but adding a `--expectedFromGrid=`. Here, the quantile should be set to 0.5 for the median, 0.84 for the +ve side of the 68% band, 0.16 for the -ve side of the 68% band, 0.975 for the +ve side of the 95% band, and 0.025 for the -ve side of the 95% band. -The output file will contain the value of the quantile in the branch **quantileExpected** which can be used to separate the points. +The output file will contain the value of the quantile in the branch **quantileExpected**. This branch can therefore be used to separate the points. #### Accuracy -The search for the limit is performed using an adaptive algorithm, terminating when the estimate of the limit value is below some limit or when the precision cannot be futher improved with the specified options. The options controlling this behaviour are: +The search for the limit is performed using an adaptive algorithm, terminating when the estimate of the limit value is below some limit or when the precision cannot be improved further with the specified options. The options controlling this behaviour are: - `rAbsAcc`, `rRelAcc`: define the accuracy on the limit at which the search stops. The default values are 0.1 and 0.05 respectively, meaning that the search is stopped when Δr < 0.1 or Δr/r < 0.05. -- `clsAcc`: this determines the absolute accuracy up to which the CLs values are computed when searching for the limit. The default is 0.5%. Raising the accuracy above this value will increase significantly the time to run the algorithm, as you need N2 more toys to improve the accuracy by a factor N, you can consider enlarging this value if you're computing limits with a larger CL (e.g. 90% or 68%). Note that if you're using the `CLsplusb` rule then this parameter will control the uncertainty on $p_{\mu}$ rather than CLs. -- `T` or `toysH`: controls the minimum number of toys that are generated for each point. The default value of 500 should be ok when computing the limit with 90-95% CL. You can decrease this number if you're computing limits at 68% CL, or increase it if you're using 99% CL. +- `clsAcc`: this determines the absolute accuracy up to which the CLs values are computed when searching for the limit. The default is 0.5%. Raising the accuracy above this value will significantly increase the time needed to run the algorithm, as you need N2 more toys to improve the accuracy by a factor N. You can consider increasing this value if you are computing limits with a larger CL (e.g. 90% or 68%). Note that if you are using the `CLsplusb` rule, this parameter will control the uncertainty on $p_{\mu}$ rather than CLs. +- `T` or `toysH`: controls the minimum number of toys that are generated for each point. The default value of 500 should be sufficient when computing the limit at 90-95% CL. You can decrease this number if you are computing limits at 68% CL, or increase it if you are using 99% CL. -Note, to further improve the accuracy when searching for the upper limit, combine will also fit an exponential function to several of the points and interpolate to find the crossing. +Note, to further improve the accuracy when searching for the upper limit, Combine will also fit an exponential function to several of the points and interpolate to find the crossing. ### Complex models -For complicated models, it is best to produce a *grid* of test statistic distributions at various values of the signal strength, and use it to compute the observed and expected limit and bands. This approach is good for complex models since the grid of points can be distributed across any number of jobs. In this approach we will store the distributions of the test-statistic at different values of the signal strength using the option `--saveHybridResult`. The distribution at a single value of **r=X** can be determined by +For complicated models, it is best to produce a *grid* of test statistic distributions at various values of the signal strength, and use it to compute the observed and expected limit and central intervals. This approach is convenient for complex models, since the grid of points can be distributed across any number of jobs. In this approach we will store the distributions of the test statistic at different values of the signal strength using the option `--saveHybridResult`. The distribution at a single value of **r=X** can be determined by ```sh combine datacard.txt -M HybridNew --LHCmode LHC-limits --singlePoint X --saveToys --saveHybridResult -T 500 --clsAcc 0 ``` !!! warning - We have specified the accuracy here by including `clsAcc=0` which turns off adaptive sampling and specifying the number of toys to be 500 with the `-T N` option. For complex models, it may be necessary to split the toys internally over a number of instances of `HybridNew` using the option `--iterations I`. The **total** number of toys will be the product **I*N**. + We have specified the accuracy here by including `--clsAcc=0`, which turns off adaptive sampling, and specifying the number of toys to be 500 with the `-T N` option. For complex models, it may be necessary to internally split the toys over a number of instances of `HybridNew` using the option `--iterations I`. The **total** number of toys will be the product **I*N**. -The above can be repeated several times, in parallel, to build the distribution of the test-statistic (giving the random seed option `-s -1`). Once all of the distributions are finished, the resulting output files can be merged into one using **hadd** and read back to calculate the limit, specifying the merged file with `--grid=merged.root`. +The above can be repeated several times, in parallel, to build the distribution of the test statistic (passing the random seed option `-s -1`). Once all of the distributions have been calculated, the resulting output files can be merged into one using **hadd**, and read back to calculate the limit, specifying the merged file with `--grid=merged.root`. The observed limit can be obtained with ```sh -combine datacard.txt -M HybridNew --LHCmode LHC-limits --readHybridResults --grid=merged.root +combine datacard.txt -M HybridNew --LHCmode LHC-limits --readHybridResults --toysFile=merged.root ``` and similarly, the median expected and quantiles can be determined using ```sh -combine datacard.txt -M HybridNew --LHCmode LHC-limits --readHybridResults --grid=merged.root --expectedFromGrid +combine datacard.txt -M HybridNew --LHCmode LHC-limits --readHybridResults --toysFile=merged.root --expectedFromGrid ``` -substituting `` with 0.5 for the median, 0.84 for the +ve side of the 68% band, 0.16 for the -ve side of the 68% band, 0.975 for the +ve side of the 95% band, 0.025 for the -ve side of the 95% band. +substituting `` with 0.5 for the median, 0.84 for the +ve side of the 68% band, 0.16 for the -ve side of the 68% band, 0.975 for the +ve side of the 95% band, and 0.025 for the -ve side of the 95% band. -The splitting of the jobs can be left to the user's preference. However, users may wish to use the **combineTool** for automating this as described in the section on [combineTool for job submission](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part3/runningthetool/#combinetool-for-job-submission) +The splitting of the jobs can be left to the user's preference. However, users may wish to use the **combineTool** for automating this, as described in the section on [combineTool for job submission](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part3/runningthetool/#combinetool-for-job-submission) #### Plotting -A plot of the CLs (or $p_{\mu}$) as a function of **r**, which is used to find the crossing, can be produced using the option `--plot=limit_scan.png`. This can be useful for judging if the grid was sufficient in determining the upper limit. +A plot of the CLs (or $p_{\mu}$) as a function of **r**, which is used to find the crossing, can be produced using the option `--plot=limit_scan.png`. This can be useful for judging if the chosen grid was sufficient for determining the upper limit. If we use our [realistic-counting-experiment.txt](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/data/tutorials/counting/realistic-counting-experiment.txt) datacard and generate a grid of points $r\varepsilon[1.4,2.2]$ in steps of 0.1, with 5000 toys for each point, the plot of the observed CLs vs **r** should look like the following, ![](images/limit_scan.png) -You should judge in each case if the limit is accurate given the spacing of the points and the precision of CLs at each point. If it is not sufficient, simply generate more points closer to the limit and/or more toys at each point. +You should judge in each case whether the limit is accurate given the spacing of the points and the precision of CLs at each point. If it is not sufficient, simply generate more points closer to the limit and/or more toys at each point. -The distributions of the test-statistic can also be plotted, at each value in the grid, using the simple python tool, +The distributions of the test statistic can also be plotted, at each value in the grid, using ```sh python test/plotTestStatCLs.py --input mygrid.root --poi r --val all --mass MASS ``` -The resulting output file will contain a canvas showing the distribution of the test statistic background only and signal+background hypothesis at each value of **r**. Use `--help` to see more options for this script. +The resulting output file will contain a canvas showing the distribution of the test statistics for the background only and signal+background hypotheses at each value of **r**. Use `--help` to see more options for this script. !!! info - If you used the TEV or LEP style test statistic (using the commands as described above), then you should include the option `--doublesided`, which will also take care of defining the correct integrals for $p_{\mu}$ and $p_{b}$. Click on the examples below to see what a typical output of this plotting tool will look like when using the LHC test statistic, or TEV test statistic. + If you used the TEV or LEP style test statistic (using the commands as described above), then you should include the option `--doublesided`, which will also take care of defining the correct integrals for $p_{\mu}$ and $p_{b}$. Click on the examples below to see what a typical output of this plotting tool will look like when using the LHC test statistic, or the TEV test statistic. /// details | **qLHC test stat example** @@ -615,7 +615,7 @@ The resulting output file will contain a canvas showing the distribution of the ## Computing Significances with toys -Computation of expected significance with toys is a two step procedure: first you need to run one or more jobs to construct the expected distribution of the test statistic. As with setting limits, there are a number of different configurations for generating toys but we will use the preferred option using, +Computation of the expected significance with toys is a two-step procedure: first you need to run one or more jobs to construct the expected distribution of the test statistic. As for setting limits, there are a number of different possible configurations for generating toys. However, we will use the most commonly used option, * **LHC-style**: `--LHCmode LHC-significance` , which is the shortcut for `--testStat LHC --generateNuisances=0 --generateExternalMeasurements=1 --fitNuisances=1 --significance` @@ -625,13 +625,13 @@ Computation of expected significance with toys is a two step procedure: first yo ### Observed significance -To construct the distribution of the test statistic run as many times as necessary, +To construct the distribution of the test statistic, the following command should be run as many times as necessary ```sh combine -M HybridNew datacard.txt --LHCmode LHC-significance --saveToys --fullBToys --saveHybridResult -T toys -i iterations -s seed ``` -with different seeds, or using `-s -1` for random seeds, then merge all those results into a single root file with `hadd`. +with different seeds, or using `-s -1` for random seeds, then merge all those results into a single ROOT file with `hadd`. The *observed* significance can be calculated as @@ -643,83 +643,83 @@ where the option `--pvalue` will replace the result stored in the **limit** bran ### Expected significance, assuming some signal -The *expected* significance, assuming a signal with **r=X** can be calculated, by including the option `--expectSignal X` when generating the distribution of the test statistic and using the option `--expectedFromGrid=0.5` when calculating the significance for the median. To get the ±1σ bands, use 0.16 and 0.84 instead of 0.5, and so on... +The *expected* significance, assuming a signal with **r=X** can be calculated, by including the option `--expectSignal X` when generating the distribution of the test statistic and using the option `--expectedFromGrid=0.5` when calculating the significance for the median. To get the ±1σ bands, use 0.16 and 0.84 instead of 0.5, and so on. -You need a total number of background toys large enough to compute the value of the significance, but you need less signal toys (especially if you only need the median). For large significance, you can then run most of the toys without the `--fullBToys` option (about a factor 2 faster), and only a smaller part with that option turned on. +The total number of background toys needs to be large enough to compute the value of the significance, but you need fewer signal toys (especially when you are only computing the median expected significance). For large significances, you can run most of the toys without the `--fullBToys` option, which will be about a factor 2 faster. Only a small part of the toys needs to be run with that option turned on. -As with calculating limits with toys, these jobs can be submitted to the grid or batch systems with the help of the `combineTool` as described in the section on [combineTool for job submission](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part3/runningthetool/#combinetool-for-job-submission) +As with calculating limits with toys, these jobs can be submitted to the grid or batch systems with the help of the `combineTool`, as described in the section on [combineTool for job submission](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part3/runningthetool/#combinetool-for-job-submission) ## Goodness of fit tests -The `GoodnessOfFit` method can be used to evaluate how compatible the observed data are with the model pdf. +The `GoodnessOfFit` method can be used to evaluate how compatible the observed data are with the model PDF. -The module can be run specifying an algorithm, and will compute a goodness of fit indicator for that algorithm and the data. The procedure is therefore to first run on the real data +This method implements several algorithms, and will compute a goodness of fit indicator for the chosen algorithm and the data. The procedure is therefore to first run on the real data ```sh combine -M GoodnessOfFit datacard.txt --algo= ``` -and then to run on many toy mc datasets to determine the distribution of the goodness of fit indicator +and then to run on many toy MC data sets to determine the distribution of the goodness-of-fit indicator ```sh combine -M GoodnessOfFit datacard.txt --algo= -t -s ``` -When computing the goodness of fit, by default the signal strength is left floating in the fit, so that the measure is independent from the presence or absence of a signal. It is possible to instead keep it fixed to some value by passing the option `--fixedSignalStrength=`. +When computing the goodness-of-fit, by default the signal strength is left floating in the fit, so that the measure is independent from the presence or absence of a signal. It is possible to fixe the signal strength to some value by passing the option `--fixedSignalStrength=`. -The following algorithms are supported: +The following algorithms are implemented: -- **`saturated`**: Compute a goodness-of-fit measure for binned fits based on the *saturated model* method, as prescribed by the StatisticsCommittee [(note)](http://www.physics.ucla.edu/~cousins/stats/cousins_saturated.pdf). This quantity is similar to a chi-square, but can be computed for an arbitrary combination of binned channels with arbitrary constraints. +- **`saturated`**: Compute a goodness-of-fit measure for binned fits based on the *saturated model*, as prescribed by the Statistics Committee [(note)](http://www.physics.ucla.edu/~cousins/stats/cousins_saturated.pdf). This quantity is similar to a chi-square, but can be computed for an arbitrary combination of binned channels with arbitrary constraints. -- **`KS`**: Compute a goodness-of-fit measure for binned fits using the *Kolmogorov-Smirnov* test. It is based on the highest difference between the cumulative distribution function and the empirical distribution function of any bin. +- **`KS`**: Compute a goodness-of-fit measure for binned fits using the *Kolmogorov-Smirnov* test. It is based on the largest difference between the cumulative distribution function and the empirical distribution function of any bin. - **`AD`**: Compute a goodness-of-fit measure for binned fits using the *Anderson-Darling* test. It is based on the integral of the difference between the cumulative distribution function and the empirical distribution function over all bins. It also gives the tail ends of the distribution a higher weighting. -The output tree will contain a branch called **`limit`** which contains the value of the test-statistic in each toy. You can make a histogram of this test-statistic $t$ and from this distribution ($f(t)$) and the single value obtained in the data ($t_{0}$) you can calculate the p-value $$p = \int_{t=t_{0}}^{\mathrm{+inf}} f(t) dt $$. Note: in rare cases the test statistic value for the toys can be undefined (for AS and KD), and in this case we set the test statistic value to -1. When plotting the test statistic distribution, those toys should be excluded. This is automatically taken care of if you use the GoF collection script in CombineHarvester described below. +The output tree will contain a branch called **`limit`**, which contains the value of the test statistic in each toy. You can make a histogram of this test statistic $t$. From the distribution that is obtained in this way ($f(t)$) and the single value obtained by running on the observed data ($t_{0}$) you can calculate the p-value $$p = \int_{t=t_{0}}^{\mathrm{+inf}} f(t) dt $$. Note: in rare cases the test statistic value for the toys can be undefined (for AS and KD). In this case we set the test statistic value to -1. When plotting the test statistic distribution, those toys should be excluded. This is automatically taken care of if you use the GoF collection script in CombineHarvester, which is described below. -When generating toys, the default behavior will be used. See the section on [toy generation](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part3/runningthetool/#toy-data-generation) for options on how to generate/fit nuisance parameters in these tests. It is recomended to use the *frequentist toys* (`--toysFreq`) when running the **`saturated`** model, and the default toys for the other two tests. +When generating toys, the default behavior will be used. See the section on [toy generation](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part3/runningthetool/#toy-data-generation) for options that control how nuisance parameters are generated and fitted in these tests. It is recommended to use *frequentist toys* (`--toysFreq`) when running the **`saturated`** model, and the default toys for the other two tests. -Further goodness of fit methods could be added on request, especially if volunteers are available to code them. -The output limit tree will contain the value of the test-statistic in each toy (or the data) +Further goodness-of-fit methods could be added on request, especially if volunteers are available to code them. +The output limit tree will contain the value of the test statistic in each toy (or the data) !!! warning The above algorithms are all concerned with *one-sample* tests. For *two-sample* tests, you can follow an example CMS HIN analysis described [in this Twiki](https://twiki.cern.ch/twiki/bin/viewauth/CMS/HiggsCombineTwoDatasetCompatibility) ### Masking analysis regions in the saturated model -For searches that employs a simultaneous fit across signal and control regions, it may be useful to mask one or more analysis regions either when the likelihood is maximized (fit) or when the test-statistic is computed. This can be done by using the options `--setParametersForFit` and `--setParametersForEval`, respectively. The former will set parameters *before* each fit while the latter is used to set parameters *after* each fit, but before the NLL is evauated. Note of course that if the parameter in the list is floating, it will be still floating in each fit so will not effect the results when using `--setParametersForFit`. +For analyses that employ a simultaneous fit across signal and control regions, it may be useful to mask one or more analysis regions, either when the likelihood is maximized (fit) or when the test statistic is computed. This can be done by using the options `--setParametersForFit` and `--setParametersForEval`, respectively. The former will set parameters *before* each fit, while the latter is used to set parameters *after* each fit, but before the NLL is evaluated. Note, of course, that if the parameter in the list is floating, it will still be floating in each fit. Therefore, it will not affect the results when using `--setParametersForFit`. -A realistic example for a binned shape analysis performed in one signal region and two control samples can be found in this directory of the Higgs-combine package [Datacards-shape-analysis-multiple-regions](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/tree/81x-root606/data/tutorials/rate_params). +A realistic example for a binned shape analysis performed in one signal region and two control samples can be found in this directory of the Combine package [Datacards-shape-analysis-multiple-regions](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/tree/81x-root606/data/tutorials/rate_params). -First of all, one needs to combine the individual datacards to build a single model and to introduce the channel-masking variables as follow: +First of all, one needs to Combine the individual datacards to build a single model, and to introduce the channel masking variables as follow: ```sh combineCards.py signal_region.txt dimuon_control_region.txt singlemuon_control_region.txt > combined_card.txt text2workspace.py combined_card.txt --channel-masks ``` -More information about the channel-masking can be found in this -section [Channel Masking](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part3/nonstandard/#channel-masking). The saturated test-static value for a simultaneous fit across all the analysis regions can be calculated as: +More information about the channel masking can be found in this +section [Channel Masking](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part3/nonstandard/#channel-masking). The saturated test static value for a simultaneous fit across all the analysis regions can be calculated as: ```sh combine -M GoodnessOfFit -d combined_card.root --algo=saturated -n _result_sb ``` -In this case, signal and control regions are included in both the fit and in the evaluation of the test-static, and the signal strength is freely floating. This measures the compatibility between the signal+background fit and the observed data. Moreover, it can be interesting to assess the level of compatibility between the observed data in all the regions and the background prediction obtained by only fitting the control regions (CR-only fit). This is computed as follow: +In this case, signal and control regions are included in both the fit and in the evaluation of the test statistic, and the signal strength is freely floating. This measures the compatibility between the signal+background fit and the observed data. Moreover, it can be interesting to assess the level of compatibility between the observed data in all the regions and the background prediction obtained by only fitting the control regions (CR-only fit). This can be evaluated as follow: ```sh combine -M GoodnessOfFit -d combined_card.root --algo=saturated -n _result_bonly_CRonly --setParametersForFit mask_ch1=1 --setParametersForEval mask_ch1=0 --freezeParameters r --setParameters r=0 ``` -where the signal strength is frozen and the signal region is not considered in the fit (`--setParametersForFit mask_ch1=1`), but it is included in the test-statistic computation (`--setParametersForEval mask_ch1=0`). To show the differences between the two models being tested, one can perform a fit to the data using the FitDiagnostics method as: +where the signal strength is frozen and the signal region is not considered in the fit (`--setParametersForFit mask_ch1=1`), but it is included in the test statistic computation (`--setParametersForEval mask_ch1=0`). To show the differences between the two models being tested, one can perform a fit to the data using the FitDiagnostics method as: ```sh combine -M FitDiagnostics -d combined_card.root -n _fit_result --saveShapes --saveWithUncertainties combine -M FitDiagnostics -d combined_card.root -n _fit_CRonly_result --saveShapes --saveWithUncertainties --setParameters mask_ch1=1 ``` -By taking the total background, the total signal, and the data shapes from FitDiagnostics output, we can compare the post-fit predictions from the S+B fit (first case) and the CR-only fit (second case) with the observation as reported below: +By taking the total background, the total signal, and the data shapes from the FitDiagnostics output, we can compare the post-fit predictions from the S+B fit (first case) and the CR-only fit (second case) with the observation as reported below: /// details | **FitDiagnostics S+B fit** @@ -733,7 +733,7 @@ By taking the total background, the total signal, and the data shapes from FitDi /// -To compute a p-value for the two results, one needs to compare the observed goodness-of-fit value previously computed with expected distribution of the test-statistic obtained in toys: +To compute a p-value for the two results, one needs to compare the observed goodness-of-fit value previously computed with the expected distribution of the test statistic obtained in toys: ```sh combine -M GoodnessOfFit combined_card.root --algo=saturated -n result_toy_sb --toysFrequentist -t 500 @@ -752,9 +752,9 @@ where the former gives the result for the S+B model, while the latter gives the ![](images/gof_CRonly.png) /// -### Making a plot of the GoF test-statistic distribution +### Making a plot of the GoF test statistic distribution -If you have also checked out the [combineTool](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/#combine-tool), you can use this to run batch jobs or on the grid (see [here](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part3/runningthetool/#combinetool-for-job-submission)) and produce a plot of the results. Once you have the jobs, you can hadd them together and run (e.g for the saturated model), +If you have also checked out the [combineTool](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/#combine-tool), you can use this to run batch jobs or on the grid (see [here](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part3/runningthetool/#combinetool-for-job-submission)) and produce a plot of the results. Once the jobs have completed, you can hadd them together and run (e.g for the saturated model), ```sh combineTool.py -M CollectGoodnessOfFit --input data_run.root toys_run.root -m 125.0 -o gof.json @@ -763,18 +763,18 @@ plotGof.py gof.json --statistic saturated --mass 125.0 -o gof_plot --title-right ## Channel Compatibility -The `ChannelCompatibilityCheck` method can be used to evaluate how compatible are the measurements of the signal strength from the separate channels of a combination. +The `ChannelCompatibilityCheck` method can be used to evaluate how compatible the measurements of the signal strength from the separate channels of a combination are with each other. -The method performs two fits of the data, first with the nominal model in which all channels are assumed to have the *same signal strength multiplier* $r$, and then another allowing *separate signal strengths* $r_{i}$ in each channel. A chisquare-like quantity is computed as $-2 \ln \mathcal{L}(\mathrm{data}| r)/L(\mathrm{data}|\{r_{i}\}_{i=1}^{N_{\mathrm{chan}}})$. Just like for the goodness of fit indicators, the expected distribution of this quantity under the nominal model can be computed from toy mc. +The method performs two fits of the data, first with the nominal model in which all channels are assumed to have the *same signal strength modifier* $r$, and then another allowing *separate signal strengths* $r_{i}$ in each channel. A chisquare-like quantity is computed as $-2 \ln \mathcal{L}(\mathrm{data}| r)/L(\mathrm{data}|\{r_{i}\}_{i=1}^{N_{\mathrm{chan}}})$. Just like for the goodness-of-fit indicators, the expected distribution of this quantity under the nominal model can be computed from toy MC data sets. By default, the signal strength is kept floating in the fit with the nominal model. It can however be fixed to a given value by passing the option `--fixedSignalStrength=`. -In the default models build from the datacards the signal strengths in all channels are constrained to be non-negative. One can allow negative signal strengths in the fits by changing the bound on the variable (option `--rMin=`), which should make the quantity more chisquare-like under the hypothesis of zero signal; this however can create issues in channels with small backgrounds, since total expected yields and pdfs in each channel must be positive. +In the default model built from the datacards, the signal strengths in all channels are constrained to be non-negative. One can allow negative signal strengths in the fits by changing the bound on the variable (option `--rMin=`), which should make the quantity more chisquare-like under the hypothesis of zero signal; this however can create issues in channels with small backgrounds, since total expected yields and PDFs in each channel must be positive. -When run with the a verbosity of 1, as the default, the program also prints out the best fit signal strengths in all channels; as the fit to all channels is done simultaneously, the correlation between the other systematical uncertainties is taken into account, and so these results can differ from the ones obtained fitting each channel separately. +When run with a verbosity of 1, as is the default, the program also prints out the best fit signal strengths in all channels. As the fit to all channels is done simultaneously, the correlation between the other systematic uncertainties is taken into account. Therefore, these results can differ from the ones obtained when fitting each channel separately. -Below is an example output from combine, +Below is an example output from Combine, ```nohighlight $ combine -M ChannelCompatibilityCheck comb_hww.txt -m 160 -n HWW @@ -797,9 +797,9 @@ Chi2-like compatibility variable: 2.16098 Done in 0.08 min (cpu), 0.08 min (real) ``` -The output tree will contain the value of the compatibility (chisquare variable) in the **limit** branch. If the option `--saveFitResult` is specified, the output root file contains also two [RooFitResult](http://root.cern.ch/root/htmldoc/RooFitResult.html) objects **fit_nominal** and **fit_alternate** with the results of the two fits. +The output tree will contain the value of the compatibility (chi-square variable) in the **limit** branch. If the option `--saveFitResult` is specified, the output ROOT file also contains two [RooFitResult](http://root.cern.ch/root/htmldoc/RooFitResult.html) objects **fit_nominal** and **fit_alternate** with the results of the two fits. -This can be read and used to extract the best fit for each channel and the overall best fit using +This can be read and used to extract the best fit value for each channel, and the overall best fit value, using ```c++ $ root -l @@ -808,13 +808,13 @@ fit_alternate->floatParsFinal().selectByName("*ChannelCompatibilityCheck*")->Pri fit_nominal->floatParsFinal().selectByName("r")->Print("v"); ``` -The macro [cccPlot.cxx](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/test/plotting/cccPlot.cxx) can be used to produce a comparison plot of the best fit signals from all channels. +The macro [cccPlot.cxx](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/test/plotting/cccPlot.cxx) can be used to produce a comparison plot of the best fit signal strengths from all channels. ## Likelihood Fits and Scans -The `MultiDimFit` method can do multi-dimensional fits and likelihood based scans/contours using models with several parameters of interest. +The `MultiDimFit` method can be used to perform multi-dimensional fits and likelihood-based scans/contours using models with several parameters of interest. -Taking a toy datacard [data/tutorials/multiDim/toy-hgg-125.txt](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/data/tutorials/multiDim/toy-hgg-125.txt) (counting experiment which vaguely resembles the H→γγ analysis at 125 GeV), we need to convert the datacard into a workspace with 2 parameters, ggH and qqH cross sections +Taking a toy datacard [data/tutorials/multiDim/toy-hgg-125.txt](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/data/tutorials/multiDim/toy-hgg-125.txt) (counting experiment which vaguely resembles an early H→γγ analysis at 125 GeV), we need to convert the datacard into a workspace with 2 parameters, the ggH and qqH cross sections: ```sh text2workspace.py toy-hgg-125.txt -m 125 -P HiggsAnalysis.CombinedLimit.PhysicsModel:floatingXSHiggs --PO modes=ggH,qqH @@ -822,29 +822,29 @@ text2workspace.py toy-hgg-125.txt -m 125 -P HiggsAnalysis.CombinedLimit.PhysicsM A number of different algorithms can be used with the option `--algo `, -- **`none`** (default): Perform a maximum likelihood fit `combine -M MultiDimFit toy-hgg-125.root`; The output root tree will contain two columns, one for each parameter, with the fitted values. +- **`none`** (default): Perform a maximum likelihood fit `combine -M MultiDimFit toy-hgg-125.root`; The output ROOT tree will contain two columns, one for each parameter, with the fitted values. -- **`singles`**: Perform a fit of each parameter separately, treating the others as *unconstrained nuisances*: `combine -M MultiDimFit toy-hgg-125.root --algo singles --cl=0.68` . The output root tree will contain two columns, one for each parameter, with the fitted values; there will be one row with the best fit point (and `quantileExpected` set to -1) and two rows for each fitted parameter, where the corresponding column will contain the maximum and minimum of that parameter in the 68% CL interval, according to a *one-dimensional chisquare* (i.e. uncertainties on each fitted parameter *do not* increase when adding other parameters if they're uncorrelated). Note that if you run, for example, with `--cminDefaultMinimizerStrategy=0`, these uncertainties will be derived from the Hessian, while `--cminDefaultMinimizerStrategy=1` will invoke Minos to derive them. +- **`singles`**: Perform a fit of each parameter separately, treating the other parameters of interest as *unconstrained nuisance parameters*: `combine -M MultiDimFit toy-hgg-125.root --algo singles --cl=0.68` . The output ROOT tree will contain two columns, one for each parameter, with the fitted values; there will be one row with the best fit point (and `quantileExpected` set to -1) and two rows for each fitted parameter, where the corresponding column will contain the maximum and minimum of that parameter in the 68% CL interval, according to a *one-dimensional chi-square* (i.e. uncertainties on each fitted parameter *do not* increase when adding other parameters if they are uncorrelated). Note that if you run, for example, with `--cminDefaultMinimizerStrategy=0`, these uncertainties will be derived from the Hessian, while `--cminDefaultMinimizerStrategy=1` will invoke Minos to derive them. -- **`cross`**: Perform joint fit of all parameters: `combine -M MultiDimFit toy-hgg-125.root --algo=cross --cl=0.68`. The output root tree will have one row with the best fit point, and two rows for each parameter, corresponding to the minimum and maximum of that parameter on the likelihood contour corresponding to the specified CL, according to a *N-dimensional chisquare* (i.e. uncertainties on each fitted parameter *do* increase when adding other parameters, even if they're uncorrelated). Note that the output of this way of running *are not* 1D uncertainties on each parameter, and shouldn't be taken as such. +- **`cross`**: Perform a joint fit of all parameters: `combine -M MultiDimFit toy-hgg-125.root --algo=cross --cl=0.68`. The output ROOT tree will have one row with the best fit point, and two rows for each parameter, corresponding to the minimum and maximum of that parameter on the likelihood contour corresponding to the specified CL, according to an *N-dimensional chi-square* (i.e. the uncertainties on each fitted parameter *do* increase when adding other parameters, even if they are uncorrelated). Note that this method *does not* produce 1D uncertainties on each parameter, and should not be taken as such. -- **`contour2d`**: Make a 68% CL contour a la minos `combine -M MultiDimFit toy-hgg-125.root --algo contour2d --points=20 --cl=0.68`. The output will contain values corresponding to the best fit point (with `quantileExpected` set to -1) and for a set of points on the contour (with `quantileExpected` set to 1-CL, or something larger than that if the contour is hitting the boundary of the parameters). Probabilities are computed from the the n-dimensional $\chi^{2}$ distribution. For slow models, you can split it up by running several times with *different* number of points and merge the outputs (something better can be implemented). You can look at the [contourPlot.cxx](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/test/multiDim/contourPlot.cxx) macro for how to make plots out of this algorithm. +- **`contour2d`**: Make a 68% CL contour à la minos `combine -M MultiDimFit toy-hgg-125.root --algo contour2d --points=20 --cl=0.68`. The output will contain values corresponding to the best fit point (with `quantileExpected` set to -1) and for a set of points on the contour (with `quantileExpected` set to 1-CL, or something larger than that if the contour hits the boundary of the parameters). Probabilities are computed from the the n-dimensional $\chi^{2}$ distribution. For slow models, this method can be split by running several times with a *different* number of points, and merging the outputs. The [contourPlot.cxx](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/test/multiDim/contourPlot.cxx) macro can be used to make plots out of this algorithm. -- **`random`**: Scan N random points and compute the probability out of the profile likelihood `combine -M MultiDimFit toy-hgg-125.root --algo random --points=20 --cl=0.68`. Again, best fit will have `quantileExpected` set to -1, while each random point will have `quantileExpected` set to the probability given by the profile likelihood at that point. +- **`random`**: Scan N random points and compute the probability out of the profile likelihood ratio `combine -M MultiDimFit toy-hgg-125.root --algo random --points=20 --cl=0.68`. Again, the best fit will have `quantileExpected` set to -1, while each random point will have `quantileExpected` set to the probability given by the profile likelihood ratio at that point. - **`fixed`**: Compare the log-likelihood at a fixed point compared to the best fit. `combine -M MultiDimFit toy-hgg-125.root --algo fixed --fixedPointPOIs r=r_fixed,MH=MH_fixed`. The output tree will contain the difference in the negative log-likelihood between the points ($\hat{r},\hat{m}_{H}$) and ($\hat{r}_{fixed},\hat{m}_{H,fixed}$) in the branch `deltaNLL`. -- **`grid`**: Scan on a fixed grid of points not with approximately N points in total. `combine -M MultiDimFit toy-hgg-125.root --algo grid --points=10000`. - * You can partition the job in multiple tasks by using options `--firstPoint` and `--lastPoint`, for complicated scans, the points can be split as described in the [combineTool for job submission](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part3/runningthetool/#combinetool-for-job-submission) section. The output file will contain a column `deltaNLL` with the difference in negative log likelihood with respect to the best fit point. Ranges/contours can be evaluated by filling TGraphs or TH2 histograms with these points. - * By default the "min" and "max" of the POI ranges are *not* included and the points which are in the scan are *centered* , eg `combine -M MultiDimFit --algo grid --rMin 0 --rMax 5 --points 5` will scan at the points $r=0.5, 1.5, 2.5, 3.5, 4.5$. You can instead include the option `--alignEdges 1` which causes the points to be aligned with the endpoints of the parameter ranges - eg `combine -M MultiDimFit --algo grid --rMin 0 --rMax 5 --points 6 --alignEdges 1` will now scan at the points $r=0, 1, 2, 3, 4, 5$. NB - the number of points must be increased by 1 to ensure both end points are included. +- **`grid`**: Scan a fixed grid of points with approximately N points in total. `combine -M MultiDimFit toy-hgg-125.root --algo grid --points=10000`. + * You can partition the job in multiple tasks by using the options `--firstPoint` and `--lastPoint`. For complicated scans, the points can be split as described in the [combineTool for job submission](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part3/runningthetool/#combinetool-for-job-submission) section. The output file will contain a column `deltaNLL` with the difference in negative log-likelihood with respect to the best fit point. Ranges/contours can be evaluated by filling TGraphs or TH2 histograms with these points. + * By default the "min" and "max" of the POI ranges are *not* included and the points that are in the scan are *centred* , eg `combine -M MultiDimFit --algo grid --rMin 0 --rMax 5 --points 5` will scan at the points $r=0.5, 1.5, 2.5, 3.5, 4.5$. You can include the option `--alignEdges 1`, which causes the points to be aligned with the end-points of the parameter ranges - e.g. `combine -M MultiDimFit --algo grid --rMin 0 --rMax 5 --points 6 --alignEdges 1` will scan at the points $r=0, 1, 2, 3, 4, 5$. Note - the number of points must be increased by 1 to ensure both end points are included. -With the algorithms `none` and `singles` you can save the RooFitResult from the initial fit using the option `--saveFitResult`. The fit result is saved into a new file called `muiltidimfit.root`. +With the algorithms `none` and `singles` you can save the RooFitResult from the initial fit using the option `--saveFitResult`. The fit result is saved into a new file called `multidimfit.root`. -As usual, any *floating* nuisance parameters will be *profiled* which can be turned of using the `--freezeParameters` option. +As usual, any *floating* nuisance parameters will be *profiled*. This behaviour can be modified by using the `--freezeParameters` option. -For most of the methods, for lower precision results you can turn off the profiling of the nuisances setting option `--fastScan`, which for complex models speeds up the process by several orders of magnitude. **All** nuisance parameters will be kept fixed at the value corresponding to the best fit point. +For most of the methods, for lower-precision results you can turn off the profiling of the nuisance parameters by using the option `--fastScan`, which for complex models speeds up the process by several orders of magnitude. **All** nuisance parameters will be kept fixed at the value corresponding to the best fit point. -As an example, lets produce the $-2\Delta\ln{\mathcal{L}}$ scan as a function of **`r_ggH`** and **`r_qqH`** from the toy H→γγ datacard, with the nuisance parameters *fixed* to their global best fit values. +As an example, let's produce the $-2\Delta\ln{\mathcal{L}}$ scan as a function of **`r_ggH`** and **`r_qqH`** from the toy H→γγ datacard, with the nuisance parameters *fixed* to their global best fit values. ```sh combine toy-hgg-125.root -M MultiDimFit --algo grid --points 2000 --setParameterRanges r_qqH=0,10:r_ggH=0,4 -m 125 --fastScan @@ -903,28 +903,28 @@ best_fit->SetMarkerSize(3); best_fit->SetMarkerStyle(34); best_fit->Draw("p same ![](images/nll2D.png) -To make the full profiled scan just remove the `--fastScan` option from the combine command. +To make the full profiled scan, just remove the `--fastScan` option from the Combine command. -Similarly, 1D scans can be drawn directly from the tree, however for 1D likelihood scans, there is a python script from the [`CombineHarvester/CombineTools`](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/#combine-tool) package [plot1DScan.py](https://github.com/cms-analysis/CombineHarvester/blob/113x/CombineTools/scripts/plot1DScan.py) which can be used to make plots and extract the crossings of the `2*deltaNLL` - e.g the 1σ/2σ boundaries. +Similarly, 1D scans can be drawn directly from the tree, however for 1D likelihood scans, there is a python script from the [`CombineHarvester/CombineTools`](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/#combine-tool) package [plot1DScan.py](https://github.com/cms-analysis/CombineHarvester/blob/113x/CombineTools/scripts/plot1DScan.py) that can be used to make plots and extract the crossings of the `2*deltaNLL` - e.g the 1σ/2σ boundaries. ### Useful options for likelihood scans A number of common, useful options (especially for computing likelihood scans with the **grid** algo) are, -* `--autoBoundsPOIs arg`: Adjust bounds for the POIs if they end up close to the boundary. This can be a comma separated list of POIs, or "*" to get all of them. +* `--autoBoundsPOIs arg`: Adjust bounds for the POIs if they end up close to the boundary. This can be a comma-separated list of POIs, or "*" to get all of them. * `--autoMaxPOIs arg`: Adjust maxima for the POIs if they end up close to the boundary. Can be a list of POIs, or "*" to get all. * `--autoRange X`: Set to any **X >= 0** to do the scan in the $\hat{p}$ $\pm$ Xσ range, where $\hat{p}$ and σ are the best fit parameter value and uncertainty from the initial fit (so it may be fairly approximate). In case you do not trust the estimate of the error from the initial fit, you can just centre the range on the best fit value by using the option `--centeredRange X` to do the scan in the $\hat{p}$ $\pm$ X range centered on the best fit value. -* `--squareDistPoiStep`: POI step size based on distance from midpoint ( either (max-min)/2 or the best fit if used with `--autoRange` or `--centeredRange` ) rather than linear separation. -* `--skipInitialFit`: Skip the initial fit (saves time if for example a snapshot is loaded from a previous fit) +* `--squareDistPoiStep`: POI step size based on distance from the midpoint ( either (max-min)/2 or the best fit if used with `--autoRange` or `--centeredRange` ) rather than linear separation. +* `--skipInitialFit`: Skip the initial fit (saves time if, for example, a snapshot is loaded from a previous fit) -Below is a comparison in a likelihood scan, with 20 points, as a function of **`r_qqH`** with our `toy-hgg-125.root` workspace with and without some of these options. The options added tell combine to scan more points closer to the minimum (best-fit) than with the default. +Below is a comparison in a likelihood scan, with 20 points, as a function of **`r_qqH`** with our `toy-hgg-125.root` workspace with and without some of these options. The options added tell Combine to scan more points closer to the minimum (best-fit) than with the default. ![](images/r_qqH.png) You may find it useful to use the `--robustFit=1` option to turn on robust (brute-force) for likelihood scans (and other algorithms). You can set the strategy and tolerance when using the `--robustFit` option using the options `--setRobustFitAlgo` (default is `Minuit2,migrad`), `setRobustFitStrategy` (default is 0) and `--setRobustFitTolerance` (default is 0.1). If these options are not set, the defaults (set using `cminDefaultMinimizerX` options) will be used. -If running `--robustFit=1` with the algo **singles**, you can tune the accuracy of the routine used to find the crossing points of the likelihood using the option `--setCrossingTolerance` (default is set to 0.0001) +If running `--robustFit=1` with the algo **singles**, you can tune the accuracy of the routine used to find the crossing points of the likelihood using the option `--setCrossingTolerance` (the default is set to 0.0001) If you suspect your fits/uncertainties are not stable, you may also try to run custom HESSE-style calculation of the covariance matrix. This is enabled by running `MultiDimFit` with the `--robustHesse=1` option. A simple example of how the default behaviour in a simple datacard is given [here](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/issues/498). @@ -943,23 +943,23 @@ If `--floatOtherPOIs` is set to 0, the other parameters of interest (POIs), whic - When running with `--algo=singles`, the other floating POIs are treated as unconstrained nuisance parameters. - When running with `--algo=cross` or `--algo=contour2d`, the other floating POIs are treated as other POIs, and so they increase the number of dimensions of the chi-square. -As a result, when running with `floatOtherPOIs` set to 1, the uncertainties on each fitted parameters do not depend on what's the selection of POIs passed to MultiDimFit, but only on the number of parameters of the model. +As a result, when running with `--floatOtherPOIs` set to 1, the uncertainties on each fitted parameters do not depend on the selection of POIs passed to MultiDimFit, but only on the number of parameters of the model. !!! info - Note that `poi` given to the the option `-P` can also be any nuisance parameter. However, by default, the other nuisance parameters are left *floating*, so you do not need to specify that. + Note that `poi` given to the the option `-P` can also be any nuisance parameter. However, by default, the other nuisance parameters are left *floating*, so in general this does not need to be specified. -You can save the values of the other parameters of interest in the output tree by adding the option `saveInactivePOI=1`. You can additionally save the post-fit values any nuisance parameter, function or discrete index (RooCategory) defined in the workspace using the following options; +You can save the values of the other parameters of interest in the output tree by passing the option `--saveInactivePOI=1`. You can additionally save the post-fit values any nuisance parameter, function, or discrete index (RooCategory) defined in the workspace using the following options; -- `--saveSpecifiedNuis=arg1,arg2,...` will store the fitted value of any specified *constrained* nuisance parameter. Use `all` to save every constrained nuisance parameter. **Note** that if you want to store the values of `flatParams` (or floating parameters which are not defined in the datacard) or `rateParams`, which are *unconstrained*, you should instead use the generic option `--trackParameters` as described [here](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part3/runningthetool/#common-command-line-options). +- `--saveSpecifiedNuis=arg1,arg2,...` will store the fitted value of any specified *constrained* nuisance parameter. Use `all` to save every constrained nuisance parameter. **Note** that if you want to store the values of `flatParams` (or floating parameters that are not defined in the datacard) or `rateParams`, which are *unconstrained*, you should instead use the generic option `--trackParameters` as described [here](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part3/runningthetool/#common-command-line-options). - `--saveSpecifiedFunc=arg1,arg2,...` will store the value of any function (eg `RooFormulaVar`) in the model. - `--saveSpecifiedIndex=arg1,arg2,...` will store the index of any `RooCategory` object - eg a `discrete` nuisance. ### Using best fit snapshots -This can be used to save time when performing scans so that the best-fit needs not be redone and can also be used to perform scans with some nuisances frozen to the best-fit values. Sometimes it is useful to scan freezing certain nuisances to their *best-fit* values as opposed to the default values. To do this here is an example, +This can be used to save time when performing scans so that the best fit does not need to be repeated. It can also be used to perform scans with some nuisance parameters frozen to their best-fit values. This can be done as follows, -- Create a workspace workspace for a floating $r,m_{H}$ fit +- Create a workspace for a floating $r,m_{H}$ fit ```sh text2workspace.py hgg_datacard_mva_8TeV_bernsteins.txt -m 125 -P HiggsAnalysis.CombinedLimit.PhysicsModel:floatingHiggsMass --PO higgsMassRange=120,130 -o testmass.root` @@ -971,7 +971,7 @@ text2workspace.py hgg_datacard_mva_8TeV_bernsteins.txt -m 125 -P HiggsAnalysis.C combine -m 123 -M MultiDimFit --saveWorkspace -n teststep1 testmass.root --verbose 9 ``` -Now we can load the best-fit $\hat{r},\hat{m}_{H}$ and fit for $r$ freezing $m_{H}$ and **lumi_8TeV** to the best-fit values, +Now we can load the best fit $\hat{r},\hat{m}_{H}$ and fit for $r$ freezing $m_{H}$ and **lumi_8TeV** to their best-fit values, ```sh combine -m 123 -M MultiDimFit -d higgsCombineteststep1.MultiDimFit.mH123.root -w w --snapshotName "MultiDimFit" -n teststep2 --verbose 9 --freezeParameters MH,lumi_8TeV @@ -980,7 +980,7 @@ combine -m 123 -M MultiDimFit -d higgsCombineteststep1.MultiDimFit.mH123.root -w The Feldman-Cousins (FC) procedure for computing confidence intervals for a generic model is, -- use the profile likelihood as the test-statistic $q(x) = - 2 \ln \mathcal{L}(\mathrm{data}|x,\hat{\theta}_{x})/\mathcal{L}(\mathrm{data}|\hat{x},\hat{\theta})$ where $x$ is a point in the (N-dimensional) parameter space, and $\hat{x}$ is the point corresponding to the best fit. In this test-statistic, the nuisance parameters are profiled, separately both in the numerator and denominator. +- use the profile likelihood ratio as the test statistic, $q(x) = - 2 \ln \mathcal{L}(\mathrm{data}|x,\hat{\theta}_{x})/\mathcal{L}(\mathrm{data}|\hat{x},\hat{\theta})$ where $x$ is a point in the (N-dimensional) parameter space, and $\hat{x}$ is the point corresponding to the best fit. In this test statistic, the nuisance parameters are profiled, both in the numerator and denominator. - for each point $x$: - compute the observed test statistic $q_{\mathrm{obs}}(x)$ - compute the expected distribution of $q(x)$ under the hypothesis of $x$ as the true value. @@ -988,7 +988,7 @@ The Feldman-Cousins (FC) procedure for computing confidence intervals for a gene With a critical value $\alpha$. -In `combine`, you can perform this test on each individual point (**param1, param2,...**) = (**value1,value2,...**) by doing, +In Combine, you can perform this test on each individual point (**param1, param2,...**) = (**value1,value2,...**) by doing, ```sh combine workspace.root -M HybridNew --LHCmode LHC-feldman-cousins --clsAcc 0 --singlePoint param1=value1,param2=value2,param3=value3,... --saveHybridResult [Other options for toys, iterations etc as with limits] @@ -997,7 +997,7 @@ combine workspace.root -M HybridNew --LHCmode LHC-feldman-cousins --clsAcc 0 --s The point belongs to your confidence region if $p_{x}$ is larger than $\alpha$ (e.g. 0.3173 for a 1σ region, $1-\alpha=0.6827$). !!! warning - You should not use this method without the option `--singlePoint`. Although combine will not complain, the algorithm to find the crossing will only find a single crossing and therefore not find the correct interval. Instead you should calculate the Feldman-Cousins intervals as described above. + You should not use this method without the option `--singlePoint`. Although Combine will not complain, the algorithm to find the crossing will only find a single crossing and therefore not find the correct interval. Instead you should calculate the Feldman-Cousins intervals as described above. ### Physical boundaries @@ -1007,7 +1007,7 @@ Imposing physical boundaries (such as requiring $\mu>0$ for a signal strength) i --setParameterRanges param1=param1_min,param1_max:param2=param2_min,param2_max .... ``` -The boundary is imposed by **restricting the parameter range(s)** to those set by the user, in the fits. Note that this is a trick! The actual fitted value, as one of an ensemble of outcomes, can fall outside of the allowed region, while the boundary should be imposed on the physical parameter. The effect of restricting the parameter value in the fit is such that the test-statistic is modified as follows ; +The boundary is imposed by **restricting the parameter range(s)** to those set by the user, in the fits. Note that this is a trick! The actual fitted value, as one of an ensemble of outcomes, can fall outside of the allowed region, while the boundary should be imposed on the physical parameter. The effect of restricting the parameter value in the fit is such that the test statistic is modified as follows ; $q(x) = - 2 \ln \mathcal{L}(\mathrm{data}|x,\hat{\theta}_{x})/\mathcal{L}(\mathrm{data}|\hat{x},\hat{\theta})$, if $\hat{x}$ in contained in the bounded range @@ -1018,9 +1018,7 @@ $q(x) = - 2 \ln \mathcal{L}(\mathrm{data}|x,\hat{\theta}_{x})/\mathcal{L}(\mathr This can sometimes be an issue as Minuit may not know if has successfully converged when the minimum lies outside of that range. If there is no upper/lower boundary, just set that value to something far from the region of interest. !!! info - One can also imagine imposing the boundaries by first allowing Minuit to find the minimum in the *un-restricted* region and then setting the test-statistic to that above in the case that minimum lies outside the physical boundary. This would avoid potential issues of convergence - If you are interested in implementing this version in combine, please contact the development team. - -As in general for `HybridNew`, you can split the task into multiple tasks (grid and/or batch) and then merge the outputs, as described in the [combineTool for job submission](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part3/runningthetool/#combinetool-for-job-submission) section. + One can also imagine imposing the boundaries by first allowing Minuit to find the minimum in the *unrestricted* region and then setting the test statistic to that in the case that minimum lies outside the physical boundary. This would avoid potential issues of convergence. If you are interested in implementing this version in Combine, please contact the development team. ### Extracting contours from results files @@ -1029,27 +1027,27 @@ As in general for `HybridNew`, you can split the task into multiple tasks (grid #### Extracting 1D intervals -For *one-dimensional* models only, and if the parameter behaves like a cross-section, the code is somewhat able to do interpolation and determine the values of your parameter on the contour (just like it does for the limits). As with limits, read in the grid of points and extract 1D intervals using, +For *one-dimensional* models only, and if the parameter behaves like a cross section, the code is able to interpolate and determine the values of your parameter on the contour (just like it does for the limits). As with limits, read in the grid of points and extract 1D intervals using, ```sh -combine workspace.root -M HybridNew --LHCmode LHC-feldman-cousins --readHybridResults --grid=mergedfile.root --cl <1-alpha> +combine workspace.root -M HybridNew --LHCmode LHC-feldman-cousins --readHybridResults --toysFile=mergedfile.root --cl <1-alpha> ``` -The output tree will contain the values of the POI which crosses the critical value ($\alpha$) - i.e, the boundaries of the confidence intervals, +The output tree will contain the values of the POI that crosses the critical value ($\alpha$) - i.e, the boundaries of the confidence intervals. You can produce a plot of the value of $p_{x}$ vs the parameter of interest $x$ by adding the option `--plot `. #### Extracting 2D contours -There is a tool for extracting *2D contours* from the output of `HybridNew` located in `test/makeFCcontour.py` provided the option `--saveHybridResult` was included when running `HybridNew`. It can be run with the usual combine output files (or several of them) as input, +There is a tool for extracting *2D contours* from the output of `HybridNew` located in `test/makeFCcontour.py`. This can be used provided the option `--saveHybridResult` was included when running `HybridNew`. It can be run with the usual Combine output files (or several of them) as input, ```sh ./test/makeFCcontour.py toysfile1.root toysfile2.root .... [options] -out outputfile.root ``` -To extract 2D contours, the names of each parameter must be given `--xvar poi_x --yvar poi_y`. The output will be a root file containing a 2D histogram of value of $p_{x,y}$ for each point $(x,y)$ which can be used to draw 2D contours. There will also be a histogram containing the number of toys found for each point. +To extract 2D contours, the names of each parameter must be given `--xvar poi_x --yvar poi_y`. The output will be a ROOT file containing a 2D histogram of value of $p_{x,y}$ for each point $(x,y)$ which can be used to draw 2D contours. There will also be a histogram containing the number of toys found for each point. -There are several options for reducing the running time (such as setting limits on the region of interest or the minimum number of toys required for a point to be included) Finally, adding the option `--storeToys` in this python tool will add histograms for each point to the output file of the test-statistic distribution. This will increase the momory usage however as all of the toys will be stored in memory. +There are several options for reducing the running time, such as setting limits on the region of interest or the minimum number of toys required for a point to be included. Finally, adding the option `--storeToys` in this script will add histograms for each point to the output file of the test statistic distribution. This will increase the memory usage, as all of the toys will be kept in memory. diff --git a/docs/part3/debugging.md b/docs/part3/debugging.md index 92927a318ed..cecb0178fd2 100644 --- a/docs/part3/debugging.md +++ b/docs/part3/debugging.md @@ -1,6 +1,6 @@ # Debugging fits -When a fit fails there are several things you can do to investigate. Have a look at [these slides](https://indico.cern.ch/event/976099/contributions/4138476/attachments/2163625/3651175/CombineTutorial-2020-debugging.pdf) from the combine tutorial. +When a fit fails there are several things you can do to investigate. CMS users can have a look at [these slides](https://indico.cern.ch/event/976099/contributions/4138476/attachments/2163625/3651175/CombineTutorial-2020-debugging.pdf) from a previous Combine tutorial. This section contains a few pointers for some of the methods mentioned in the slides. ## Analyzing the NLL shape in each parameter diff --git a/docs/part3/nonstandard.md b/docs/part3/nonstandard.md index 347f7f805a3..fcc66ebe89e 100644 --- a/docs/part3/nonstandard.md +++ b/docs/part3/nonstandard.md @@ -1,18 +1,18 @@ # Advanced Use Cases -This section will cover some of the more specific use cases for combine which are not necessarily related to the main statistics results. +This section will cover some of the more specific use cases for Combine that are not necessarily related to the main results of the analysis. -## Fitting Diagnostics +## Fit Diagnostics -You may first want to look at the HIG PAG standard checks applied to all datacards if you want to diagnose your limit setting/fitting results which can be found [here](https://twiki.cern.ch/twiki/bin/view/CMS/HiggsWG/HiggsPAGPreapprovalChecks) +If you want to diagnose your limits/fit results, you may first want to look at the HIG PAG standard checks, which are applied to all datacards and can be found [here](https://twiki.cern.ch/twiki/bin/view/CMS/HiggsWG/HiggsPAGPreapprovalChecks). -If you have already found the higgs boson but it's an exotic one, instead of computing a limit or significance you might want to extract it's cross section by performing a maximum-likelihood fit. Or, more seriously, you might want to use this same package to extract the cross section of some other process (e.g. the di-boson production). Or you might want to know how well the data compares to you model, e.g. how strongly it constraints your other nuisance parameters, what's their correlation, etc. These general diagnostic tools are contained in the method `FitDiagnostics`. +If you have already found the Higgs boson but it's an exotic one, instead of computing a limit or significance you might want to extract its cross section by performing a maximum-likelihood fit. Alternatively, you might want to know how compatible your data and your model are, e.g. how strongly your nuisance parameters are constrained, to what extent they are correlated, etc. These general diagnostic tools are contained in the method `FitDiagnostics`. ``` combine -M FitDiagnostics datacard.txt ``` -The program will print out the result of the *two fits* performed with signal strength **r** (or first POI in the list) set to zero and a second with floating **r**. The output root tree will contain the best fit value for **r** and it's uncertainty. You will also get a `fitDiagnostics.root` file containing the following objects: +The program will print out the result of *two fits*. The first one is performed with the signal strength **r** (or the first POI in the list, in models with multiple POIs) set to zero and a second with floating **r**. The output ROOT tree will contain the best fit value for **r** and its uncertainty. You will also get a `fitDiagnostics.root` file containing the following objects: | Object | Description | |------------------------|---------------------------------------------------------------------------------------------------------------------------------------| @@ -23,22 +23,22 @@ The program will print out the result of the *two fits* performed with signal st | **`tree_fit_sb`** | `TTree` of fitted nuisance parameter values and constraint terms (_In) with floating signal strength | | **`tree_fit_b`** | `TTree` of fitted nuisance parameter values and constraint terms (_In) with signal strength set to 0 | -by including the option `--plots`, you will additionally find the following contained in the root file . +by including the option `--plots`, you will additionally find the following contained in the ROOT file: | Object | Description | |------------------------|---------------------------------------------------------------------------------------------------------------------------------------| | **`covariance_fit_s`** | `TH2D` Covariance matrix of the parameters in the fit with floating signal strength | | **`covariance_fit_b`** | `TH2D` Covariance matrix of the parameters in the fit with signal strength set to zero | -| **`category_variable_prefit`** | `RooPlot` plot of the prefit pdfs with the data (or toy if running with `-t` overlaid) | -| **`category_variable_fit_b`** | `RooPlot` plot of the pdfs from the background only fit with the data (or toy if running with `-t` overlaid) | -| **`category_variable_fit_s`** | `RooPlot` plot of the pdfs from the signal+background fit with the data (or toy if running with `-t` overlaid) | +| **`category_variable_prefit`** | `RooPlot` plot of the pre-fit PDFs/templates with the data (or toy if running with `-t`) overlaid | +| **`category_variable_fit_b`** | `RooPlot` plot of the PDFs/templates from the background only fit with the data (or toy if running with `-t`) overlaid | +| **`category_variable_fit_s`** | `RooPlot` plot of the PDFs/templates from the signal+background fit with the data (or toy if running with `-t`) overlaid | -where for the `RooPlot` objects, you will get one per category in the likelihood and one per variable if using a multi-dimensional dataset. You will also get a png file for each of these additional objects. +There will be one `RooPlot` object per category in the likelihood, and one per variable if using a multi-dimensional dataset. For each of these additional objects a png file will also be produced. !!! info - If you use the option `--name` this name will be inserted into the file name for this output file too. + If you use the option `--name`, this additional name will be inserted into the file name for this output file. -As well as values of the constrained nuisance parameters (and their constraint values) in the toys, you will also find branches for the number of "bad" nll calls (which you should check is not too large) and the status of the fit `fit_status`. The fit status is computed as follows +As well as the values of the constrained nuisance parameters (and their constraints), you will also find branches for the number of "bad" nll calls (which you should check is not too large) and the status of the fit `fit_status`. The fit status is computed as follows ``` fit_status = 100 * hesse_status + 10 * minos_status + minuit_summary_status @@ -46,21 +46,21 @@ fit_status = 100 * hesse_status + 10 * minos_status + minuit_summary_status The `minuit_summary_status` is the usual status from Minuit, details of which can be found [here](https://root.cern.ch/root/htmldoc/ROOT__Minuit2__Minuit2Minimizer.html#ROOT__Minuit2__Minuit2Minimizer:Minimize). For the other status values, check these documentation links for the [`hesse_status`](https://root.cern.ch/root/htmldoc/ROOT__Minuit2__Minuit2Minimizer.html#ROOT__Minuit2__Minuit2Minimizer:Hesse) and the [`minos_status`](https://root.cern.ch/root/htmldoc/ROOT__Minuit2__Minuit2Minimizer.html#ROOT__Minuit2__Minuit2Minimizer:GetMinosError). -A fit status of -1 indicates that the fit failed (Minuit summary was not 0 or 1) and hence the fit is **not** valid. +A fit status of -1 indicates that the fit failed (Minuit summary was not 0 or 1) and hence the fit result is **not** valid. ### Fit options -- If you need only the signal+background fit, you can run with `--justFit`. This can be useful if the background-only fit is not interesting or not converging (e.g. if the significance of your signal is very very large) -- You can use `--rMin` and `--rMax` to set the range of the first POI; a range that is not too large compared to the uncertainties you expect from the fit usually gives more stable and accurate results. -- By default, the uncertainties are computed using MINOS for the first POI and HESSE for all other parameters (and hence they will be symmetric for the nuisance parameters). You can run MINOS for *all* parameters using the option `--minos all`, or for *none* of the parameters using `--minos none`. Note that running MINOS is slower so you should only consider using it if you think the HESSE uncertainties are not accurate. -- If MINOS or HESSE fails to converge, you can try running with `--robustFit=1` that will do a slower but more robust likelihood scan; this can be further controlled by the parameter `--stepSize` (the default is 0.1, and is relative to the range of the parameter) -- You can set the strategy and tolerance when using the `--robustFit` option using the options `setRobustFitAlgo` (default is `Minuit2,migrad`), `setRobustFitStrategy` (default is 0) and `--setRobustFitTolerance` (default is 0.1). If these options are not set, the defaults (set using `cminDefaultMinimizerX` options) will be used. You can also tune the accuracy of the routine used to find the crossing points of the likelihood using the option `--setCrossingTolerance` (default is set to 0.0001) -- If you find the covariance matrix provided by HESSE is not accurate (i.e. `fit_s->Print()` reports this was forced positive-definite) then a custom HESSE-style calculation of the covariance matrix can be used instead. This is enabled by running FitDiagnostics with the `--robustHesse 1` option. Please note that the status reported by `RooFitResult::Print()` will contain `covariance matrix quality: Unknown, matrix was externally provided` when robustHesse is used, this is normal and does not indicate a problem. NB: one feature of the robustHesse algorithm is that if it still cannot calculate a positive-definite covariance matrix it will try to do so by dropping parameters from the hessian matrix before inverting. If this happens it will be reported in the output to the screen. +- If you only want to run the signal+background fit, and do not need the output file, you can run with `--justFit`. In case you would like to run only the signal+background fit but would like to produce the output file, you should use the option `--skipBOnlyFit` instead. +- You can use `--rMin` and `--rMax` to set the range of the first POI; a range that is not too large compared with the uncertainties you expect from the fit usually gives more stable and accurate results. +- By default, the uncertainties are computed using MINOS for the first POI and HESSE for all other parameters. For the nuisance parameters the uncertainties will therefore be symmetric. You can run MINOS for *all* parameters using the option `--minos all`, or for *none* of the parameters using `--minos none`. Note that running MINOS is slower so you should only consider using it if you think the HESSE uncertainties are not accurate. +- If MINOS or HESSE fails to converge, you can try running with `--robustFit=1`. This will do a slower, but more robust, likelihood scan, which can be further controlled with the parameter `--stepSize` (the default value is 0.1, and is relative to the range of the parameter). +- The strategy and tolerance when using the `--robustFit` option can be set using the options `setRobustFitAlgo` (default is `Minuit2,migrad`), `setRobustFitStrategy` (default is 0) and `--setRobustFitTolerance` (default is 0.1). If these options are not set, the defaults (set using `cminDefaultMinimizerX` options) will be used. You can also tune the accuracy of the routine used to find the crossing points of the likelihood using the option `--setCrossingTolerance` (the default is set to 0.0001) +- If you find the covariance matrix provided by HESSE is not accurate (i.e. `fit_s->Print()` reports this was forced positive-definite) then a custom HESSE-style calculation of the covariance matrix can be used instead. This is enabled by running `FitDiagnostics` with the `--robustHesse 1` option. Please note that the status reported by `RooFitResult::Print()` will contain `covariance matrix quality: Unknown, matrix was externally provided` when robustHesse is used, this is normal and does not indicate a problem. NB: one feature of the robustHesse algorithm is that if it still cannot calculate a positive-definite covariance matrix it will try to do so by dropping parameters from the hessian matrix before inverting. If this happens it will be reported in the output to the screen. - For other fitting options see the [generic minimizer options](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/wiki/runningthetool#generic-minimizer-options) section. ### Fit parameter uncertainties -If you get a warning message when running `FitDiagnostics` which says `Unable to determine uncertainties on all fit parameters`. This means the covariance matrix calculated in FitDiagnostics was not correct. +If you get a warning message when running `FitDiagnostics` that says `Unable to determine uncertainties on all fit parameters`. This means the covariance matrix calculated in `FitDiagnostics` was not correct. The most common problem is that the covariance matrix is forced positive-definite. In this case the constraints on fit parameters as taken from the covariance matrix are incorrect and should not be used. In particular, if you want to make post-fit plots of the distribution used in the signal extraction fit and are extracting the uncertainties on the signal and background expectations from the covariance matrix, the resulting values will not reflect the truth if the covariance matrix was incorrect. By default if this happens and you passed the `--saveWithUncertainties` flag when calling `FitDiagnostics`, this option will be ignored as calculating the uncertainties would lead to incorrect results. This behaviour can be overridden by passing `--ignoreCovWarning`. @@ -73,103 +73,103 @@ A discontinuity in the NLL function or its derivatives at or near the minimum. If you are aware that your analysis has any of these features you could try resolving these. Setting `--cminDefaultMinimizerStrategy 0` can also help with this problem. -### Pre and post fit nuisance parameters and pulls +### Pre- and post-fit nuisance parameters -It is possible to compare pre-fit and post-fit nuisance parameters with the script [diffNuisances.py](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/test/diffNuisances.py). Taking as input a `fitDiagnostics.root` file, the script will by default print out the parameters which have changed significantly w.r.t. their initial estimate. For each of those parameters, it will print out the shift in value and the post-fit uncertainty, both normalized to the input values, and the linear correlation between the parameter and the signal strength. +It is possible to compare pre-fit and post-fit nuisance parameter values with the script [diffNuisances.py](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/test/diffNuisances.py). Taking as input a `fitDiagnostics.root` file, the script will by default print out the parameters that have changed significantly with respect to their initial estimate. For each of those parameters, it will print out the shift in value and the post-fit uncertainty, both normalized to the initial (pre-fit) value. The linear correlation between the parameter and the signal strength will also be printed. python diffNuisances.py fitDiagnostics.root -The script has several options to toggle the thresholds used to decide if a parameter has changed significantly, to get the printout of the absolute value of the nuisance parameters, and to get the output in another format for easy cut-n-paste (supported formats are `html`, `latex`, `twiki`). To print *all* of the parameters, use the option `--all`. +The script has several options to toggle the thresholds used to decide whether a parameter has changed significantly, to get the printout of the absolute value of the nuisance parameters, and to get the output in another format for use on a webpage or in a note (the supported formats are `html`, `latex`, `twiki`). To print *all* of the parameters, use the option `--all`. -The output by default will be the changes in the nuisance parameter values and uncertainties, relative to their initial (pre-fit) values (usually relative to initial values of 0 and 1 for most nuisance types). +By default, the changes in the nuisance parameter values and uncertainties are given relative to their initial (pre-fit) values (usually relative to initial values of 0 and 1 for most nuisance types). -The values in the output will be $(\theta-\theta_{I})/\sigma_{I}$ if the nuisance has a pre-fit uncertainty, otherwise it will be $\theta-\theta_{I}$ if not (eg, a `flatParam` has no pre-fit uncertainty). +The values in the output will be $(\theta-\theta_{I})/\sigma_{I}$ if the nuisance has a pre-fit uncertainty, otherwise they will be $\theta-\theta_{I}$ (for example, a `flatParam` has no pre-fit uncertainty). -The uncertainty reported will be the ratio $\sigma/\sigma_{I}$ - i.e the ratio of the post-fit to the pre-fit uncertainty. If there is no pre-fit uncertainty (as for `flatParam` nuisances) then the post-fit uncertainty is shown. +The reported uncertainty will be the ratio $\sigma/\sigma_{I}$ - i.e the ratio of the post-fit to the pre-fit uncertainty. If there is no pre-fit uncertainty (as for `flatParam` nuisances), the post-fit uncertainty is shown. -With the option `--abs`, instead the pre-fit and post-fit values and (asymmetric) uncertainties will be reported in full. +To print the pre-fit and post-fit values and (asymmetric) uncertainties, rather than the ratios, the option `--abs` can be used. !!! info - We recommend you include the options `--abs` and `--all` to get the full information on all of the parameters (including unconstrained nuisance parameters) at least once when checking your datacards. + We recommend that you include the options `--abs` and `--all` to get the full information on all of the parameters (including unconstrained nuisance parameters) at least once when checking your datacards. -If instead of the plain values, you wish to report the _pulls_, you can do so with the option `--pullDef X` with `X` being one of the following options; You should note that since the pulls below are only defined when the pre-fit uncertainty exists, *nothing* will be reported for parameters which have no prior constraint (except in the case of the `unconstPullAsym` choice as described below). You may want to run without this option and `--all` to get information on those parameters. +If instead of the nuisance parameter values, you wish to report the _pulls_, you can do so using the option `--pullDef X`, with `X` being one of the options listed below. You should note that since the pulls below are only defined when the pre-fit uncertainty exists, *nothing* will be reported for parameters that have no prior constraint (except in the case of the `unconstPullAsym` choice as described below). You may want to run without this option and `--all` to get information about those parameters. -- `relDiffAsymErrs`: This is the same as the default output of the tool except that only constrained parameters (pre-fit uncertainty defined) are reported. The error is also reported and calculated as $\sigma/\sigma_{I}$. +- `relDiffAsymErrs`: This is the same as the default output of the tool, except that only constrained parameters (i.e. where the pre-fit uncertainty is defined) are reported. The uncertainty is also reported and calculated as $\sigma/\sigma_{I}$. -- `unconstPullAsym`: Report the pull as $\frac{\theta-\theta_{I}}{\sigma}$ where $\theta_{I}$ and $\sigma$ are the initial value and **post-fit** uncertainty of that nuisance parameter. The pull defined in this way will have no error bar, but *all* nuisance parameters will have a result in this case. +- `unconstPullAsym`: Report the pull as $\frac{\theta-\theta_{I}}{\sigma}$, where $\theta_{I}$ and $\sigma$ are the initial value and **post-fit** uncertainty of that nuisance parameter. The pull defined in this way will have no error bar, but *all* nuisance parameters will have a result in this case. -- `compatAsym`: The pull is defined as $\frac{\theta-\theta_{D}}{\sqrt{\sigma^{2}+\sigma_{D}^{2}}}$, where $\theta_{D}$ and $\sigma_{D}$ are calculated as $\sigma_{D} = (\frac{1}{\sigma^{2}} - \frac{1}{\sigma_{I}^{2}})^{-1}$ and $\theta_{D} = \sigma_{D}(\theta - \frac{\theta_{I}}{\sigma_{I}^{2}})$, where $\theta_{I}$ and $\sigma_{I}$ are the initial value and uncertainty of that nuisance parameter. This can be thought of as a _compatibility_ between the initial measurement (prior) an imagined measurement where only the data (with no constraint) is used to measure the nuisance parameter. There is no error bar associated to this value. +- `compatAsym`: The pull is defined as $\frac{\theta-\theta_{D}}{\sqrt{\sigma^{2}+\sigma_{D}^{2}}}$, where $\theta_{D}$ and $\sigma_{D}$ are calculated as $\sigma_{D} = (\frac{1}{\sigma^{2}} - \frac{1}{\sigma_{I}^{2}})^{-1}$ and $\theta_{D} = \sigma_{D}(\theta - \frac{\theta_{I}}{\sigma_{I}^{2}})$. In this expression $\theta_{I}$ and $\sigma_{I}$ are the initial value and uncertainty of that nuisance parameter. This can be thought of as a _compatibility_ between the initial measurement (prior) and an imagined measurement where only the data (with no constraint on the nuisance parameter) is used to measure the nuisance parameter. There is no error bar associated with this value. - `diffPullAsym`: The pull is defined as $\frac{\theta-\theta_{I}}{\sqrt{\sigma_{I}^{2}-\sigma^{2}}}$, where $\theta_{I}$ and $\sigma_{I}$ are the pre-fit value and uncertainty (from [L. Demortier and L. Lyons](http://physics.rockefeller.edu/luc/technical_reports/cdf5776_pulls.pdf)). If the denominator is close to 0 or the post-fit uncertainty is larger than the pre-fit (usually due to some failure in the calculation), the pull is not defined and the result will be reported as `0 +/- 999`. -If using `--pullDef`, the results for *all* parameters for which the pull can be calculated will be shown (i.e `--all` will be set to `true`), not just those which have moved by some metric. +If using `--pullDef`, the results for *all* parameters for which the pull can be calculated will be shown (i.e `--all` will be set to `true`), not just those that have moved by some metric. -This script has the option (`-g outputfile.root`) to produce plots of the fitted _values_ of the nuisance parameters and their post-fit, asymmetric uncertainties. Instead, the pulls defined using one of the options above, can be plotted using the option `--pullDef X`. In addition this will produce a plot showing directly a comparison of the post-fit to pre-fit nuisance (symmetrized) uncertainties. +This script has the option (`-g outputfile.root`) to produce plots of the fitted _values_ of the nuisance parameters and their post-fit, asymmetric uncertainties. Instead, the pulls defined using one of the options above, can be plotted using the option `--pullDef X`. In addition this will produce a plot showing a comparison between the post-fit and pre-fit (symmetrized) uncertainties on the nuisance parameters. !!! info - In the above options, if an asymmetric uncertainty is associated to the nuisance parameter, then the choice of which uncertainty is used in the definition of the pull will depend on the sign of $\theta-\theta_{I}$. + In the above options, if an asymmetric uncertainty is associated with the nuisance parameter, then the choice of which uncertainty is used in the definition of the pull will depend on the sign of $\theta-\theta_{I}$. ### Normalizations -For a certain class of models, like those made from datacards for shape-based analysis, the tool can also compute and save to the output root file the best fit yields of all processes. If this feature is turned on with the option `--saveNormalizations`, the file will also contain three RooArgSet `norm_prefit`, `norm_fit_s`, `norm_fit_b` objects each containing one RooConstVar for each channel `xxx` and process `yyy` with name **`xxx/yyy`** and value equal to the best fit yield. You can use `RooRealVar::getVal` and `RooRealVar::getError` to estimate both the post-(or pre-)fit values and uncertainties of these normalisations. +For a certain class of models, like those made from datacards for shape-based analysis, the tool can also compute and save the best fit yields of all processes to the output ROOT file. If this feature is turned on with the option `--saveNormalizations`, the file will also contain three `RooArgSet` objects `norm_prefit`, `norm_fit_s`, and `norm_fit_b`. These each contain one `RooConstVar` for each channel `xxx` and process `yyy` with name **`xxx/yyy`** and value equal to the best fit yield. You can use `RooRealVar::getVal` and `RooRealVar::getError` to estimate both the post-fit (or pre-fit) values and uncertainties of these normalizations. -The sample pyroot macro [mlfitNormsToText.py](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/test/mlfitNormsToText.py) can be used to convert the root file into a text table with four columns: channel, process, yield from the signal+background fit and yield from the background-only fit. To include the uncertainties in the table, add the option `--uncertainties` +The sample `pyROOT` macro [mlfitNormsToText.py](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/test/mlfitNormsToText.py) can be used to convert the ROOT file into a text table with four columns: channel, process, yield from the signal+background fit, and yield from the background-only fit. To include the uncertainties in the table, add the option `--uncertainties`. !!! warning - Note that when running with multiple toys, the `norm_fit_s`, `norm_fit_b` and `norm_prefit` objects will be stored for the _last_ toy dataset generated and so may not be useful to you. + Note that when running with multiple toys, the `norm_fit_s`, `norm_fit_b`, and `norm_prefit` objects will be stored for the _last_ toy dataset generated and so may not be useful to you. -Note that this procedure works only for "extended likelihoods" like the ones used in shape-based analysis, not for the cut-and-count datacards. You can however convert a cut-and-count datacard in an equivalent shape-based one by adding a line `shapes * * FAKE` in the datacard after the `imax`, `jmax`, `kmax` or using `combineCards.py countingcard.txt -S > shapecard.txt`. +Note that this procedure works only for "extended likelihoods" like the ones used in shape-based analysis, not for counting experiment datacards. You can however convert a counting experiment datacard to an equivalent shape-based one by adding a line `shapes * * FAKE` in the datacard after the `imax`, `jmax`, `kmax` lines. Alternatively, you can use `combineCards.py countingcard.txt -S > shapecard.txt` to do this conversion. #### Per-bin norms for shape analyses -If you have a shape based analysis, you can also (instead) include the option `--savePredictionsPerToy`. With this option, additional branches will be filled in the three output trees contained in `fitDiagnostics.root`. +If you have a shape-based analysis, you can include the option `--savePredictionsPerToy`. With this option, additional branches will be filled in the three output trees contained in `fitDiagnostics.root`. -The normalisation values for each toy will be stored in the branches inside the `TTrees` named **n\_exp[\_final]\_binxxx\_proc\_yyy**. The **\_final** will only be there if there are systematics affecting this process. +The normalization values for each toy will be stored in the branches inside the `TTrees` named **n\_exp[\_final]\_binxxx\_proc\_yyy**. The **\_final** will only be there if there are systematic uncertainties affecting this process. -Additionally, there will be filled branches which provide the value of the expected **bin** content for each process, in each channel. These will are named as **n\_exp[\_final]\_binxxx\_proc\_yyy_i** (where **\_final** will only be in the name if there are systematics affecting this process) for channel `xxx`, process `yyy` bin number `i`. In the case of the post-fit trees (`tree_fit_s/b`), these will be resulting expectations from the _fitted_ models, while for the pre-fit tree, they will be the expectation from the generated model (i.e if running toys with `-t N` and using `--genNuisances`, they will be randomised for each toy). These can be useful, for example, for calculating correlations/covariances between different bins, in different channels or processes, within the model from toys. +Additionally, there will be branches that provide the value of the expected **bin** content for each process, in each channel. These are named **n\_exp[\_final]\_binxxx\_proc\_yyy_i** (where **\_final** will only be in the name if there are systematic uncertainties affecting this process) for channel `xxx`, process `yyy`, bin number `i`. In the case of the post-fit trees (`tree_fit_s/b`), these will be the expectations from the _fitted_ models, while for the pre-fit tree, they will be the expectation from the generated model (i.e if running toys with `-t N` and using `--genNuisances`, they will be randomized for each toy). These can be useful, for example, for calculating correlations/covariances between different bins, in different channels or processes, within the model from toys. !!! info - Be aware that for *unbinned* models, a binning scheme is adopted based on the `RooRealVar::getBinning` for the observable defining the shape, if it exists, or combine will adopt some appropriate binning for each observable. + Be aware that for *unbinned* models, a binning scheme is adopted based on the `RooRealVar::getBinning` for the observable defining the shape, if it exists, or Combine will adopt some appropriate binning for each observable. ### Plotting -`FitDiagnostics` can also produce pre- and post-fit plots the model in the same directory as `fitDiagnostics.root` along with the data. To get them, you have to specify the option `--plots`, and then *optionally specify* what are the names of the signal and background pdfs, e.g. `--signalPdfNames='ggH*,vbfH*'` and `--backgroundPdfNames='*DY*,*WW*,*Top*'` (by default, the definitions of signal and background are taken from the datacard). For models with more than 1 observable, a separate projection onto each observable will be produced. +`FitDiagnostics` can also produce pre- and post-fit plots of the model along with the data. They will be stored in the same directory as `fitDiagnostics.root`. To obtain these, you have to specify the option `--plots`, and then *optionally specify* the names of the signal and background PDFs/templates, e.g. `--signalPdfNames='ggH*,vbfH*'` and `--backgroundPdfNames='*DY*,*WW*,*Top*'` (by default, the definitions of signal and background are taken from the datacard). For models with more than 1 observable, a separate projection onto each observable will be produced. -An alternative is to use the options `--saveShapes`. The result will be additional folders in `fitDiagnostics.root` for each category, with pre and post-fit distributions of the signals and backgrounds as TH1s and the data as TGraphAsymmErrors (with Poisson intervals as error bars). +An alternative is to use the option `--saveShapes`. This will add additional folders in `fitDiagnostics.root` for each category, with pre- and post-fit distributions of the signals and backgrounds as TH1s, and the data as `TGraphAsymmErrors` (with Poisson intervals as error bars). !!! info - If you want to save post-fit shapes at a specific r value, add the options `--customStartingPoint` and `--skipSBFit`, and set the r value. The result will appear in **shapes\_fit\_b**, as described below. + If you want to save post-fit shapes at a specific **r** value, add the options `--customStartingPoint` and `--skipSBFit`, and set the **r** value. The result will appear in **shapes\_fit\_b**, as described below. -Three additional folders (**shapes\_prefit**, **shapes\_fit\_sb** and **shapes\_fit\_b** ) will contain the following distributions, +Three additional folders (**shapes\_prefit**, **shapes\_fit\_sb** and **shapes\_fit\_b** ) will contain the following distributions: | Object | Description | |------------------------|---------------------------------------------------------------------------------------------------------------------------------------| | **`data`** | `TGraphAsymmErrors` containing the observed data (or toy data if using `-t`). The vertical error bars correspond to the 68% interval for a Poisson distribution centered on the observed count. | -| **`$PROCESS`** (id <= 0) | `TH1F` for each signal process in channel, named as in the datacard | -| **`$PROCESS`** (id > 0) | `TH1F` for each background process in channel, named as in the datacard| +| **`$PROCESS`** (id <= 0) | `TH1F` for each signal process in each channel, named as in the datacard | +| **`$PROCESS`** (id > 0) | `TH1F` for each background process in each channel, named as in the datacard| | **`total_signal`** | `TH1F` Sum over the signal components| | **`total_background`** | `TH1F` Sum over the background components| | **`total`** | `TH1F` Sum over all of the signal and background components | -The above distributions are provided *for each channel included in the datacard*, in separate sub-folders, named as in the datacard: There will be one sub-folder per channel. +The above distributions are provided *for each channel included in the datacard*, in separate subfolders, named as in the datacard: There will be one subfolder per channel. !!! warning - The pre-fit signal is by default for `r=1` but this can be modified using the option `--preFitValue`. + The pre-fit signal is evaluated for `r=1` by default, but this can be modified using the option `--preFitValue`. -The distributions and normalisations are guaranteed to give the correct interpretation: +The distributions and normalizations are guaranteed to give the correct interpretation: -- For shape datacards whose inputs are TH1, the histograms/data points will have the bin number as the x-axis and the content of each bin will be a number of events. +- For shape datacards whose inputs are `TH1`, the histograms/data points will have the bin number as the x-axis and the content of each bin will be a number of events. -- For datacards whose inputs are RooAbsPdf/RooDataHists, the x-axis will correspond to the observable and the bin content will be the PDF density / events divided by the bin width. This means the absolute number of events in a given bin, i, can be obtained from `h.GetBinContent(i)*h.GetBinWidth(i)` or similar for the data graphs. **Note** that for *unbinned* analyses combine will make a reasonable guess as to an appropriate binning. +- For datacards whose inputs are `RooAbsPdf`/`RooDataHist`s, the x-axis will correspond to the observable and the bin content will be the PDF density / events divided by the bin width. This means the absolute number of events in a given bin, i, can be obtained from `h.GetBinContent(i)*h.GetBinWidth(i)` or similar for the data graphs. **Note** that for *unbinned* analyses Combine will make a reasonable guess as to an appropriate binning. Uncertainties on the shapes will be added with the option `--saveWithUncertainties`. These uncertainties are generated by re-sampling of the fit covariance matrix, thereby accounting for the full correlation between the parameters of the fit. !!! warning - It may be tempting to sum up the uncertainties in each bin (in quadrature) to get the *total* uncertainty on a process however, this is (usually) incorrect as doing so would not account for correlations *between the bins*. Instead you can refer to the uncertainties which will be added to the post-fit normalizations described above. + It may be tempting to sum up the uncertainties in each bin (in quadrature) to get the *total* uncertainty on a process. However, this is (usually) incorrect, as doing so would not account for correlations *between the bins*. Instead you can refer to the uncertainties which will be added to the post-fit normalizations described above. Additionally, the covariance matrix **between** bin yields (or yields/bin-widths) in each channel will also be saved as a `TH2F` named **total_covar**. If the covariance between *all bins* across *all channels* is desired, this can be added using the option `--saveOverallShapes`. Each folder will now contain additional distributions (and covariance matrices) corresponding to the concatenation of the bins in each channel (and therefore the covaraince between every bin in the analysis). The bin labels should make it clear as to which bin corresponds to which channel. @@ -187,7 +187,7 @@ $ root -l plotParametersFromToys("fitDiagnosticsToys.root","fitDiagnosticsData.root","workspace.root","r<0") ``` -The first argument is the name of the output file from running with toys, and the second and third (optional) arguments are the name of the file containing the result from a fit to the data and the workspace (created from `text2workspace.py`). The fourth argument can be used to specify a cut string applied to one of the branches in the tree which can be used to correlate strange behaviour with specific conditions. The output will be 2 pdf files (**`tree_fit_(s)b.pdf`**) and 2 root files (**`tree_fit_(s)b.root`**) containing canvases of the fit results of the tool. For details on the output plots, consult [AN-2012/317](http://cms.cern.ch/iCMS/user/noteinfo?cmsnoteid=CMS%20AN-2012/317). +The first argument is the name of the output file from running with toys, and the second and third (optional) arguments are the name of the file containing the result from a fit to the data and the workspace (created from `text2workspace.py`). The fourth argument can be used to specify a cut string applied to one of the branches in the tree, which can be used to correlate strange behaviour with specific conditions. The output will be 2 pdf files (**`tree_fit_(s)b.pdf`**) and 2 ROOT files (**`tree_fit_(s)b.root`**) containing canvases of the fit results of the tool. For details on the output plots, consult [AN-2012/317](http://cms.cern.ch/iCMS/user/noteinfo?cmsnoteid=CMS%20AN-2012/317). ## Scaling constraints @@ -205,17 +205,17 @@ To add a *constant scaling factor* we use the option `--X-rescale-nuisance`, eg text2workspace.py datacard.txt --X-rescale-nuisance '[some regular expression]' 0.5 -will create the workspace in which ever nuisance parameter whose name matches the specified regular expression will have the width of the gaussian constraint scaled by a factor 0.5. +will create the workspace in which every nuisance parameter whose name matches the specified regular expression will have the width of the gaussian constraint scaled by a factor 0.5. Multiple `--X-rescale-nuisance` options can be specified to set different scalings for different nuisances (note that you actually have to write `--X-rescale-nuisance` each time as in `--X-rescale-nuisance 'theory.*' 0.5 --X-rescale-nuisance 'exp.*' 0.1`). -To add a *functional scaling factor* we use the option `--X-nuisance-function`, which works in a similar way. Instead of a constant value you should specify a RooFit factory expression. +To add a *functional scaling factor* we use the option `--X-nuisance-function`, which works in a similar way. Instead of a constant value you should specify a `RooFit` factory expression. -A typical case would be scaling by $1/\sqrt{L}$, where $L$ is a luminosity scale factor eg assuming there is some parameter in the datacard/workspace called **`lumiscale`**, +A typical case would be scaling by $1/\sqrt{L}$, where $L$ is a luminosity scale factor. For example, assuming there is some parameter in the datacard/workspace called **`lumiscale`**, text2workspace.py datacard.txt --X-nuisance-function '[some regular expression]' 'expr::lumisyst("1/sqrt(@0)",lumiscale[1])' -This factory syntax is quite flexible, but for our use case the typical format will be: `expr::[function name]("[formula]", [arg0], [arg1], ...)`. The `arg0`, `arg1` ... are represented in the formula by `@0`, `@1`,... placeholders. +This factory syntax is flexible, but for our use case the typical format will be: `expr::[function name]("[formula]", [arg0], [arg1], ...)`. The `arg0`, `arg1` ... are represented in the formula by `@0`, `@1`,... placeholders. !!! warning We are playing a slight trick here with the `lumiscale` parameter. At the point at which `text2workspace.py` is building these scaling terms the `lumiscale` for the `rateParam` has not yet been created. By writing `lumiscale[1]` we are telling RooFit to create this variable with an initial value of 1, and then later this will be re-used by the `rateParam` creation. @@ -231,7 +231,7 @@ The impact of a nuisance parameter (NP) θ on a parameter of interest (POI) μ i This is effectively a measure of the correlation between the NP and the POI, and is useful for determining which NPs have the largest effect on the POI uncertainty. -It is possible to use the `FitDiagnostics` method of combine with the option `--algo impact -P parameter` to calculate the impact of a particular nuisance parameter on the parameter(s) of interest. We will use the `combineTool.py` script to automate the fits (see the [`combineTool`](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/#combine-tool) section to check out the tool. +It is possible to use the `FitDiagnostics` method of Combine with the option `--algo impact -P parameter` to calculate the impact of a particular nuisance parameter on the parameter(s) of interest. We will use the `combineTool.py` script to automate the fits (see the [`combineTool`](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/#combine-tool) section to check out the tool. We will use an example workspace from the [$H\rightarrow\tau\tau$ datacard](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/data/tutorials/htt/125/htt_tt.txt), @@ -240,7 +240,7 @@ $ cp HiggsAnalysis/CombinedLimit/data/tutorials/htt/125/htt_tt.txt . $ text2workspace.py htt_tt.txt -m 125 ``` -Calculating the impacts is done in a few stages. First we just fit for each POI, using the `--doInitialFit` option with `combineTool.py`, and adding the `--robustFit 1` option that will be passed through to combine, +Calculating the impacts is done in a few stages. First we just fit for each POI, using the `--doInitialFit` option with `combineTool.py`, and adding the `--robustFit 1` option that will be passed through to Combine, combineTool.py -M Impacts -d htt_tt.root -m 125 --doInitialFit --robustFit 1 @@ -250,13 +250,13 @@ Next we perform a similar scan for each nuisance parameter with the `--doFits` o combineTool.py -M Impacts -d htt_tt.root -m 125 --robustFit 1 --doFits -Note that this will run approximately 60 scans, and to speed things up the option `--parallel X` can be given to run X combine jobs simultaneously. The batch and grid submission methods described in the [combineTool for job submission](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part3/runningthetool/#combinetool-for-job-submission) section can also be used. +Note that this will run approximately 60 scans, and to speed things up the option `--parallel X` can be given to run X Combine jobs simultaneously. The batch and grid submission methods described in the [combineTool for job submission](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part3/runningthetool/#combinetool-for-job-submission) section can also be used. -Once all jobs are completed the output can be collected and written into a json file: +Once all jobs are completed, the output can be collected and written into a json file: combineTool.py -M Impacts -d htt_tt.root -m 125 -o impacts.json -A plot summarising the nuisance parameter values and impacts can be made with `plotImpacts.py`, +A plot summarizing the nuisance parameter values and impacts can be made with `plotImpacts.py`, plotImpacts.py -i impacts.json -o impacts @@ -267,12 +267,12 @@ The first page of the output is shown below. The direction of the +1σ and -1σ impacts (i.e. when the NP is moved to its +1σ or -1σ values) on the POI indicates whether the parameter is correlated or anti-correlated with it. -For models with multiple POIs, the combine option `--redefineSignalPOIs X,Y,Z...` should be specified in all three of the `combineTool.py -M Impacts [...]` steps above. The final step will produce the `impacts.json` file which will contain the impacts for all the specified POIs. In the `plotImpacts.py` script, a particular POI can be specified with `--POI X`. +For models with multiple POIs, the Combine option `--redefineSignalPOIs X,Y,Z...` should be specified in all three of the `combineTool.py -M Impacts [...]` steps above. The final step will produce the `impacts.json` file which will contain the impacts for all the specified POIs. In the `plotImpacts.py` script, a particular POI can be specified with `--POI X`. !!! warning - The plot also shows the *best fit* value of the POI at the top and its uncertainty. You may wish to allow the range to go -ve (i.e using `--setParameterRanges` or `--rMin`) to avoid getting one-sided impacts! + The plot also shows the *best fit* value of the POI at the top and its uncertainty. You may wish to allow the range to go negative (i.e using `--setParameterRanges` or `--rMin`) to avoid getting one-sided impacts! -This script also accepts an optional json-file argument with `-`t which can be used to provide a dictionary for renaming parameters. A simple example would be to create a file `rename.json`, +This script also accepts an optional json-file argument with `-t`, which can be used to provide a dictionary for renaming parameters. A simple example would be to create a file `rename.json`, ```python { @@ -285,11 +285,11 @@ that will rename the POI label on the plot. !!! info Since `combineTool` accepts the usual options for combine you can also generate the impacts on an Asimov or toy dataset. -The left panel in the summary plot shows the value of $(\theta-\theta_{0})/\Delta_{\theta}$ where $\theta$ and $\theta_{0}$ are the **post** and **pre**-fit values of the nuisance parameter and $\Delta_{\theta}$ is the **pre**-fit uncertainty. The asymmetric error bars show the **post**-fit uncertainty divided by the **pre**-fit uncertainty meaning that parameters with error bars smaller than $\pm 1$ are constrained in the fit. As with the `diffNuisances.py` script, use the option `--pullDef` are defined (eg to show the *pull* instead). +The left panel in the summary plot shows the value of $(\theta-\theta_{0})/\Delta_{\theta}$ where $\theta$ and $\theta_{0}$ are the **post** and **pre**-fit values of the nuisance parameter and $\Delta_{\theta}$ is the **pre**-fit uncertainty. The asymmetric error bars show the **post**-fit uncertainty divided by the **pre**-fit uncertainty meaning that parameters with error bars smaller than $\pm 1$ are constrained in the fit. The pull will additionally be shown. As with the `diffNuisances.py` script, the option `--pullDef` can be used (to modify the definition of the *pull* that is shown). ## Breakdown of uncertainties -Often you will want to report the breakdown of your total (systematic) uncertainty on a measured parameter due to one or more groups of nuisance parameters. For example these groups could be theory uncertainties, trigger uncertainties, ... The prodecude to do this in combine is to sequentially freeze groups of nuisance parameters and subtract (in quadrature) from the total uncertainty. Below are the steps to do so. We will use the `data/tutorials/htt/125/htt_tt.txt` datacard for this. +Often you will want to report the breakdown of your total (systematic) uncertainty on a measured parameter due to one or more groups of nuisance parameters. For example, these groups could be theory uncertainties, trigger uncertainties, ... The prodecude to do this in Combine is to sequentially freeze groups of nuisance parameters and subtract (in quadrature) from the total uncertainty. Below are the steps to do so. We will use the `data/tutorials/htt/125/htt_tt.txt` datacard for this. 1. Add groups to the datacard to group nuisance parameters. Nuisance parameters not in groups will be considered as "rest" in the later steps. The lines should look like the following and you should add them to the end of the datacard ``` @@ -300,14 +300,14 @@ efficiency group = CMS_eff_b_8TeV CMS_eff_t_tt_8TeV CMS_fake_b_8TeV 2. Create the workspace with `text2workspace.py data/tutorials/htt/125/htt_tt.txt -m 125`. -3. Run a post-fit with all nuisance parameters floating and store the workspace in an output file - `combine data/tutorials/htt/125/htt_tt.root -M MultiDimFit --saveWorkspace -n htt.postfit` +3. Run a fit with all nuisance parameters floating and store the workspace in an output file - `combine data/tutorials/htt/125/htt_tt.root -M MultiDimFit --saveWorkspace -n htt.postfit` 4. Run a scan from the postfit workspace ``` combine higgsCombinehtt.postfit.MultiDimFit.mH120.root -M MultiDimFit -n htt.total --algo grid --snapshotName MultiDimFit --setParameterRanges r=0,4 ``` -5. Run additional scans using the post-fit workspace sequentially adding another group to the list of groups to freeze +5. Run additional scans using the post-fit workspace, sequentially adding another group to the list of groups to freeze ``` combine higgsCombinehtt.postfit.MultiDimFit.mH120.root -M MultiDimFit --algo grid --snapshotName MultiDimFit --setParameterRanges r=0,4 --freezeNuisanceGroups theory -n htt.freeze_theory @@ -316,32 +316,32 @@ combine higgsCombinehtt.postfit.MultiDimFit.mH120.root -M MultiDimFit --algo gri combine higgsCombinehtt.postfit.MultiDimFit.mH120.root -M MultiDimFit --algo grid --snapshotName MultiDimFit --setParameterRanges r=0,4 --freezeNuisanceGroups theory,calibration,efficiency -n htt.freeze_theory_calibration_efficiency ``` -6. Run one last scan freezing all of the constrained nuisances (this represents the statistics only uncertainty). +6. Run one last scan freezing all of the constrained nuisance parameters (this represents the statistical uncertainty only). ``` combine higgsCombinehtt.postfit.MultiDimFit.mH120.root -M MultiDimFit --algo grid --snapshotName MultiDimFit --setParameterRanges r=0,4 --freezeParameters allConstrainedNuisances -n htt.freeze_all ``` -7. Use the `combineTool` script `plot1D.py` to report the breakdown of uncertainties. +7. Use the `combineTool` script `plot1DScan.py` to report the breakdown of uncertainties. ``` plot1DScan.py higgsCombinehtt.total.MultiDimFit.mH120.root --main-label "Total Uncert." --others higgsCombinehtt.freeze_theory.MultiDimFit.mH120.root:"freeze theory":4 higgsCombinehtt.freeze_theory_calibration.MultiDimFit.mH120.root:"freeze theory+calibration":7 higgsCombinehtt.freeze_theory_calibration_efficiency.MultiDimFit.mH120.root:"freeze theory+calibration+efficiency":2 higgsCombinehtt.freeze_all.MultiDimFit.mH120.root:"stat only":6 --output breakdown --y-max 10 --y-cut 40 --breakdown "theory,calibration,efficiency,rest,stat" ``` -The final step calculates the contribution of each group of nuisances as the subtraction in quadrature of each scan from the previous one. This procedure guarantees that the sum in quadrature of the individual components is the same as the total uncertainty. +The final step calculates the contribution of each group of nuisance parameters as the subtraction in quadrature of each scan from the previous one. This procedure guarantees that the sum in quadrature of the individual components is the same as the total uncertainty. The plot below is produced, ![](images/breakdown.png) !!! warning - While the above procedure is guaranteed the have the effect that the sum in quadrature of the breakdown will equal the total uncertainty, the order in which you freeze the groups can make a difference due to correlations induced by the fit. You should check if the answers change significantly if changing the order and we reccomend you start with the largest group (in terms of overall contribution to the uncertainty) first and work down the list in order of contribution. + While the above procedure is guaranteed the have the effect that the sum in quadrature of the breakdown will equal the total uncertainty, the order in which you freeze the groups can make a difference due to correlations induced by the fit. You should check if the answers change significantly if changing the order and we recommend you start with the largest group (in terms of overall contribution to the uncertainty) first, working down the list in order of the size of the contribution. ## Channel Masking -The `combine` tool has a number of features for diagnostics and plotting results of fits. It can often be useful to turn off particular channels in a combined analysis to see how constraints/pulls can vary. It can also be helpful to plot post-fit shapes + uncertainties of a particular channel (for example a signal region) *without* including the constraints from the data in that region. +The Combine tool has a number of features for diagnostics and plotting results of fits. It can often be useful to turn off particular channels in a combined analysis to see how constraints/shifts in parameter values can vary. It can also be helpful to plot the post-fit shapes and uncertainties of a particular channel (for example a signal region) *without* including the constraints from the data in that region. -This can in some cases be achieved by removing a specific datacard when running `combineCards.py` however, when doing so the information of particular nuisances and pdfs in that region will be lost. Instead, it is possible to ***mask*** that channel from the likelihood! This is acheived at the `text2Workspace` step using the option `--channel-masks`. +This can in some cases be achieved by removing a specific datacard when running `combineCards.py`. However, when doing so, the information of particular nuisance parameters and PDFs in that region will be lost. Instead, it is possible to ***mask*** that channel from the likelihood. This is achieved at the `text2Workspace` step using the option `--channel-masks`. ### Example: removing constraints from the signal region @@ -350,29 +350,29 @@ We will take the control region example from the rate parameters tutorial from [ The first step is to combine the cards combineCards.py signal=signal_region.txt dimuon=dimuon_control_region.txt singlemuon=singlemuon_control_region.txt > datacard.txt -Note that we use the directive `CHANNELNAME=CHANNEL_DATACARD.txt` so that the names of the channels are under our control and easier to interpret. Next, we make a workspace and tell combine to create the parameters used to *mask channels* +Note that we use the directive `CHANNELNAME=CHANNEL_DATACARD.txt` so that the names of the channels are under our control and easier to interpret. Next, we make a workspace and tell Combine to create the parameters used to *mask channels* text2workspace.py datacard.txt --channel-masks -Now lets try a fit *ignoring* the signal region. We can turn off the signal region by setting the channel mask parameter on: `--setParameters mask_signal=1`. Note that `text2workspace` has created a masking parameter for every channel with the naming scheme **mask_CHANNELNAME**. By default, every parameter is set to 0 so that the channel is unmasked by default. +Now we will try to do a fit *ignoring* the signal region. We can turn off the signal region by setting the corresponding channel mask parameter to 1: `--setParameters mask_signal=1`. Note that `text2workspace` has created a masking parameter for every channel with the naming scheme **mask_CHANNELNAME**. By default, every parameter is set to 0 so that the channel is unmasked by default. combine datacard.root -M FitDiagnostics --saveShapes --saveWithUncertainties --setParameters mask_signal=1 !!! warning - There will be a lot of warning from combine. This is safe to ignore as this is due to the s+b fit not converging since the free signal parameter cannot be constrained as the data in the signal region is being ignored. + There will be a lot of warnings from Combine. These are safe to ignore as they are due to the s+b fit not converging. This is expected as the free signal parameter cannot be constrained because the data in the signal region is being ignored. -We can compare the background post-fit and uncertainties with and without the signal region by re-running with `--setParameters mask_signal=0` (or just removing that command). Below is a comparison of the background in the signal region with and without masking the data in the signal region. We take these from the shapes folder +We can compare the post-fit background and uncertainties with and without the signal region included by re-running with `--setParameters mask_signal=0` (or just removing that option completely). Below is a comparison of the background in the signal region with and without masking the data in the signal region. We take these from the shapes folder **shapes_fit_b/signal/total_background** in the `fitDiagnostics.root` output. ![](images/masking_tutorial.png) -Clearly the background shape is different and much less constrained *without including the signal region*, as expected. Channel masking can be used with *any method* in combine. +Clearly the background shape is different and much less constrained *without including the signal region*, as expected. Channel masking can be used with *any method* in Combine. ## RooMultiPdf conventional bias studies -Several analyses within the Higgs group use a functional form to describe their background which is fit to the data (eg the Higgs to two photons (Hgg) analysis). Often however, there is some uncertainty associated to the choice of which background function to use and this choice will impact results of a fit. It is therefore often the case that in these analyses, a Bias study is performed which will indicate how much potential bias can be present given a certain choice of functional form. These studies can be conducted using combine. +Several analyses in CMS use a functional form to describe the background. This functional form is fit to the data. Often however, there is some uncertainty associated with the choice of which background function to use, and this choice will impact the fit results. It is therefore often the case that in these analyses, a bias study is performed. This study will give an indication of the size of the potential bias in the result, given a certain choice of functional form. These studies can be conducted using Combine. -Below is an example script which will produce a workspace based on a simplified Hgg analysis with a *single* category. It will produce the data and pdfs necessary for this example (use it as a basis to cosntruct your own studies). +Below is an example script that will produce a workspace based on a simplified Higgs to diphoton (Hgg) analysis with a *single* category. It will produce the data and PDFs necessary for this example, and you can use it as a basis to construct your own studies. ```c++ @@ -458,31 +458,31 @@ void makeRooMultiPdfWorkspace(){ } ``` -The signal is modelled as a simple Gaussian with a width approximately that of the diphoton resolution and the background is a choice of 3 functions. An exponential, a power-law and a 2nd order polynomial. This choice is accessible inside combine through the use of the [RooMultiPdf](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/interface/RooMultiPdf.h) object which can switch between the functions by setting its associated index (herein called **pdf_index**). This (as with all parameters in combine) is accessible via the `--setParameters` option. +The signal is modelled as a simple Gaussian with a width approximately that of the diphoton resolution. For the background there is a choice of 3 functions: an exponential, a power-law, and a 2nd order polynomial. This choice is accessible within Combine through the use of the [RooMultiPdf](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/interface/RooMultiPdf.h) object, which can switch between the functions by setting their associated indices (herein called **pdf_index**). This (as with all parameters in Combine) can be set via the `--setParameters` option. -To asses the bias, one can throw toys using one function and fit with another. All of this only needs to use one datacard [hgg_toy_datacard.txt](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/tree/main/data/tutorials/bias_studies/hgg_toy_datacard.txt) +To assess the bias, one can throw toys using one function and fit with another. To do this, only a single datacard is needed: [hgg_toy_datacard.txt](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/tree/main/data/tutorials/bias_studies/hgg_toy_datacard.txt). -The bias studies are performed in two stages. The first is to generate toys using one of the functions under some value of the signal strength **r** (or $\mu$). This can be repeated for several values of **r** and also at different masses, but here the Higgs mass is fixed to 125 GeV. +The bias studies are performed in two stages. The first is to generate toys using one of the functions, under some value of the signal strength **r** (or $\mu$). This can be repeated for several values of **r** and also at different masses, but in this example the Higgs boson mass is fixed to 125 GeV. ```bash combine hgg_toy_datacard.txt -M GenerateOnly --setParameters pdf_index=0 --toysFrequentist -t 100 --expectSignal 1 --saveToys -m 125 --freezeParameters pdf_index ``` !!! warning - It is important to freeze `pdf_index` otherwise combine will try to iterate over the index in the frequentist fit. + It is important to freeze `pdf_index`, otherwise Combine will try to iterate over the index in the frequentist fit. -Now we have 100 toys which, by setting `pdf_index=0`, sets the background pdf to the exponential function i.e assumes the exponential is the *true* function. Note that the option `--toysFrequentist` is added. This first performs a fit of the pdf, assuming a signal strength of 1, to the data before generating the toys. This is the most obvious choice as to where to throw the toys from. +Now we have 100 toys which, by setting `pdf_index=0`, sets the background PDF to the exponential function. This means we assume that the exponential is the *true* function. Note that the option `--toysFrequentist` is added; this first performs a fit of the PDF, assuming a signal strength of 1, to the data before generating the toys. This is the most obvious choice as to where to throw the toys from. -The next step is to fit the toys under a different background pdf hypothesis. This time we set the `pdf_index` to be 1, the powerlaw and run fits with the `FitDiagnostics` method again freezing `pdf_index`. +The next step is to fit the toys under a different background PDF hypothesis. This time we set the `pdf_index` to 1, which selects the powerlaw, and run fits with the `FitDiagnostics` method, again freezing `pdf_index`. ```bash combine hgg_toy_datacard.txt -M FitDiagnostics --setParameters pdf_index=1 --toysFile higgsCombineTest.GenerateOnly.mH125.123456.root -t 100 --rMin -10 --rMax 10 --freezeParameters pdf_index --cminDefaultMinimizerStrategy=0 ``` -Note how we add the option `--cminDefaultMinimizerStrategy=0`. This is because we don't need the Hessian, as `FitDiagnostics` will run minos to get the uncertainty on `r`. If we don't do this, Minuit will think the fit failed as we have parameters (those not attached to the current pdf) for which the likelihood is flat. +Note how we add the option `--cminDefaultMinimizerStrategy=0`. This is because we do not need the Hessian, as `FitDiagnostics` will run MINOS to get the uncertainty on `r`. If we do not do this, Minuit will think the fit failed as we have parameters (those not attached to the current PDF) for which the likelihood is flat. !!! warning - You may get warnings about non-accurate errors such as `[WARNING]: Unable to determine uncertainties on all fit parameters in b-only fit` - These can be ignored since they are related to the free parameters of the background pdfs which are not active. + You may get warnings about non-accurate errors such as `[WARNING]: Unable to determine uncertainties on all fit parameters in b-only fit` - These can be ignored since they are related to the free parameters of the background PDFs which are not active. -In the output file `fitDiagnostics.root` there is a tree which contains the best fit results under the signal+background hypothesis. One measure of the bias is the *pull* defined as the difference between the measured value of $\mu$ and the generated value (here we used 1) relative to the uncertainty on $\mu$. The pull distribution can be drawn and the mean provides an estimate of the pull. In this example, we are averaging the +ve and -ve errors, but we could do something smarter if the errors are very asymmetric. +In the output file `fitDiagnostics.root` there is a tree that contains the best fit results under the signal+background hypothesis. One measure of the bias is the *pull* defined as the difference between the measured value of $\mu$ and the generated value (here we used 1) relative to the uncertainty on $\mu$. The pull distribution can be drawn and the mean provides an estimate of the pull. In this example, we are averaging the positive and negative uncertainties, but we could do something smarter if the uncertainties are very asymmetric. ```c++ root -l fitDiagnostics.root @@ -493,16 +493,16 @@ h->Fit("gaus") ![](images/biasexample.png) -From the fitted Gaussian, we see the mean is at -1.29 which would indicate a bias of 129% of the uncertainty on mu from choosing the polynomial when the true function is an exponential! +From the fitted Gaussian, we see the mean is at -1.29, which would indicate a bias of 129% of the uncertainty on mu from choosing the polynomial when the true function is an exponential. ### Discrete profiling -If the `discrete` nuisance is left floating, it will be profiled by looping through the possible index values and finding the pdf which gives the best fit. This allows for the [**discrete profiling method**](https://arxiv.org/pdf/1408.6865.pdf) to be applied for any method which involves a profiled likelihood (frequentist methods). +If the `discrete` nuisance is left floating, it will be profiled by looping through the possible index values and finding the PDF that gives the best fit. This allows for the [**discrete profiling method**](https://arxiv.org/pdf/1408.6865.pdf) to be applied for any method which involves a profiled likelihood (frequentist methods). !!! warning - You should be careful since MINOS knows nothing about the discretenuisances and hence estimations of uncertainties will be incorrect via MINOS. Instead, uncertainties from scans and limits will correctly account for these nuisances. Currently the Bayesian methods will *not* properly treat the nuisances so some care should be taken when interpreting Bayesian results. + You should be careful since MINOS knows nothing about the discrete nuisances and hence estimations of uncertainties will be incorrect via MINOS. Instead, uncertainties from scans and limits will correctly account for these nuisance parameters. Currently the Bayesian methods will *not* properly treat the nuisance parameters, so some care should be taken when interpreting Bayesian results. -As an example, we can use peform a likelihood scan as a function of the Higgs signal strength in the toy Hgg datacard. By leaving the object `pdf_index` non-constant, at each point in the likelihood scan, the pdfs will be iterated over and the one which gives the lowest -2 times log-likelihood, including the correction factor $c$ (as defined in the paper) will be stored in the output tree. We can also check the scan fixing to each pdf individually to check that the envelope is acheived. For this, you will need to include the option `--X-rtd REMOVE_CONSTANT_ZERO_POINT=1`. In this way, we can take a look at the absolute value to compare the curves, if we also include `--saveNLL`. +As an example, we can peform a likelihood scan as a function of the Higgs boson signal strength in the toy Hgg datacard. By leaving the object `pdf_index` non-constant, at each point in the likelihood scan, the PDFs will be iterated over and the one that gives the lowest -2 times log-likelihood, including the correction factor $c$ (as defined in the paper linked above) will be stored in the output tree. We can also check the scan when we fix at each PDF individually to check that the envelope is achieved. For this, you will need to include the option `--X-rtd REMOVE_CONSTANT_ZERO_POINT=1`. In this way, we can take a look at the absolute value to compare the curves, if we also include `--saveNLL`. For example for a full scan, you can run @@ -518,26 +518,26 @@ and for the individual `pdf_index` set to `X`, for `X=0,1,2` -You can then plot the value of `2*(deltaNLL+nll+nll0)` to plot the absolute value of (twice) the negative log-likelihood, including the correction term for extra parameters in the different pdfs. +You can then plot the value of `2*(deltaNLL+nll+nll0)` to plot the absolute value of (twice) the negative log-likelihood, including the correction term for extra parameters in the different PDFs. The above output will produce the following scans. ![](images/discrete_profile.png) As expected, the curve obtained by allowing the `pdf_index` to float (labelled "Envelope") picks out the best function (maximum corrected likelihood) for each value of the signal strength. -In general, you can improve the performance of combine, when using the disccrete profiling method, by including the following options `--X-rtd MINIMIZER_freezeDisassociatedParams`, which will stop parameters not associated to the current pdf from floating in the fits. Additionaly, you can also include the following +In general, the performance of Combine can be improved when using the discrete profiling method by including the option `--X-rtd MINIMIZER_freezeDisassociatedParams`. This will stop parameters not associated to the current PDF from floating in the fits. Additionally, you can include the following options: * `--X-rtd MINIMIZER_multiMin_hideConstants`: hide the constant terms in the likelihood when recreating the minimizer * `--X-rtd MINIMIZER_multiMin_maskConstraints`: hide the constraint terms during the discrete minimization process - * `--X-rtd MINIMIZER_multiMin_maskChannels=` mask in the NLL the channels that are not needed: + * `--X-rtd MINIMIZER_multiMin_maskChannels=` mask the channels that are not needed from the NLL: * ` 1`: keeps unmasked all channels that are participating in the discrete minimization. * ` 2`: keeps unmasked only the channel whose index is being scanned at the moment. -You may want to check with the combine dev team if using these options as they are somewhat for *expert* use. +You may want to check with the Combine development team if you are using these options, as they are somewhat for *expert* use. ## RooSplineND multidimensional splines -[RooSplineND](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/interface/RooSplineND.h) can be used to interpolate from tree of points to produce a continuous function in N-dimensions. This function can then be used as input to workspaces allowing for parametric rates/cross-sections/efficiencies etc OR can be used to up-scale the resolution of likelihood scans (i.e like those produced from combine) to produce smooth contours. +[RooSplineND](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/interface/RooSplineND.h) can be used to interpolate from a tree of points to produce a continuous function in N-dimensions. This function can then be used as input to workspaces allowing for parametric rates/cross-sections/efficiencies. It can also be used to up-scale the resolution of likelihood scans (i.e like those produced from Combine) to produce smooth contours. The spline makes use of a radial basis decomposition to produce a continous $N \to 1$ map (function) from $M$ provided sample points. The function of the $N$ variables $\vec{x}$ is assumed to be of the form, @@ -566,7 +566,7 @@ $$ The solution is obtained using the `eigen` c++ package. -The typical constructor of the object is done as follows; +The typical constructor of the object is as follows; ```c++ RooSplineND(const char *name, const char *title, RooArgList &vars, TTree *tree, const char* fName="f", double eps=3., bool rescale=false, std::string cutstring="" ) ; @@ -574,19 +574,19 @@ RooSplineND(const char *name, const char *title, RooArgList &vars, TTree *tree, where the arguments are: - * `vars`: A RooArgList of RooRealVars representing the $N$ dimensions of the spline. The length of this list determines the dimension $N$ of the spline. + * `vars`: A `RooArgList` of `RooRealVars` representing the $N$ dimensions of the spline. The length of this list determines the dimension $N$ of the spline. * `tree`: a TTree pointer where each entry represents a sample point used to construct the spline. The branch names must correspond to the names of the variables in `vars`. * `fName`: is a string representing the name of the branch to interpret as the target function $f$. * `eps` : is the value of $\epsilon$ and represents the *width* of the basis functions $\phi$. - * `rescale` : is an option to re-scale the input sample points so that each variable has roughly the same range (see above in the definition of $||.||$). + * `rescale` : is an option to rescale the input sample points so that each variable has roughly the same range (see above in the definition of $||.||$). * `cutstring` : a string to remove sample points from the tree. Can be any typical cut string (eg "var1>10 && var2<3"). -The object can be treaeted as a `RooAbsArg` and its value for the current values of the parameters is obtained as usual by using the `getVal()` method. +The object can be treated as a `RooAbsArg`; its value for the current values of the parameters is obtained as usual by using the `getVal()` method. !!! warning - You should not include more variable branches than contained in `vars` in the tree as the spline will interpret them as additional sample points. You should get a warning if there are two *nearby* points in the input samples and this will cause a failure in determining the weights. If you cannot create a reduced tree, you can remove entries by using the `cutstring`. + You should not include more variable branches than contained in `vars` in the tree, as the spline will interpret them as additional sample points. You will get a warning if there are two *nearby* points in the input samples and this will cause a failure in determining the weights. If you cannot create a reduced tree, you can remove entries by using the `cutstring`. -The following script is an example of its use which produces a 2D spline (`N=2`) from a set of 400 points (`M=400`) generated from a function. +The following script is an example that produces a 2D spline (`N=2`) from a set of 400 points (`M=400`) generated from a function. ```c++ void splinend(){ @@ -694,11 +694,11 @@ Running the script will produce the following plot. The plot shows the sampled p ## RooParametricHist gammaN for shapes -Currently, there is no straight-forward implementation of using per-bin **gmN** like uncertainties with shape (histogram) analyses. Instead, it is possible to tie control regions (written as datacards) with the signal region using three methods. +Currently, there is no straightforward implementation of using per-bin **gmN**-like uncertainties with shape (histogram) analyses. Instead, it is possible to tie control regions (written as datacards) with the signal region using three methods. -For analyses who take the normalisation of some process from a control region, it is possible to use either **lnU** or **rateParam** directives to float the normalisation in a correlated way of some process between two regions. Instead if each bin is intended to be determined via a control region, one can use a number of RooFit histogram pdfs/functions to accomplish this. The example below shows a simple implementation of a [RooParametricHist](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/interface/RooParametricHist.h) to achieve this. +For analyses that take the normalization of some process from a control region, it is possible to use either **lnU** or **rateParam** directives to float the normalization in a correlated way of some process between two regions. Instead if each bin is intended to be determined via a control region, one can use a number of `RooFit` histogram PDFs/functions to accomplish this. The example below shows a simple implementation of a [RooParametricHist](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/interface/RooParametricHist.h) to achieve this. -copy the script below into a file called `examplews.C` and create the input workspace using `root -l examplews.C`... +Copy the script below into a file called `examplews.C` and create the input workspace using `root -l examplews.C`... ```c++ @@ -869,12 +869,12 @@ void examplews(){ } ``` -Lets go through what the script is doing. First, the observable for the search is the missing energy so we create a parameter to represent that. +We will now discuss what the script is doing. First, the observable for the search is the missing energy, so we create a parameter to represent this observable. ```c++ RooRealVar met("met","E_{T}^{miss}",xmin,xmax); ``` -First, the following lines create a freely floating parameter for each of our bins (in this example, there are only 4 bins, defined for our observable `met`. +The following lines create a freely floating parameter for each of our bins (in this example, there are only 4 bins, defined for our observable `met`). ```c++ @@ -898,24 +898,24 @@ They are put into a list so that we can create a `RooParametricHist` and its nor RooAddition p_bkg_norm("bkg_SR_norm","Total Number of events from background in signal region",bkg_SR_bins); ``` -For the control region, the background process will be dependent on the yields of the background in the signal region using a *transfer factor*. The transfer factor `TF` must account for acceptance/efficiency etc differences in the signal to control regions. +For the control region, the background process will be dependent on the yields of the background in the signal region using a *transfer factor*. The transfer factor `TF` must account for acceptance/efficiency/etc differences between the signal region and the control regions. -In this example lets assume the control region is populated by the same process decaying to a different final state with twice as large branching ratio compared to the one in the signal region. +In this example we will assume the control region is populated by the same process decaying to a different final state with twice as large branching fraction as the one in the signal region. -We could imagine that the transfer factor could be associated with some uncertainty - lets say a 1% uncertainty due to efficiency and 2% due to acceptance. We need to make nuisance parameters ourselves to model this and give them a nominal value of 0. +We could imagine that the transfer factor could be associated with some uncertainty - for example a 1% uncertainty due to efficiency and a 2% uncertainty due to acceptance differences. We need to make nuisance parameters ourselves to model this, and give them a nominal value of 0. ```c++ RooRealVar efficiency("efficiency", "efficiency nuisance parameter",0); RooRealVar acceptance("acceptance", "acceptance nuisance parameter",0); ``` -We need to make the transfer factor a function of these parameters since variations in these uncertainties will lead to variations of the transfer factor. Here we've assumed Log-normal effects (i.e the same as putting lnN in the CR datacard) but we could use *any function* which could be used to parameterise the effect - eg if the systematic is due to some alternate template, we could use polynomials for example. +We need to make the transfer factor a function of these parameters, since variations in these uncertainties will lead to variations of the transfer factor. Here we have assumed Log-normal effects (i.e the same as putting lnN in the CR datacard), but we could use *any function* which could be used to parameterize the effect - for example if the systematic uncertainty is due to some alternate template, we could use polynomials. ```c++ RooFormulaVar TF("TF","Trasnfer factor","2*TMath::Power(1.01,@0)*TMath::Power(1.02,@1)",RooArgList(efficiency,acceptance) ); ``` -Then need to make each bin of the background in the control region a function of the background in the signal and the transfer factor - i.e $N_{CR} = N_{SR} \times TF $. +Then, we need to make each bin of the background in the control region a function of the background in the signal region and the transfer factor - i.e $N_{CR} = N_{SR} \times TF $. ```c++ RooFormulaVar CRbin1("bkg_CR_bin1","Background yield in control region, bin 1","@0*@1",RooArgList(TF,bin1)); @@ -924,7 +924,7 @@ Then need to make each bin of the background in the control region a function of RooFormulaVar CRbin4("bkg_CR_bin4","Background yield in control region, bin 4","@0*@1",RooArgList(TF,bin4)); ``` -As before, we also need to create the `RooParametricHist` for this process in the control region but this time the bin yields will be the `RooFormulaVars` we just created instead of free floating parameters. +As before, we also need to create the `RooParametricHist` for this process in the control region but this time the bin yields will be the `RooFormulaVars` we just created instead of freely floating parameters. ```c++ RooArgList bkg_CR_bins; @@ -937,7 +937,7 @@ As before, we also need to create the `RooParametricHist` for this process in th RooAddition p_CRbkg_norm("bkg_CR_norm","Total Number of events from background in control region",bkg_CR_bins); ``` -Finally, we can also create alternative shape variations (Up/Down) that can be fed to combine as we do with `TH1` or `RooDataHist` type workspaces. These need +Finally, we can also create alternative shape variations (Up/Down) that can be fed to Combine as we do with `TH1` or `RooDataHist` type workspaces. These need to be of type `RooDataHist`. The example below is for a Jet Energy Scale type shape uncertainty. ```c++ @@ -1024,9 +1024,9 @@ acceptance param 0 1 ``` -Note that for the control region, our nuisance parameters appear as `param` types so that combine will correctly constrain them. +Note that for the control region, our nuisance parameters appear as `param` types, so that Combine will correctly constrain them. -If we combine the two cards and fit the result with `-M MultiDimFit -v 3` we can see that the parameters which give the rate of background in each bin of the signal region, along with the nuisance parameters and signal strength, are determined by the fit - i.e we have properly included the constraint from the control region, just as with the 1-bin `gmN`. +If we combine the two cards and fit the result with `-M MultiDimFit -v 3` we can see that the parameters that give the rate of background in each bin of the signal region, along with the nuisance parameters and signal strength, are determined by the fit - i.e we have properly included the constraint from the control region, just as with the 1-bin `gmN`. ``` acceptance = 0.00374312 +/- 0.964632 (limited) @@ -1039,20 +1039,20 @@ lumi_8TeV = -0.0025911 +/- 0.994458 r = 0.00716347 +/- 12.513 (limited) ``` -The example given here is extremely basic and it should be noted that additional complexity in the transfer factors, additional uncertainties/backgrounds etc in the cards are supported as always. +The example given here is extremely basic and it should be noted that additional complexity in the transfer factors, as well as additional uncertainties/backgrounds etc in the cards are, as always, supported. !!! danger - If trying to implement parametric uncertainties in this setup (eg on transfer factors) which are correlated with other channels and implemented separately, you ***MUST*** normalise the uncertainty effect so that the datacard line can read `param name X 1`. That is the uncertainty on this parameter must be 1. Without this, there will be inconsistency with other nuisances of the same name in other channels implemented as **shape** or **lnN**. + If trying to implement parametric uncertainties in this setup (eg on transfer factors) that are correlated with other channels and implemented separately, you ***MUST*** normalize the uncertainty effect so that the datacard line can read `param name X 1`. That is, the uncertainty on this parameter must be 1. Without this, there will be inconsistency with other nuisances of the same name in other channels implemented as **shape** or **lnN**. ## Look-elsewhere effect for one parameter In case you see an excess somewhere in your analysis, you can evaluate the look-elsewhere effect (LEE) of that excess. For an explanation of the LEE, take a look at the CMS Statistics Committee Twiki [here](https://twiki.cern.ch/twiki/bin/viewauth/CMS/LookElsewhereEffect). -To calculate the look-elsewhere effect for a single parameter (in this case the mass of the resonance), you can follow the instructions. Note that these instructions assume you have a workspace which is parametric in your resonance mass $m$, otherwise you need to fit each background toy with separate workspaces. Assume the local significance for your excess is $\sigma$. +To calculate the look-elsewhere effect for a single parameter (in this case the mass of the resonance), you can follow the instructions below. Note that these instructions assume you have a workspace that is parametric in your resonance mass $m$, otherwise you need to fit each background toy with separate workspaces. We will assume the local significance for your excess is $\sigma$. * Generate background-only toys `combine ws.root -M GenerateOnly --toysFrequentist -m 16.5 -t 100 --saveToys --expectSignal=0`. The output will be something like `higgsCombineTest.GenerateOnly.mH16.5.123456.root`. - * For each toy, calculate the significance for a predefined range - e.g $m\in [10,35]$ GeV in steps suitable to the resolution - eg 1 GeV. For `toy_1` the procedure would be: `for i in $(seq 10 35); do combine ws.root -M Significance --redefineSignalPOI r --freezeParameters MH --setParameter MH=$i -n $i -D higgsCombineTest.GenerateOnly.mH16.5.123456.root:toys/toy_1`. Calculate the maximum significance over all of these mass points - call this $\sigma_{max}$. + * For each toy, calculate the significance for a predefined range (e.g $m\in [10,35]$ GeV) in steps suitable to the resolution (e.g. 1 GeV). For `toy_1` the procedure would be: `for i in $(seq 10 35); do combine ws.root -M Significance --redefineSignalPOI r --freezeParameters MH --setParameter MH=$i -n $i -D higgsCombineTest.GenerateOnly.mH16.5.123456.root:toys/toy_1`. Calculate the maximum significance over all of these mass points - call this $\sigma_{max}$. * Count how many toys have a maximum significance larger than the local one for your observed excess. This fraction of toys with $\sigma_{max}>\sigma$ is the global p-value. You can find more tutorials on the LEE [here](https://indico.cern.ch/event/456547/contributions/1126036/attachments/1188691/1724680/20151117_comb_tutorial_Lee.pdf) diff --git a/docs/part3/regularisation.md b/docs/part3/regularisation.md index 51751211a5f..6cf42ced570 100644 --- a/docs/part3/regularisation.md +++ b/docs/part3/regularisation.md @@ -1,11 +1,11 @@ # Unfolding & regularization -This section details how to perform an unfolded cross-section measurement, *including regularization*, inside Combine. +This section details how to perform an unfolded cross-section measurement, *including regularization*, within Combine. -There are many resources available that describe unfolding, including when to use it (or not), and what are the usual issues around it. A useful summary is available at the [CMS Statistics Committee pages](https://twiki.cern.ch/twiki/bin/view/CMS/ScrecUnfolding) on unfolding. You can also -find a nice overview of unfolding and its usage in combine in [these slides](https://indico.cern.ch/event/399923/contributions/956409/attachments/800899/1097609/2015_06_24_LHCXSWG.pdf#search=Marini%20AND%20StartDate%3E%3D2015-06-24%20AND%20EndDate%3C%3D2015-06-24). +There are many resources available that describe unfolding, including when to use it (or not), and what the common issues surrounding it are. For CMS users, useful summary is available in the [CMS Statistics Committee pages](https://twiki.cern.ch/twiki/bin/view/CMS/ScrecUnfolding) on unfolding. You can also +find an overview of unfolding and its usage in Combine in [these slides](https://indico.cern.ch/event/399923/contributions/956409/attachments/800899/1097609/2015_06_24_LHCXSWG.pdf#search=Marini%20AND%20StartDate%3E%3D2015-06-24%20AND%20EndDate%3C%3D2015-06-24). -The basic idea behind the unfolding technique to describe smearing introduced through the reconstruction (eg of the particle energy) in a given truth level bin $x_{i}$ through a linear relationship to the effects in the nearby truth-bins. We can make statements about the probability $p_{j}$ that the event falling in the truth bin $x_{i}$ is reconstructed in the bin $y_{i}$ via the linear relationship, +The basic idea behind the unfolding technique is to describe smearing introduced through the reconstruction (e.g. of the particle energy) in a given truth level bin $x_{i}$ through a linear relationship with the effects in the nearby truth-bins. We can make statements about the probability $p_{j}$ that the event falling in the truth bin $x_{i}$ is reconstructed in the bin $y_{i}$ via the linear relationship, $$ y_{obs} = \tilde{\boldsymbol{R}}\cdot x_{true} + b @@ -22,7 +22,7 @@ Unfolding aims to find the distribution at truth level $x$, given the observatio ## Likelihood-based unfolding -Since Combine has access to the full likelihood for any analysis written in the usual datacard format, we will use likelihood-based unfolding +Since Combine has access to the full likelihood for any analysis written in the usual datacard format, we will use likelihood-based unfolding throughout - for other approaches, there are many other tools available (eg `RooUnfold` or `TUnfold`), which can be used instead. The benefits of the likelihood-based approach are that, @@ -33,13 +33,13 @@ The benefits of the likelihood-based approach are that, In practice, one must construct the *response matrix* and unroll it in the reconstructed bins: -* First, one derives the truth distribution, eg after the generator-cut only, $x_{i}$. -* Each reconstructed bin (eg each datacard) should describe the contribution from each truth bin - this is how combine knows about $\boldsymbol{R}$ +* First, one derives the truth distribution, e.g. after the generator-level selection only, $x_{i}$. +* Each reconstructed bin (e.g. each datacard) should describe the contribution from each truth bin - this is how Combine knows about the response matrix $\boldsymbol{R}$ and folds in the acceptance/efficiency effects as usual. * The out-of-acceptance contributions can also be included in the above. The model we use for this is then just the usual [`PhysicsModel:multiSignalModel`](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/python/PhysicsModel.py#L98), where each *signal* refers to a particular truth level bin. The results can be extracted through a -simple maximum likelihood fit with, +simple maximum-likelihood fit with, ``` text2workspace.py -m 125 --X-allow-no-background -o datacard.root datacard.txt @@ -49,7 +49,7 @@ simple maximum likelihood fit with, combine -M MultiDimFit --setParameters=r_Bin0=1,r_Bin1=1,r_Bin2=1,r_Bin3=1,r_Bin4=1 -t -1 -m 125 --algo=grid --points=100 -P r_Bin1 --setParameterRanges r_Bin1=0.5,1.5 --floatOtherPOIs=1 datacard.root ``` -Notice that one can also perform the so called bin-by-bin unfolding (though it is strongly discouraged except for testing) with, +Notice that one can also perform the so called bin-by-bin unfolding (though it is strongly discouraged, except for testing) with, ``` text2workspace.py -m 125 --X-allow-no-background -o datacard.root datacard.txt @@ -58,7 +58,7 @@ Notice that one can also perform the so called bin-by-bin unfolding (though it i Nuisance parameters can be added to the likelihood function and profiled in the usual way via the datacards. Theory uncertainties on the inclusive cross section are typically not included in unfolded measurements. -The figure below shows a comparison of Likelihood based unfolding and a least-squares based unfolding as implemented in `RooUnfold`. +The figure below shows a comparison of likelihood-based unfolding and a least-squares based unfolding as implemented in `RooUnfold`. /// details | **Show comparison** @@ -70,24 +70,24 @@ The figure below shows a comparison of Likelihood based unfolding and a least-sq The main difference with respect to other models with multiple signal contributions is the introduction of **Regularization**, which is used to stabilize the unfolding process. -An example of unfolding in combine with and without regularization, can be found under +An example of unfolding in Combine with and without regularization, can be found under [data/tutorials/regularization](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/tree/102x/data/tutorials/regularization). Running `python createWs.py [-r]` will create a simple datacard and perform a fit both with and without including regularization. -The simplest way to introduce regularization in the likelihood based approach, is to apply a penalty term in the likelihood function which -depends on the values of the truth bins (so called *Tickonov regularization*): +The simplest way to introduce regularization in the likelihood based approach, is to apply a penalty term, which +depends on the values of the truth bins, in the likelihood function (so-called *Tikhonov regularization*): $$ -2\ln L = -2\ln L + P(\vec{x}) $$ -where $P$ is a linear operator. There are two different approches which are supported to construct $P$. -If instead you run `python makeModel.py`, you will create a more complex datacard with each the two regularization scheme implemented. You will need -to uncomment the relevant sections of code to activate SVD or TUnfold type regularization. +Here, $P$ is a linear operator. There are two different approaches that are supported to construct $P$. +If you run `python makeModel.py`, you will create a more complex datacard with the two regularization schemes implemented. You will need +to uncomment the relevant sections of code to activate `SVD` or `TUnfold`-type regularization. !!! warning - Any unfolding method which makes use of regularization must perform studies of the potential bias/coverage properties introduced through the + When using any unfolding method with regularization, you must perform studies of the potential bias/coverage properties introduced through the inclusion of regularization, and how strong the associated regularization is. Advice on this can be found in the CMS Statistics Committee pages. ### Singular Value Decomposition (SVD) @@ -115,8 +115,8 @@ row of the product $A\cdot\vec{\mu}$, by including them as lines in the datacard ``` name constr formula dependents delta ``` -where the regularization strength $\delta=\frac{1}{\sqrt{\tau}}$ and can either be a fixed value (eg by putting directly `0.01`) or as -a modifiable parameter with eg `delta[0.01]`. +where the regularization strength is $\delta=\frac{1}{\sqrt{\tau}}$ and can either be a fixed value (e.g. by directly putting `0.01`) or as +a modifiable parameter with e.g. `delta[0.01]`. For example, for 3 bins and a regularization strength of 0.03, the first line would be @@ -124,7 +124,7 @@ For example, for 3 bins and a regularization strength of 0.03, the first line wo name constr @0-2*@2+@1 r_Bin0,r_Bin1,r_Bin2 0.03 ``` -Alternative, valid syntaxes are +Alternative valid syntaxes are ``` constr1 constr r_bin0-r_bin1 0.01 @@ -133,7 +133,7 @@ Alternative, valid syntaxes are constr1 constr r_bin0+r_bin1 {r_bin0,r_bin1} delta[0.01] ``` -The figure below shows an example unfolding using the "SVD regularization" approach with the least squares method (as implemented by `RooUnfold`) and implemented as a penalty term added to the likelihood using the maximum likelihood approach in `Combine`. +The figure below shows an example unfolding using the "SVD regularization" approach with the least squares method (as implemented by `RooUnfold`) and implemented as a penalty term added to the likelihood using the maximum likelihood approach in Combine. /// details | **Show comparison** @@ -143,10 +143,10 @@ The figure below shows an example unfolding using the "SVD regularization" appro ### TUnfold method -The Tikhonov regularization as implemented in `TUnfold` uses the MC information, or rather the densities prediction, as a bias vector. -In order to give this information to Combine, a single datacard for each reco-level bin needs to be produced, so that we have access to the proper normalization terms during the minimization. In this case the bias vector is $\vec{x}_{obs}-\vec{x}_{true}$ +The Tikhonov regularization as implemented in `TUnfold` uses the MC information, or rather the density prediction, as a bias vector. +In order to give this information to Combine, a single datacard for each reconstruction-level bin needs to be produced, so that we have access to the proper normalization terms during the minimization. In this case the bias vector is $\vec{x}_{obs}-\vec{x}_{true}$ -Then one can write a constraint term in the datacard via (eg.) +Then one can write a constraint term in the datacard via, for example, ``` constr1 constr (r_Bin0-1.)*(shapeSig_GenBin0_RecoBin0__norm+shapeSig_GenBin0_RecoBin1__norm+shapeSig_GenBin0_RecoBin2__norm+shapeSig_GenBin0_RecoBin3__norm+shapeSig_GenBin0_RecoBin4__norm)+(r_Bin2-1.)*(shapeSig_GenBin2_RecoBin0__norm+shapeSig_GenBin2_RecoBin1__norm+shapeSig_GenBin2_RecoBin2__norm+shapeSig_GenBin2_RecoBin3__norm+shapeSig_GenBin2_RecoBin4__norm)-2*(r_Bin1-1.)*(shapeSig_GenBin1_RecoBin0__norm+shapeSig_GenBin1_RecoBin1__norm+shapeSig_GenBin1_RecoBin2__norm+shapeSig_GenBin1_RecoBin3__norm+shapeSig_GenBin1_RecoBin4__norm) {r_Bin0,r_Bin1,r_Bin2,shapeSig_GenBin1_RecoBin0__norm,shapeSig_GenBin0_RecoBin0__norm,shapeSig_GenBin2_RecoBin0__norm,shapeSig_GenBin1_RecoBin1__norm,shapeSig_GenBin0_RecoBin1__norm,shapeSig_GenBin2_RecoBin1__norm,shapeSig_GenBin1_RecoBin2__norm,shapeSig_GenBin0_RecoBin2__norm,shapeSig_GenBin2_RecoBin2__norm,shapeSig_GenBin1_RecoBin3__norm,shapeSig_GenBin0_RecoBin3__norm,shapeSig_GenBin2_RecoBin3__norm,shapeSig_GenBin1_RecoBin4__norm,shapeSig_GenBin0_RecoBin4__norm,shapeSig_GenBin2_RecoBin4__norm} delta[0.03] diff --git a/docs/part3/runningthetool.md b/docs/part3/runningthetool.md index dad20633347..bffcc5c520c 100644 --- a/docs/part3/runningthetool.md +++ b/docs/part3/runningthetool.md @@ -1,100 +1,100 @@ # How to run the tool -The executable **`combine`** provided by the package allows to use the Higgs Combination Tool indicating by command line which is the method to use for limit combination and which are user's preferences to run it. To see the entire list of all available options ask for the help: +The executable Combine provided by the package is used to invoke the tools via the command line. The statistical analysis method, as well as user settings, are also specified on the command line. To see the full list of available options, you can run: ```sh combine --help ``` -The option `-M` allows to chose the method used. There are several groups of statistical methods: +The option `-M` is used to choose the statistical evaluation method. There are several groups of statistical methods: - **Asymptotic** likelihood methods: - - `AsymptoticLimits`: limits calculated according to the asymptotic formulas in [arxiv:1007.1727](http://arxiv.org/abs/1007.1727) + - `AsymptoticLimits`: limits calculated according to the asymptotic formulae in [arxiv:1007.1727](http://arxiv.org/abs/1007.1727). - `Significance`: simple profile likelihood approximation, for calculating significances. - **Bayesian** methods: - - `BayesianSimple`: performing a classical numerical integration (for simple models only) + - `BayesianSimple`: performing a classical numerical integration (for simple models only). - `MarkovChainMC`: performing Markov Chain integration, for arbitrarily complex models. - **Frequentist** or hybrid bayesian-frequentist methods: - `HybridNew`: compute modified frequentist limits, significance/p-values and confidence intervals according to several possible prescriptions with toys. - **Fitting** - - `FitDiagnostics`: performs maximum likelihood fits to extract the signal yield and provide diagnostic tools such as pre and post-fit models and correlations - - `MultiDimFit`: perform maximum likelihood fits in multiple parameters and likelihood scans -- **Miscellaneous** other modules that don't compute limits but use the same framework: - - `GoodnessOfFit`: perform a goodness of fit test for models including shape information using several GOF estimators - - `ChannelConsistencyCheck`: check how consistent are the individual channels of a combination are + - `FitDiagnostics`: performs maximum likelihood fits to extract the signal rate, and provides diagnostic tools such as pre- and post-fit figures and correlations + - `MultiDimFit`: performs maximum likelihood fits and likelihood scans with an arbitrary number of parameters of interest. +- **Miscellaneous** other modules that do not compute limits or confidence intervals, but use the same framework: + - `GoodnessOfFit`: perform a goodness of fit test for models including shape information. Several GoF tests are implemented. + - `ChannelConsistencyCheck`: study the consistency between individual channels in a combination. - `GenerateOnly`: generate random or asimov toy datasets for use as input to other methods The command help is organized into five parts: -- *Main options* section indicates how to pass the datacard as input to the tool (`-d datacardName`) and how to choose the statistical method (`-M MethodName`) to compute a limit and level of verbosity for output `-v` -- *Common statistics options* include options common to different statistical methods such as `--cl` to specify the CL (default is 0.95) or `-t` to give the number of toy MC extractions required. -- *Common input-output options*. Is it possible to specify hypothesis point under analysis using `-m` or include specific string in output filename `--name`. +- The *Main options* section indicates how to pass the datacard as input to the tool (`-d datacardName`), how to choose the statistical method (`-M MethodName`), and how to set the verbosity level `-v` +- Under *Common statistics options*, options common to different statistical methods are given. Examples are `--cl`, to specify the confidence level (default is 0.95), or `-t`, to give the number of toy MC extractions required. +- The *Common input-output options* section includes, for example, the options to specify the mass hypothesis under study (`-m`) or to include a specific string in the output filename (`--name`). - *Common miscellaneous options*. -- Method specific options sections are dedicated to each method. By providing the Method name with the `-M` option, only the options for that specific method are shown in addition to the common options +- Further method-specific options are available for each method. By passing the method name via the `-M` option, along with `--help`, the options for that specific method are shown in addition to the common options. -Those options reported above are just a sample of all available.The command `--help` provides documentation of all of them. +Not all the available options are discussed in this online documentation; use `--help` to get the documentation of all options. -## Common command line options +## Common command-line options -There are a number of useful command line options which can be used to alter the model (or parameters of the model) at run These are the most commonly used, generic options, +There are a number of useful command-line options that can be used to alter the model (or parameters of the model) at run time. The most commonly used, generic options, are: -- `-H`: run first another faster algorithm (e.g. the ProfileLikelihood described below) to get a hint of the limit, allowing the real algorithm to converge more quickly. We **strongly recommend** to use this option when using MarkovChainMC, HybridNew or FeldmanCousins calculators, unless you know in which range your limit lies and you set it manually (the default is `[0, 20]`) +- `-H`: first run a different, faster, algorithm (e.g. the `ProfileLikelihood` described below) to obtain an approximate indication of the limit, which will allow the precise chosen algorithm to converge more quickly. We **strongly recommend** to use this option when using the `MarkovChainMC`, `HybridNew` or `FeldmanCousins` calculators, unless you know in which range your limit lies and you set this range manually (the default is `[0, 20]`) -- `--rMax`, `--rMin`: manually restrict the range of signal strengths to consider. For Bayesian limits with MCMC, `rMax` a rule of thumb is that rMax should be 3-5 times the limit (a too small value of `rMax` will bias your limit towards low values, since you are restricting the integration range, while a too large value will bias you to higher limits) +- `--rMax`, `--rMin`: manually restrict the range of signal strengths to consider. For Bayesian limits with MCMC, a rule of thumb is that `rMax` should be 3-5 times the limit (a too small value of `rMax` will bias your limit towards low values, since you are restricting the integration range, while a too large value will bias you to higher limits) -- `--setParameters name=value[,name2=value2,...]` sets the starting values of the parameters, useful e.g. when generating toy MC or when also setting the parameters as fixed. This option supports the use of regexp via by replacing `name` with `rgx{some regular expression}`. +- `--setParameters name=value[,name2=value2,...]` sets the starting values of the parameters, useful e.g. when generating toy MC or when setting the parameters as fixed. This option supports the use of regular expressions by replacing `name` with `rgx{some regular expression}`. -- `--setParameterRanges name=min,max[:name2=min2,max2:...]` sets the ranges of the parameters (useful e.g. for scanning in MultiDimFit, or for Bayesian integration). This option supports the use of regexp via by replacing `name` with `rgx{some regular expression}`. +- `--setParameterRanges name=min,max[:name2=min2,max2:...]` sets the ranges of the parameters (useful e.g. for scans in `MultiDimFit`, or for Bayesian integration). This option supports the use of regular expressions by replacing `name` with `rgx{some regular expression}`. - `--redefineSignalPOIs name[,name2,...]` redefines the set of parameters of interest. - - if the parameters where constant in the input workspace, they are re-defined to be floating. - - nuisances promoted to parameters of interest are removed from the list of nuisances, and thus they are not randomized in methods that randomize nuisances (e.g. HybridNew in non-frequentist mode, or BayesianToyMC, or in toy generation with `-t` but without `--toysFreq`). This doesn't have any impact on algorithms that don't randomize nuisances (e.g. fits, AsymptoticLimits, or HybridNew in fequentist mode) or on algorithms that treat all parameters in the same way (e.g. MarkovChainMC). - - Note that constraint terms for the nuisances are **dropped** after promotion to a POI using `--redefineSignalPOI`. To produce a likelihood scan for a nuisance parameter, using MultiDimFit with **`--algo grid`**, you should instead use the `--parameters (-P)` option which will not cause the loss of the constraint term when scanning. - - parameters of interest of the input workspace that are not selected by this command become unconstrained nuisance parameters, but they are not added to the list of nuisances so they will not be randomized (see above). + - If the parameters were constant in the input workspace, they are set to be floating. + - Nuisance parameters promoted to parameters of interest are removed from the list of nuisances, and thus they are not randomized in methods that randomize nuisances (e.g. `HybridNew` in non-frequentist mode, or `BayesianToyMC`, or in toy generation with `-t` but without `--toysFreq`). This does not have any impact on algorithms that do not randomize nuisance parameters (e.g. fits, `AsymptoticLimits`, or `HybridNew` in fequentist mode) or on algorithms that treat all parameters in the same way (e.g. `MarkovChainMC`). + - Note that constraint terms for the nuisances are **dropped** after promotion to a POI using `--redefineSignalPOI`. To produce a likelihood scan for a nuisance parameter, using `MultiDimFit` with **`--algo grid`**, you should instead use the `--parameters (-P)` option, which will not cause the loss of the constraint term when scanning. + - Parameters of interest of the input workspace that are not selected by this command become unconstrained nuisance parameters, but they are not added to the list of nuisances so they will not be randomized (see above). -- `--freezeParameters name1[,name2,...]` Will freeze the parameters with the given names to their set values. This option supports the use of regexps via by replacing `name` with `rgx{some regular expression}` for matching to *constrained nuisance parameters* or `var{some regular expression}` for matching to *any* parameter. For example `--freezeParameters rgx{CMS_scale_j.*}` will freeze all constrained nuisance parameters with the prefix `CMS_scale_j`, while `--freezeParameters var{.*rate_scale}` will freeze any parameter (constrained nuisance or otherwise) with the suffix `rate_scale`. - - use the option `--freezeParameters allConstrainedNuisances` to freeze all nuisance parameters that have a constraint term (i.e not `flatParams` or `rateParams` or other freely floating parameters). - - similarly the option `--floatParameters` sets the parameter floating. - - groups of nuisances (constrained or otherwise), as defined in the datacard, can be frozen using `--freezeNuisanceGroups`. You can also specify to freeze nuisances which are *not* contained in a particular group using a **^** before the group name (`--freezeNuisanceGroups=^group_name` will freeze everything except nuisance parameters in the group "group_name".) - - all *constrained* nuisance parameters (not `flatParam` or `rateParam`) can be set floating using `--floatAllNuisances`. +- `--freezeParameters name1[,name2,...]` Will freeze the parameters with the given names to their set values. This option supports the use of regular expression by replacing `name` with `rgx{some regular expression}` for matching to *constrained nuisance parameters* or `var{some regular expression}` for matching to *any* parameter. For example `--freezeParameters rgx{CMS_scale_j.*}` will freeze all constrained nuisance parameters with the prefix `CMS_scale_j`, while `--freezeParameters var{.*rate_scale}` will freeze any parameter (constrained nuisance parameter or otherwise) with the suffix `rate_scale`. + - Use the option `--freezeParameters allConstrainedNuisances` to freeze all nuisance parameters that have a constraint term (i.e not `flatParams` or `rateParams` or other freely floating parameters). + - Similarly, the option `--floatParameters name1[,name2,...]` sets the parameter(s) floating. + - Groups of nuisance parameters (constrained or otherwise), as defined in the datacard, can be frozen using `--freezeNuisanceGroups`. You can also freeze all nuisances that are *not* contained in a particular group using a **^** before the group name (`--freezeNuisanceGroups=^group_name` will freeze everything except nuisance parameters in the group "group_name".) + - All *constrained* nuisance parameters (not `flatParam` or `rateParam`) can be set floating using `--floatAllNuisances`. !!! warning - Note that the floating/freezing options have a priority ordering from lowest to highest as `floatParameters < freezeParameters < freezeNuisanceGroups < floatAllNuisances`. Options with higher priority will override those with lower priority. + Note that the floating/freezing options have a priority ordering from lowest to highest as `floatParameters < freezeParameters < freezeNuisanceGroups < floatAllNuisances`. Options with higher priority will take precedence over those with lower priority. -- `--trackParameters name1[,name2,...]` will add a branch to the output tree for each of the named parameters. This option supports the use of regexp via by replacing `name` with `rgx{some regular expression}` +- `--trackParameters name1[,name2,...]` will add a branch to the output tree for each of the named parameters. This option supports the use of regular expressions by replacing `name` with `rgx{some regular expression}` - - the name of the branch will be **trackedParam_*name***. - - the exact behaviour depends on the method. For example, when using `MultiDimFit` with the `--algo scan`, the value of the parameter at each point in the scan will be saved while for `FitDiagnostics`, only the value at the end of the method will be saved. + - The name of the branch will be **trackedParam_*name***. + - The exact behaviour depends on the method used. For example, when using `MultiDimFit` with `--algo scan`, the value of the parameter at each point in the scan will be saved, while for `FitDiagnostics`, only the value at the end of the fit will be saved. -- `--trackErrors name1[,name2,...]` will add a branch to the output tree for the error of each of the named parameters. This option supports the use of regexp via by replacing `name` with `rgx{some regular expression}` +- `--trackErrors name1[,name2,...]` will add a branch to the output tree for the error of each of the named parameters. This option supports the use of regular expressions by replacing `name` with `rgx{some regular expression}` - - the name of the branch will be **trackedError_*name***. - - the behaviour is the same as `--trackParameters` above. + - The name of the branch will be **trackedError_*name***. + - The behaviour, in terms of which values are saved, is the same as `--trackParameters` above. -By default, the dataset used by combine will be the one pointed to in the datacard. You can tell combine to use a different dataset (for example a toy one that you generated) by using the option `--dataset`. The argument should be `rootfile.root:workspace:location` or `rootfile.root:location`. In order to use this option, you must first convert your datacard to a binary workspace and use this binary workspace as the input to the command line. +By default, the data set used by Combine will be the one listed in the datacard. You can tell Combine to use a different data set (for example a toy data set that you generated) by using the option `--dataset`. The argument should be `rootfile.root:workspace:location` or `rootfile.root:location`. In order to use this option, you must first convert your datacard to a binary workspace and use this binary workspace as the input to Combine. ### Generic Minimizer Options -Combine uses its own minimizer class which is used to steer Minuit (via RooMinimizer) named the `CascadeMinimizer`. This allows for sequential minimization which can help in case a particular setting/algo fails. Also, the `CascadeMinimizer` knows about extra features of Combine such as *discrete* nuisance parameters. +Combine uses its own minimizer class, which is used to steer Minuit (via RooMinimizer), named the `CascadeMinimizer`. This allows for sequential minimization, which can help in case a particular setting or algorithm fails. The `CascadeMinimizer` also knows about extra features of Combine such as *discrete* nuisance parameters. -All of the fits which are performed in several of the methods available use this minimizer. This means that the fits can be tuned using these common options, +All of the fits that are performed in Combine's methods use this minimizer. This means that the fits can be tuned using these common options, * `--cminPoiOnlyFit`: First, perform a fit floating *only* the parameters of interest. This can be useful to find, roughly, where the global minimum is. -* `--cminPreScan`: Do a scan before first minimization -* `--cminPreFit` arg: If set to a value N > 0, the minimizer will perform a pre-fit with strategy (N-1) with frozen nuisance parameters. - * `--cminApproxPreFitTolerance arg`: If non-zero, do first a pre-fit with this tolerance (or 10 times the final tolerance, whichever is largest) +* `--cminPreScan`: Do a scan before the first minimization. +* `--cminPreFit arg` If set to a value N > 0, the minimizer will perform a pre-fit with strategy (N-1), with the nuisance parameters frozen. + * `--cminApproxPreFitTolerance arg`: If non-zero, first do a pre-fit with this tolerance (or 10 times the final tolerance, whichever is largest) * `--cminApproxPreFitStrategy arg`: Strategy to use in the pre-fit. The default is strategy 0. -* `--cminDefaultMinimizerType arg`: Set the default minimizer Type. Default is Minuit2. -* `--cminDefaultMinimizerAlgo arg`: Set the default minimizer Algo. The default is Migrad -* `--cminDefaultMinimizerTolerance arg`: Set the default minimizer Tolerance, the default is 0.1 -* `--cminDefaultMinimizerStrategy arg`: Set the default minimizer Strategy between 0 (speed), 1 (balance - *default*), 2 (robustness). The [Minuit documentation](http://www.fresco.org.uk/minuit/cern/node6.html) for this is pretty sparse but in general, 0 means evaluate the function less often, while 2 will waste function calls to get precise answers. An important note is that Hesse (error/correlation estimation) will be run *only* if the strategy is 1 or 2. -* `--cminFallbackAlgo arg`: Provides a list of fallback algorithms if the default minimizer fails. You can provide multiple ones using the syntax is `Type[,algo],strategy[:tolerance]`: eg `--cminFallbackAlgo Minuit2,Simplex,0:0.1` will fall back to the simplex algo of Minuit2 with strategy 0 and a tolerance 0.1, while `--cminFallbackAlgo Minuit2,1` will use the default algo (migrad) of Minuit2 with strategy 1. +* `--cminDefaultMinimizerType arg`: Set the default minimizer type. By default this is set to Minuit2. +* `--cminDefaultMinimizerAlgo arg`: Set the default minimizer algorithm. The default algorithm is Migrad. +* `--cminDefaultMinimizerTolerance arg`: Set the default minimizer tolerance, the default is 0.1. +* `--cminDefaultMinimizerStrategy arg`: Set the default minimizer strategy between 0 (speed), 1 (balance - *default*), 2 (robustness). The [Minuit documentation](http://www.fresco.org.uk/minuit/cern/node6.html) for this is pretty sparse but in general, 0 means evaluate the function less often, while 2 will waste function calls to get precise answers. An important note is that the `Hesse` algorithm (for error and correlation estimation) will be run *only* if the strategy is 1 or 2. +* `--cminFallbackAlgo arg`: Provides a list of fallback algorithms, to be used in case the default minimizer fails. You can provide multiple options using the syntax `Type[,algo],strategy[:tolerance]`: eg `--cminFallbackAlgo Minuit2,Simplex,0:0.1` will fall back to the simplex algorithm of Minuit2 with strategy 0 and a tolerance 0.1, while `--cminFallbackAlgo Minuit2,1` will use the default algorithm (Migrad) of Minuit2 with strategy 1. * `--cminSetZeroPoint (0/1)`: Set the reference of the NLL to 0 when minimizing, this can help faster convergence to the minimum if the NLL itself is large. The default is true (1), set to 0 to turn off. -The allowed combinations of minimizer types and minimizer algos are as follows +The allowed combinations of minimizer types and minimizer algorithms are as follows: -| **Minimizer Type** | **Minimizer Algo** | +| **Minimizer type** | **Minimizer algorithm** | |--------------------|--------------------| |`Minuit` | `Migrad`, `Simplex`, `Combined`, `Scan` | |`Minuit2` | `Migrad`, `Simplex`, `Combined`, `Scan` | @@ -107,125 +107,125 @@ More of these options can be found in the **Cascade Minimizer options** section ### Output from combine -Most methods will print the results of the computation to the screen, however, in addition, combine will also produce a root file containing a tree called **limit** with these results. The name of this file will be of the format, +Most methods will print the results of the computation to the screen. However, in addition, Combine will also produce a root file containing a tree called **limit** with these results. The name of this file will be of the format, higgsCombineTest.MethodName.mH$MASS.[word$WORD].root where **$WORD** is any user defined keyword from the datacard which has been set to a particular value. -A few command line options of combine can be used to control this output: +A few command-line options can be used to control this output: -- The option `-n` allows you to specify part of the name of the rootfile. e.g. if you do `-n HWW` the roofile will be called `higgsCombineHWW....` instead of `higgsCombineTest` -- The option `-m` allows you to specify the higgs boson mass, which gets written in the filename and also in the tree (this simplifies the bookeeping because you can merge together multiple trees corresponding to different higgs masses using `hadd` and then use the tree to plot the value of the limit vs mass) (default is m=120) -- The option `-s` allows to specify the seed (eg `-s 12345`) used in toy generation. If this option is given, the name of the file will be extended by this seed, eg `higgsCombineTest.AsymptoticLimits.mH120.12345.root` +- The option `-n` allows you to specify part of the name of the root file. e.g. if you pass `-n HWW` the root file will be called `higgsCombineHWW....` instead of `higgsCombineTest` +- The option `-m` allows you to specify the (Higgs boson) mass hypothesis, which gets written in the filename and in the output tree. This simplifies the bookeeping, as it becomes possible to merge multiple trees corresponding to different (Higgs boson) masses using `hadd`. Quantities can then be plotted as a function of the mass. The default value is m=120. +- The option `-s` can be used to specify the seed (eg `-s 12345`) used in toy generation. If this option is given, the name of the file will be extended by this seed, eg `higgsCombineTest.AsymptoticLimits.mH120.12345.root` - The option `--keyword-value` allows you to specify the value of a keyword in the datacard such that **$WORD** (in the datacard) will be given the value of **VALUE** in the command `--keyword-value WORD=VALUE`, eg `higgsCombineTest.AsymptoticLimits.mH120.WORDVALUE.12345.root` The output file will contain a `TDirectory` named **toys**, which will be empty if no toys are generated (see below for details) and a `TTree` called **limit** with the following branches; | **Branch name** | **Type** | **Description** | |------------------------|---------------| ------------------------------------------------------------------------------------------------------------------------| -| **`limit`** | `Double_t` | Main result of combine run with method dependent meaning | +| **`limit`** | `Double_t` | Main result of combine run, with method-dependent meaning | | **`limitErr`** | `Double_t` | Estimated uncertainty on the result | | **`mh`** | `Double_t` | Value of **MH**, specified with `-m` option | | **`iToy`** | `Int_t` | Toy number identifier if running with `-t`| | **`iSeed`** | `Int_t` | Seed specified with `-s`| | **`t_cpu`** | `Float_t` | Estimated CPU time for algorithm| | **`t_real`** | `Float_t` | Estimated real time for algorithm| -| **`quantileExpected`** | `Float_t` | Quantile identifier for methods which calculated expected (quantiles) and observed results (eg conversions from $\Delta\ln L$ values) with method dependent meaning. Negative values are reserved for entries which *do not* related to quantiles of a calculation with the default being set to -1 (usually meaning the *observed* result). | +| **`quantileExpected`** | `Float_t` | Quantile identifier for methods that calculated expected (quantiles) and observed results (eg conversions from $\Delta\ln L$ values), with method-dependent meaning. Negative values are reserved for entries that *do not* relate to quantiles of a calculation, with the default being set to -1 (usually meaning the *observed* result). | -The value of any user defined keyword **$WORD** which is set using `keyword-value` described above will also be included as a branch with type `string` named **WORD**. The option can be repeated multiple times for multiple keywords. +The value of any user-defined keyword **$WORD** that is set using `keyword-value` described above will also be included as a branch with type `string` named **WORD**. The option can be repeated multiple times for multiple keywords. -In some cases, the precise meanings of the branches will depend on the Method being used, which is included in this documentation. +In some cases, the precise meanings of the branches will depend on the method being used. In this case, it will be specified in this documentation. ## Toy data generation -By default, each of these methods will be run using the **observed data** as the input. In several cases (as detailed below), it might be useful to run the tool using toy datasets, including Asimov data. +By default, each of the methods described so far will be run using the **observed data** as the input. In several cases (as detailed below), it is useful to run the tool using toy datasets, including Asimov data sets. -The option `-t` is used to specify to combine to first generate a toy dataset(s) which will be used in replacement of the real data. There are two versions of this, +The option `-t` is used to tell Combine to first generate one or more toy data sets, which will be used instead of the observed data. There are two versions, - * `-t N` with N > 0. Combine will generate N toy datasets from the model and re-run the method once per toy. The seed for the toy generation can be modified with the option `-s` (use `-s -1` for a random seed). The output file will contain one entry in the tree for each of these toys. + * `-t N` with N > 0. Combine will generate N toy datasets from the model and re-run the method once per toy. The seed for the toy generation can be modified with the option `-s` (use `-s -1` for a random seed). The output file will contain one entry in the tree for each of these toys. - * `-t -1` will produce an Asimov dataset in which statistical fluctuations are suppressed. The procedure to generate this Asimov dataset depends on which type of analysis you are using, see below for details. + * `-t -1` will produce an Asimov data set, in which statistical fluctuations are suppressed. The procedure for generating this Asimov data set depends on the type of analysis you are using. More details are given below. !!! warning - The default values of the nuisance parameters (or any parameter) are used to generate the toy. This means that if, for example, you are using parametric shapes and the parameters inside the workspace are set to arbitrary values, *those* arbitrary values will be used to generate the toy. This behaviour can be modified through the use of the option `--setParameters x=value_x,y=value_y...` which will set the values of the parameters (`x` and `y`) before toy generation. You can also load a snap-shot from a previous fit to set the nuisances to their *post-fit* values (see below). + The default values of the nuisance parameters (or any parameter) are used to generate the toy. This means that if, for example, you are using parametric shapes and the parameters inside the workspace are set to arbitrary values, *those* arbitrary values will be used to generate the toy. This behaviour can be modified through the use of the option `--setParameters x=value_x,y=value_y...`, which will set the values of the parameters (`x` and `y`) before toy generation. You can also load a snapshot from a previous fit to set the nuisance parameters to their *post-fit* values (see below). The output file will contain the toys (as `RooDataSets` for the observables, including global observables) in the **toys** directory if the option `--saveToys` is provided. If you include this option, the `limit` TTree in the output will have an entry corresponding to the state of the POI used for the generation of the toy, with the value of **`quantileExpected`** set to **-2**. !!! info - The branches that are created by methods like `MultiDimFit` *will not* show the values used to generate the toy. If you also want the TTree to show the values of the POIs used to generate to toy, you should add additional branches using the `--trackParameters` option as described in the [common command line options](#common-command-line-options) section above. These branches will behave as expected when adding the option `--saveToys`. + The branches that are created by methods like `MultiDimFit` *will not* show the values used to generate the toy. If you also want the TTree to show the values of the POIs used to generate to toy, you should add additional branches using the `--trackParameters` option as described in the [common command-line options](#common-command-line-options) section above. These branches will behave as expected when adding the option `--saveToys`. ### Asimov datasets -If you are using wither `-t -1` or using `AsymptoticLimits`, combine will calculate results based on an Asimov dataset. +If you are using either `-t -1` or `AsymptoticLimits`, Combine will calculate results based on an Asimov data set. - * For counting experiments, the Asimov data will just be set to the total number of expected events (given the values of the nuisance parameters and POIs of the model) + * For counting experiments, the Asimov data set will just be the total number of expected events (given the values of the nuisance parameters and POIs of the model) - * For shape analyses with templates, the Asimov dataset will be constructed as a histogram using the same binning which is defined for your analysis. + * For shape analyses with templates, the Asimov data set will be constructed as a histogram using the same binning that is defined for your analysis. - * If your model uses parametric shapes (for example when you are using binned data, there are some options as to what Asimov dataset to produce. By *default*, combine will produce the Asimov data as a histogram using the binning which is associated to each observable (ie as set using `RooRealVar::setBins`). If this binning doesn't exist, combine will **guess** a suitable binning - it is therefore best to use `RooRealVar::setBins` to associate a binning to each observable, even if your data is unbinned, if you intend to use Asimov datasets. + * If your model uses parametric shapes, there are some options as to what Asimov data set to produce. By *default*, Combine will produce the Asimov data set as a histogram using the binning that is associated with each observable (ie as set using `RooRealVar::setBins`). If this binning does not exist, Combine will **guess** a suitable binning - it is therefore best to use `RooRealVar::setBins` to associate a binning with each observable, even if your data is unbinned, if you intend to use Asimov data sets. -You can also ask combine to use a **Pseudo-Asimov** dataset, which is created from many weighted unbinned events. +You can also ask Combine to use a **Pseudo-Asimov** dataset, which is created from many weighted unbinned events. Setting `--X-rtd TMCSO_AdaptivePseudoAsimov=`$\beta$ with $\beta>0$ will trigger the internal logic of whether to produce a Pseudo-Asimov dataset. This logic is as follows; - 1. For each observable in your dataset, the number of bins, $n_{b}$ is determined either from the value of `RooRealVar::getBins` if it exists or assumed to be 100. + 1. For each observable in your dataset, the number of bins, $n_{b}$ is determined either from the value of `RooRealVar::getBins`, if it exists, or assumed to be 100. - 2. If $N_{b}=\prod_{b}n_{b}>5000$, the number of expected events $N_{ev}$ is determined. *Note* if you are combining multiple channels, $N_{ev}$ refers to the number of expected events in a single channel, the logic is separate for each channel. If $N_{ev}/N_{b}<0.01$ then a Pseudo-Asimov dataset is created with the number of events equal to $\beta \cdot \mathrm{max}\{100*N_{ev},1000\}$. If $N_{ev}/N_{b}\geq 0.01$ , then a normal Asimov dataset is produced. + 2. If $N_{b}=\prod_{b}n_{b}>5000$, the number of expected events $N_{ev}$ is determined. *Note* if you are combining multiple channels, $N_{ev}$ refers to the number of expected events in a single channel. The logic is separate for each channel. If $N_{ev}/N_{b}<0.01$ then a Pseudo-Asimov data set is created with the number of events equal to $\beta \cdot \mathrm{max}\{100*N_{ev},1000\}$. If $N_{ev}/N_{b}\geq 0.01$ , then a normal Asimov data set is produced. - 3. If $N_{b}\leq 5000$ then a normal Asimov dataset will be produced + 3. If $N_{b}\leq 5000$ then a normal Asimov data set will be produced -The production of a Pseudo-Asimov dataset can be *forced* by using the option `--X-rtd TMCSO_PseudoAsimov=X` where `X>0` will determine the number of weighted events for the Pseudo-Asimov dataset. You should try different values of `X` since larger values leads to more events in the Pseudo-Asimov dataset resulting in higher precision but in general the fit will be slower. +The production of a Pseudo-Asimov data set can be *forced* by using the option `--X-rtd TMCSO_PseudoAsimov=X` where `X>0` will determine the number of weighted events for the Pseudo-Asimov data set. You should try different values of `X`, since larger values lead to more events in the Pseudo-Asimov data set, resulting in higher precision. However, in general, the fit will be slower. -You can turn off the internal logic by setting `--X-rtd TMCSO_AdaptivePseudoAsimov=0 --X-rtd TMCSO_PseudoAsimov=0` thereby forcing histograms to be generated. +You can turn off the internal logic by setting `--X-rtd TMCSO_AdaptivePseudoAsimov=0 --X-rtd TMCSO_PseudoAsimov=0`, thereby forcing histograms to be generated. !!! info - If you set `--X-rtd TMCSO_PseudoAsimov=X` with `X>0` and also turn on `--X-rtd TMCSO_AdaptivePseudoAsimov=`$\beta$, with $\beta>0$, the internal logic will be used but this time the default will be to generate Pseudo-Asimov datasets, rather than the normal Asimov ones. + If you set `--X-rtd TMCSO_PseudoAsimov=X` with `X>0` and also turn on `--X-rtd TMCSO_AdaptivePseudoAsimov=`$\beta$, with $\beta>0$, the internal logic will be used, but this time the default will be to generate Pseudo-Asimov data sets, rather than the standard Asimov ones. ### Nuisance parameter generation -The default method of dealing with systematics is to generate random values (around their nominal values, see above) for the nuisance parameters, according to their prior pdfs centred around their default values, *before* generating the data. The *unconstrained* nuisance parameters (eg `flatParam` or `rateParam`) or those with *flat* priors are **not** randomised before the data generation. If you wish to also randomise these parameters, you **must** declare these as `flatParam` in your datacard and when running text2workspace you must add the option `--X-assign-flatParam-prior` in the command line. +The default method of handling systematics is to generate random values (around their nominal values, see above) for the nuisance parameters, according to their prior PDFs centred around their default values, *before* generating the data. The *unconstrained* nuisance parameters (eg `flatParam` or `rateParam`), or those with *flat* priors are **not** randomized before the data generation. If you wish to also randomize these parameters, you **must** declare them as `flatParam` in your datacard and, when running text2workspace, you must add the option `--X-assign-flatParam-prior` to the command line. -The following are options which define how the toys will be generated, +The following options define how the toys will be generated, - * `--toysNoSystematics` the nuisance parameters in each toy are *not* randomised when generating the toy datasets - i.e their nominal values are used to generate the data. Note that for methods which profile (fit) the nuisances, the parameters are still floating when evaluating the likelihood. + * `--toysNoSystematics` the nuisance parameters in each toy are *not* randomized when generating the toy data sets - i.e their nominal values are used to generate the data. Note that for methods which profile (fit) the nuisances, the parameters are still floating when evaluating the likelihood. - * `--toysFrequentist` the nuisance parameters in each toy are set to their nominal values which are obtained *after fitting first to the data*, with POIs fixed, before generating the data. For evaluating likelihoods, the constraint terms are instead randomised within their pdfs around the post-fit nuisance parameter values. + * `--toysFrequentist` the nuisance parameters in each toy are set to their nominal values which are obtained *after first fitting to the observed data*, with the POIs fixed, before generating the toy data sets. For evaluating likelihoods, the constraint terms are instead randomized within their PDFs around the post-fit nuisance parameter values. -If you are using `toysFrequentist`, be aware that the values set by `--setParameters` will be *ignored* for the toy generation as the *post-fit* values will instead be used (except for any parameter which is also a parameter of interest). You can override this behaviour and choose the nominal values for toy generation for any parameter by adding the option `--bypassFrequentistFit` which will skip the initial fit to data or by loading a snapshot (see below). +If you are using `toysFrequentist`, be aware that the values set by `--setParameters` will be *ignored* for the toy generation as the *post-fit* values will instead be used (except for any parameter that is also a parameter of interest). You can override this behaviour and choose the nominal values for toy generation for any parameter by adding the option `--bypassFrequentistFit`, which will skip the initial fit to data, or by loading a snapshot (see below). !!! warning - The methods such as `AsymptoticLimits` and `HybridNew --LHCmode LHC-limits`, the "nominal" nuisance parameter values are taken from fits to the data and are therefore not "blind" to the observed data by default (following the fully frequentist paradigm). See the detailed documentation on these methods for avoiding this and running in a completely "blind" mode. + For methods such as `AsymptoticLimits` and `HybridNew --LHCmode LHC-limits`, the "nominal" nuisance parameter values are taken from fits to the data and are, therefore, not "blind" to the observed data by default (following the fully frequentist paradigm). See the detailed documentation on these methods for how to run in fully "blinded" mode. ### Generate only -It is also possible to generate the toys first and then feed them to the Methods in combine. This can be done using `-M GenerateOnly --saveToys`. The toys can then be read and used with the other methods by specifying `--toysFile=higgsCombineTest.GenerateOnly...` and using the same options for the toy generation. +It is also possible to generate the toys first, and then feed them to the methods in Combine. This can be done using `-M GenerateOnly --saveToys`. The toys can then be read and used with the other methods by specifying `--toysFile=higgsCombineTest.GenerateOnly...` and using the same options for the toy generation. !!! warning - Some Methods also use toys within the method itself (eg `AsymptoticLimits` and `HybridNew`). For these, you should **not** specify the toy generation with `-t` or the options above and instead follow the specific instructions. + Some methods also use toys within the method itself (eg `AsymptoticLimits` and `HybridNew`). For these, you should **not** specify the toy generation with `-t` or the options above. Instead, you should follow the method-specific instructions. ### Loading snapshots -Snapshots from workspaces can be loaded and used in order to generate toys using the option `--snapshotName `. This will first set the parameters to the values in the snapshot *before* any other parameter options are set and toys are generated. +Snapshots from workspaces can be loaded and used in order to generate toys using the option `--snapshotName `. This will first set the parameters to the values in the snapshot, *before* any other parameter options are set and toys are generated. See the section on [saving post-fit workspaces](/HiggsAnalysis-CombinedLimit/part3/commonstatsmethods/#using-best-fit-snapshots) for creating workspaces with post-fit snapshots from `MultiDimFit`. Here are a few examples of calculations with toys from post-fit workspaces using a workspace with $r, m_{H}$ as parameters of interest -- Throw post-fit toy with b from s+b(floating $r,m_{H}$) fit, s with **r=1.0**, **m=best fit MH**, using nuisance values and constraints re-centered on s+b(floating $r,m_{H}$) fit values (aka frequentist post-fit expected) and compute post-fit expected **r** uncertainty profiling **MH** +- Throw post-fit toy with b from s+b(floating $r,m_{H}$) fit, s with **r=1.0**, **m=best fit MH**, using nuisance parameter values and constraints re-centered on s+b(floating $r,m_{H}$) fit values (aka frequentist post-fit expected) and compute post-fit expected **r** uncertainty profiling **MH** `combine higgsCombinemumhfit.MultiDimFit.mH125.root --snapshotName MultiDimFit -M MultiDimFit --verbose 9 -n randomtest --toysFrequentist --bypassFrequentistFit -t -1 --expectSignal=1 -P r --floatOtherPOIs=1 --algo singles` -- Throw post-fit toy with b from s+b(floating $r,m_{H}$) fit, s with **r=1.0, m=128.0**, using nuisance values and constraints re-centered on s+b(floating $r,m_{H}$) fit values (aka frequentist post-fit expected) and compute post-fit expected significance (with **MH** fixed at 128 implicitly) +- Throw post-fit toy with b from s+b(floating $r,m_{H}$) fit, s with **r=1.0, m=128.0**, using nuisance parameter values and constraints re-centered on s+b(floating $r,m_{H}$) fit values (aka frequentist post-fit expected) and compute post-fit expected significance (with **MH** fixed at 128 implicitly) `combine higgsCombinemumhfit.MultiDimFit.mH125.root -m 128 --snapshotName MultiDimFit -M ProfileLikelihood --significance --verbose 9 -n randomtest --toysFrequentist --bypassFrequentistFit --overrideSnapshotMass -t -1 --expectSignal=1 --redefineSignalPOIs r --freezeParameters MH` -- Throw post-fit toy with b from s+b(floating $r,m_{H}$) fit, s with **r=0.0**, using nuisance values and constraints re-centered on s+b(floating $r,m_{H}$) fit values (aka frequentist post-fit expected) and compute post-fit expected and observed asymptotic limit (with **MH** fixed at 128 implicitly) +- Throw post-fit toy with b from s+b(floating $r,m_{H}$) fit, s with **r=0.0**, using nuisance parameter values and constraints re-centered on s+b(floating $r,m_{H}$) fit values (aka frequentist post-fit expected) and compute post-fit expected and observed asymptotic limit (with **MH** fixed at 128 implicitly) `combine higgsCombinemumhfit.MultiDimFit.mH125.root -m 128 --snapshotName MultiDimFit -M AsymptoticLimits --verbose 9 -n randomtest --bypassFrequentistFit --overrideSnapshotMass--redefineSignalPOIs r --freezeParameters MH` ## combineTool for job submission -For longer tasks which cannot be run locally, several methods in combine can be split to run on the *LSF batch* or the *Grid*. The splitting and submission is handled using the `combineTool` (see [this getting started](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/#combine-tool) section to get the tool) +For longer tasks that cannot be run locally, several methods in Combine can be split to run on a *batch* system or on the *Grid*. The splitting and submission is handled using the `combineTool` (see [this getting started](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/#combine-tool) section to check out the tool) ### Submission to Condor @@ -236,40 +236,40 @@ The syntax for running on condor with the tool is combineTool.py -M ALGO [options] --job-mode condor --sub-opts='CLASSADS' --task-name NAME [--dry-run] ``` -with `options` being the usual list of `combine` options. The help option `-h` will give a list of both `combine` and `combineTool` sets of options. This can be used with several different methods from `combine`. +with `options` being the usual list of Combine options. The help option `-h` will give a list of both Combine and `combineTool` options. It is possible to use this tool with several different methods from Combine. The `--sub-opts` option takes a string with the different ClassAds that you want to set, separated by `\n` as argument (e.g. `'+JobFlavour="espresso"\nRequestCpus=1'`). The `--dry-run` option will show what will be run without actually doing so / submitting the jobs. -For example, to generate toys (eg for use with limit setting) users running on lxplus at CERN the **condor** mode can be used eg +For example, to generate toys (eg for use with limit setting) users running on lxplus at CERN can use the **condor** mode: ```sh combineTool.py -d workspace.root -M HybridNew --LHCmode LHC-limits --clsAcc 0 -T 2000 -s -1 --singlePoint 0.2:2.0:0.05 --saveHybridResult -m 125 --job-mode condor --task-name condor-test --sub-opts='+JobFlavour="tomorrow"' ``` -The `--singlePoint` option is over-ridden so that this will produce a script for each value of the POI in the range 0.2 to 2.0 in steps of 0.05. You can merge multiple points into a script using `--merge` - e.g adding `--merge 10` to the above command will mean that each job contains *at most* 10 of the values. The scripts are labelled by the `--task-name` option. These will be submitted directly to condor adding any options in `--sub-opts` to the condor submit script. Make sure multiple options are separated by `\n`. The jobs will run and produce output in the **current directory**. +The `--singlePoint` option is over-ridden, so that this will produce a script for each value of the POI in the range 0.2 to 2.0 in steps of 0.05. You can merge multiple points into a script using `--merge` - e.g adding `--merge 10` to the above command will mean that each job contains *at most* 10 of the values. The scripts are labelled by the `--task-name` option. They will be submitted directly to condor, adding any options in `--sub-opts` to the condor submit script. Make sure multiple options are separated by `\n`. The jobs will run and produce output in the **current directory**. Below is an example for splitting points in a multi-dimensional likelihood scan. #### Splitting jobs for a multi-dimensional likelihood scan -The option `--split-points` issues the command to split the jobs for `MultiDimFit` when using `--algo grid`. The following example will split the jobs such that there are **10 points** in each of the jobs, which will be submitted to the **8nh** queue. +The option `--split-points` issues the command to split the jobs for `MultiDimFit` when using `--algo grid`. The following example will split the jobs such that there are **10 points** in each of the jobs, which will be submitted to the **workday** queue. ```sh combineTool.py datacard.txt -M MultiDimFit --algo grid --points 50 --rMin 0 --rMax 1 --job-mode condor --split-points 10 --sub-opts='+JobFlavour="workday"' --task-name mytask -n mytask ``` -Remember, any usual options (such as redefining POIs or freezing parameters) are passed to combine and can be added to the command line for `combineTool`. +Remember, any usual options (such as redefining POIs or freezing parameters) are passed to Combine and can be added to the command line for `combineTool`. !!! info - The option `-n NAME` should be included to avoid overwriting output files as the jobs will be run inside the directory from which the command is issued. + The option `-n NAME` should be included to avoid overwriting output files, as the jobs will be run inside the directory from which the command is issued. ### Grid submission with combineTool For more CPU-intensive tasks, for example determining limits for complex models using toys, it is generally not feasible to compute all the results interactively. Instead, these jobs can be submitted to the Grid. -In this example we will use the `HybridNew` method of combine to determine an upper limit for a sub-channel of the Run 1 SM $H\rightarrow\tau\tau$ analysis. For full documentation, see the section on [computing limits with toys](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part3/commonstatsmethods/#computing-limits-with-toys). +In this example we will use the `HybridNew` method of Combine to determine an upper limit for a sub-channel of the Run 1 SM $H\rightarrow\tau\tau$ analysis. For full documentation, see the section on [computing limits with toys](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part3/commonstatsmethods/#computing-limits-with-toys). With this model it would take too long to find the limit in one go, so instead we create a set of jobs in which each one throws toys and builds up the test statistic distributions for a fixed value of the signal strength. These jobs can then be submitted to a batch system or to the Grid using `crab3`. From the set of output distributions it is possible to extract the expected and observed limits. @@ -282,7 +282,7 @@ $ text2workspace.py data/tutorials/htt/125/htt_mt.txt -m 125 $ mv data/tutorials/htt/125/htt_mt.root ./ ``` -To get an idea of the range of signal strength values we will need to build test-statistic distributions for we will first use the `AsymptoticLimits` method of combine, +To get an idea of the range of signal strength values we will need to build test-statistic distributions for, we will first use the `AsymptoticLimits` method of Combine, ```nohighlight $ combine -M Asymptotic htt_mt.root -m 125 @@ -299,9 +299,9 @@ Expected 97.5%: r < 1.7200 Based on this, a range of 0.2 to 2.0 should be suitable. -We can use the same command for generating the distribution of test statistics with `combineTool`. The `--singlePoint` option is now enhanced to support expressions that generate a set of calls to combine with different values. The accepted syntax is of the form **MIN:MAX:STEPSIZE**, and multiple comma-separated expressions can be specified. +We can use the same command for generating the distribution of test statistics with `combineTool`. The `--singlePoint` option is now enhanced to support expressions that generate a set of calls to Combine with different values. The accepted syntax is of the form **MIN:MAX:STEPSIZE**, and multiple comma-separated expressions can be specified. -The script also adds an option `--dry-run` which will not actually call combine but just prints out the commands that would be run, e.g, +The script also adds an option `--dry-run`, which will not actually call comCombinebine but just prints out the commands that would be run, e.g, ```sh combineTool.py -M HybridNew -d htt_mt.root --LHCmode LHC-limits --singlePoint 0.2:2.0:0.2 -T 2000 -s -1 --saveToys --saveHybridResult -m 125 --dry-run @@ -316,7 +316,7 @@ When the `--dry-run` option is removed each command will be run in sequence. ### Grid submission with crab3 -Submission to the grid with `crab3` works in a similar way. Before doing so ensure that the `crab3` environment has been sourced in addition to the CMSSW environment. We will use the example of generating a grid of test-statistic distributions for limits. +Submission to the grid with `crab3` works in a similar way. Before doing so, ensure that the `crab3` environment has been sourced in addition to the CMSSW environment. We will use the example of generating a grid of test-statistic distributions for limits. ```sh $ cmsenv; source /cvmfs/cms.cern.ch/crab3/crab.sh @@ -334,9 +334,9 @@ def custom_crab(config): config.Site.blacklist = ['SOME_SITE', 'SOME_OTHER_SITE'] ``` -Again it is possible to use the option `--dry-run` to see what the complete crab config will look like before actually submitted it. +Again it is possible to use the option `--dry-run` to see what the complete crab config will look like before actually submitting it. -Once submitted the progress can be monitored using the standard `crab` commands. When all jobs are completed copy the output from your sites storage element to the local output folder. +Once submitted, the progress can be monitored using the standard `crab` commands. When all jobs are completed, copy the output from your site's storage element to the local output folder. ```sh $ crab getoutput -d crab_grid-test @@ -347,5 +347,5 @@ $ mv higgsCombine*.root ../../ $ cd ../../ ``` -These output files should be combined with `hadd`, after which we invoke combine as usual to calculate observed and expected limits from the merged grid as usual. +These output files should be combined with `hadd`, after which we invoke Combine as usual to calculate observed and expected limits from the merged grid, as usual. diff --git a/docs/part3/simplifiedlikelihood.md b/docs/part3/simplifiedlikelihood.md index 382dda73a49..cde56c9fee1 100644 --- a/docs/part3/simplifiedlikelihood.md +++ b/docs/part3/simplifiedlikelihood.md @@ -4,11 +4,11 @@ This page is to give a brief outline for the creation of (potentially aggregated ## Requirements -You need an up to date version of combine. Note You should use the latest release of combine for the exact commands on this page. You should be using combine tag `v9.0.0` or higher or the latest version of the `112x` branch to follow these instructions. +You need an up to date version of Combine. Note You should use the latest release of Combine for the exact commands on this page. You should be using Combine tag `v9.0.0` or higher or the latest version of the `112x` branch to follow these instructions. -You will find the python scripts needed to convert combine outputs into simplified likelihood inputs under `test/simplifiedLikelihood` +You will find the python scripts needed to convert Combine outputs into simplified likelihood inputs under `test/simplifiedLikelihood` -If you're using the `102x` branch (not reccomended), then you can obtain these scripts from here by running: +If you're using the `102x` branch (not recommended), then you can obtain these scripts from here by running: ``` curl -s https://raw.githubusercontent.com/nucleosynthesis/work-tools/master/sparse-checkout-SL-ssh.sh > checkoutSL.sh bash checkoutSL.sh @@ -22,7 +22,7 @@ git clone https://gitlab.cern.ch/SimplifiedLikelihood/SLtools.git ## Producing covariance for recasting -Producing the necessary predictions and covariance for recasting varies depending on whether control regions are explicitly included in the datacard when running fits. Instructions for cases where the control regions *are* and *are not* included are detailed below. +Producing the necessary predictions and covariance for recasting varies depending on whether or not control regions are explicitly included in the datacard when running fits. Instructions for cases where the control regions *are* and *are not* included are detailed below. !!! warning The instructions below will calculate moments based on the assumption that $E[x]=\hat{x}$, i.e it will use the maximum likelihood estimators for the yields as the expectation values. If instead you want to use the full definition of the moments, you can run the `FitDiagnostics` method with the `-t` option and include `--savePredictionsPerToy` and remove the other options, which will produce a tree of the toys in the output from which moments can be calculated. @@ -35,14 +35,14 @@ For an example datacard 'datacard.txt' including two signal channels 'Signal1' a text2workspace.py --channel-masks --X-allow-no-signal --X-allow-no-background datacard.txt -o datacard.root ``` -Run the fit making the covariance (output saved as `fitDiagnostics.root`) masking the Signal channel. Note that all signal channels must be masked! +Run the fit making the covariance (output saved as `fitDiagnostics.root`) masking the signal channels. Note that all signal channels must be masked! ``` combine datacard.root -M FitDiagnostics --saveShapes --saveWithUnc --numToysForShape 2000 --setParameters mask_Signal1=1,mask_Signal2=1 --saveOverall -N Name ``` Where "Name" can be specified by you. -Outputs including predictions and covariance will be saved in `fitDiagnosticsName.root` folder `shapes_fit_b` +Outputs, including predictions and covariance, will be saved in `fitDiagnosticsName.root` folder `shapes_fit_b` ### Type B - Control regions not included in datacard @@ -52,16 +52,16 @@ For an example datacard 'datacard.txt' including two signal channels 'Signal1' a text2workspace.py --X-allow-no-signal --X-allow-no-background datacard.txt -o datacard.root ``` -Run the fit making the covariance (output saved as `fitDiagnosticsName.root`) setting no signal contribution in the prefit. Note we *must* set `--preFitValue 0` in this case since we will be using the pre-fit uncertainties for the covariance calculation and we don't want to include the uncertainties on the signal. +Run the fit making the covariance (output saved as `fitDiagnosticsName.root`) setting no pre-fit signal contribution. Note we *must* set `--preFitValue 0` in this case since, we will be using the pre-fit uncertainties for the covariance calculation and we do not want to include the uncertainties on the signal. ``` combine datacard.root -M FitDiagnostics --saveShapes --saveWithUnc --numToysForShape 2000 --saveOverall --preFitValue 0 -n Name ``` Where "Name" can be specified by you. -Outputs including predictions and covariance will be saved in `fitDiagnosticsName.root` folder `shapes_prefit` +Outputs, including predictions and covariance, will be saved in `fitDiagnosticsName.root` folder `shapes_prefit` -In order to also pull out the signal yields corresponding to `r=1` (in case you want to run the validation step later), you also need to produce a second file with the prefit value set to 1. For this you don't need to run many toys so to save time, just set `--numToysForShape` to some low value. +In order to also extract the signal yields corresponding to `r=1` (in case you want to run the validation step later), you also need to produce a second file with the pre-fit value set to 1. For this you do not need to run many toys. To save time you can set `--numToysForShape` to a low value. ``` combine datacard.root -M FitDiagnostics --saveShapes --saveWithUnc --numToysForShape 1 --saveOverall --preFitValue 1 -n Name2 @@ -72,12 +72,12 @@ You should check that the order of the bins in the covariance matrix is as expec ## Produce simplified likelihood inputs -Head over to the `test/simplifiedLikelihoods` directory inside your combine area. The following instructions depend on whether you are aggregating or not aggregating your signal regions. Choose the instructions for your case. +Head over to the `test/simplifiedLikelihoods` directory inside your Combine area. The following instructions depend on whether you are aggregating or not aggregating your signal regions. Choose the instructions for your case. ### Not Aggregating -Run the `makeLHInputs.py` script to prepare the inputs for the simplified likelihood. The filter flag can be used to select only signal regions based on the channel names. To include all channels don't include the filter flag. +Run the `makeLHInputs.py` script to prepare the inputs for the simplified likelihood. The filter flag can be used to select only signal regions based on the channel names. To include all channels do not include the filter flag. -The SL input must NOT include any control regions which were not masked in the fit. +The SL input must NOT include any control regions that were not masked in the fit. If your analysis is Type B (i.e everything in the datacard is a signal region), then you can just run @@ -85,29 +85,29 @@ If your analysis is Type B (i.e everything in the datacard is a signal region), python makeLHInputs.py -i fitDiagnosticsName.root -o SLinput.root ``` -If necessary (i.e as in Type B analyses) you may also need to run the same on the run where the prefit value was set to 1. +If necessary (i.e as in Type B analyses) you may also need to run the same on the output of the run where the pre-fit value was set to 1. ``` python makeLHInputs.py -i fitDiagnosticsName2.root -o SLinput2.root ``` -If you instead have a Type A analysis (some of the regions are control regions that were used to fit but not masked) then you should add the option `--filter SignalName` where `SignalName` is some string that defines the signal regions in your datacards (eg "SR" is a common name for these). +If you instead have a Type A analysis (some of the regions are control regions that were used to fit but not masked) then you should add the option `--filter SignalName` where `SignalName` is some string that defines the signal regions in your datacards (for example, "SR" is a common name for these). -Note: If your signal regions cannot be easily identified by a string, follow the instructions below for aggregating but define only one channel for each aggregate region which will maintain the full information and won't actually aggregate any regions. +Note: If your signal regions cannot be easily identified by a string, follow the instructions below for aggregating, but define only one channel for each aggregate region. This will maintain the full information and will not actually aggregate any regions. ### Aggregating -If aggregating based on covariance edit the config file `aggregateCFG.py` to define aggregate regions based on channel names, note that wildcards are supported. You can then make likelihood inputs using +If aggregating based on covariance, edit the config file `aggregateCFG.py` to define aggregate regions based on channel names. Note that wildcards are supported. You can then make likelihood inputs using ``` python makeLHInputs.py -i fitDiagnosticsName.root -o SLinput.root --config aggregateCFG.py ``` -At this point you now have the inputs as ROOT files necessary to publish and run the simplified likelihood. +At this point you have the inputs as ROOT files necessary to publish and run the simplified likelihood. ## Validating the simplified likelihood approach -The simplified likelihood relies on several assumptions (detailed in the documentation at the top). To test the validity for your analysis, statistical results between combine and the simplified likelihood can be compared. +The simplified likelihood relies on several assumptions (detailed in the documentation at the top). To test the validity for your analysis, statistical results between Combine and the simplified likelihood can be compared. We will use the package [SLtools](https://gitlab.cern.ch/SimplifiedLikelihood/SLtools/-/blob/master/README.md) from the [Simplified Likelihood Paper](https://link.springer.com/article/10.1007/JHEP04(2019)064) for this. The first step is to convert the ROOT files into python configs to run in the tool. @@ -121,13 +121,13 @@ If you followed the steps above, you have all of the histograms already necessar * `-d/--data` : The data TGraph, should be of format `file.root:location/to/graph` * `-c/--covariance` : The covariance TH2 histogram, should be of format `file.root:location/to/histogram` -For example to get the correct output from a Type B analysis with no Aggregating, you can run +For example, to get the correct output from a Type B analysis with no aggregating, you can run ```sh python test/simplifiedLikelihoods/convertSLRootToPython.py -O mymodel.py -s SLinput.root:shapes_prefit/total_signal -b SLinput.root:shapes_prefit/total_M2 d -d SLinput.root:shapes_prefit/total_data -c SLinput.root:shapes_prefit/total_M2 ``` -The output will be a python file with the right format for the SL tool. You can mix different ROOT files for these inputs. Note that the SLtools package also has some tools to covert `.yaml` based inputs into the python config for you. +The output will be a python file with the right format for the SL tool. You can mix different ROOT files for these inputs. Note that the `SLtools` package also has some tools to covert `.yaml`-based inputs into the python config for you. ### Run a likelihood scan with the SL @@ -149,7 +149,7 @@ plt.plot(mus,tmus1) plt.show() ``` -Where, the `mymodel.py` config is a simple python file defined as; +Where the `mymodel.py` config is a simple python file defined as; * `data` : A python array of observed data, one entry per bin. * `background` : A python array of expected background, one entry per bin. @@ -178,26 +178,26 @@ covariance = array.array('d', [ 18774.2, -2866.97, -5807.3, -4460.52, -2777.25, ## Example using tutorial datacard -For this example, we'll use the tutorial datacard `data/tutorials/longexercise/datacard_part3.txt`. This datacard is of **Type B** since there are no control regions (all regions are signal regions). +For this example, we will use the tutorial datacard `data/tutorials/longexercise/datacard_part3.txt`. This datacard is of **Type B** since there are no control regions (all regions are signal regions). -First, we'll create the binary file (run `text2workspace`) +First, we will create the binary file (run `text2workspace`) ``` text2workspace.py --X-allow-no-signal --X-allow-no-background data/tutorials/longexercise/datacard_part3.txt -m 200 ``` -And next, we'll generate the covariance between the bins of the background model. +And next, we will generate the covariance between the bins of the background model. ``` combine data/tutorials/longexercise/datacard_part3.root -M FitDiagnostics --saveShapes --saveWithUnc --numToysForShape 10000 --saveOverall --preFitValue 0 -n SimpleTH1 -m 200 combine data/tutorials/longexercise/datacard_part3.root -M FitDiagnostics --saveShapes --saveWithUnc --numToysForShape 1 --saveOverall --preFitValue 1 -n SimpleTH1_Signal1 -m 200 ``` -We will also want to compare our scan to that from the full likelihood, which we can get as usual from combine. +We will also want to compare our scan to that from the full likelihood, which we can get as usual from Combine. ``` combine -M MultiDimFit data/tutorials/longexercise/datacard_part3.root --rMin -0.5 --rMax 2 --algo grid -n SimpleTH1 -m 200 ``` -Next, since we don't plan to aggregate any of the bins, we'll follow the instructions for this and pick out the right covariance matrix. +Next, since we do not plan to aggregate any of the bins, we will follow the instructions for this and pick out the right covariance matrix. ``` python test/simplifiedLikelihoods/makeLHInputs.py -i fitDiagnosticsSimpleTH1.root -o SLinput.root @@ -205,7 +205,7 @@ python test/simplifiedLikelihoods/makeLHInputs.py -i fitDiagnosticsSimpleTH1.roo python test/simplifiedLikelihoods/makeLHInputs.py -i fitDiagnosticsSimpleTH1_Signal1.root -o SLinput_Signal1.root ``` -We now have everything we need to provide the simplified likelihood inputs. E.G +We now have everything we need to provide the simplified likelihood inputs: ``` $ root -l SLinput.root @@ -221,13 +221,13 @@ TFile** SLinput.root KEY: TDirectoryFile shapes_fit_s;1 shapes_fit_s ``` -We can convert this to a python module that we can use to run a scan with the SLtools package. Note, since we have a **Type B** datacard, we'll be using the *pre-fit* covariance matrix. Also, this means we want to take the signal from the file where the prefit value of `r` was 1. +We can convert this to a python module that we can use to run a scan with the `SLtools` package. Note, since we have a **Type B** datacard, we will be using the *pre-fit* covariance matrix. Also, this means we want to take the signal from the file where the prefit value of `r` was 1. ``` python test/simplifiedLikelihoods/convertSLRootToPython.py -O mymodel.py -s SLinput_Signal1.root:shapes_prefit/total_signal -b SLinput.root:shapes_prefit/total_M1-d SLinput.root:shapes_prefit/total_data -c SLinput.root:shapes_prefit/total_M2 ``` -Let's compare the profiled likelihood scans from our simplified likelihood (using the python file we just created) and from the full likelihood (that we created with combine.). For the former, we need to first checkout the SLtools package +We can compare the profiled likelihood scans from our simplified likelihood (using the python file we just created) and from the full likelihood (that we created with Combine.). For the former, we need to first checkout the `SLtools` package ``` git clone https://gitlab.cern.ch/SimplifiedLikelihood/SLtools.git @@ -277,4 +277,4 @@ This will produce a figure like the one below. ![](SLexample.jpg) -It is also possible to include the 3rd moment of each bin to improve the precision of the simplified likelihood [ [JHEP 64 2019](https://link.springer.com/article/10.1007/JHEP04(2019)064) ]. The necessary information is stored in the outputs from combine so you just need to include the option `-t SLinput.root:shapes_prefit/total_M3` in the options list for `convertSLRootToPython.py` to include this in the model file. The 3rd moment information can be included in SLtools by using ` sl.SLParams(background, covariance, third_moment, obs=data, sig=signal)` +It is also possible to include the third moment of each bin to improve the precision of the simplified likelihood [ [JHEP 64 2019](https://link.springer.com/article/10.1007/JHEP04(2019)064) ]. The necessary information is stored in the outputs from Combine, therefore you just need to include the option `-t SLinput.root:shapes_prefit/total_M3` in the options list for `convertSLRootToPython.py` to include this in the model file. The third moment information can be included in `SLtools` by using ` sl.SLParams(background, covariance, third_moment, obs=data, sig=signal)` diff --git a/docs/part3/validation.md b/docs/part3/validation.md index 64afe41beaf..06499c3fadb 100644 --- a/docs/part3/validation.md +++ b/docs/part3/validation.md @@ -1,12 +1,12 @@ # Validating datacards -This section covers the main features of the datacard validation tool which helps you spot potential problems with your datacards at an early stage. The tool is implemented +This section covers the main features of the datacard validation tool that helps you spot potential problems with your datacards at an early stage. The tool is implemented in the [`CombineHarvester/CombineTools`](https://github.com/cms-analysis/CombineHarvester/blob/113x/CombineTools) subpackage. See the [`combineTool`](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/#combine-tool) section of the documentation for checkout instructions. -The datacard validation tool contains a number of checks. It is possible to call sub-sets of these checks when creating datacards within CombineHarvester. However, for now we will only -describe the usage of the validation tool on already existing datacards. If you create your datacards with CombineHarvester and would like to include the checks at the datacard creation -stage, please contact us via [https://hypernews.cern.ch/HyperNews/CMS/get/higgs-combination.html](https://hypernews.cern.ch/HyperNews/CMS/get/higgs-combination.html). +The datacard validation tool contains a number of checks. It is possible to call subsets of these checks when creating datacards within `CombineHarvester`. However, for now we will only +describe the usage of the validation tool on already existing datacards. If you create your datacards with `CombineHarvester` and would like to include the checks at the datacard creation +stage, please contact us via [https://cms-talk.web.cern.ch/c/physics/cat/cat-stats/279](https://cms-talk.web.cern.ch/c/physics/cat/cat-stats/279). ## How to use the tool @@ -53,7 +53,7 @@ optional arguments: --readOnly If this is enabled, skip validation and only read the output json --checkUncertOver CHECKUNCERTOVER, -c CHECKUNCERTOVER - Report uncertainties which have a normalisation effect + Report uncertainties which have a normalization effect larger than this fraction (default:0.1) --reportSigUnder REPORTSIGUNDER, -s REPORTSIGUNDER Report signals contributing less than this fraction of @@ -63,21 +63,21 @@ optional arguments: --mass MASS Signal mass to use (default:*) ``` `printLevel` adjusts how much information is printed to the screen. When set to 0, the results are only written to the json file, but not to the screen. When set to 1 (default), the number of warnings/alerts -of a given type is printed to the screen. Setting this option to 2 prints the same information as level 1, and additionally which uncertainties are affected (if the check is related to uncertainties) or which processes are affected (if the check is related only to processes). When `printLevel` is set to 3, the information from level 2 is printed, and additionaly for checks related to uncertainties prints which processes are affected. +of a given type is printed to the screen. Setting this option to 2 prints the same information as level 1, and additionally prints which uncertainties are affected (if the check is related to uncertainties) or which processes are affected (if the check is related only to processes). When `printLevel` is set to 3, the information from level 2 is printed, and additionaly for checks related to uncertainties it prints which processes are affected. -To print information to screen, the script parses the json file which contains the results of the validation checks, so if you have already run the validation tool and produced this json file, you can simply change the `printLevel` by re-running the tool with `printLevel` set to a different value, and enabling the `--readOnly` option. +To print information to screen, the script parses the json file that contains the results of the validation checks. Therefore, if you have already run the validation tool and produced this json file, you can simply change the `printLevel` by re-running the tool with `printLevel` set to a different value, and enabling the `--readOnly` option. The options `--checkUncertOver` and `--reportSigUnder` will be described in more detail in the section that discusses the checks for which they are relevant. -Note: the `--mass` argument should only be set if you normally use it when running Combine, otherwise you can leave it at the default. +Note: the `--mass` argument should only be set if you normally use it when running Combine, otherwise you can leave it at the default. -The datacard validation tool is primarily intended for shape (histogram)-based analyses. However, when running on a parametric model or counting experiment the checks for small signal processes, empty processes and uncertainties with large normalisation effects will still be performed. +The datacard validation tool is primarily intended for shape (histogram) based analyses. However, when running on a parametric model or counting experiment the checks for small signal processes, empty processes, and uncertainties with large normalization effects can still be performed. ## Details on checks -### Uncertainties with large normalisation effect +### Uncertainties with large normalization effect -This check highlights nuisance parameters which have a normalisation effect larger than the fraction set by the setting `--checkUncertOver`. The default value is 0.1, meaning that any uncertainties with a normalisation +This check highlights nuisance parameters that have a normalization effect larger than the fraction set by the option `--checkUncertOver`. The default value is 0.1, meaning that any uncertainties with a normalization effect larger than 10% are flagged up. The output file contains the following information for this check: @@ -95,7 +95,7 @@ largeNormEff: { } ``` -Where `value_u` and `value_d` are the values of the 'up' and 'down' normalisation effects. +Where `value_u` and `value_d` are the values of the 'up' and 'down' normalization effects. ### At least one of the Up/Down systematic templates is empty @@ -116,11 +116,11 @@ emptySystematicShape: { } } ``` -Where `value_u` and `value_d` are the values of the 'up' and 'down' normalisation effects. +Where `value_u` and `value_d` are the values of the 'up' and 'down' normalization effects. ### Identical Up/Down templates -This check applies to shape uncertainties only, and will highlight cases where the shape uncertainties have identical Up and Down templates (identical in shape and in normalisation). +This check applies to shape uncertainties only, and will highlight cases where the shape uncertainties have identical Up and Down templates (identical in shape and in normalization). The information given in the output file for this check is: @@ -136,12 +136,12 @@ uncertTemplSame: { } } ``` -Where `value_u` and `value_d` are the values of the 'up' and 'down' normalisation effects. +Where `value_u` and `value_d` are the values of the 'up' and 'down' normalization effects. ### Up and Down templates vary the yield in the same direction -Again this check only applies to shape uncertainties - it highlights cases where the 'Up' template and the 'Down' template both have the effect of increasing or decreasing the normalisation of a process. +Again, this check only applies to shape uncertainties - it highlights cases where the 'Up' template and the 'Down' template both have the effect of increasing or decreasing the normalization of a process. The information given in the output file for this check is: @@ -158,15 +158,15 @@ uncertVarySameDirect: { } } ``` -Where `value_u` and `value_d` are the values of the 'up' and 'down' normalisation effects. +Where `value_u` and `value_d` are the values of the 'up' and 'down' normalization effects. ### Uncertainty probably has no genuine shape effect -In this check, applying only to shape uncertainties, the normalised nominal templates are compared with the normalised templates for the 'up' and 'down' systematic variations. The script calculates +In this check, applying only to shape uncertainties, the normalized nominal templates are compared with the normalized templates for the 'up' and 'down' systematic variations. The script calculates $$ \Sigma_i \frac{2|\text{up}(i) - \text{nominal}(i)|}{|\text{up}(i)| + |\text{nominal}(i)|}$$ and $$ \Sigma_i \frac{2|\text{down}(i) - \text{nominal}(i)|}{|\text{down}(i)| + |\text{nominal}(i)|} $$ -where the sums run over all bins in the histograms, and 'nominal', 'up', and 'down' are the central template and up and down varied templates, all normalised. +where the sums run over all bins in the histograms, and 'nominal', 'up', and 'down' are the central template and up and down varied templates, all normalized. If both sums are smaller than 0.001, the uncertainty is flagged up as probably not having a genuine shape effect. This means a 0.1% variation in one bin is enough to avoid being reported, but many smaller variations can also sum to be large enough to pass the threshold. It should be noted that the chosen threshold is somewhat arbitrary: if an uncertainty is flagged up as probably having no genuine shape effect you should take this as a starting point to investigate. @@ -204,9 +204,9 @@ emptyProcessShape: { ``` -### Bins which have signal but no background +### Bins that have signal but no background -For shape-based analyses, this checks whether there are any bins in the nominal templates which have signal contributions, but no background contributions. +For shape-based analyses, this checks whether there are any bins in the nominal templates that have signal contributions, but no background contributions. The information given in the output file for this check is: @@ -223,7 +223,7 @@ emptyBkgBin: { ### Small signal process -This reports signal processes which contribute less than the fraction specified by `--reportSigUnder` (default 0.001 = 0.1%) of the total signal in a given category. This produces an alert, not a warning, as it does not hint at a potential problem. +This reports signal processes that contribute less than the fraction specified by `--reportSigUnder` (default 0.001 = 0.1%) of the total signal in a given category. This produces an alert, not a warning, as it does not hint at a potential problem. However, in analyses with many signal contributions and with long fitting times, it can be helpful to remove signals from a category in which they do not contribute a significant amount. The information given in the output file for this check is: @@ -243,12 +243,12 @@ Where `sigrate_tot` is the total signal yield in the analysis category and `proc ## What to do in case of a warning -These checks are mostly a tool to help you investigate your datacards: a warning does not necessarily mean there is a mistake in your datacard, but you should use it as a starting point to investigate. Empty processes and emtpy shape uncertainties connected to nonempty processes will most likely be unintended. The same holds for cases where the 'up' and 'down' shape templates are identical. If there are bins which contain signal but no background contributions, this should be corrected. See the [FAQ](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part4/usefullinks/#faq) for more information on that point. +These checks are mostly a tool to help you investigate your datacards: a warning does not necessarily mean there is a mistake in your datacard, but you should use it as a starting point to investigate. Empty processes and emtpy shape uncertainties connected to nonempty processes will most likely be unintended. The same holds for cases where the 'up' and 'down' shape templates are identical. If there are bins that contain signal but no background contributions, this should be corrected. See the [FAQ](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part4/usefullinks/#faq) for more information on that point. -For other checks it depends on where the check is fired whether there is a problem or not. Some examples: +For other checks it depends on the situation whether there is a problem or not. Some examples: -- An analysis-specific noncloser uncertainty could be larger than 10%. A theoretical uncertainty in the ttbar normalisation probably not. -- In an analysis with a selection that requires the presence of exactly 1 jet, 'up' and 'down' variations in the jet energy uncertainty *could* both change the process normalisation in the same direction. (But they don't have to!) +- An analysis-specific nonclosure uncertainty could be larger than 10%. A theoretical uncertainty in the ttbar normalization probably not. +- In an analysis with a selection that requires the presence of exactly 1 jet, 'up' and 'down' variations in the jet energy uncertainty *could* both change the process normalization in the same direction. (But they do not have to!) -As always: think about whether you expect a check to yield a warning in case of your analysis, and investigate to make sure. +As always: think about whether you expect a check to yield a warning in case of your analysis, and if not, investigate to make sure there are no issues. diff --git a/docs/part4/usefullinks.md b/docs/part4/usefullinks.md index 08900587eee..43d44bcc89d 100644 --- a/docs/part4/usefullinks.md +++ b/docs/part4/usefullinks.md @@ -2,7 +2,7 @@ ### Tutorials and reading material -There are several tutorials which have been run over the last few years with instructions and examples for running the combine tool. +There are several tutorials that have been run over the last few years with instructions and examples for running the Combine tool. Tutorial Sessions: @@ -15,7 +15,7 @@ Tutorial Sessions: * [7th tutorial 3rd Feb 2023](https://indico.cern.ch/event/1227742/) - Uses `113x` branch -Worked examples from Higgs analyses using combine: +Worked examples from Higgs analyses using Combine: * [The CMS DAS at CERN 2014](https://twiki.cern.ch/twiki/bin/viewauth/CMS/SWGuideCMSDataAnalysisSchool2014HiggsCombPropertiesExercise) * [The CMS DAS at DESY 2018](https://twiki.cern.ch/twiki/bin/view/CMS/SWGuideCMSDataAnalysisSchoolHamburg2018LongStatisticsExercise) @@ -25,11 +25,11 @@ Higgs combinations procedures * [Conventions to be used when preparing inputs for Higgs combinations](https://twiki.cern.ch/twiki/bin/view/CMS/HiggsWG/HiggsCombinationConventions) - * [CMS AN-2011/298](http://cms.cern.ch/iCMS/jsp/db_notes/noteInfo.jsp?cmsnoteid=CMS AN-2011/298) Procedure for the LHC Higgs boson search combination in summer 2011. This describes in more detail some of the methods used in Combine. + * [CMS AN-2011/298](http://cms.cern.ch/iCMS/jsp/db_notes/noteInfo.jsp?cmsnoteid=CMS AN-2011/298) Procedure for the LHC Higgs boson search combination in summer 2011. This describes in more detail some of the methods used in Combine. ### Citations -There is no document currently which can be cited for using the combine tool, however you can use the following publications for the procedures we use, +There is no document currently which can be cited for using the Combine tool, however, you can use the following publications for the procedures we use, * [Summer 2011 public ATLAS-CMS note](https://cds.cern.ch/record/1379837) for any Frequentist limit setting procedures with toys or Bayesian limits, constructing likelihoods, descriptions of nuisance parameter options (like log-normals (`lnN`) or gamma (`gmN`), and for definitions of test-statistics. @@ -45,7 +45,7 @@ There is no document currently which can be cited for using the combine tool, ho ### Combine based packages -* [SWGuideHiggs2TauLimits](https://twiki.cern.ch/twiki/bin/view/CMS/SWGuideHiggs2TauLimits) +* [SWGuideHiggs2TauLimits](https://twiki.cern.ch/twiki/bin/view/CMS/SWGuideHiggs2TauLimits) (Deprecated) * [ATGCRooStats](https://twiki.cern.ch/twiki/bin/view/CMS/ATGCRooStats) @@ -53,7 +53,7 @@ There is no document currently which can be cited for using the combine tool, ho ### Contacts -* **Hypernews forum**: hn-cms-higgs-combination [https://hypernews.cern.ch/HyperNews/CMS/get/higgs-combination.html](https://hypernews.cern.ch/HyperNews/CMS/get/higgs-combination.html) +* **CMStalk forum**: [https://cms-talk.web.cern.ch/c/physics/cat/cat-stats/279](https://cms-talk.web.cern.ch/c/physics/cat/cat-stats/279) ### CMS Statistics Committee @@ -61,34 +61,34 @@ There is no document currently which can be cited for using the combine tool, ho # FAQ -* _Why does combine have trouble with bins that have zero expected contents?_ - * If you're computing only upper limits, and your zero-prediction bins are all empty in data, then you can just set the background to a very small value instead of zero as anyway the computation is regular for background going to zero (e.g. a counting experiment with $B\leq1$ will have essentially the same expected limit and observed limit as one with $B=0$). If you're computing anything else, e.g. p-values, or if your zero-prediction bins are not empty in data, you're out of luck, and you should find a way to get a reasonable background prediction there (and set an uncertainty on it, as per the point above) +* _Why does Combine have trouble with bins that have zero expected contents?_ + * If you are computing only upper limits, and your zero-prediction bins are all empty in data, then you can just set the background to a very small value instead of zero as the computation is regular for background going to zero (e.g. a counting experiment with $B\leq1$ will have essentially the same expected limit and observed limit as one with $B=0$). If you are computing anything else, e.g. p-values, or if your zero-prediction bins are not empty in data, you're out of luck, and you should find a way to get a reasonable background prediction there (and set an uncertainty on it, as per the point above) * _How can an uncertainty be added to a zero quantity?_ - * You can put an uncertainty even on a zero event yield if you use a gamma distribution. That's in fact the more proper way of doing it if the prediction of zero comes from the limited size of your MC or data sample used to compute it. + * You can put an uncertainty even on a zero event yield if you use a gamma distribution. That is in fact the more proper way of doing it if the prediction of zero comes from the limited size of your MC or data sample used to compute it. * _Why does changing the observation in data affect my expected limit?_ * The expected limit (if using either the default behaviour of `-M AsymptoticLimits` or using the `LHC-limits` style limit setting with toys) uses the _**post-fit**_ expectation of the background model to generate toys. This means that first the model is fit to the _**observed data**_ before toy generation. See the sections on [blind limits](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part3/commonstatsmethods/#blind-limits) and [toy generation](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part3/runningthetool/#toy-data-generation) to avoid this behavior. * _How can I deal with an interference term which involves a negative contribution?_ - * You will need to set up a specific PhysicsModel to deal with this, however you can [see this section](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part2/physicsmodels/#interference) to implement such a model which can incorperate a negative contribution to the physics process -* _How does combine work?_ - * That is not a question which can be answered without someone's head exploding so please try to formulate something specific. + * You will need to set up a specific PhysicsModel to deal with this, however you can [see this section](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part2/physicsmodels/#interference) to implement such a model that can incorperate a negative contribution to the physics process +* _How does Combine work?_ + * That is not a question that can be answered without someone's head exploding; please try to formulate something specific. * _What does fit status XYZ mean?_ - * Combine reports the fit status in some routines (for example in the `FitDiagnostics` method). These are typically the status of the last call from Minuit. For details on the meanings of these status codes see the [Minuit2Minimizer](https://root.cern.ch/root/html/ROOT__Minuit2__Minuit2Minimizer.html) documentation page. + * Combine reports the fit status in some routines (for example in the `FitDiagnostics` method). These are typically the status of the last call from Minuit. For details on the meanings of these status codes see the [Minuit2Minimizer](https://root.cern.ch/root/html/ROOT__Minuit2__Minuit2Minimizer.html) documentation page. * _Why does my fit not converge?_ - * There are several reasons why some fits may not converge. Often some indication can be obtained from the `RooFitResult` or status which you will see information from when using the `--verbose X` (with $X>2$) option. Sometimes however, it can be that the likelihood for your data is very unusual. You can get a rough idea about what the likelihood looks like as a function of your parameters (POIs and nuisances) using `combineTool.py -M FastScan -w myworkspace.root` (use --help for options). - * We have seen often that fits in combine using `RooCBShape` as a parametric function will fail. This is related to an optimisation that fails. You can try to fix the problem as described in this issue: [issues#347](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/issues/347) (i.e add the option `--X-rtd ADDNLL_CBNLL=0`). + * There are several reasons why some fits may not converge. Often some indication can be obtained from the `RooFitResult` or status that you will see information from when using the `--verbose X` (with $X>2$) option. Sometimes however, it can be that the likelihood for your data is very unusual. You can get a rough idea about what the likelihood looks like as a function of your parameters (POIs and nuisances) using `combineTool.py -M FastScan -w myworkspace.root` (use --help for options). + * We have often seen that fits in Combine using `RooCBShape` as a parametric function will fail. This is related to an optimization that fails. You can try to fix the problem as described in this issue: [issues#347](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/issues/347) (i.e add the option `--X-rtd ADDNLL_CBNLL=0`). * _Why does the fit/fits take so long?_ - * The minimisation routines are common to many methods in combine. You can tune the fitting using the generic optimisation command line options described [here](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part3/runningthetool/#generic-minimizer-options). For example, setting the default minimizer strategy to 0 can greatly improve the speed since this avoids running Hesse. In calculations such as `AsymptoticLimits`, Hesse is not needed and hence this can be done, however, for `FitDiagnostics` the uncertainties and correlations are part of the output so using strategy 0 may not be particularly accurate. + * The minimization routines are common to many methods in Combine. You can tune the fits using the generic optimization command line options described [here](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part3/runningthetool/#generic-minimizer-options). For example, setting the default minimizer strategy to 0 can greatly improve the speed, since this avoids running HESSE. In calculations such as `AsymptoticLimits`, HESSE is not needed and hence this can be done, however, for `FitDiagnostics` the uncertainties and correlations are part of the output, so using strategy 0 may not be particularly accurate. * _Why are the results for my counting experiment so slow or unstable?_ - * There is a known issue with counting experiments with ***large*** numbers of events which will cause unstable fits or even the fit to fail. You can avoid this by creating a "fake" shape datacard (see [this section](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part2/settinguptheanalysis/#combination-of-multiple-datacards) from the setting up the datacards page). The simplest way to do this is to run `combineCards.py -S mycountingcard.txt > myshapecard.txt`. You may still find that your parameter uncertainties are not correct when you have large numbers of events. This can be often fixed using the `--robustHesse` option. An example of this issue is detailed [here](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/issues/498). + * There is a known issue with counting experiments with ***large*** numbers of events that will cause unstable fits or even the fit to fail. You can avoid this by creating a "fake" shape datacard (see [this section](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part2/settinguptheanalysis/#combination-of-multiple-datacards) from the setting up the datacards page). The simplest way to do this is to run `combineCards.py -S mycountingcard.txt > myshapecard.txt`. You may still find that your parameter uncertainties are not correct when you have large numbers of events. This can be often fixed using the `--robustHesse` option. An example of this issue is detailed [here](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/issues/498). * _Why do some of my nuisance parameters have uncertainties > 1?_ - * When running `-M FitDiagnostics` you may find that the post-fit uncertainties of the nuisances are $> 1$ (or larger than their pre-fit values). If this is the case, you should first check if the same is true when adding the option `--minos all` which will invoke minos to scan the likelihood as a function of these parameters to determine the crossing at $-2\times\Delta\log\mathcal{L}=1$ rather than relying on the estimate from Hesse. However, this is not guaranteed to succeed, in which case you can scan the likelihood yourself using `MultiDimFit` (see [here](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part3/commonstatsmethods/#likelihood-fits-and-scans) ) and specifying the option `--poi X` where `X` is your nuisance parameter. + * When running `-M FitDiagnostics` you may find that the post-fit uncertainties of the nuisances are $> 1$ (or larger than their pre-fit values). If this is the case, you should first check if the same is true when adding the option `--minos all`, which will invoke MINOS to scan the likelihood as a function of these parameters to determine the crossing at $-2\times\Delta\log\mathcal{L}=1$ rather than relying on the estimate from HESSE. However, this is not guaranteed to succeed, in which case you can scan the likelihood yourself using `MultiDimFit` (see [here](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part3/commonstatsmethods/#likelihood-fits-and-scans) ) and specifying the option `--poi X` where `X` is your nuisance parameter. * _How can I avoid using the data?_ * For almost all methods, you can use toy data (or an Asimov dataset) in place of the real data for your results to be blind. You should be careful however as in some methods, such as `-M AsymptoticLimits` or `-M HybridNew --LHCmode LHC-limits` or any other method using the option `--toysFrequentist`, the data will be used to determine the most likely nuisance parameter values (to determine the so-called a-posteriori expectation). See the section on [toy data generation](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part3/runningthetool/#toy-data-generation) for details on this. * _What if my nuisance parameters have correlations which are not 0 or 1?_ - * Combine is designed under the assumption that each *source* of nuisance parameter is uncorrelated with the other sources. If you have a case where some pair (or set) of nuisances have some known correlation structure, you can compute the eigenvectors of their correlation matrix and provide these *diagonalised* nuisances to combine. You can also model *partial correlations*, between different channels or data taking periods, of a given nuisance parameter using the `combineTool` as described in [this page](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/issues/503). + * Combine is designed under the assumption that each *source* of nuisance parameter is uncorrelated with the other sources. If you have a case where some pair (or set) of nuisances have some known correlation structure, you can compute the eigenvectors of their correlation matrix and provide these *diagonalised* nuisances to Combine. You can also model *partial correlations*, between different channels or data taking periods, of a given nuisance parameter using the `combineTool` as described in [this page](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/issues/503). * _My nuisances are (artificially) constrained and/or the impact plot show some strange behaviour, especially after including MC statistical uncertainties. What can I do?_ - * Depending on the details of the analysis, several solutions can be adopted to mitigate these effects. We advise to run the validation tools at first, to identify possible redundant shape uncertainties that can be safely eliminated or replaced with lnN ones. Any remaining artificial constrain should be studies. Possible mitigating strategies can be to (a) smooth the templates or (b) adopt some rebinning in order to reduce statistical fluctuations in the templates. A description of possible strategies and effects can be found in [this talk by Margaret Eminizer](https://indico.cern.ch/event/788727/contributions/3401374/attachments/1831680/2999825/higgs_combine_4_17_2019_fitting_details.pdf) + * Depending on the details of the analysis, several solutions can be adopted to mitigate these effects. We advise to run the validation tools at first, to identify possible redundant shape uncertainties that can be safely eliminated or replaced with lnN ones. Any remaining artificial constraints should be studies. Possible mitigating strategies can be to (a) smooth the templates or (b) adopt some rebinning in order to reduce statistical fluctuations in the templates. A description of possible strategies and effects can be found in [this talk by Margaret Eminizer](https://indico.cern.ch/event/788727/contributions/3401374/attachments/1831680/2999825/higgs_combine_4_17_2019_fitting_details.pdf) * _What do CLs, CLs+b and CLb in the code mean?_ - * The names CLs+b and CLb what are found within some of the RooStats tools are rather outdated and should instead be referred to as p-values - $p_{\mu}$ and $1-p_{b}$, respectively. We use the CLs (which itself is not a p-value) criterion often in High energy physics as it is designed to avoid excluding a signal model when the sensitivity is low (and protects against excluding due to underfluctuations in the data). Typically, when excluding a signal model the p-value $p_{\mu}$ often refers to the p-value under the signal+background hypothesis, assuming a particular value of the signal stregth ($\mu$) while $p_{b}$ is the p-value under the background only hypothesis. You can find more details and definitions of the CLs criterion and $p_{\mu}$ and $p_{b}$ in section 39.4.2.4 of the [2016 PDG review](http://pdg.lbl.gov/2016/reviews/rpp2016-rev-statistics.pdf). + * The names CLs+b and CLb what are found within some of the `RooStats` tools are rather outdated and should instead be referred to as p-values - $p_{\mu}$ and $1-p_{b}$, respectively. We use the CLs (which itself is not a p-value) criterion often in High energy physics as it is designed to avoid excluding a signal model when the sensitivity is low (and protects against excluding due to underfluctuations in the data). Typically, when excluding a signal model the p-value $p_{\mu}$ often refers to the p-value under the signal+background hypothesis, assuming a particular value of the signal strength ($\mu$) while $p_{b}$ is the p-value under the background only hypothesis. You can find more details and definitions of the CLs criterion and $p_{\mu}$ and $p_{b}$ in section 39.4.2.4 of the [2016 PDG review](http://pdg.lbl.gov/2016/reviews/rpp2016-rev-statistics.pdf). diff --git a/docs/part5/longexercise.md b/docs/part5/longexercise.md index 0f02c08c612..c291669e8d3 100644 --- a/docs/part5/longexercise.md +++ b/docs/part5/longexercise.md @@ -1,5 +1,5 @@ # Long exercise: main features of Combine -This exercise is designed to give a broad overview of the tools available for statistical analysis in CMS using the combine tool. Combine is a high-level tool for building RooFit/RooStats models and running common statistical methods. We will cover the typical aspects of setting up an analysis and producing the results, as well as look at ways in which we can diagnose issues and get a deeper understanding of the statistical model. This is a long exercise - expect to spend some time on it especially if you are new to Combine. If you get stuck while working through this exercise or have questions specifically about the exercise, you can ask them on [this mattermost channel](https://mattermost.web.cern.ch/cms-exp/channels/hcomb-tutorial). Finally, we also provide some solutions to some of the questions that are asked as part of the exercise. These are available [here](https://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part5/longexerciseanswers). +This exercise is designed to give a broad overview of the tools available for statistical analysis in CMS using the combine tool. Combine is a high-level tool for building `RooFit`/`RooStats` models and running common statistical methods. We will cover the typical aspects of setting up an analysis and producing the results, as well as look at ways in which we can diagnose issues and get a deeper understanding of the statistical model. This is a long exercise - expect to spend some time on it especially if you are new to Combine. If you get stuck while working through this exercise or have questions specifically about the exercise, you can ask them on [this mattermost channel](https://mattermost.web.cern.ch/cms-exp/channels/hcomb-tutorial). Finally, we also provide some solutions to some of the questions that are asked as part of the exercise. These are available [here](https://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part5/longexerciseanswers). For the majority of this course we will work with a simplified version of a real analysis, that nonetheless will have many features of the full analysis. The analysis is a search for an additional heavy neutral Higgs boson decaying to tau lepton pairs. Such a signature is predicted in many extensions of the standard model, in particular the minimal supersymmetric standard model (MSSM). You can read about the analysis in the paper [here](https://arxiv.org/pdf/1803.06553.pdf). The statistical inference makes use of a variable called the total transverse mass ($M_{\mathrm{T}}^{\mathrm{tot}}$) that provides good discrimination between the resonant high-mass signal and the main backgrounds, which have a falling distribution in this high-mass region. The events selected in the analysis are split into a several categories which target the main di-tau final states as well as the two main production modes: gluon-fusion (ggH) and b-jet associated production (bbH). One example is given below for the fully-hadronic final state in the b-tag category which targets the bbH signal: @@ -12,7 +12,7 @@ You can find a presentation with some more background on likelihoods and extract If you are not yet familiar with these concepts, or would like to refresh your memory, we recommend that you have a look at these presentations before you start with the exercise. ## Getting started -We need to set up a new CMSSW area and checkout the combine package: +We need to set up a new CMSSW area and checkout the Combine package: ```shell cmsrel CMSSW_11_3_4 @@ -26,7 +26,7 @@ git fetch origin git checkout v9.0.0 ``` -We will also make use another package, `CombineHarvester`, which contains some high-level tools for working with combine. The following command will download the repository and checkout just the parts of it we need for this tutorial: +We will also make use another package, `CombineHarvester`, which contains some high-level tools for working with Combine. The following command will download the repository and checkout just the parts of it we need for this tutorial: ```shell bash <(curl -s https://raw.githubusercontent.com/cms-analysis/CombineHarvester/main/CombineTools/scripts/sparse-checkout-https.sh) ``` @@ -82,10 +82,10 @@ The layout of the datacard is as follows: - The first line starting with `bin` gives a unique label to each channel, and the following line starting with `observation` gives the number of events observed in data. - In the remaining part of the card there are several columns: each one represents one process in one channel. The first four lines labelled `bin`, `process`, `process` and `rate` give the channel label, the process label, a process identifier (`<=0` for signal, `>0` for background) and the number of expected events respectively. - The remaining lines describe sources of systematic uncertainty. Each line gives the name of the uncertainty, (which will become the name of the nuisance parameter inside our RooFit model), the type of uncertainty ("lnN" = log-normal normalisation uncertainty) and the effect on each process in each channel. E.g. a 20% uncertainty on the yield is written as 1.20. - - It is also possible to add a hash symbol (`#`) at the start of a line, which combine will then ignore when it reads the card. + - It is also possible to add a hash symbol (`#`) at the start of a line, which Combine will then ignore when it reads the card. -We can now run combine directly using this datacard as input. The general format for running combine is: +We can now run Combine directly using this datacard as input. The general format for running Combine is: ```shell combine -M [method] [datacard] [additional options...] @@ -93,15 +93,15 @@ combine -M [method] [datacard] [additional options...] ### A: Computing limits using the asymptotic approximation -As we are searching for a signal process that does not exist in the standard model, it's natural to set an upper limit on the cross section times branching fraction of the process (assuming our dataset does not contain a significant discovery of new physics). Combine has dedicated method for calculating upper limits. The most commonly used one is `AsymptoticLimits`, which implements the [CLs criterion](https://inspirehep.net/literature/599622) and uses the profile likelihood ratio as the test statistic. As the name implies, the test statistic distributions are determined analytically in the [asymptotic approximation](https://arxiv.org/abs/1007.1727), so there is no need for more time-intensive toy throwing and fitting. Try running the following command: +As we are searching for a signal process that does not exist in the standard model, it's natural to set an upper limit on the cross section times branching fraction of the process (assuming our dataset does not contain a significant discovery of new physics). Combine has dedicated method for calculating upper limits. The most commonly used one is `AsymptoticLimits`, which implements the [CLs criterion](https://inspirehep.net/literature/599622) and uses the profile likelihood ratio as the test statistic. As the name implies, the test statistic distributions are determined analytically in the [asymptotic approximation](https://arxiv.org/abs/1007.1727), so there is no need for more time-intensive toy throwing and fitting. Try running the following command: ```shell combine -M AsymptoticLimits datacard_part1.txt -n .part1A ``` -You should see the results of the observed and expected limit calculations printed to the screen. Here we have added an extra option, `-n .part1A`, which is short for `--name`, and is used to label the output file combine produces, which in this case will be called `higgsCombine.part1A.AsymptoticLimits.mH120.root`. The file name depends on the options we ran with, and is of the form: `higgsCombine[name].[method].mH[mass].root`. The file contains a TTree called `limit` which stores the numerical values returned by the limit computation. Note that in our case we did not set a signal mass when running combine (i.e. `-m 800`), so the output file just uses the default value of `120`. This does not affect our result in any way though, just the label that is used on the output file. +You should see the results of the observed and expected limit calculations printed to the screen. Here we have added an extra option, `-n .part1A`, which is short for `--name`, and is used to label the output file Combine produces, which in this case will be called `higgsCombine.part1A.AsymptoticLimits.mH120.root`. The file name depends on the options we ran with, and is of the form: `higgsCombine[name].[method].mH[mass].root`. The file contains a TTree called `limit` which stores the numerical values returned by the limit computation. Note that in our case we did not set a signal mass when running Combine (i.e. `-m 800`), so the output file just uses the default value of `120`. This does not affect our result in any way though, just the label that is used on the output file. -The limits are given on a parameter called `r`. This is the default **parameter of interest (POI)** that is added to the model automatically. It is a linear scaling of the normalisation of all signal processes given in the datacard, i.e. if $s_{i,j}$ is the nominal number of signal events in channel $i$ for signal process $j$, then the normalisation of that signal in the model is given as $r\cdot s_{i,j}(\vec{\theta})$, where $\vec{\theta}$ represents the set of nuisance parameters which may also affect the signal normalisation. We therefore have some choice in the interpretation of r: for the measurement of a process with a well defined SM prediction we may enter this as the nominal yield in the datacard, such that $r=1$ corresponds to this SM expectation, whereas for setting limits on BSM processes we may choose the nominal yield to correspond to some cross section, e.g. 1 pb, such that we can interpret the limit as a cross section limit directly. In this example the signal has been normalised to a cross section times branching fraction of 1 fb. +The limits are given on a parameter called `r`. This is the default **parameter of interest (POI)** that is added to the model automatically. It is a linear scaling of the normalization of all signal processes given in the datacard, i.e. if $s_{i,j}$ is the nominal number of signal events in channel $i$ for signal process $j$, then the normalization of that signal in the model is given as $r\cdot s_{i,j}(\vec{\theta})$, where $\vec{\theta}$ represents the set of nuisance parameters which may also affect the signal normalization. We therefore have some choice in the interpretation of r: for the measurement of a process with a well-defined SM prediction we may enter this as the nominal yield in the datacard, such that $r=1$ corresponds to this SM expectation, whereas for setting limits on BSM processes we may choose the nominal yield to correspond to some cross section, e.g. 1 pb, such that we can interpret the limit as a cross section limit directly. In this example the signal has been normalised to a cross section times branching fraction of 1 fb. The expected limit is given under the background-only hypothesis. The median value under this hypothesis as well as the quantiles needed to give the 68% and 95% intervals are also calculated. These are all the ingredients needed to produce the standard limit plots you will see in many CMS results, for example the $\sigma \times \mathcal{B}$ limits for the $\text{bb}\phi\rightarrow\tau\tau$ process: @@ -116,19 +116,19 @@ In this case we only computed the values for one signal mass hypothesis, indicat - Now try changing the number of observed events. The observed limit will naturally change, but the expected does too - why might this be? -There are other command line options we can supply to combine which will change its behaviour when run. You can see the full set of supported options by doing `combine -h`. Many options are specific to a given method, but others are more general and are applicable to all methods. Throughout this tutorial we will highlight some of the most useful options you may need to use, for example: +There are other command line options we can supply to Combine which will change its behaviour when run. You can see the full set of supported options by doing `combine -h`. Many options are specific to a given method, but others are more general and are applicable to all methods. Throughout this tutorial we will highlight some of the most useful options you may need to use, for example: - - The range on the signal strength modifier: `--rMin=X` and `--rMax=Y`: In RooFit parameters can optionally have a range specified. The implication of this is that their values cannot be adjusted beyond the limits of this range. The min and max values can be adjusted though, and we might need to do this for our POI `r` if the order of magnitude of our measurement is different from the default range of `[0, 20]`. This will be discussed again later in the tutorial. + - The range on the signal strength modifier: `--rMin=X` and `--rMax=Y`: In `RooFit` parameters can optionally have a range specified. The implication of this is that their values cannot be adjusted beyond the limits of this range. The min and max values can be adjusted though, and we might need to do this for our POI `r` if the order of magnitude of our measurement is different from the default range of `[0, 20]`. This will be discussed again later in the tutorial. - Verbosity: `-v X`: By default combine does not usually produce much output on the screen other the main result at the end. However, much more detailed information can be printed by setting the `-v N` with N larger than zero. For example at `-v 3` the logs from the minimizer, Minuit, will also be printed. These are very useful for debugging problems with the fit. ### Advanced section: B: Computing limits with toys -Now we will look at computing limits without the asymptotic approximation, so instead using toy datasets to determine the test statistic distributions under the signal+background and background-only hypotheses. This can be necessary if we are searching for signal in bins with a small number of events expected. In combine we will use the `HybridNew` method to calculate limits using toys. This mode is capable of calculating limits with several different test statistics and with fine-grained control over how the toy datasets are generated internally. To calculate LHC-style profile likelihood limits (i.e. the same as we did with the asymptotic) we set the option `--LHCmode LHC-limits`. You can read more about the different options in the [Combine documentation](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part3/commonstatsmethods/#computing-limits-with-toys). +Now we will look at computing limits without the asymptotic approximation, so instead using toy datasets to determine the test statistic distributions under the signal+background and background-only hypotheses. This can be necessary if we are searching for signal in bins with a small number of events expected. In Combine we will use the `HybridNew` method to calculate limits using toys. This mode is capable of calculating limits with several different test statistics and with fine-grained control over how the toy datasets are generated internally. To calculate LHC-style profile likelihood limits (i.e. the same as we did with the asymptotic) we set the option `--LHCmode LHC-limits`. You can read more about the different options in the [Combine documentation](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part3/commonstatsmethods/#computing-limits-with-toys). Run the following command: ```shell combine -M HybridNew datacard_part1.txt --LHCmode LHC-limits -n .part1B --saveHybridResult --fork 0 ``` -In contrast to `AsymptoticLimits` this will only determine the observed limit, and will take a few minutes. There will not be much output to the screen while combine is running. You can add the option `-v 1` to get a better idea of what is going on. You should see combine stepping around in `r`, trying to find the value for which CLs = 0.05, i.e. the 95% CL limit. The `--saveHybridResult` option will cause the test statistic distributions that are generated at each tested value of `r` to be saved in the output ROOT file. +In contrast to `AsymptoticLimits` this will only determine the observed limit, and will take a few minutes. There will not be much output to the screen while combine is running. You can add the option `-v 1` to get a better idea of what is going on. You should see Combine stepping around in `r`, trying to find the value for which CLs = 0.05, i.e. the 95% CL limit. The `--saveHybridResult` option will cause the test statistic distributions that are generated at each tested value of `r` to be saved in the output ROOT file. To get an expected limit add the option `--expectedFromGrid X`, where `X` is the desired quantile, e.g. for the median: @@ -136,7 +136,7 @@ To get an expected limit add the option `--expectedFromGrid X`, where `X` is the combine -M HybridNew datacard_part1.txt --LHCmode LHC-limits -n .part1B --saveHybridResult --fork 0 --expectedFromGrid 0.500 ``` -Calculate the median expected limit and the 68% range. The 95% range could also be done, but note it will take much longer to run the 0.025 quantile. While combine is running you can move on to the next steps below. +Calculate the median expected limit and the 68% range. The 95% range could also be done, but note it will take much longer to run the 0.025 quantile. While Combine is running you can move on to the next steps below. **Tasks and questions:** - In contrast to `AsymptoticLimits`, with `HybridNew` each limit comes with an uncertainty. What is the origin of this uncertainty? @@ -169,7 +169,7 @@ Note that for more complex models the fitting time can increase significantly, m Topics covered in this section: - A: Setting up the datacard - - B: Running combine for a blind analysis + - B: Running Combine for a blind analysis - C: Using FitDiagnostics - D: MC statistical uncertainties @@ -247,12 +247,12 @@ A more general way of blinding is to use combine's toy and Asimov dataset genera **Task:** Calculate a blind limit by generating a background-only Asimov with the `-t -1` option instead of using the `AsymptoticLimits` specific options. You should find the observed limit is the same as the expected. Then see what happens if you inject a signal into the Asimov dataset using the `--expectSignal [X]` option. ### C: Using FitDiagnostics -We will now explore one of the most commonly used modes of combine: `FitDiagnostics` . As well as allowing us to make a **measurement** of some physical quantity (as opposed to just setting a limit on it), this method is useful to gain additional information about the model and the behaviour of the fit. It performs two fits: +We will now explore one of the most commonly used modes of Combine: `FitDiagnostics` . As well as allowing us to make a **measurement** of some physical quantity (as opposed to just setting a limit on it), this method is useful to gain additional information about the model and the behaviour of the fit. It performs two fits: - A "background-only" (b-only) fit: first POI (usually "r") fixed to zero - A "signal+background" (s+b) fit: all POIs are floating -With the s+b fit combine will report the best-fit value of our signal strength modifier `r`. As well as the usual output file, a file named `fitDiagnosticsTest.root` is produced which contains additional information. In particular it includes two `RooFitResult` objects, one for the b-only and one for the s+b fit, which store the fitted values of all the **nuisance parameters (NPs)** and POIs as well as estimates of their uncertainties. The covariance matrix from both fits is also included, from which we can learn about the correlations between parameters. Run the `FitDiagnostics` method on our workspace: +With the s+b fit Combine will report the best-fit value of our signal strength modifier `r`. As well as the usual output file, a file named `fitDiagnosticsTest.root` is produced which contains additional information. In particular it includes two `RooFitResult` objects, one for the b-only and one for the s+b fit, which store the fitted values of all the **nuisance parameters (NPs)** and POIs as well as estimates of their uncertainties. The covariance matrix from both fits is also included, from which we can learn about the correlations between parameters. Run the `FitDiagnostics` method on our workspace: ```shell combine -M FitDiagnostics workspace_part2.root -m 800 --rMin -20 --rMax 20 @@ -334,13 +334,13 @@ The numbers in each column are respectively $\frac{\theta-\theta_I}{\sigma_I}$ ( So far there is an important source of uncertainty we have neglected. Our estimates of the backgrounds come either from MC simulation or from sideband regions in data, and in both cases these estimates are subject to a statistical uncertainty on the number of simulated or data events. In principle we should include an independent statistical uncertainty for every bin of every process in our model. -It's important to note that combine/RooFit does not take this into account automatically - statistical fluctuations of the data are implicitly accounted +It's important to note that Combine/`RooFit` does not take this into account automatically - statistical fluctuations of the data are implicitly accounted for in the likelihood formalism, but statistical uncertainties in the model must be specified by us. One way to implement these uncertainties is to create a `shape` uncertainty for each bin of each process, in which the up and down histograms have the contents of the bin shifted up and down by the $1\sigma$ uncertainty. However this makes the likelihood evaluation computationally inefficient, and can lead to a large number of nuisance parameters -in more complex models. Instead we will use a feature in combine called `autoMCStats` that creates these automatically from the datacard, +in more complex models. Instead we will use a feature in Combine called `autoMCStats` that creates these automatically from the datacard, and uses a technique called "Barlow-Beeston-lite" to reduce the number of systematic uncertainties that are created. This works on the assumption that for high MC event counts we can model the uncertainty with a Gaussian distribution. Given the uncertainties in different bins are independent, the total uncertainty of several processes in a particular bin is just the sum of $N$ individual Gaussians, which is itself a Gaussian distribution. So instead of $N$ nuisance parameters we need only one. This breaks down when the number of events is small and we are not in the Gaussian regime. @@ -484,7 +484,7 @@ To produce these distributions add the `--saveShapes` and `--saveWithUncertainti combine -M FitDiagnostics workspace_part3.root -m 200 --rMin -1 --rMax 2 --saveShapes --saveWithUncertainties -n .part3B ``` -Combine will produce pre- and post-fit distributions (for fit_s and fit_b) in the fitDiagnosticsTest.root output file: +Combine will produce pre- and post-fit distributions (for fit_s and fit_b) in the fitDiagnosticsTest.root output file: ![](images/fit_diag_shapes.png) @@ -497,7 +497,7 @@ Combine will produce pre- and post-fit distributions (for fit_s and fit_b) in th ### D: Calculating the significance -In the event that you observe a deviation from your null hypothesis, in this case the b-only hypothesis, combine can be used to calculate the p-value or significance. To do this using the asymptotic approximation simply do: +In the event that you observe a deviation from your null hypothesis, in this case the b-only hypothesis, Combine can be used to calculate the p-value or significance. To do this using the asymptotic approximation simply do: ```shell combine -M Significance workspace_part3.root -m 200 --rMin -1 --rMax 2 @@ -601,7 +601,7 @@ python plot1DScan.py higgsCombine.part3E.MultiDimFit.mH200.root --others 'higgsC ![](images/freeze_first_attempt.png) -This doesn't look quite right - the best-fit has been shifted because unfortunately the `--freezeParameters` option acts before the initial fit, whereas we only want to add it for the scan after this fit. To remedy this we can use a feature of combine that lets us save a "snapshot" of the best-fit parameter values, and reuse this snapshot in subsequent fits. First we perform a single fit, adding the `--saveWorkspace` option: +This doesn't look quite right - the best-fit has been shifted because unfortunately the `--freezeParameters` option acts before the initial fit, whereas we only want to add it for the scan after this fit. To remedy this we can use a feature of Combine that lets us save a "snapshot" of the best-fit parameter values, and reuse this snapshot in subsequent fits. First we perform a single fit, adding the `--saveWorkspace` option: ```shell combine -M MultiDimFit workspace_part3.root -n .part3E.snapshot -m 200 --rMin -1 --rMax 2 --saveWorkspace @@ -642,7 +642,7 @@ While it is perfectly fine to just list the relevant nuisance parameters in the - How important are these tau-related uncertainties compared to the others? ### F: Use of channel masking -We will now return briefly to the topic of blinding. We've seen that we can compute expected results by performing any combine method on an Asimov dataset generated using `-t -1`. This is useful, because we can optimise our analysis without introducing any accidental bias that might come from looking at the data in the signal region. However our control regions have been chosen specifically to be signal-free, and it would be useful to use the data here to set the normalisation of our backgrounds even while the signal region remains blinded. Unfortunately there's no easy way to generate a partial Asimov dataset just for the signal region, but instead we can use a feature called "channel masking" to remove specific channels from the likelihood evaluation. One useful application of this feature is to make post-fit plots of the signal region from a control-region-only fit. +We will now return briefly to the topic of blinding. We've seen that we can compute expected results by performing any Combine method on an Asimov dataset generated using `-t -1`. This is useful, because we can optimise our analysis without introducing any accidental bias that might come from looking at the data in the signal region. However our control regions have been chosen specifically to be signal-free, and it would be useful to use the data here to set the normalisation of our backgrounds even while the signal region remains blinded. Unfortunately there's no easy way to generate a partial Asimov dataset just for the signal region, but instead we can use a feature called "channel masking" to remove specific channels from the likelihood evaluation. One useful application of this feature is to make post-fit plots of the signal region from a control-region-only fit. To use the masking we first need to rerun `text2workspace.py` with an extra option that will create variables named like `mask_[channel]` in the workspace: @@ -659,7 +659,7 @@ Topics covered in this section: - A: Writing a simple physics model - B: Performing and plotting 2D likelihood scans -With combine we are not limited to parametrising the signal with a single scaling parameter `r`. In fact we can define any arbitrary scaling using whatever functions and parameters we would like. +With Combine we are not limited to parametrising the signal with a single scaling parameter `r`. In fact we can define any arbitrary scaling using whatever functions and parameters we would like. For example, when measuring the couplings of the Higgs boson to the different SM particles we would introduce a POI for each coupling parameter, for example $\kappa_{\text{W}}$, $\kappa_{\text{Z}}$, $\kappa_{\tau}$ etc. We would then generate scaling terms for each $i\rightarrow \text{H}\rightarrow j$ process in terms of how the cross section ($\sigma_i(\kappa)$) and branching ratio ($\frac{\Gamma_i(\kappa)}{\Gamma_{\text{tot}}(\kappa)}$) scale relative to the SM prediction. This parametrisation of the signal (and possibly backgrounds too) is specified in a **physics model**. This is a python class that is used by `text2workspace.py` to construct the model in terms of RooFit objects. There is documentation on using phyiscs models [here](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part2/physicsmodels/#physics-models). @@ -692,7 +692,7 @@ dasModel = DASModel() In this we override two methods of the basic `PhysicsModel` class: `doParametersOfInterest` and `getYieldScale`. In the first we define our POI variables, using the doVar function which accepts the RooWorkspace factory syntax for creating variables, and then define all our POIs in a set via the doSet function. The second function will be called for every process in every channel (bin), and using the corresponding strings we have to specify how that process should be scaled. Here we check if the process was declared as signal in the datacard, and if so scale it by `r`, otherwise if it is a background no scaling is applied (`1`). -To use the physics model with `text2workspace.py` first copy it to the python directory in the combine package: +To use the physics model with `text2workspace.py` first copy it to the python directory in the Combine package: ```shell cp DASModel.py $CMSSW_BASE/src/HiggsAnalysis/CombinedLimit/python/ ``` @@ -712,7 +712,7 @@ combine -M MultiDimFit workspace_part4.root -n .part4A -m 200 --rMin 0 --rMax 2 ### B: Performing and plotting 2D likelihood scans -For a model with two POIs it is often useful to look at the how well we are able to measure both simultaneously. A natural extension of determining 1D confidence intervals on a single parameter like we did in part 3D is to determine confidence level regions in 2D. To do this we also use combine in a similar way, with `-M MultiDimFit --algo grid`. When two POIs are found combine will scan a 2D grid of points instead of a 1D array. +For a model with two POIs it is often useful to look at the how well we are able to measure both simultaneously. A natural extension of determining 1D confidence intervals on a single parameter like we did in part 3D is to determine confidence level regions in 2D. To do this we also use combine in a similar way, with `-M MultiDimFit --algo grid`. When two POIs are found, Combine will scan a 2D grid of points instead of a 1D array. **Tasks and questions:** diff --git a/docs/part5/roofit.md b/docs/part5/roofit.md index 5508e2135fc..cbd8cf2d220 100644 --- a/docs/part5/roofit.md +++ b/docs/part5/roofit.md @@ -4,8 +4,8 @@ This section covers a few of the basics of `RooFit`. There are many more tutorials available at this link: [https://root.cern.ch/root/html600/tutorials/roofit/index.html](https://root.cern.ch/root/html600/tutorials/roofit/index.html) ## Objects -In Roofit, any variable, data point, function, PDF (etc.) is represented by a c++ object -The most basic of these is the `RooRealVar`. Let's create one which will represent the mass of some hypothetical particle, we name it and give it an initial starting value and range. +In `RooFit`, any variable, data point, function, PDF (etc.) is represented by a c++ object +The most basic of these is the `RooRealVar`. We will create one that will represent the mass of some hypothetical particle, we name it and give it an initial starting value and range. ```c++ RooRealVar MH("MH","mass of the Hypothetical Boson (H-boson) in GeV",125,120,130); @@ -15,26 +15,26 @@ MH.Print(); RooRealVar::MH = 125 L(120 - 130) ``` -ok, great. This variable is now an object we can play around with. We can access this object and modify it's properties, such as its value. +Ok, great. This variable is now an object we can play around with. We can access this object and modify its properties, such as its value. ```c++ MH.setVal(130); MH.getVal(); ``` -In particle detectors we typically don't observe this particle mass but usually define some observable which is *sensitive* to this mass. Lets assume we can detect and reconstruct the decay products of the H-boson and measure the invariant mass of those particles. We need to make another variable which represents that invariant mass. +In particle detectors we typically do not observe this particle mass, but usually define some observable which is *sensitive* to this mass. We will assume we can detect and reconstruct the decay products of the H-boson and measure the invariant mass of those particles. We need to make another variable that represents that invariant mass. ```c++ RooRealVar mass("m","m (GeV)",100,80,200); ``` -In the perfect world we would perfectly measure the exact mass of the particle in every single event. However, our detectors are usually far from perfect so there will be some resolution effect. Lets assume the resolution of our measurement of the invariant mass is 10 GeV and call it "sigma" +In the perfect world we would perfectly measure the exact mass of the particle in every single event. However, our detectors are usually far from perfect so there will be some resolution effect. We will assume the resolution of our measurement of the invariant mass is 10 GeV and call it "sigma" ```c++ RooRealVar sigma("resolution","#sigma",10,0,20); ``` -More exotic variables can be constructed out of these `RooRealVar`s using `RooFormulaVars`. For example, suppose we wanted to make a function out of the variables which represented the relative resolution as a function of the hypothetical mass MH. +More exotic variables can be constructed out of these `RooRealVar`s using `RooFormulaVars`. For example, suppose we wanted to make a function out of the variables that represented the relative resolution as a function of the hypothetical mass MH. ```c++ RooFormulaVar func("R","@0/@1",RooArgList(sigma,mass)); @@ -67,7 +67,7 @@ func.Print("v"); -Notice how there is a list of the variables we passed (the servers or "actual vars"). We can now plot the function. RooFit has a special plotting object `RooPlot` which keeps track of the objects (and their normalisations) which we want to draw. Since RooFit doesn't know the difference between which objects are/aren't dependant, we need to tell it. +Notice how there is a list of the variables we passed (the servers or "actual vars"). We can now plot the function. `RooFit` has a special plotting object `RooPlot` which keeps track of the objects (and their normalisations) that we want to draw. Since `RooFit` does not know the difference between objects that are and are not dependent, we need to tell it. Right now, we have the relative resolution as $R(m,\sigma)$, whereas we want to plot $R(m,\sigma(m))$! @@ -84,13 +84,13 @@ can->Draw(); ``` ![](images/expo.png) -The main objects we are interested in using from RooFit are *probability denisty functions* or (PDFs). We can construct the PDF, +The main objects we are interested in using from `RooFit` are *probability denisty functions* or (PDFs). We can construct the PDF, $$ f(m|M_{H},\sigma) $$ -as a simple Gaussian shape for example or a `RooGaussian` in RooFit language (think McDonald's logic, everything is a `RooSomethingOrOther`) +as a simple Gaussian shape for example or a `RooGaussian` in `RooFit` language (think McDonald's logic, everything is a `RooSomethingOrOther`) ```c++ RooGaussian gauss("gauss","f(m|M_{H},#sigma)",mass,MH,sigma); @@ -150,7 +150,7 @@ can->Draw(); Note that as we change the value of `MH`, the PDF gets updated at the same time. -PDFs can be used to generate Monte Carlo data. One of the benefits of RooFit is that to do so only uses a single line of code! As before, we have to tell `RooFit` which variables to generate in (e.g which are the observables for an experiment). In this case, each of our events will be a single value of "mass" $m$. The arguments for the function are the set of observables, follwed by the number of events, +PDFs can be used to generate Monte Carlo data. One of the benefits of `RooFit` is that to do so only uses a single line of code! As before, we have to tell `RooFit` which variables to generate in (e.g which are the observables for an experiment). In this case, each of our events will be a single value of "mass" $m$. The arguments for the function are the set of observables, follwed by the number of events, ```c++ RooDataSet *gen_data = (RooDataSet*) gauss.generate(RooArgSet(mass),500); @@ -172,11 +172,11 @@ can->Draw(); ![](images/gausdata.png) -Of course we're not in the business of generating MC events, but collecting *real data!*. Next we will look at using real data in `RooFit`. +Of course we are not in the business of generating MC events, but collecting *real data!*. Next we will look at using real data in `RooFit`. ## Datasets -A dataset is essentially just a collection of points in N-dimensional (N-observables) space. There are two basic implementations in RooFit, +A dataset is essentially just a collection of points in N-dimensional (N-observables) space. There are two basic implementations in `RooFit`, 1) an "unbinned" dataset - `RooDataSet` @@ -186,7 +186,7 @@ both of these use the same basic structure as below ![](images/datastructure.png) -Lets create an empty dataset where the only observable, the mass. Points can be added to the dataset one by one ... +We will create an empty dataset where the only observable is the mass. Points can be added to the dataset one by one ... ```c++ RooDataSet mydata("dummy","My dummy dataset",RooArgSet(mass)); @@ -213,7 +213,7 @@ There are also other ways to manipulate datasets in this way as shown in the dia Luckily there are also Constructors for a `RooDataSet` from a `TTree` and for a `RooDataHist` from a `TH1` so its simple to convert from your usual ROOT objects. -Let's take an example dataset put together already. The file `tutorial.root` can be downloaded [here](https://github.com/amarini/Prefit2020/blob/master/Session%201/tutorial.root). +We will take an example dataset put together already. The file `tutorial.root` can be downloaded [here](https://github.com/amarini/Prefit2020/blob/master/Session%201/tutorial.root). ```c++ TFile *file = TFile::Open("tutorial.root"); @@ -230,9 +230,9 @@ TFile** tutorial.root -Inside the file, there is something called a `RooWorkspace`. This is just the RooFit way of keeping a persistent link between the objects for a model. It is a very useful way to share data and PDFs/functions etc among CMS collaborators. +Inside the file, there is something called a `RooWorkspace`. This is just the `RooFit` way of keeping a persistent link between the objects for a model. It is a very useful way to share data and PDFs/functions etc among CMS collaborators. -Let's take a look at it. It contains a `RooDataSet` and one variable. This time we called our variable (or observable) `CMS_hgg_mass`, let's assume now that this is the invariant mass of photon pairs where we assume our H-boson decays to photons. +We will now take a look at it. It contains a `RooDataSet` and one variable. This time we called our variable (or observable) `CMS_hgg_mass`, we will assume that this is the invariant mass of photon pairs where we assume our H-boson decays to photons. ```c++ RooWorkspace *wspace = (RooWorkspace*) file->Get("workspace"); @@ -254,7 +254,7 @@ RooDataSet::dataset(CMS_hgg_mass) ``` -Let's have a look at the data. The `RooWorkspace` has several accessor functions, we will use the `RooWorkspace::data` one. +Now we will have a look at the data. The `RooWorkspace` has several accessor functions, we will use the `RooWorkspace::data` one. There are also `RooWorkspace::var`, `RooWorkspace::function` and `RooWorkspace::pdf` with (hopefully) obvious purposes. ```c++ @@ -275,29 +275,29 @@ hggcan->Draw(); # Likelihoods and Fitting to data -The data we have in our file doesn't look like a Gaussian distribution. Instead, we could probably use something like an exponential to describe it. +The data we have in our file does not look like a Gaussian distribution. Instead, we could probably use something like an exponential to describe it. -There is an exponential PDF already in `RooFit` (yep you guessed it) `RooExponential`. For a pdf, we only need one parameter which is the exponential slope $\alpha$ so our pdf is, +There is an exponential PDF already in `RooFit` (yes, you guessed it) `RooExponential`. For a PDF, we only need one parameter which is the exponential slope $\alpha$ so our pdf is, $$ f(m|\alpha) = \dfrac{1}{N} e^{-\alpha m}$$ Where of course, $N = \int_{110}^{150} e^{-\alpha m} dm$ is the normalisation constant. -You can find a bunch of available RooFit functions here: [https://root.cern.ch/root/html/ROOFIT_ROOFIT_Index.html](https://root.cern.ch/root/html/ROOFIT_ROOFIT_Index.html) +You can find several available `RooFit` functions here: [https://root.cern.ch/root/html/ROOFIT_ROOFIT_Index.html](https://root.cern.ch/root/html/ROOFIT_ROOFIT_Index.html) -There is also support for a generic pdf in the form of a `RooGenericPdf`, check this link: [https://root.cern.ch/doc/v608/classRooGenericPdf.html](https://root.cern.ch/doc/v608/classRooGenericPdf.html) +There is also support for a generic PDF in the form of a `RooGenericPdf`, check this link: [https://root.cern.ch/doc/v608/classRooGenericPdf.html](https://root.cern.ch/doc/v608/classRooGenericPdf.html) -Let's create an exponential PDF for our background, +Now we will create an exponential PDF for our background, ```c++ RooRealVar alpha("alpha","#alpha",-0.05,-0.2,0.01); RooExponential expo("exp","exponential function",*hgg_mass,alpha); ``` -We can use RooFit to tell us to estimate the value of $\alpha$ using this dataset. You will learn more about parameter estimation but for now we will just assume you know about maximising likelihoods. This *maximum likelihood estimator* is common in HEP and is known to give unbiased estimates for things like distribution means etc. +We can use `RooFit` to tell us to estimate the value of $\alpha$ using this dataset. You will learn more about parameter estimation, but for now we will just assume you know about maximizing likelihoods. This *maximum likelihood estimator* is common in HEP and is known to give unbiased estimates for things like distribution means etc. -This also introduces the other main use of PDFs in RooFit. They can be used to construct *likelihoods* easily. +This also introduces the other main use of PDFs in `RooFit`. They can be used to construct *likelihoods* easily. The likelihood $\mathcal{L}$ is defined for a particluar dataset (and model) as being proportional to the probability to observe the data assuming some pdf. For our data, the probability to observe an event with a value in an interval bounded by a and b is given by, @@ -314,7 +314,7 @@ Note that for a specific dataset, the $dm$ factors which should be there are con The maximum likelihood esitmator for $\alpha$, usually written as $\hat{\alpha}$, is found by maximising $\mathcal{L}(\alpha)$. -Note that this won't depend on the value of the constant of proportionality so we can ignore it. This is true in most scenarios because usually only the *ratio* of likelihoods is needed, in which the constant factors out. +Note that this will not depend on the value of the constant of proportionality so we can ignore it. This is true in most scenarios because usually only the *ratio* of likelihoods is needed, in which the constant factors out. Obviously this multiplication of exponentials can lead to very large (or very small) numbers which can lead to numerical instabilities. To avoid this, we can take logs of the likelihood. Its also common to multiply this by -1 and minimize the resulting **N**egative **L**og **L**ikelihood : $\mathrm{-Log}\mathcal{L}(\alpha)$. @@ -345,9 +345,9 @@ nll->Print("v"); ``` -Notice that the NLL object knows which RooRealVar is the parameter because it doesn't find that one in the dataset. This is how RooFit distiguishes between *observables* and *parameters*. +Notice that the NLL object knows which RooRealVar is the parameter because it doesn't find that one in the dataset. This is how `RooFit` distiguishes between *observables* and *parameters*. -RooFit has an interface to Minuit via the `RooMinimizer` class which takes the NLL as an argument. To minimize, we just call the `RooMinimizer::minimize()` function. **`Minuit2`** is the program and **`migrad`** is the minimization routine which uses gradient descent. +`RooFit` has an interface to Minuit via the `RooMinimizer` class which takes the NLL as an argument. To minimize, we just call the `RooMinimizer::minimize()` function. **`Minuit2`** is the program and **`migrad`** is the minimization routine which uses gradient descent. ```c++ RooMinimizer minim(*nll); @@ -427,7 +427,7 @@ alpha.Print("v"); Error = 0.00291959 ``` -Lets plot the resulting exponential on the data. Notice that the value of $\hat{\alpha}$ is used for the exponential. +We will plot the resulting exponential on top of the data. Notice that the value of $\hat{\alpha}$ is used for the exponential. ```c++ expo.plotOn(plot); @@ -439,9 +439,9 @@ hggcan->Draw(); ![](images/expofit.png) -It looks like there could be a small region near 125 GeV for which our fit doesn't quite go through the points. Maybe our hypothetical H-boson isn't so hypothetical after all! +It looks like there could be a small region near 125 GeV for which our fit does not quite go through the points. Maybe our hypothetical H-boson is not so hypothetical after all! -Let's see what happens if we include some resonant signal into the fit. We can take our Gaussian function again and use that as a signal model. A reasonable value for the resolution of a resonant signal with a mass around 125 GeV decaying to a pair of photons is around a GeV. +We will now see what happens if we include some resonant signal into the fit. We can take our Gaussian function again and use that as a signal model. A reasonable value for the resolution of a resonant signal with a mass around 125 GeV decaying to a pair of photons is around a GeV. ```c++ sigma.setVal(1.); @@ -453,9 +453,9 @@ MH.setConstant(); RooGaussian hgg_signal("signal","Gaussian PDF",*hgg_mass,MH,sigma); ``` -By setting these parameters constant, RooFit knows (either when creating the NLL by hand or when using `fitTo`) that there is not need to fit for these parameters. +By setting these parameters constant, `RooFit` knows (either when creating the NLL by hand or when using `fitTo`) that there is not need to fit for these parameters. -We need to add this to our exponential model and fit a "Sigmal+Background model" by creating a `RooAddPdf`. In RooFit there are two ways to add PDFs, recursively where the fraction of yields for the signal and background is a parameter or absolutely where each PDF has its own normalisation. We're going to use the second one. +We need to add this to our exponential model and fit a "Sigmal+Background model" by creating a `RooAddPdf`. In `RooFit` there are two ways to add PDFs, recursively where the fraction of yields for the signal and background is a parameter or absolutely where each PDF has its own normalization. We're going to use the second one. ```c++ RooRealVar norm_s("norm_s","N_{s}",10,100); @@ -498,14 +498,14 @@ Cached value = 0 ``` -Ok now lets fit the model. Note this time we add the option `Extended()` which tells RooFit that we care about the overall number of observed events in the data $n$ too. It will add an additional Poisson term in the likelihood to account for this so our likelihood this time looks like, +Ok, now we will fit the model. Note this time we add the option `Extended()`, which tells `RooFit` that we care about the overall number of observed events in the data $n$ too. It will add an additional Poisson term in the likelihood to account for this so our likelihood this time looks like, $$L_{s+b}(N_{s},N_{b},\alpha) = \dfrac{ N_{s}+N_{b}^{n} e^{N_{s}+N_{b}} }{n!} \cdot \prod_{i}^{n} \left[ c f_{s}(m_{i}|M_{H},\sigma)+ (1-c)f_{b}(m_{i}|\alpha) \right] $$ where $c = \dfrac{ N_{s} }{ N_{s} + N_{b} }$, $f_{s}(m|M_{H},\sigma)$ is the Gaussian signal pdf and $f_{b}(m|\alpha)$ is the exponential pdf. Remember that $M_{H}$ and $\sigma$ are fixed so that they are no longer parameters of the likelihood. -There is a simpler interface for maximum likelihood fits which is the `RooAbsPdf::fitTo` method. With this simple method, RooFit will construct the negative log-likelihood function, from the pdf, and minimize all of the free parameters in one step. +There is a simpler interface for maximum-likelihood fits which is the `RooAbsPdf::fitTo` method. With this simple method, `RooFit` will construct the negative log-likelihood function, from the pdf, and minimize all of the free parameters in one step. ```c++ model.fitTo(*hgg_data,RooFit::Extended()); @@ -687,14 +687,14 @@ nominal_values = (MH=124.627 +/- 0.398094,resolution=1[C],norm_s=33.9097 +/- 11. ``` -This is exactly what needs to be done when you want to use shape based datacards in combine with parametric models. +This is exactly what needs to be done when you want to use shape based datacards in Combine with parametric models. ## A likelihood for a counting experiment An introductory presentation about likelihoods and interval estimation is available [here](https://indico.cern.ch/event/976099/contributions/4138517/). **Note: We will use python syntax in this section; you should use a .py script. Make sure to do `import ROOT` at the top of your script ** -We've seen how to create variables and pdfs, and how to fit a pdf to data. But what if we have a counting experiment, or a histogram template shape? And what about systematic uncertainties? Let's build a likelihood +We have seen how to create variables and PDFs, and how to fit a PDF to data. But what if we have a counting experiment, or a histogram template shape? And what about systematic uncertainties? We are going to build a likelihood for this: $\mathcal{L} \propto p(\text{data}|\text{parameters})$ @@ -704,12 +704,12 @@ where our parameters are parameters of interest, $\mu$, and nuisance parameters, So we have $\mathcal{L} \propto p(\text{data}|\mu,\vec{\theta})\cdot \pi(\vec{\theta}_0|\vec{\theta})$ -let's try to build the likelihood by hand for a 1-bin counting experiment. -The data is the number of observed events $N$, and the probability is just a poisson probability $p(N|\lambda) = \frac{\lambda^N e^{-\lambda}}{N!}$, where $\lambda$ is the number of events expected in our signal+background model: $\lambda = \mu\cdot s(\vec{\theta}) + b(\vec{\theta})$. +now we will try to build the likelihood by hand for a 1-bin counting experiment. +The data is the number of observed events $N$, and the probability is just a Poisson probability $p(N|\lambda) = \frac{\lambda^N e^{-\lambda}}{N!}$, where $\lambda$ is the number of events expected in our signal+background model: $\lambda = \mu\cdot s(\vec{\theta}) + b(\vec{\theta})$. -In the expression, s and b are the numbers of expected signal- and background events, which both depend on the nuisance parameters. Let's start by building a simple likelihood function with one signal process and one background process. We'll assume there are no nuisance parameters for now. The number of observed events in data is 15, the expected number of signal events is 5 and the expected number of background events 8.1. +In the expression, s and b are the numbers of expected signal and background events, which both depend on the nuisance parameters. We will start by building a simple likelihood function with one signal process and one background process. We will assume there are no nuisance parameters for now. The number of observed events in data is 15, the expected number of signal events is 5 and the expected number of background events 8.1. -It's easiest to use the RooFit workspace factory to build our model ([this tutorial](https://root.cern/doc/master/rf511__wsfactory__basic_8py.html) has more information on the factory syntax). +It is easiest to use the `RooFit` workspace factory to build our model ([this tutorial](https://root.cern/doc/master/rf511__wsfactory__basic_8py.html) has more information on the factory syntax). ``` import ROOT @@ -720,18 +720,18 @@ We need to create an expression for the number of events in our model, $\mu s +b ``` w.factory('expr::n("mu*s +b", mu[1.0,0,4], s[5],b[8.1])') ``` -Now we can build the likelihood, which is just our poisson pdf: +Now we can build the likelihood, which is just our Poisson PDF: ``` w.factory('Poisson::poisN(N[15],n)') ``` -To find the best-fit value for our parameter of interest $\mu$ we need to maximize the likelihood. In practice it's actually easier to minimize the **N**egative **l**og of the **l**ikelihood, or NLL: +To find the best fit value for our parameter of interest $\mu$ we need to maximize the likelihood. In practice it is actually easier to minimize the **N**egative **l**og of the **l**ikelihood, or NLL: ``` w.factory('expr::NLL("-log(@0)",poisN)') ``` -We can now use the RooMinimizer to find the minimum of the NLL +We can now use the `RooMinimizer` to find the minimum of the NLL ``` @@ -743,7 +743,7 @@ bestfitnll = nll.getVal() ``` Notice that we need to set the error level to 0.5 to get the uncertainties (relying on Wilks' theorem!) - note that there is a more reliable way of extracting the confidence interval (explicitly rather than relying on migrad). We will discuss this a bit later in this section. -Now let's add a nuisance parameter, *lumi*, which represents the luminosity uncertainty. It has a 2.5% effect on both the signal and the background. The parameter will be log-normally distributed: when it's 0, the normalization of the signal and background are not modified; at $+1\sigma$ the signal and background normalizations will be multiplied by 1.025 and at $-1\sigma$ they will be divided by 1.025. We should modify the expression for the number of events in our model: +Now we will add a nuisance parameter, *lumi*, which represents the luminosity uncertainty. It has a 2.5% effect on both the signal and the background. The parameter will be log-normally distributed: when it's 0, the normalization of the signal and background are not modified; at $+1\sigma$ the signal and background normalizations will be multiplied by 1.025 and at $-1\sigma$ they will be divided by 1.025. We should modify the expression for the number of events in our model: ``` w.factory('expr::n("mu*s*pow(1.025,lumi) +b*pow(1.025,lumi)", mu[1.0,0,4], s[5],b[8.1],lumi[0,-4,4])') @@ -765,11 +765,11 @@ w.factory('expr::NLL("-log(@0)",likelihood)') Which we can minimize in the same way as before. -Now let's extend our model a bit. +Now we will extend our model a bit. - Expanding on what was demonstrated above, build the likelihood for $N=15$, a signal process *s* with expectation 5 events, a background *ztt* with expectation 3.7 events and a background *tt* with expectation 4.4 events. The luminosity uncertainty applies to all three processes. The signal process is further subject to a 5% log-normally distributed uncertainty *sigth*, *tt* is subject to a 6% log-normally distributed uncertainty *ttxs*, and *ztt* is subject to a 4% log-normally distributed uncertainty *zttxs*. Find the best-fit value and the associated uncertainty -- Also perform an explicit scan of the $\Delta$ NLL ( = log of profile likelihood ratio) and make a graph of the scan. Some example code can be found below to get you started. Hint: you'll need to perform fits for different values of mu, where mu is fixed. In RooFit you can set a variable to be constant as `var("VARNAME").setConstant(True)` -- From the curve that you've created by performing an explicit scan, we can extract the 68% CL interval. You can do so by eye or by writing some code to find the relevant intersections of the curve. +- Also perform an explicit scan of the $\Delta$ NLL ( = log of profile likelihood ratio) and make a graph of the scan. Some example code can be found below to get you started. Hint: you'll need to perform fits for different values of mu, where mu is fixed. In `RooFit` you can set a variable to be constant as `var("VARNAME").setConstant(True)` +- From the curve that you have created by performing an explicit scan, we can extract the 68% CL interval. You can do so by eye or by writing some code to find the relevant intersections of the curve. ``` gr = ROOT.TGraph() @@ -791,7 +791,7 @@ canv.SaveAs("likelihoodscan.pdf") ``` Well, this is doable - but we were only looking at a simple one-bin counting experiment. This might become rather cumbersome for large models... $[*]$ -We'll now switch to Combine which will make it a lot easier to set up your model and do the statistical analysis than trying to build the likelihood yourself. +We will now switch to Combine which will make it a lot easier to set up your model and do the statistical analysis than trying to build the likelihood yourself. -$[*]$ Side note - RooFit does have additional functionality to help with statistical model building, but we won't go into detail today. +$[*]$ Side note - `RooFit` does have additional functionality to help with statistical model building, but we will not go into detail today. From b4057ab12af879e10de25d9de20d45366b7197ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20David?= Date: Thu, 14 Dec 2023 09:59:43 +0100 Subject: [PATCH 85/98] Uppercase the reverend's name (#879) --- docs/full-documentation.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/full-documentation.md b/docs/full-documentation.md index 4d553ff8728..9693b0fdb53 100644 --- a/docs/full-documentation.md +++ b/docs/full-documentation.md @@ -3,9 +3,9 @@ Full documentation ### Common options -#### Choice of the prior for bayesian methods +#### Choice of the prior for Bayesian methods -For methods based on bayesian inference (BayesianSimple, MarkovChainMC) you can specify a prior for the signal strength. This is controlled through option **`--prior`**, and the values that are currently allowed are: +For methods based on Bayesian inference (BayesianSimple, MarkovChainMC) you can specify a prior for the signal strength. This is controlled through option **`--prior`**, and the values that are currently allowed are: - **uniform**: flat prior - **1/sqrt(r)**: prior proportional to *1/sqrt(r)*, where *r* is the signal strength; for a counting experiment with a single channel and no systematics, this is Jeffrey's prior. @@ -63,7 +63,7 @@ If you believe there's something going wrong, e.g. if your chain remains stuck a #### HybridNew algorithm **Type of limit** -By default, HybridNew computes hybrid bayesian-frequentist limits. If one specifies the command line option **`--freqentist`** then it will instead compute the fully frequentist limits. +By default, HybridNew computes hybrid Bayesian-frequentist limits. If one specifies the command line option **`--freqentist`** then it will instead compute the fully frequentist limits. **Rule** (option **`--rule`**) The rule defines how the distribution of the test statistics is used to compute a limit. When using the *CL<sub>s+b</sub>* rule the limit to the value of the signal strength for which 95% of the pseudo-experiments give a result more signal-like than the current one, <nobr>*P(x < x<sub>obs</sub>|r\*s+b) = 1 - CL*</nobr>. For the more conservative *CL<sub>s</sub>* rule, the limit is set by the condition <nobr>*P(x < x<sub>obs</sub>|r\*s+b) /P(x < x<sub>obs</sub>|b) = 1 - CL*</nobr> . @@ -77,7 +77,7 @@ The **test statistics** is the measure of how signal-like or background-like is - **Profile Likelihood modified for upper limits** (option value **`LHC`** or **`MPL`**): The LHC-like (or Atlas-like) profiled likelihood in which the maximization of the likelihood is done also in the signal strength (*max<sub>θ</sub> L(x|r\*s+b,θ) / max<sub>r', θ</sub> L(x|r'\*s+b,θ)* ), with the constraints *0 ≤ r' ≤ r* where the upper bound is applied to force the method to always give an upper limit and not a two-sided interval. - **Profile Likelihood (not modified for upper limits)** (option value **`PL`**): The traditional profiled likelihood in which the maximization of the likelihood is done also in the signal strength (*max<sub>θ</sub>L(x|r\*s+b,θ) / max<sub>r', θ</sub>L(x|x|r'\*s+b,θ)* ), with just the physical constraints *0 ≤ r'* This test statistics can give two-sided limits, as it starts decreasing when the number of observed events is above the expectations from the signal+background hypothesis. -The default value when computing hybrid bayesian-frequentist limits is **`LEP`**. The default value when computing frequentist limits is **`LHC`**. +The default value when computing hybrid Bayesian-frequentist limits is **`LEP`**. The default value when computing frequentist limits is **`LHC`**. **Accuracy** The search for the limit is performed using an adaptive algorithm, terminating when the estimate of the limit value is below some limit or when the precision cannot be futher improved with the specified options. The options controlling this behaviour are: From 13555cc0b637098a43e95d28d4392ac412e30008 Mon Sep 17 00:00:00 2001 From: nckw Date: Thu, 14 Dec 2023 09:03:38 +0000 Subject: [PATCH 86/98] Include docker installation index.md (#864) * Include docker installation index.md Include docker installation instructions. This PR likely clashes with #762, which includes installation via VM (do we also want to support that?) * Update to include CernVM from #762 * updated VM instructions to new cernVM system --------- Co-authored-by: Giacomo Ortona --- docs/index.md | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/docs/index.md b/docs/index.md index da40bb43012..4c74509e682 100644 --- a/docs/index.md +++ b/docs/index.md @@ -96,6 +96,17 @@ git checkout v7.0.13 scramv1 b clean; scramv1 b # always make a clean build ``` +## Oustide of CMSSW (recommended for non-CMS users) + +Pre-compiled versions of the tool are available as containers from the [CMS cloud pages](https://gitlab.cern.ch/cms-cloud/combine-standalone). These containers can be downloaded and run using [Docker](https://cms-opendata-guide.web.cern.ch/tools/docker/. If you have docker running you can pull and run the *latest* version using, + +```sh +docker run --name combine -it gitlab-registry.cern.ch/cms-cloud/combine-standalone:latest +``` + +You will now have the compiled `combine` binary available as well as the complete package of tool. +The container can be re-started using `docker start -i combine`. + ## Standalone compilation The standalone version can be easily compiled using @@ -158,6 +169,25 @@ conda activate combine **Note:** on OS X, Combine can only accept workspaces, so run `text2workspace.py` first. This is due to an issue with child processes and `LD_LIBRARY_PATH` (see note in Makefile) +### Standalone compilation with CernVM + +`combine`, either standalone or not, can be compiled via CVMFS using access to `/cvmfs/cms.cern.ch/` obtained using a virtual machine - [`CernVM`](https://cernvm.cern.ch/). To use `CernVM` You should have access to CERN IT resources. If you are a CERN user you can use your account, otherwise you can request a lightweight account. +If you have a CERN user account, we strongly suggest you simply run one of the other standalone installations, which are simpler and faster than using a VM. + +You should have a working VM on your local machine, compatible with CernVM, such as `VirtualBox`. All the required software can be downloaded [here](https://cernvm.cern.ch/appliance/). +At least 2GB of disk space should be reserved on the virtual machine for `combine` to work properly and the machine must be contextualized to add the `CMS`` group to CVMFS. A minimal working setup is described below. + +0. Download the CernVM-launcher for your operating system, following the instructions available [`here`] for your operating system (https://cernvm.readthedocs.io/en/stable/cpt-launch.html#installation + +1. Prepare a CMS context. You can use the CMS open data one already available on gitHub: +```wget https://raw.githubusercontent.com/cernvm/public-contexts/master/cms-opendata-2011.context)``` + +2. Launch the virtual machine ```cernvm-launch create --name combine --cpus 2 cms-opendata-2011.context``` + +3. In the VM, proceed with an installation of combine + +Installation through CernVM is maintained on a best-effort basis and these instructions may not be up to date. + # What has changed between tags? You can generate a diff of any two tags (eg for `v9.1.0` and `v9.0.0`) by using the following url: @@ -202,5 +232,3 @@ bash <(curl -s https://raw.githubusercontent.com/cms-analysis/CombineHarvester/m make sure to run `scram` to compile the `CombineTools` package. See the [`CombineHarvester`](http://cms-analysis.github.io/CombineHarvester/) documentation pages for more details on using this tool and additional features available in the full package. - - From b9538db4230e4859f4f4f3982b66bba57b2c6976 Mon Sep 17 00:00:00 2001 From: nckw Date: Thu, 14 Dec 2023 09:43:47 +0000 Subject: [PATCH 87/98] Adding folder CAT23001 with datacards used in the paper (#865) * Adding folder CAT23001 with datacards used in the paper * updates for changes needed for paper * Update to paper v12 --------- Co-authored-by: Nick Wardle --- .../CAT23001/counting-experiment-datacard.txt | 15 +++++++++++++ .../default-physics-model-datacard.txt | 15 +++++++++++++ .../CAT23001/example-abcd-datacard.txt | 18 ++++++++++++++++ .../CAT23001/multi-signal-datacard.txt | 19 +++++++++++++++++ .../parametric-analysis-datacard-input.root | Bin 0 -> 14419 bytes .../CAT23001/parametric-analysis-datacard.txt | 20 ++++++++++++++++++ .../template-analysis-datacard-input.root | Bin 0 -> 8724 bytes .../CAT23001/template-analysis-datacard.txt | 18 ++++++++++++++++ 8 files changed, 105 insertions(+) create mode 100644 data/tutorials/CAT23001/counting-experiment-datacard.txt create mode 100644 data/tutorials/CAT23001/default-physics-model-datacard.txt create mode 100644 data/tutorials/CAT23001/example-abcd-datacard.txt create mode 100644 data/tutorials/CAT23001/multi-signal-datacard.txt create mode 100644 data/tutorials/CAT23001/parametric-analysis-datacard-input.root create mode 100644 data/tutorials/CAT23001/parametric-analysis-datacard.txt create mode 100644 data/tutorials/CAT23001/template-analysis-datacard-input.root create mode 100644 data/tutorials/CAT23001/template-analysis-datacard.txt diff --git a/data/tutorials/CAT23001/counting-experiment-datacard.txt b/data/tutorials/CAT23001/counting-experiment-datacard.txt new file mode 100644 index 00000000000..b661aeb731d --- /dev/null +++ b/data/tutorials/CAT23001/counting-experiment-datacard.txt @@ -0,0 +1,15 @@ +imax 1 +jmax 2 +kmax 3 +# A single channel - ch1 - in which 0 events are observed in data +bin ch1 +observation 0 +# ---------- +bin ch1 ch1 ch1 +process ppX WW tt +process 0 1 2 +rate 1.47 0.64 0.22 +# ---------- +lumi lnN 1.11 1.11 1.11 +xs lnN 1.20 - - +nWW gmN 4 - 0.16 - diff --git a/data/tutorials/CAT23001/default-physics-model-datacard.txt b/data/tutorials/CAT23001/default-physics-model-datacard.txt new file mode 100644 index 00000000000..cdf11b07a88 --- /dev/null +++ b/data/tutorials/CAT23001/default-physics-model-datacard.txt @@ -0,0 +1,15 @@ +imax 1 number of channels +jmax 1 number of backgrounds +kmax 2 number of nuisance parameters (sources of systematical uncertainties) +------------ +# One channel, in which we observe 0 events +bin ch1 +observation 0 +# ------------ +bin ch1 ch1 +process S B +process 0 1 +rate 4.76 1.47 +# ------------ +deltaS lnN 1.20 - 20\% uncertainty on signal +deltaB lnN - 1.50 50\% uncertainty on background diff --git a/data/tutorials/CAT23001/example-abcd-datacard.txt b/data/tutorials/CAT23001/example-abcd-datacard.txt new file mode 100644 index 00000000000..cf846a949df --- /dev/null +++ b/data/tutorials/CAT23001/example-abcd-datacard.txt @@ -0,0 +1,18 @@ +imax 4 +jmax 1 +kmax * +# ------- +bin B C D A +observation 50 100 500 16 +# ------- +bin B C D A A +process bkg bkg bkg bkg sig +process 1 2 3 4 0 +rate 1 1 1 1 3 +# ------- +lumi lnN - - - - 1.02 +eff lnN - - - - 1.01 +alpha rateParam A bkg (@0*@1/@2) beta,gamma,delta +beta rateParam B bkg 50 +gamma rateParam C bkg 100 +delta rateParam D bkg 500 diff --git a/data/tutorials/CAT23001/multi-signal-datacard.txt b/data/tutorials/CAT23001/multi-signal-datacard.txt new file mode 100644 index 00000000000..ddab1d5e1c0 --- /dev/null +++ b/data/tutorials/CAT23001/multi-signal-datacard.txt @@ -0,0 +1,19 @@ +imax 2 +jmax 2 +kmax * +------------ +shapes * dijet FAKE +shapes * incl FAKE +------------ +bin incl dijet +observation 166 8 +------------ +bin incl incl incl dijet dijet dijet +process ggH_hgg qqH_hgg bkg ggH_hgg qqH_hgg bkg +process -1 0 1 -1 0 1 +rate 21 1.6 140 0.4 0.95 3.2 +------------ +QCDscale_ggH lnN 1.12 - - 1.12 - - +pdf_gg lnN 1.08 - - 1.08 - - +pdf_qqbar lnN - 1.025 - - 1.025 - +bg_incl lnN - - 1.05 - - - diff --git a/data/tutorials/CAT23001/parametric-analysis-datacard-input.root b/data/tutorials/CAT23001/parametric-analysis-datacard-input.root new file mode 100644 index 0000000000000000000000000000000000000000..ba321ff576a7c59f19eeb18d23dce243d132eff0 GIT binary patch literal 14419 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 literal 0 HcmV?d00001 diff --git a/data/tutorials/CAT23001/parametric-analysis-datacard.txt b/data/tutorials/CAT23001/parametric-analysis-datacard.txt new file mode 100644 index 00000000000..30e81a7cb89 --- /dev/null +++ b/data/tutorials/CAT23001/parametric-analysis-datacard.txt @@ -0,0 +1,20 @@ +imax 1 +jmax 1 +kmax 2 +# --------------- +shapes data_obs ch1 parametric-analysis-datacard-input.root w:data_obs +shapes signal ch1 parametric-analysis-datacard-input.root w:sig +shapes background ch1 parametric-analysis-datacard-input.root w:bkg +# --------------- +bin ch1 +observation 567 +# --------------- +bin ch1 ch1 +process signal background +process 0 1 +rate 10 1 +# --------------- +lumi lnN 1.1 - +sigma param 1.0 0.1 +alpha flatParam +bkg_norm flatParam diff --git a/data/tutorials/CAT23001/template-analysis-datacard-input.root b/data/tutorials/CAT23001/template-analysis-datacard-input.root new file mode 100644 index 0000000000000000000000000000000000000000..c267d75ddf1d8495897bce3267235ba324ea04e5 GIT binary patch literal 8724 zcmb`N2Ut_hw)b~J54|HuN2C*a2azHmRY5w07C}lVp$i10_aY!7h;->qL3)wir6^LR zs&wi7i@fK1?|bfZ@44sRb9SDcy`M>D*6jIB=D%jGxFQfp0N4Wo0ALLOEEE91+=0H= zL7%_NoG{UEHUL1B1^^`c0LV76Kr}dxbSrat$g-}nc^m!dKXnuVzZm4&M{ubq>#JCe`!cQ60RuK`%U ztz26Iz@lg)PU!R68UQfH{7;VnO8(tbFygwt((j&vh*1a7?rwc?DAXAW4LlH#fwT*eatfh^ghF1j84wdO z#D^R*Rv6=xyQA%38S_V5`cd}yU>h0qw6>muso04UNFIyd%ybvtJ8hEFI1gl z(cHl5rW4um=GlFE_Bv{*UTgV_|~s0gNlh<5SezUOjVz6-YFc?E|bnO`D2Jn%jR z-;H0|A%lWIAONy(z<;BkZr4HbwNb>4^fY%X<}pUq7ax$)_H6I=Ury$B^MD)UKLw%K zvdGD_WpTBcr$icun|Da#gVgSrljAe=SCHkyQUOU|ceC(KZ*iogjDb!;vl^Di0xg)i z0wKe(@Mu#A)Ij8t6;e0&aVxEKLU(9fxrW(Mm+lf{?glwV$GbxV&s0?Ivu($=Z79PP z2=jT76nW&_g|qg_L67WyT*85~eN-)zsWhBVZo72RW&Fq3pwn24`W<5F1Fg|IHwA1t zp{I?LQT(4z4c}!kDrWAVq*pP#D*j=*J*;awkVG%}X6zHs=E=~>20xA?A_@&=@i!_g zw`){dzfoao{)vj>KciAacsl)KSdn1B4GRsc>A93Tg$_mNRoc|3yP*!t%j0m9=QJG4 zZ=@lHt0h6qknF7NP)r=dNvx?`QW#}q?pF5Ml@B2Jm6d|*qU=;;-wDRk4Ge76wefSa z1V%;Hh6bvNh1q{P4rQbz?PcuEUlGY`-C_MsxI;cdfCT|;Q7y>UMqx4y_O7L87puvY z{c!umCr|JB4pfnk=1OppDX{S8$SI*1i+qS6y5LE9tQsv$%q&+^*1=>_Hl|nrl;@|3Sh;F0zSxNM!TXvf3;9+>@BWh2TfCZf}k zJfY4pf>wv~r{VtV?t}Ho~DhbzpII7*#{e0Y*ZG)stmtOhl>l;fz(2 zugxEzv?*X;|-;!bIc*K^8R z9w{xAFv*3cuJH#K)M9t6#nF9BEJ(L4+oYep{BlPm2@%a7#z+@uwjt`Hyo~sHyHvSf z480fyUN1)d*E3xH_YB8@{yD>Oe+!p6!qScA@ATpSm;Rv+Vj!UZj|HentwWn8^mUQ} z;Tv2_obGUXo^ZM9ul_eM?@@~}E1$nnFow!!^EH7+eXxSeP^nBoUU*GdvnH6gx!2g< z@@_6J1TJ6rCmx*~iw7M<@*3!igZnusP=v8=G+h=WlHsfG*L7wjB?#%v*1z-@%g5u2 z8>}+kf<|B+HlWfU**k73>10K4Yt!x�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 a|1oQ>|HOfgl>KjJ4LZQaLg6X$9Qc30Q9vvJ literal 0 HcmV?d00001 diff --git a/data/tutorials/CAT23001/template-analysis-datacard.txt b/data/tutorials/CAT23001/template-analysis-datacard.txt new file mode 100644 index 00000000000..172a2366c81 --- /dev/null +++ b/data/tutorials/CAT23001/template-analysis-datacard.txt @@ -0,0 +1,18 @@ +imax 1 +jmax 1 +kmax 4 +# --------------- +shapes * * template-analysis-datacard-input.root $PROCESS $PROCESS_$SYSTEMATIC +# --------------- +bin ch1 +observation 85 +# ------------------------------ +bin ch1 ch1 +process signal background +process 0 1 +rate 24 100 +# -------------------------------- +lumi lnN 1.1 1.0 +bgnorm lnN 1.0 1.3 +alpha shape - 1 # uncertainty on background shape and normalization. +sigma shape 0.5 - # uncertainty on signal shape. From ce02748834e771595f073f7d906f805a81ee9e1f Mon Sep 17 00:00:00 2001 From: Nick Wardle Date: Thu, 14 Dec 2023 10:55:35 +0100 Subject: [PATCH 88/98] Adding version tag in printout --- bin/combine.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/bin/combine.cpp b/bin/combine.cpp index e5ada18689f..2ff2b2603fd 100644 --- a/bin/combine.cpp +++ b/bin/combine.cpp @@ -31,6 +31,10 @@ using namespace std; +// Update whenever we have a new Tag +std::string combineTagString = "v9.1.0"; +// + int main(int argc, char **argv) { using namespace boost; namespace po = boost::program_options; @@ -147,6 +151,8 @@ int main(int argc, char **argv) { splashFile.close(); } else { std::cout << " <<< Combine >>> " << std::endl; + // UPDATE THIS TO THE LATEST TAG WHENEVER RELEASED + std::cout << Form(" <<< %s >>>",combineTagString.c_str() ) << std::endl; } // now search for algo, and add option From 43d983dd8e2261696e30216d797d43ad72fa80cb Mon Sep 17 00:00:00 2001 From: nckw Date: Thu, 14 Dec 2023 10:02:07 +0000 Subject: [PATCH 89/98] Create LICENSE --- LICENSE | 201 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 201 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000000..261eeb9e9f8 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. From ec31c309bcd95f4c116ad6f3faf8018908f1fa8d Mon Sep 17 00:00:00 2001 From: nckw Date: Thu, 14 Dec 2023 15:39:03 +0000 Subject: [PATCH 90/98] Update index.md --- docs/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/index.md b/docs/index.md index 4c74509e682..5e772a51f83 100644 --- a/docs/index.md +++ b/docs/index.md @@ -98,7 +98,7 @@ scramv1 b clean; scramv1 b # always make a clean build ## Oustide of CMSSW (recommended for non-CMS users) -Pre-compiled versions of the tool are available as containers from the [CMS cloud pages](https://gitlab.cern.ch/cms-cloud/combine-standalone). These containers can be downloaded and run using [Docker](https://cms-opendata-guide.web.cern.ch/tools/docker/. If you have docker running you can pull and run the *latest* version using, +Pre-compiled versions of the tool are available as containers from the [CMS cloud pages](https://gitlab.cern.ch/cms-cloud/combine-standalone). These containers can be downloaded and run using [Docker](https://cms-opendata-guide.web.cern.ch/tools/docker/). If you have docker running you can pull and run the *latest* version using, ```sh docker run --name combine -it gitlab-registry.cern.ch/cms-cloud/combine-standalone:latest From 2812272a5547499092c6f2d92e85d7f4a06bc9e1 Mon Sep 17 00:00:00 2001 From: nckw Date: Tue, 19 Dec 2023 12:19:33 +0000 Subject: [PATCH 91/98] Update runningthetool.md Add explanation as to why repeated commands wont give identical results. Also moved branch discussion out of info box. --- docs/part3/runningthetool.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/docs/part3/runningthetool.md b/docs/part3/runningthetool.md index bffcc5c520c..5b27513ca7e 100644 --- a/docs/part3/runningthetool.md +++ b/docs/part3/runningthetool.md @@ -152,8 +152,11 @@ The option `-t` is used to tell CombineCombine commands will not be identical when using the datacard as the input. This is due to a feature in the tool that allows one to run concurrent commands that do not interfere with one another. In order to produce reproducible results with toy-based methods, you should first convert the datacard to a binary workspace using `text2workspace.py` and then use the resulting file as input to the Combine commands + ### Asimov datasets From e4705e2feb6b01799388c618ab668e4f600656ed Mon Sep 17 00:00:00 2001 From: nckw Date: Tue, 19 Dec 2023 17:35:50 +0000 Subject: [PATCH 92/98] Update runningthetool.md --- docs/part3/runningthetool.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/part3/runningthetool.md b/docs/part3/runningthetool.md index 5b27513ca7e..c1c10351445 100644 --- a/docs/part3/runningthetool.md +++ b/docs/part3/runningthetool.md @@ -152,7 +152,7 @@ The option `-t` is used to tell CombineCombine commands will not be identical when using the datacard as the input. This is due to a feature in the tool that allows one to run concurrent commands that do not interfere with one another. In order to produce reproducible results with toy-based methods, you should first convert the datacard to a binary workspace using `text2workspace.py` and then use the resulting file as input to the Combine commands From 7a408dd2503dd9407b9b8b9b6169008fde7a67a7 Mon Sep 17 00:00:00 2001 From: Jonas Rembser Date: Wed, 20 Dec 2023 18:07:15 +0100 Subject: [PATCH 93/98] Don't do public accessor workarounds if not needed (#875) Some public accessor hacks are now hidden behind preprocessor macros. This will serve as a reminder to remove these workarounds in the far future when combine doesn't support old ROOT versions anymore. --- interface/utils.h | 2 ++ src/CachingMultiPdf.cc | 4 ++++ src/VectorizedHistFactoryPdfs.cc | 16 ++++++++++++---- src/utils.cc | 19 ++++++++++++++++--- 4 files changed, 34 insertions(+), 7 deletions(-) diff --git a/interface/utils.h b/interface/utils.h index 04490a89967..0cf66b8682b 100644 --- a/interface/utils.h +++ b/interface/utils.h @@ -56,8 +56,10 @@ namespace utils { /// factorize a RooAbsReal void factorizeFunc(const RooArgSet &observables, RooAbsReal &pdf, RooArgList &obsTerms, RooArgList &otherTerms, bool keepDuplicates = true, bool debug=false); +#if ROOT_VERSION_CODE < ROOT_VERSION(6,28,0) /// workaround for RooProdPdf::components() RooArgList factors(const RooProduct &prod) ; +#endif /// Note: doesn't recompose Simultaneous pdfs properly, for that use factorizePdf method RooAbsPdf *makeObsOnlyPdf(RooStats::ModelConfig &model, const char *name="obsPdf") ; diff --git a/src/CachingMultiPdf.cc b/src/CachingMultiPdf.cc index bbc83a67843..eb7840d46e2 100644 --- a/src/CachingMultiPdf.cc +++ b/src/CachingMultiPdf.cc @@ -134,7 +134,11 @@ void cacheutils::CachingAddPdf::setIncludeZeroWeights(bool includeZeroWeights) cacheutils::CachingProduct::CachingProduct(const RooProduct &pdf, const RooArgSet &obs) : pdf_(&pdf) { +#if ROOT_VERSION_CODE < ROOT_VERSION(6,28,0) const RooArgList & pdfs = utils::factors(pdf); +#else + const RooArgList & pdfs = pdf.realComponents(); +#endif //std::cout << "Making a CachingProduct for " << pdf.GetName() << " with " << pdfs.getSize() << " pdfs, " << coeffs.getSize() << " coeffs." << std::endl; for (int i = 0, n = pdfs.getSize(); i < n; ++i) { RooAbsReal *pdfi = (RooAbsReal*) pdfs.at(i); diff --git a/src/VectorizedHistFactoryPdfs.cc b/src/VectorizedHistFactoryPdfs.cc index eae5d4ea59e..83874d5764b 100644 --- a/src/VectorizedHistFactoryPdfs.cc +++ b/src/VectorizedHistFactoryPdfs.cc @@ -81,24 +81,32 @@ cacheutils::VectorizedParamHistFunc::fill(std::vector &out) const } } +#if ROOT_VERSION_CODE < ROOT_VERSION(6,30,0) namespace { class PiecewiseInterpolationWithAccessor : public PiecewiseInterpolation { public: PiecewiseInterpolationWithAccessor(const PiecewiseInterpolation &p) : PiecewiseInterpolation(p) {} - const RooAbsReal & nominal() const { return _nominal.arg(); } - int getInterpCode(int i) const { return _interpCode[i]; } + const RooAbsReal* nominalHist() const { return &_nominal.arg(); } + const std::vector& interpolationCodes() const { return _interpCode; } bool positiveDefinite() const { return _positiveDefinite; } }; } +#endif cacheutils::CachingPiecewiseInterpolation::CachingPiecewiseInterpolation(const PiecewiseInterpolation &pdf, const RooArgSet &obs) : pdf_(&pdf) { +#if ROOT_VERSION_CODE < ROOT_VERSION(6,30,0) + // Since ROOT 6.30, the public accessors are in upstream RooFit and we + // don't need this hack. PiecewiseInterpolationWithAccessor fixme(pdf); +#else + auto& fixme = pdf; +#endif const RooArgList & highList = pdf.highList(); const RooArgList & lowList = pdf.lowList(); - const RooAbsReal & nominal = fixme.nominal(); + const RooAbsReal & nominal = *fixme.nominalHist(); const RooArgList & coeffs = pdf.paramList(); //std::cout << "Making a CachingPiecewiseInterpolation for " << pdf.GetName() << " with " << highList.getSize() << " pdfs, " << coeffs.getSize() << " coeffs." << std::endl; positiveDefinite_ = fixme.positiveDefinite(); @@ -109,7 +117,7 @@ cacheutils::CachingPiecewiseInterpolation::CachingPiecewiseInterpolation(const P RooAbsReal *pdfiLo = (RooAbsReal*) lowList.at(i); cachingPdfsLow_.push_back(makeCachingPdf(pdfiLo, &obs)); coeffs_.push_back((RooAbsReal*) coeffs.at(i)); - codes_.push_back(fixme.getInterpCode(i)); + codes_.push_back(fixme.interpolationCodes()[i]); //std::cout << " PiecewiseInterpolation Adding " << pdf.GetName() << "[" << i << "] Hi : " << pdfiHi->ClassName() << " " << pdfiHi->GetName() << " using " << typeid(cachingPdfsHi_.back()).name() << std::endl; //std::cout << " PiecewiseInterpolation Adding " << pdf.GetName() << "[" << i << "] Hi : " << pdfiHi->ClassName() << " " << pdfiHi->GetName() << " using " << typeid(cachingPdfsHi_.back()).name() << std::endl; //std::cout << " PiecewiseInterpolation Adding " << pdf.GetName() << "[" << i << "] Coeff : " << coeffs_.back()->ClassName() << " " << coeffs_.back()->GetName() << std::endl; diff --git a/src/utils.cc b/src/utils.cc index 13c6b144e3c..ad56448f1d5 100644 --- a/src/utils.cc +++ b/src/utils.cc @@ -43,7 +43,13 @@ using namespace std; +#if ROOT_VERSION_CODE < ROOT_VERSION(6,28,0) + // This is needed to be able to factorize products in factorizeFunc, since RooProduct::components() strips duplicates +// +// Note: since ROOT 6.28.00, this workaround is not necessary more, because +// there is direct public access to the _compRSet via +// RooProduct::realComponents(). namespace { class RooProductWithAccessors : public RooProduct { public: @@ -61,6 +67,12 @@ namespace { }; } +RooArgList utils::factors(const RooProduct &prod) { + return ::RooProductWithAccessors(prod).realTerms(); +} + +#endif + void utils::printRDH(RooAbsData *data) { std::vector varnames, catnames; const RooArgSet *b0 = data->get(); @@ -224,9 +236,6 @@ void utils::factorizePdf(const RooArgSet &observables, RooAbsPdf &pdf, RooArgLis } -RooArgList utils::factors(const RooProduct &prod) { - return ::RooProductWithAccessors(prod).realTerms(); -} void utils::factorizeFunc(const RooArgSet &observables, RooAbsReal &func, RooArgList &obsTerms, RooArgList &constraints, bool keepDuplicate, bool debug) { RooAbsPdf *pdf = dynamic_cast(&func); if (pdf != 0) { @@ -236,7 +245,11 @@ void utils::factorizeFunc(const RooArgSet &observables, RooAbsReal &func, RooArg const std::type_info & id = typeid(func); if (id == typeid(RooProduct)) { RooProduct *prod = dynamic_cast(&func); +#if ROOT_VERSION_CODE < ROOT_VERSION(6,28,0) RooArgList components(utils::factors(*prod)); +#else + RooArgList components(prod->realComponents()); +#endif //std::cout << "Function " << func.GetName() << " is a RooProduct with " << components.getSize() << " components." << std::endl; std::unique_ptr iter(components.createIterator()); for (RooAbsReal *funci = (RooAbsReal *) iter->Next(); funci != 0; funci = (RooAbsReal *) iter->Next()) { From 06a73aa2ff06c6f7341b0d471ba39b40052bb16f Mon Sep 17 00:00:00 2001 From: Jonas Rembser Date: Wed, 20 Dec 2023 18:07:22 +0100 Subject: [PATCH 94/98] Replace deprecated legacy iterators (#874) The legacy iterators are deprecated since ROOT 6.18 and they will be removed at some point. This commit also fixes a few memory leaks, and it might also benefit the performance a bit because the legacy iterators had quite some overhead. --- interface/AtlasPdfs.h | 3 - interface/FastTemplateFunc.h | 5 +- interface/HZZ4L_RooSpinZeroPdf_1D.h | 1 - interface/ProcessNormalization.h | 1 - interface/RooMultiPdf.h | 1 - interface/SimpleCacheSentry.h | 1 - interface/VerticalInterpHistPdf.h | 4 - interface/VerticalInterpPdf.h | 2 - src/AsimovUtils.cc | 22 ++--- src/AsymptoticLimits.cc | 6 +- src/AtlasPdfs.cxx | 66 +++----------- src/CMSHggFormula.cc | 15 ++-- src/CMSHistErrorPropagator.cc | 4 +- src/CMSHistFunc.cc | 4 +- src/CMSHistFuncWrapper.cc | 4 +- src/CMSHistSum.cc | 4 +- src/CachingNLL.cc | 16 ++-- src/CascadeMinimizer.cc | 3 +- src/Combine.cc | 66 +++++--------- src/FitDiagnostics.cc | 17 ++-- src/FitterAlgoBase.cc | 14 ++- src/HWWLVJJRooPdfs.cc | 10 +-- src/HWWLVJRooPdfs.cxx | 1 - src/HZGRooPdfs.cxx | 44 ++++----- src/HZZ4L_RooCTauPdf_1D.cc | 5 +- src/HZZ4L_RooCTauPdf_1D_Expanded.cc | 10 +-- src/HZZ4L_RooCTauPdf_2D.cc | 5 +- src/HZZ4L_RooSpinZeroPdf.cc | 7 +- src/HZZ4L_RooSpinZeroPdf_1D.cc | 8 +- src/HZZ4L_RooSpinZeroPdf_1D_fast.cc | 10 +-- src/HZZ4L_RooSpinZeroPdf_2D.cc | 9 +- src/HZZ4L_RooSpinZeroPdf_2D_fast.cc | 10 +-- src/HZZ4L_RooSpinZeroPdf_phase.cc | 7 +- src/HZZ4L_RooSpinZeroPdf_phase_fast.cc | 10 +-- src/HybridNew.cc | 24 +++-- src/MarkovChainMC.cc | 3 +- src/MultiDimFit.cc | 15 ++-- src/ProcessNormalization.cc | 9 +- src/ProfiledLikelihoodRatioTestStatExt.cc | 3 +- src/RobustHesse.cc | 8 +- src/RooCheapProduct.cc | 6 +- src/RooEFTScalingFunction.cc | 5 +- src/RooMorphingPdf.cc | 6 +- src/RooMultiPdf.cxx | 9 +- src/RooParametricHist.cxx | 29 ++---- src/RooParametricHist2D.cxx | 40 +-------- src/RooParametricShapeBinPdf.cc | 20 +---- src/RooSimultaneousOpt.cc | 3 +- src/RooSplineND.cc | 17 +--- src/SimpleCacheSentry.cc | 4 +- src/SimpleProdPdf.cc | 14 +-- src/SimplerLikelihoodRatioTestStatExt.cc | 6 +- src/TestProposal.cc | 9 +- src/ToyMCSamplerOpt.cc | 9 +- src/VBFHZZ4L_RooSpinZeroPdf.cc | 6 +- src/VBFHZZ4L_RooSpinZeroPdf_fast.cc | 10 +-- src/VVHZZ4L_RooSpinZeroPdf_1D_fast.cc | 10 +-- src/VerticalInterpHistPdf.cc | 89 +++++------------- src/VerticalInterpPdf.cc | 105 +++++++--------------- src/utils.cc | 97 +++++++------------- 60 files changed, 250 insertions(+), 701 deletions(-) diff --git a/interface/AtlasPdfs.h b/interface/AtlasPdfs.h index 11964a8ba66..dcac0e486fa 100644 --- a/interface/AtlasPdfs.h +++ b/interface/AtlasPdfs.h @@ -372,9 +372,6 @@ class RooStarMomentMorph : public RooAbsPdf { mutable std::vector _nnuis; mutable std::vector _nref; - TIterator* _parItr ; //! do not persist - TIterator* _obsItr ; //! do not persist - TIterator* _pdfItr ; //! mutable TMatrixD* _M; //! Setting _setting; diff --git a/interface/FastTemplateFunc.h b/interface/FastTemplateFunc.h index b7cf2bad56a..e8120a64067 100644 --- a/interface/FastTemplateFunc.h +++ b/interface/FastTemplateFunc.h @@ -19,15 +19,12 @@ template class FastTemplateFunc_t : public RooAbsReal{ virtual inline ~FastTemplateFunc_t(){} void setProxyList(RooListProxy& proxyList, RooArgList& varList){ - TIterator* varIter = varList.createIterator(); - RooAbsArg* var; - while ((var = (RooAbsArg*)varIter->Next())) { + for (RooAbsArg *var : varList) { if (!dynamic_cast(var)) { assert(0); } proxyList.add(*var); } - delete varIter; } virtual TObject* clone(const char* newname) const = 0; diff --git a/interface/HZZ4L_RooSpinZeroPdf_1D.h b/interface/HZZ4L_RooSpinZeroPdf_1D.h index 8410e44e98a..c0c3939833f 100644 --- a/interface/HZZ4L_RooSpinZeroPdf_1D.h +++ b/interface/HZZ4L_RooSpinZeroPdf_1D.h @@ -28,7 +28,6 @@ class HZZ4L_RooSpinZeroPdf_1D : public RooAbsPdf { // RooRealProxy ksmd ; RooRealProxy fai ; RooListProxy _coefList ; // List of funcficients - TIterator* _coefIter ; //! Iterator over funcficient lis Double_t evaluate() const ; public: HZZ4L_RooSpinZeroPdf_1D() {} ; diff --git a/interface/ProcessNormalization.h b/interface/ProcessNormalization.h index d99aec236e3..dd09d64525e 100644 --- a/interface/ProcessNormalization.h +++ b/interface/ProcessNormalization.h @@ -1,7 +1,6 @@ #ifndef HiggsAnalysis_CombinedLimit_ProcessNormalization_h #define HiggsAnalysis_CombinedLimit_ProcessNormalization_h -#include #include #include "RooListProxy.h" diff --git a/interface/RooMultiPdf.h b/interface/RooMultiPdf.h index bb7f4176e49..6b196e0245a 100644 --- a/interface/RooMultiPdf.h +++ b/interface/RooMultiPdf.h @@ -17,7 +17,6 @@ #include "RooConstVar.h" -#include "TIterator.h" #include "RooListProxy.h" #include diff --git a/interface/SimpleCacheSentry.h b/interface/SimpleCacheSentry.h index 28d895298df..4a90b4ba1bc 100644 --- a/interface/SimpleCacheSentry.h +++ b/interface/SimpleCacheSentry.h @@ -3,7 +3,6 @@ #include "RooRealVar.h" #include "RooSetProxy.h" -#include "TIterator.h" class SimpleCacheSentry : public RooAbsArg { public: diff --git a/interface/VerticalInterpHistPdf.h b/interface/VerticalInterpHistPdf.h index 889437b23c6..a361ddfd59d 100644 --- a/interface/VerticalInterpHistPdf.h +++ b/interface/VerticalInterpHistPdf.h @@ -41,8 +41,6 @@ class VerticalInterpHistPdf : public RooAbsPdf { RooListProxy _coefList ; // List of coefficients Double_t _smoothRegion; Int_t _smoothAlgo; - TIterator* _funcIter ; //! Iterator over FUNC list - TIterator* _coefIter ; //! Iterator over coefficient list // TH1 containing the histogram of this pdf mutable SimpleCacheSentry _sentry; // !not to be serialized @@ -93,8 +91,6 @@ class FastVerticalInterpHistPdfBase : public RooAbsPdf { RooListProxy _coefList ; // List of coefficients Double_t _smoothRegion; Int_t _smoothAlgo; - TIterator* _funcIter ; //! Iterator over FUNC list - TIterator* _coefIter ; //! Iterator over coefficient list // TH1 containing the histogram of this pdf mutable bool _init; //! not to be serialized diff --git a/interface/VerticalInterpPdf.h b/interface/VerticalInterpPdf.h index 761b2f1194b..b655dc86376 100644 --- a/interface/VerticalInterpPdf.h +++ b/interface/VerticalInterpPdf.h @@ -46,8 +46,6 @@ class VerticalInterpPdf : public RooAbsPdf { RooListProxy _coefList ; // List of coefficients Double_t _quadraticRegion; Int_t _quadraticAlgo; - TIterator* _funcIter ; //! Iterator over FUNC list - TIterator* _coefIter ; //! Iterator over coefficient list Double_t _pdfFloorVal; // PDF floor should be customizable, default is 1e-15 Double_t _integralFloorVal; // PDF integral floor should be customizable, default is 1e-10 diff --git a/src/AsimovUtils.cc b/src/AsimovUtils.cc index d453443c0c6..7a5d99aec3f 100644 --- a/src/AsimovUtils.cc +++ b/src/AsimovUtils.cc @@ -2,7 +2,6 @@ #include #include -#include #include #include #include @@ -21,8 +20,7 @@ RooAbsData *asimovutils::asimovDatasetNominal(RooStats::ModelConfig *mc, double if (verbose>2) { CombineLogger::instance().log("AsimovUtils.cc",__LINE__,"Parameters after fit for asimov dataset",__func__); - std::unique_ptr iter(mc->GetPdf()->getParameters((const RooArgSet*) 0)->createIterator()); - for (RooAbsArg *a = (RooAbsArg *) iter->Next(); a != 0; a = (RooAbsArg *) iter->Next()) { + for (RooAbsArg *a : *std::unique_ptr{mc->GetPdf()->getParameters((const RooArgSet*) 0)}) { TString varstring = utils::printRooArgAsString(a); CombineLogger::instance().log("AsimovUtils.cc",__LINE__,std::string(Form("%s",varstring.Data())),__func__); } @@ -45,8 +43,7 @@ RooAbsData *asimovutils::asimovDatasetWithFit(RooStats::ModelConfig *mc, RooAbsD } else { // Do we have free parameters anyway that need fitting? std::unique_ptr params(mc->GetPdf()->getParameters(realdata)); - std::unique_ptr iter(params->createIterator()); - for (RooAbsArg *a = (RooAbsArg *) iter->Next(); a != 0; a = (RooAbsArg *) iter->Next()) { + for (RooAbsArg *a : *params) { RooRealVar *rrv = dynamic_cast(a); if ( rrv != 0 && rrv->isConstant() == false ) { needsFit &= true; break; } } @@ -67,8 +64,7 @@ RooAbsData *asimovutils::asimovDatasetWithFit(RooStats::ModelConfig *mc, RooAbsD if (verbose>2) { CombineLogger::instance().log("AsimovUtils.cc",__LINE__,"Parameters after fit for asimov dataset",__func__); - std::unique_ptr iter(mc->GetPdf()->getParameters(realdata)->createIterator()); - for (RooAbsArg *a = (RooAbsArg *) iter->Next(); a != 0; a = (RooAbsArg *) iter->Next()) { + for (RooAbsArg *a : *std::unique_ptr{mc->GetPdf()->getParameters(realdata)}) { TString varstring = utils::printRooArgAsString(a); CombineLogger::instance().log("AsimovUtils.cc",__LINE__,std::string(Form("%s",varstring.Data())),__func__); } @@ -92,8 +88,7 @@ RooAbsData *asimovutils::asimovDatasetWithFit(RooStats::ModelConfig *mc, RooAbsD std::unique_ptr nuispdf(utils::makeNuisancePdf(*mc)); RooProdPdf *prod = dynamic_cast(nuispdf.get()); if (prod == 0) throw std::runtime_error("AsimovUtils: the nuisance pdf is not a RooProdPdf!"); - std::unique_ptr iter(prod->pdfList().createIterator()); - for (RooAbsArg *a = (RooAbsArg *) iter->Next(); a != 0; a = (RooAbsArg *) iter->Next()) { + for (RooAbsArg *a : prod->pdfList()) { RooAbsPdf *cterm = dynamic_cast(a); if (!cterm) throw std::logic_error("AsimovUtils: a factor of the nuisance pdf is not a Pdf!"); if (!cterm->dependsOn(nuis)) continue; // dummy constraints @@ -109,8 +104,7 @@ RooAbsData *asimovutils::asimovDatasetWithFit(RooStats::ModelConfig *mc, RooAbsD if (cpars->getSize() == 1) { match = dynamic_cast(cpars->first()); } else { - std::unique_ptr iter2(cpars->createIterator()); - for (RooAbsArg *a2 = (RooAbsArg *) iter2->Next(); a2 != 0; a2 = (RooAbsArg *) iter2->Next()) { + for (RooAbsArg *a2 : *cpars) { RooRealVar *rrv2 = dynamic_cast(a2); if (rrv2 != 0 && !rrv2->isConstant()) { if (match != 0) throw std::runtime_error(Form("AsimovUtils: constraint term %s has multiple floating params", cterm->GetName())); @@ -138,10 +132,10 @@ RooAbsData *asimovutils::asimovDatasetWithFit(RooStats::ModelConfig *mc, RooAbsD // we want to set the global obs to a value for which the current value // of the nuisance is the best fit one. // best fit x = (k-1)*theta ----> k = x/theta + 1 - RooArgList leaves; cterm->leafNodeServerList(&leaves); - std::unique_ptr iter2(leaves.createIterator()); + RooArgList leaves; + cterm->leafNodeServerList(&leaves); RooAbsReal *match2 = 0; - for (RooAbsArg *a2 = (RooAbsArg *) iter2->Next(); a2 != 0; a2 = (RooAbsArg *) iter2->Next()) { + for (RooAbsArg *a2 : leaves) { RooAbsReal *rar = dynamic_cast(a2); if (rar == 0 || rar == match || rar == &rrv) continue; if (!rar->isConstant()) throw std::runtime_error(Form("AsimovUtils: extra floating parameter %s of RooGamma %s.", rar->GetName(), cterm->GetName())); diff --git a/src/AsymptoticLimits.cc b/src/AsymptoticLimits.cc index 75563600626..7759064503b 100644 --- a/src/AsymptoticLimits.cc +++ b/src/AsymptoticLimits.cc @@ -107,8 +107,7 @@ bool AsymptoticLimits::run(RooWorkspace *w, RooStats::ModelConfig *mc_s, RooStat */ hasDiscreteParams_ = false; if (params_.get() == 0) params_.reset(mc_s->GetPdf()->getParameters(data)); - std::unique_ptr itparam(params_->createIterator()); - for (RooAbsArg *a = (RooAbsArg *) itparam->Next(); a != 0; a = (RooAbsArg *) itparam->Next()) { + for (RooAbsArg *a : *params_) { if (a->IsA()->InheritsFrom(RooCategory::Class())) { hasDiscreteParams_ = true; break; } } @@ -164,8 +163,7 @@ bool AsymptoticLimits::runLimit(RooWorkspace *w, RooStats::ModelConfig *mc_s, Ro if (params_.get() == 0) params_.reset(mc_s->GetPdf()->getParameters(data)); hasFloatParams_ = false; - std::unique_ptr itparam(params_->createIterator()); - for (RooAbsArg *a = (RooAbsArg *) itparam->Next(); a != 0; a = (RooAbsArg *) itparam->Next()) { + for (RooAbsArg *a : *params_) { RooRealVar *rrv = dynamic_cast(a); if ( rrv != 0 && rrv != r && rrv->isConstant() == false ) { hasFloatParams_ = true; break; } } diff --git a/src/AtlasPdfs.cxx b/src/AtlasPdfs.cxx index 34e758a3ad2..2e463c89de7 100644 --- a/src/AtlasPdfs.cxx +++ b/src/AtlasPdfs.cxx @@ -433,10 +433,8 @@ RooBSpline::RooBSpline(const char* name, const char* title, //bool even = fabs(_n/2-_n/2.) < 0.0000000001; bool first=1; - TIterator* pointIter = controlPoints.createIterator() ; - RooAbsArg* point ; RooAbsArg* lastPoint=NULL ; - while((point = (RooAbsArg*)pointIter->Next())) { + for (RooAbsArg * point : controlPoints) { if (!dynamic_cast(point)) { coutE(InputArguments) << "RooBSpline::ctor(" << GetName() << ") ERROR: control point " << point->GetName() << " is not of type RooAbsReal" << std::endl ; @@ -456,19 +454,9 @@ RooBSpline::RooBSpline(const char* name, const char* title, lastPoint=point; } for (int i=0;i<(_n)/2;i++) _controlPoints.add(*lastPoint); - delete pointIter ; - TIterator* varItr = vars.createIterator(); - RooAbsArg* arg; - while ((arg=(RooAbsArg*)varItr->Next())) { - //std::cout << "======== Adding "<GetName()<<" to list of _vars of "<Next())) { + for (RooAbsArg *point : weights) { if (!dynamic_cast(point)) { coutE(InputArguments) << "RooBSpline::ctor(" << GetName() << ") ERROR: control point " << point->GetName() << " is not of type RooAbsReal" << std::endl ; @@ -577,7 +563,6 @@ void RooBSpline::setWeights(const RooArgList& weights) lastPoint=point; } for (int i=0;i<(_n+1)/2;i++) _weights.add(*lastPoint); - delete pointIter; } @@ -1235,9 +1220,6 @@ RooStarMomentMorph::RooStarMomentMorph() : { // coverity[UNINIT_CTOR] - _parItr = _parList.createIterator() ; - _obsItr = _obsList.createIterator() ; - _pdfItr = _pdfList.createIterator() ; } @@ -1269,45 +1251,31 @@ RooStarMomentMorph::RooStarMomentMorph(const char *name, const char *title, // CTOR // fit parameters - TIterator* parItr = parList.createIterator() ; - RooAbsArg* par ; - for (Int_t i=0; (par = (RooAbsArg*)parItr->Next()); ++i) { + for (RooAbsArg *par : parList) { if (!dynamic_cast(par)) { coutE(InputArguments) << "RooStarMomentMorph::ctor(" << GetName() << ") ERROR: parameter " << par->GetName() << " is not of type RooAbsReal" << endl ; throw std::string("RooStarMomentMorh::ctor() ERROR parameter is not of type RooAbsReal") ; } _parList.add(*par) ; } - delete parItr ; // observables - TIterator* obsItr = obsList.createIterator() ; - RooAbsArg* var ; - for (Int_t i=0; (var = (RooAbsArg*)obsItr->Next()); ++i) { + for (RooAbsArg *var : obsList) { if (!dynamic_cast(var)) { coutE(InputArguments) << "RooStarMomentMorph::ctor(" << GetName() << ") ERROR: variable " << var->GetName() << " is not of type RooAbsReal" << endl ; throw std::string("RooStarMomentMorh::ctor() ERROR variable is not of type RooAbsReal") ; } _obsList.add(*var) ; } - delete obsItr ; // reference p.d.f.s - TIterator* pdfItr = pdfList.createIterator() ; - RooAbsPdf* pdf ; - for (Int_t i=0; (pdf = dynamic_cast(pdfItr->Next())); ++i) { - if (!pdf) { + for (RooAbsArg *pdf : pdfList) { + if (!dynamic_cast(pdf)) { coutE(InputArguments) << "RooStarMomentMorph::ctor(" << GetName() << ") ERROR: pdf " << pdf->GetName() << " is not of type RooAbsPdf" << endl ; throw std::string("RooStarMomentMorph::ctor() ERROR pdf is not of type RooAbsPdf") ; } _pdfList.add(*pdf) ; } - delete pdfItr ; - - _parItr = _parList.createIterator() ; - _obsItr = _obsList.createIterator() ; - _pdfItr = _pdfList.createIterator() ; - // initialization initialize(); @@ -1329,12 +1297,6 @@ RooStarMomentMorph::RooStarMomentMorph(const RooStarMomentMorph& other, const ch _nnuisvar(other._nnuisvar), _useHorizMorph(other._useHorizMorph) { - - - _parItr = _parList.createIterator() ; - _obsItr = _obsList.createIterator() ; - _pdfItr = _pdfList.createIterator() ; - // nref is resized in initialize, so reduce the size here if (_nref.size()>0) { _nref.resize( _nref.size()-1 ); @@ -1347,9 +1309,6 @@ RooStarMomentMorph::RooStarMomentMorph(const RooStarMomentMorph& other, const ch //_____________________________________________________________________________ RooStarMomentMorph::~RooStarMomentMorph() { - if (_parItr) delete _parItr; - if (_obsItr) delete _obsItr; - if (_pdfItr) delete _pdfItr; if (_M) delete _M; } @@ -1512,15 +1471,11 @@ RooStarMomentMorph::CacheElem* RooStarMomentMorph::getCache(const RooArgSet* /*n //} // construction of unit pdfs - _pdfItr->Reset(); - RooAbsPdf* pdf; RooArgList transPdfList; for (Int_t i=0; iReset() ; - RooRealVar* var ; - pdf = (RooAbsPdf*)_pdfItr->Next(); + RooAbsPdf* pdf = &(RooAbsPdf&)_pdfList[i]; std::string pdfName = Form("pdf_%d",i); RooCustomizer cust(*pdf,pdfName.c_str()); @@ -1545,7 +1500,7 @@ RooStarMomentMorph::CacheElem* RooStarMomentMorph::getCache(const RooArgSet* /*n ownedComps.add(RooArgSet(*slope[sij(i,j)],*offsetVar[sij(i,j)])) ; // linear transformations, so pdf can be renormalized easily - var = (RooRealVar*)(_obsItr->Next()); + RooRealVar *var = (RooRealVar*)(_obsList[j]); std::string transVarName = Form("%s_transVar_%d_%d",GetName(),i,j); transVar[sij(i,j)] = new RooLinearVar(transVarName.c_str(),transVarName.c_str(),*var,*slope[sij(i,j)],*offsetVar[sij(i,j)]); @@ -1680,7 +1635,6 @@ void RooStarMomentMorph::CacheElem::calculateFractions(const RooStarMomentMorph& //int nObs=self._obsList.getSize(); // loop over parList - self._parItr->Reset(); int nnuis=0; // zero all fractions @@ -1691,7 +1645,7 @@ void RooStarMomentMorph::CacheElem::calculateFractions(const RooStarMomentMorph& } for (Int_t j=0; jNext()); + RooRealVar* m = &(RooRealVar&)self._parList[j]; double m0=m->getVal(); if (m0==0.) continue; diff --git a/src/CMSHggFormula.cc b/src/CMSHggFormula.cc index 34aa8abe6b6..54e10224ec6 100644 --- a/src/CMSHggFormula.cc +++ b/src/CMSHggFormula.cc @@ -11,8 +11,7 @@ CMSHggFormulaA1::CMSHggFormulaA1(const char* name, const char* title, RooAbsReal p3_("p3", "p3", this, p3), terms_("terms", "terms", this), coeffs_(coeffs) { - RooFIter iter = terms.fwdIterator(); - for (RooAbsArg* a = iter.next(); a != 0; a = iter.next()) { + for (RooAbsArg* a : terms) { RooAbsReal* rar = dynamic_cast(a); if (!rar) { throw std::invalid_argument(std::string("Component ") + a->GetName() + @@ -61,8 +60,7 @@ CMSHggFormulaA2::CMSHggFormulaA2(const char* name, const char* title, RooAbsReal p3_("p3", "p3", this, p3), terms_("terms", "terms", this), coeffs_(coeffs) { - RooFIter iter = terms.fwdIterator(); - for (RooAbsArg* a = iter.next(); a != 0; a = iter.next()) { + for (RooAbsArg *a : terms) { RooAbsReal* rar = dynamic_cast(a); if (!rar) { throw std::invalid_argument(std::string("Component ") + a->GetName() + @@ -107,8 +105,7 @@ CMSHggFormulaB1::CMSHggFormulaB1(const char* name, const char* title, RooAbsReal p0_("p0", "p0", this, p0), terms_("terms", "terms", this), coeffs_(coeffs) { - RooFIter iter = terms.fwdIterator(); - for (RooAbsArg* a = iter.next(); a != 0; a = iter.next()) { + for (RooAbsArg *a : terms) { RooAbsReal* rar = dynamic_cast(a); if (!rar) { throw std::invalid_argument(std::string("Component ") + a->GetName() + @@ -150,8 +147,7 @@ CMSHggFormulaB2::CMSHggFormulaB2(const char* name, const char* title, double con p0_(p0), terms_("terms", "terms", this), coeffs_(coeffs) { - RooFIter iter = terms.fwdIterator(); - for (RooAbsArg* a = iter.next(); a != 0; a = iter.next()) { + for (RooAbsArg* a : terms) { RooAbsReal* rar = dynamic_cast(a); if (!rar) { throw std::invalid_argument(std::string("Component ") + a->GetName() + @@ -192,8 +188,7 @@ CMSHggFormulaC1::CMSHggFormulaC1(const char* name, const char* title, RooArgList : RooAbsReal(name, title), terms_("terms", "terms", this), coeffs_(coeffs) { - RooFIter iter = terms.fwdIterator(); - for (RooAbsArg* a = iter.next(); a != 0; a = iter.next()) { + for (RooAbsArg* a : terms) { RooAbsReal* rar = dynamic_cast(a); if (!rar) { throw std::invalid_argument(std::string("Component ") + a->GetName() + diff --git a/src/CMSHistErrorPropagator.cc b/src/CMSHistErrorPropagator.cc index 07b3de411bc..c84761082c9 100644 --- a/src/CMSHistErrorPropagator.cc +++ b/src/CMSHistErrorPropagator.cc @@ -249,9 +249,7 @@ void CMSHistErrorPropagator::setAnalyticBarlowBeeston(bool flag) const { if (bintypes_[j][0] == 1 && !vbinpars_[j][0]->isConstant()) { bb_.use.push_back(j); double gobs_val = 0.; - RooFIter iter = vbinpars_[j][0]->valueClientMIterator(); - RooAbsArg *arg = nullptr; - while((arg = iter.next())) { + for (RooAbsArg * arg : vbinpars_[j][0]->valueClients()) { if (arg == this || arg == &binsentry_) { // std::cout << "Skipping " << this << " " << this->GetName() << "\n"; } else { diff --git a/src/CMSHistFunc.cc b/src/CMSHistFunc.cc index 045f802e278..6beb68168f2 100644 --- a/src/CMSHistFunc.cc +++ b/src/CMSHistFunc.cc @@ -1202,9 +1202,7 @@ Double_t CMSHistFunc::analyticalIntegral(Int_t code, } CMSHistFuncWrapper const* CMSHistFunc::wrapper() const { - RooFIter iter = this->valueClientMIterator(); - RooAbsArg *arg = nullptr; - while((arg = iter.next())) { + for (RooAbsArg *arg : valueClients()) { CMSHistFuncWrapper const* wrapper = dynamic_cast(arg); if (wrapper) return wrapper; } diff --git a/src/CMSHistFuncWrapper.cc b/src/CMSHistFuncWrapper.cc index d7710021ae0..d8b18448f44 100644 --- a/src/CMSHistFuncWrapper.cc +++ b/src/CMSHistFuncWrapper.cc @@ -47,9 +47,7 @@ void CMSHistFuncWrapper::initialize() const { pfunc_ = dynamic_cast(&(func_.arg())); perr_ = dynamic_cast(err_.absArg()); auto sentry_args = perr_->getSentryArgs(); - RooFIter iter = sentry_args->fwdIterator() ; - RooAbsArg* arg; - while((arg = iter.next())) { + for (RooAbsArg *arg : *sentry_args) { sentry_.addArg(*arg); } sentry_.setValueDirty(); diff --git a/src/CMSHistSum.cc b/src/CMSHistSum.cc index a3aad9866e5..ad30f61ad03 100644 --- a/src/CMSHistSum.cc +++ b/src/CMSHistSum.cc @@ -474,9 +474,7 @@ void CMSHistSum::setAnalyticBarlowBeeston(bool flag) const { if (bintypes_[j][0] == 1 && !vbinpars_[j][0]->isConstant()) { bb_.use.push_back(j); double gobs_val = 0.; - RooFIter iter = vbinpars_[j][0]->valueClientMIterator(); - RooAbsArg *arg = nullptr; - while((arg = iter.next())) { + for (RooAbsArg *arg : vbinpars_[j][0]->valueClients()) { if (arg == this || arg == &binsentry_) { // std::cout << "Skipping " << this << " " << this->GetName() << "\n"; } else { diff --git a/src/CachingNLL.cc b/src/CachingNLL.cc index f50443deece..ed7c802f1cd 100644 --- a/src/CachingNLL.cc +++ b/src/CachingNLL.cc @@ -117,10 +117,7 @@ namespace { unsigned long CachingSimNLLEvalCount = 0; } cacheutils::ArgSetChecker::ArgSetChecker(const RooAbsCollection &set) { - std::unique_ptr iter(set.createIterator()); - for (RooAbsArg *a = dynamic_cast(iter->Next()); - a != 0; - a = dynamic_cast(iter->Next())) { + for (RooAbsArg *a : set) { RooRealVar *rrv = dynamic_cast(a); if (rrv) { // && !rrv->isConstant()) { vars_.push_back(rrv); @@ -375,10 +372,9 @@ cacheutils::ReminderSum::ReminderSum(const char *name, const char *title, const RooAbsReal(name,title), list_("deps","",this) { - RooLinkedListIter iter(sumSet.iterator()); - for (RooAbsReal *rar = (RooAbsReal *) iter.Next(); rar != 0; rar = (RooAbsReal *) iter.Next()) { + for (RooAbsArg * rar : sumSet) { list_.add(*rar); - terms_.push_back(rar); + terms_.push_back(static_cast(rar)); } } Double_t cacheutils::ReminderSum::evaluate() const { @@ -585,8 +581,7 @@ cacheutils::CachingAddNLL::setup_() } std::unique_ptr params(pdf_->getParameters(*data_)); - std::unique_ptr iter(params->createIterator()); - for (RooAbsArg *a = (RooAbsArg *) iter->Next(); a != 0; a = (RooAbsArg *) iter->Next()) { + for (RooAbsArg *a : *params) { if (dynamic_cast(a)) params_.add(*a); else if (dynamic_cast(a)) catParams_.add(*a); } @@ -1309,8 +1304,7 @@ void cacheutils::CachingSimNLL::setMaskNonDiscreteChannels(bool mask) { unsigned int idx = 0; for (std::vector::const_iterator it = pdfs_.begin(), ed = pdfs_.end(); it != ed; ++it, ++idx) { if ((*it) == 0) continue; - RooLinkedListIter iter = (*it)->catParams().iterator(); - for (RooAbsArg *P = (RooAbsArg *) iter.Next(); P != 0; P = (RooAbsArg *) iter.Next()) { + for (RooAbsArg *P : (*it)->catParams()) { RooCategory *cat = dynamic_cast(P); if (!cat) continue; if (cat && !cat->isConstant()) { diff --git a/src/CascadeMinimizer.cc b/src/CascadeMinimizer.cc index 1c5be035728..2e07374d3c4 100644 --- a/src/CascadeMinimizer.cc +++ b/src/CascadeMinimizer.cc @@ -911,8 +911,7 @@ bool CascadeMinimizer::autoBoundsOk(int verbose) { for (int bothBounds = 0; bothBounds <= 1; ++bothBounds) { const RooArgSet * pois = (bothBounds ? poisForAutoBounds_ : poisForAutoMax_); if (!pois) continue; - RooFIter f = pois->fwdIterator(); - for (RooAbsArg *a = f.next(); a != 0; a = f.next()) { + for (RooAbsArg *a : *pois) { RooRealVar *rrv = dynamic_cast(a); if (rrv && !rrv->isConstant() && rrv->hasMax() && rrv->hasMin()) { double val = rrv->getVal(), lo = rrv->getMin(), hi = rrv->getMax(); diff --git a/src/Combine.cc b/src/Combine.cc index 38cef32c95c..bcbcd2ab3c3 100644 --- a/src/Combine.cc +++ b/src/Combine.cc @@ -19,7 +19,6 @@ #include #include #include -#include #include #include #include @@ -227,8 +226,7 @@ std::string Combine::parseRegex(std::string instr, const RooArgSet *nuisances, R std::regex rgx( reg_esp, std::regex::ECMAScript); std::string matchingParams=""; - std::unique_ptr iter(nuisances->createIterator()); - for (RooAbsArg *a = (RooAbsArg*) iter->Next(); a != 0; a = (RooAbsArg*) iter->Next()) { + for (RooAbsArg *a : *nuisances) { const std::string &target = a->GetName(); std::smatch match; if (std::regex_match(target, match, rgx)) { @@ -251,8 +249,7 @@ std::string Combine::parseRegex(std::string instr, const RooArgSet *nuisances, R std::regex rgx( reg_esp, std::regex::ECMAScript); std::string matchingParams=""; - std::unique_ptr iter(w->componentIterator()); - for (RooAbsArg *a = (RooAbsArg*) iter->Next(); a != 0; a = (RooAbsArg*) iter->Next()) { + for (RooAbsArg *a : w->components()) { if ( ! (a->IsA()->InheritsFrom(RooRealVar::Class()) || a->IsA()->InheritsFrom(RooCategory::Class()))) continue; @@ -540,8 +537,7 @@ void Combine::run(TString hlfFile, const std::string &dataset, double &limit, do if (nuisances && runtimedef::get("ADD_DISCRETE_FALLBACK")) { RooArgSet newNuis; std::string startswith = "u_CMS_Hgg_env_pdf_"; - TIterator *np = nuisances->createIterator(); - while (RooRealVar *arg = (RooRealVar*)np->Next()) { + for (RooAbsArg *arg : *nuisances) { if (std::string(arg->GetName()).compare(0, startswith.size(), startswith)) { newNuis.add(*arg); } else { @@ -616,11 +612,10 @@ void Combine::run(TString hlfFile, const std::string &dataset, double &limit, do if (redefineSignalPOIs_ != "") { RooArgSet newPOIs(w->argSet(redefineSignalPOIs_.c_str())); - TIterator *np = newPOIs.createIterator(); - while (RooRealVar *arg = (RooRealVar*)np->Next()) { + for (RooAbsArg *arg : newPOIs) { RooRealVar *rrv = dynamic_cast(arg); if (rrv == 0) { std::cerr << "MultiDimFit: Parameter of interest " << arg->GetName() << " which is not a RooRealVar will be ignored" << std::endl; continue; } - arg->setConstant(0); + rrv->setConstant(0); // also set ignoreConstraint flag for constraint PDF if ( w->pdf(Form("%s_Pdf",arg->GetName())) ) w->pdf(Form("%s_Pdf",arg->GetName()))->setAttribute("ignoreConstraint"); } @@ -639,9 +634,8 @@ void Combine::run(TString hlfFile, const std::string &dataset, double &limit, do } // Always reset the POIs to floating (post-fit workspaces can actually have them frozen in some cases, in any case they can be re-frozen in the next step - TIterator *pois = POI->createIterator(); - while (RooRealVar *arg = (RooRealVar*)pois->Next()) { - arg->setConstant(0); + for (RooAbsArg *arg : *POI) { + static_cast(arg)->setConstant(0); } if (floatNuisances_ != "") { @@ -671,8 +665,7 @@ void Combine::run(TString hlfFile, const std::string &dataset, double &limit, do if (verbose > 0) { //std::cout << "Floating the following parameters: "; toFloat.Print(""); CombineLogger::instance().log("Combine.cc",__LINE__,"Floating the following parameters:",__func__); - std::unique_ptr iter(toFloat.createIterator()); - for (RooAbsArg *a = (RooAbsArg*) iter->Next(); a != 0; a = (RooAbsArg*) iter->Next()) { + for (RooAbsArg *a : toFloat) { CombineLogger::instance().log("Combine.cc",__LINE__,a->GetName(),__func__); } } @@ -706,8 +699,7 @@ void Combine::run(TString hlfFile, const std::string &dataset, double &limit, do if (verbose > 0) { //std::cout << "Freezing the following parameters: "; toFreeze.Print(""); CombineLogger::instance().log("Combine.cc",__LINE__,"Freezing the following parameters: ",__func__); - std::unique_ptr iter(toFreeze.createIterator()); - for (RooAbsArg *a = (RooAbsArg*) iter->Next(); a != 0; a = (RooAbsArg*) iter->Next()) { + for (RooAbsArg *a : toFreeze) { CombineLogger::instance().log("Combine.cc",__LINE__,a->GetName(),__func__); } } @@ -764,9 +756,7 @@ void Combine::run(TString hlfFile, const std::string &dataset, double &limit, do for (auto const& attr : nuisanceAttrs) { RooArgSet toFreeze; if (nuisances) { - RooAbsArg *arg = nullptr; - auto iter = nuisances->createIterator(); - while ((arg = (RooAbsArg*)iter->Next())) { + for (RooAbsArg *arg : *nuisances) { if (arg->attributes().count(attr)) toFreeze.add(*arg); } if (verbose > 0) { std::cout << "Freezing the following nuisance parameters: "; toFreeze.Print(""); } @@ -983,8 +973,7 @@ void Combine::run(TString hlfFile, const std::string &dataset, double &limit, do // print the values of the parameters used to generate the toy if (verbose > 2) { CombineLogger::instance().log("Combine.cc",__LINE__, "Generate Asimov toy from parameter values ... ",__func__); - std::unique_ptr iter(genPdf->getParameters((const RooArgSet*)0)->createIterator()); - for (RooAbsArg *a = (RooAbsArg *) iter->Next(); a != 0; a = (RooAbsArg *) iter->Next()) { + for (RooAbsArg *a : *std::unique_ptr{genPdf->getParameters((const RooArgSet*)0)}) { TString varstring = utils::printRooArgAsString(a); CombineLogger::instance().log("Combine.cc",__LINE__,varstring.Data(),__func__); } @@ -1080,8 +1069,7 @@ void Combine::run(TString hlfFile, const std::string &dataset, double &limit, do std::cout << "Generate toy " << iToy << "/" << nToys << std::endl; if (verbose > 2) { CombineLogger::instance().log("Combine.cc",__LINE__, std::string(Form("Generating toy %d/%d, from parameter values ... ",iToy,nToys)),__func__); - std::unique_ptr iter(genPdf->getParameters((const RooArgSet*)0)->createIterator()); - for (RooAbsArg *a = (RooAbsArg *) iter->Next(); a != 0; a = (RooAbsArg *) iter->Next()) { + for (RooAbsArg *a : *std::unique_ptr{genPdf->getParameters((const RooArgSet*)0)}) { TString varstring = utils::printRooArgAsString(a); CombineLogger::instance().log("Combine.cc" ,__LINE__,varstring.Data(),__func__); } @@ -1198,8 +1186,7 @@ void Combine::addPOI(const RooArgSet *poi){ // RooArgSet *nuisances = (RooArgSet*) w->set("nuisances"); CascadeMinimizerGlobalConfigs::O().parametersOfInterest = RooArgList(); if (poi != 0) { - TIterator *pp = poi->createIterator(); - while (RooAbsArg *arg = (RooAbsArg*)pp->Next()) (CascadeMinimizerGlobalConfigs::O().parametersOfInterest).add(*arg); + for (RooAbsArg *arg : *poi) (CascadeMinimizerGlobalConfigs::O().parametersOfInterest).add(*arg); } } @@ -1208,20 +1195,15 @@ void Combine::addNuisances(const RooArgSet *nuisances){ // RooArgSet *nuisances = (RooArgSet*) w->set("nuisances"); CascadeMinimizerGlobalConfigs::O().nuisanceParameters = RooArgList(); if (nuisances != 0) { - TIterator *np = nuisances->createIterator(); - while (RooAbsArg *arg = (RooAbsArg*)np->Next()) (CascadeMinimizerGlobalConfigs::O().nuisanceParameters).add(*arg); + for (RooAbsArg *arg : *nuisances) (CascadeMinimizerGlobalConfigs::O().nuisanceParameters).add(*arg); } } void Combine::addFloatingParameters(const RooArgSet ¶meters){ CascadeMinimizerGlobalConfigs::O().allFloatingParameters = RooArgList(); - //if (parameters != 0) { - TIterator *np = parameters.createIterator(); - while (RooAbsArg *arg = (RooAbsArg*)np->Next()) { + for (RooAbsArg *arg : parameters) { if (! arg->isConstant()) (CascadeMinimizerGlobalConfigs::O().allFloatingParameters).add(*arg); } - //} - } void Combine::addDiscreteNuisances(RooWorkspace *w){ @@ -1231,8 +1213,7 @@ void Combine::addDiscreteNuisances(RooWorkspace *w){ CascadeMinimizerGlobalConfigs::O().allRooMultiPdfParams = RooArgList(); if (discreteParameters != 0) { - TIterator *dp = discreteParameters->createIterator(); - while (RooAbsArg *arg = (RooAbsArg*)dp->Next()) { + for (RooAbsArg *arg : *discreteParameters) { RooCategory *cat = dynamic_cast(arg); if (cat && (!cat->isConstant() || runtimedef::get("ADD_DISCRETE_FALLBACK"))) { if (verbose){ @@ -1246,8 +1227,7 @@ void Combine::addDiscreteNuisances(RooWorkspace *w){ // Run through all of the categories in the workspace and look for "pdfindex" -> fall back option else if (runtimedef::get("ADD_DISCRETE_FALLBACK")) { RooArgSet discreteParameters_C = w->allCats(); - TIterator *dp = discreteParameters_C.createIterator(); - while (RooAbsArg *arg = (RooAbsArg*)dp->Next()) { + for (RooAbsArg *arg : discreteParameters_C) { RooCategory *cat = dynamic_cast(arg); if (! (std::string(cat->GetName()).find("pdfindex") != std::string::npos )) continue; if (cat/* && !cat->isConstant()*/) { @@ -1262,14 +1242,11 @@ void Combine::addDiscreteNuisances(RooWorkspace *w){ // Now lets go through the list of parameters which are associated to this discrete nuisance RooArgSet clients; utils::getClients(CascadeMinimizerGlobalConfigs::O().pdfCategories,(w->allPdfs()),clients); - TIterator *it = clients.createIterator(); - // clients.Print(); - while (RooAbsArg *arg = (RooAbsArg*)it->Next()) { + for (RooAbsArg *arg : clients) { (CascadeMinimizerGlobalConfigs::O().allRooMultiPdfs).add(*(dynamic_cast(arg))); RooAbsPdf *pdf = dynamic_cast(arg); - RooArgSet *pdfPars = pdf->getParameters((const RooArgSet*)0); - std::unique_ptr iter_v(pdfPars->createIterator()); - for (RooAbsArg *a = (RooAbsArg *) iter_v->Next(); a != 0; a = (RooAbsArg *) iter_v->Next()) { + std::unique_ptr pdfPars{pdf->getParameters((const RooArgSet*)0)}; + for (RooAbsArg *a : *pdfPars) { RooRealVar *v = dynamic_cast(a); if (!v) continue; if (! (v->isConstant())) (CascadeMinimizerGlobalConfigs::O().allRooMultiPdfParams).add(*v) ; @@ -1289,8 +1266,7 @@ void Combine::addBranches(const std::string& trackString, RooWorkspace* w, std:: std::regex rgx( reg_esp, std::regex::ECMAScript); RooArgSet allParams(w->allVars()); - std::unique_ptr iter(allParams.createIterator()); - for (RooAbsArg *a = (RooAbsArg*) iter->Next(); a != 0; a = (RooAbsArg*) iter->Next()) { + for (RooAbsArg *a : allParams) { Var *tmp = dynamic_cast(a); if(tmp==nullptr) continue; const std::string &target = tmp->GetName(); diff --git a/src/FitDiagnostics.cc b/src/FitDiagnostics.cc index acd7caebca2..c0a29ef2b57 100644 --- a/src/FitDiagnostics.cc +++ b/src/FitDiagnostics.cc @@ -1211,16 +1211,14 @@ void FitDiagnostics::getNormalizations(RooAbsPdf *pdf, const RooArgSet &obs, Roo //void FitDiagnostics::setFitResultTrees(const RooArgSet *args, std::vector *vals){ void FitDiagnostics::setFitResultTrees(const RooArgSet *args, double * vals){ - TIterator* iter(args->createIterator()); int count=0; - for (TObject *a = iter->Next(); a != 0; a = iter->Next()) { + for (RooAbsArg *a : *args) { RooRealVar *rrv = dynamic_cast(a); //std::string name = rrv->GetName(); vals[count]=rrv->getVal(); count++; } - delete iter; return; } @@ -1259,17 +1257,15 @@ void FitDiagnostics::resetFitResultTrees(bool withSys){ } void FitDiagnostics::setNormsFitResultTrees(const RooArgSet *args, double * vals){ - TIterator* iter(args->createIterator()); int count=0; - for (TObject *a = iter->Next(); a != 0; a = iter->Next()) { + for (RooAbsArg *a : *args) { RooRealVar *rcv = dynamic_cast(a); // std::cout << "index " << count << ", Name " << rcv->GetName() << ", val " << rcv->getVal() << std::endl; //std::string name = rcv->GetName(); vals[count]=rcv->getVal(); count++; } - delete iter; return; } @@ -1346,8 +1342,7 @@ void FitDiagnostics::createFitResultTrees(const RooStats::ModelConfig &mc, bool nuisanceParameters_= new double[nuis->getSize()]; overallNuis_ = nuis->getSize(); - TIterator* iter_c(cons->createIterator()); - for (TObject *a = iter_c->Next(); a != 0; a = iter_c->Next()) { + for (RooAbsArg * a : *cons) { RooRealVar *rrv = dynamic_cast(a); std::string name = rrv->GetName(); globalObservables_[count]=0; @@ -1357,8 +1352,7 @@ void FitDiagnostics::createFitResultTrees(const RooStats::ModelConfig &mc, bool count++; } count = 0; - TIterator* iter_n(nuis->createIterator()); - for (TObject *a = iter_n->Next(); a != 0; a = iter_n->Next()) { + for (RooAbsArg * a : *nuis) { RooRealVar *rrv = dynamic_cast(a); std::string name = rrv->GetName(); nuisanceParameters_[count] = 0; @@ -1371,8 +1365,7 @@ void FitDiagnostics::createFitResultTrees(const RooStats::ModelConfig &mc, bool } count = 0; - TIterator* iter_no(norms->createIterator()); - for (TObject *a = iter_no->Next(); a != 0; a = iter_no->Next()) { + for (RooAbsArg * a : *norms) { RooRealVar *rcv = dynamic_cast(a); std::string name = rcv->GetName(); processNormalizations_[count] = -999; diff --git a/src/FitterAlgoBase.cc b/src/FitterAlgoBase.cc index a11fcd80ecd..7455028977b 100644 --- a/src/FitterAlgoBase.cc +++ b/src/FitterAlgoBase.cc @@ -151,9 +151,8 @@ bool FitterAlgoBase::run(RooWorkspace *w, RooStats::ModelConfig *mc_s, RooStats: break; } - std::unique_ptr params(mc_s->GetPdf()->getParameters(data)); - RooLinkedListIter iter = params->iterator(); int i = 0; - for (RooAbsArg *a = (RooAbsArg *) iter.Next(); a != 0; a = (RooAbsArg *) iter.Next(), ++i) { + ; + for (RooAbsArg *a : *std::unique_ptr{mc_s->GetPdf()->getParameters(data)}) { RooRealVar *rrv = dynamic_cast(a); if (rrv == 0 || rrv->isConstant()) continue; if (profileMode_ == ProfileUnconstrained && mc_s->GetNuisanceParameters()->find(*rrv) != 0) { @@ -679,8 +678,7 @@ double FitterAlgoBase::findCrossingNew(CascadeMinimizer &minim, RooAbsReal &nll, void FitterAlgoBase::optimizeBounds(const RooWorkspace *w, const RooStats::ModelConfig *mc) { if (runtimedef::get("UNBOUND_GAUSSIANS") && mc->GetNuisanceParameters() != 0) { - RooLinkedListIter iter = mc->GetNuisanceParameters()->iterator(); - for (RooAbsArg *a = (RooAbsArg *) iter.Next(); a != 0; a = (RooAbsArg *) iter.Next()) { + for (RooAbsArg *a : *mc->GetNuisanceParameters()) { RooRealVar *rrv = dynamic_cast(a); if (rrv != 0) { RooAbsPdf *pdf = w->pdf((std::string(a->GetName())+"_Pdf").c_str()); @@ -692,8 +690,7 @@ void FitterAlgoBase::optimizeBounds(const RooWorkspace *w, const RooStats::Model } } if (runtimedef::get("OPTIMIZE_BOUNDS") && mc->GetNuisanceParameters() != 0) { - RooLinkedListIter iter = mc->GetNuisanceParameters()->iterator(); - for (RooAbsArg *a = (RooAbsArg *) iter.Next(); a != 0; a = (RooAbsArg *) iter.Next()) { + for (RooAbsArg *a : *mc->GetNuisanceParameters()) { RooRealVar *rrv = dynamic_cast(a); //std::cout << (rrv ? "Var" : "Arg") << ": " << a->GetName() << ": " << a->getAttribute("optimizeBounds") << std::endl; if (rrv != 0 && rrv->getAttribute("optimizeBounds")) { @@ -707,8 +704,7 @@ void FitterAlgoBase::optimizeBounds(const RooWorkspace *w, const RooStats::Model } void FitterAlgoBase::restoreBounds(const RooWorkspace *w, const RooStats::ModelConfig *mc) { if (runtimedef::get("OPTIMIZE_BOUNDS") && mc->GetNuisanceParameters() != 0) { - RooLinkedListIter iter = mc->GetNuisanceParameters()->iterator(); - for (RooAbsArg *a = (RooAbsArg *) iter.Next(); a != 0; a = (RooAbsArg *) iter.Next()) { + for (RooAbsArg *a : *mc->GetNuisanceParameters()) { RooRealVar *rrv = dynamic_cast(a); if (rrv != 0 && rrv->getAttribute("optimizeBounds")) { rrv->setRange(rrv->getMin("optimizeBoundRange"), rrv->getMax("optimizeBoundRange")); diff --git a/src/HWWLVJJRooPdfs.cc b/src/HWWLVJJRooPdfs.cc index ff687552428..a0d35ed6e03 100644 --- a/src/HWWLVJJRooPdfs.cc +++ b/src/HWWLVJJRooPdfs.cc @@ -16,16 +16,13 @@ RooChebyshevPDF::RooChebyshevPDF(const char *name, const char *title, x("x", "x", this, var), coefs("coefs", "coefs", this) { - TIterator *cx = coefList.createIterator(); - RooAbsReal *coef; - while ((coef = (RooAbsReal*)cx->Next())) { + for (RooAbsArg * coef : coefList) { if (!dynamic_cast(coef)) { std::cerr << "Coefficient " << coef->GetName() << " is not good." << std::endl; assert(0); } coefs.add(*coef); } - delete cx; } RooChebyshevPDF::RooChebyshevPDF(const RooChebyshevPDF& other, @@ -444,16 +441,13 @@ RooExpPoly::RooExpPoly(const char *name, const char *title, x("x","x",this,_x), coefs("coefs","coefs",this) { - TIterator *cx = _coefs.createIterator(); - RooAbsReal *coef; - while ((coef = (RooAbsReal*)cx->Next())) { + for (RooAbsArg * coef : _coefs) { if (!dynamic_cast(coef)) { std::cerr << "Coefficient " << coef->GetName() << " is not good." << std::endl; assert(0); } coefs.add(*coef); } - delete cx; } diff --git a/src/HWWLVJRooPdfs.cxx b/src/HWWLVJRooPdfs.cxx index 80bbab4b86d..dc45009be41 100755 --- a/src/HWWLVJRooPdfs.cxx +++ b/src/HWWLVJRooPdfs.cxx @@ -25,7 +25,6 @@ #include "TString.h" #include "TRandom3.h" #include "TCanvas.h" -#include "TIterator.h" #include "RooHist.h" #include "RooRealVar.h" #include "RooFitResult.h" diff --git a/src/HZGRooPdfs.cxx b/src/HZGRooPdfs.cxx index df8dede31a7..d6a24dafcd3 100644 --- a/src/HZGRooPdfs.cxx +++ b/src/HZGRooPdfs.cxx @@ -55,9 +55,7 @@ RooStepBernstein::RooStepBernstein(const char* name, const char* title, _coefList("coefficients","List of coefficients",this) { // Constructor - TIterator* coefIter = coefList.createIterator() ; - RooAbsArg* coef ; - while((coef = (RooAbsArg*)coefIter->Next())) { + for (RooAbsArg* coef : coefList) { if (!dynamic_cast(coef)) { cout << "RooStepBernstein::ctor(" << GetName() << ") ERROR: coefficient " << coef->GetName() << " is not of type RooAbsReal" << endl ; @@ -65,7 +63,6 @@ RooStepBernstein::RooStepBernstein(const char* name, const char* title, } _coefList.add(*coef) ; } - delete coefIter ; } @@ -95,23 +92,22 @@ Double_t RooStepBernstein::evaluate() const x = (x - _stepThresh)/(1.0-_stepThresh); // now we get the full polynomial Int_t degree = _coefList.getSize() - 1; // n+1 polys of degree n - RooFIter iter = _coefList.fwdIterator(); if(degree == 0) { - return ((RooAbsReal *)iter.next())->getVal(); + return ((RooAbsReal &)_coefList[0]).getVal(); } else if(degree == 1) { - Double_t a0 = ((RooAbsReal *)iter.next())->getVal(); // c0 - Double_t a1 = ((RooAbsReal *)iter.next())->getVal() - a0; // c1 - c0 + Double_t a0 = ((RooAbsReal &)_coefList[0]).getVal(); // c0 + Double_t a1 = ((RooAbsReal &)_coefList[1]).getVal() - a0; // c1 - c0 return a1 * x + a0; } else if(degree == 2) { - Double_t a0 = ((RooAbsReal *)iter.next())->getVal(); // c0 - Double_t a1 = 2 * (((RooAbsReal *)iter.next())->getVal() - a0); // 2 * (c1 - c0) - Double_t a2 = ((RooAbsReal *)iter.next())->getVal() - a1 - a0; // c0 - 2 * c1 + c2 + Double_t a0 = ((RooAbsReal &)_coefList[0]).getVal(); // c0 + Double_t a1 = 2 * (((RooAbsReal &)_coefList[1]).getVal() - a0); // 2 * (c1 - c0) + Double_t a2 = ((RooAbsReal &)_coefList[2]).getVal() - a1 - a0; // c0 - 2 * c1 + c2 return (a2 * x + a1) * x + a0; } else if(degree > 2) { @@ -119,12 +115,12 @@ Double_t RooStepBernstein::evaluate() const Double_t t = x; Double_t s = 1 - x; - Double_t result = ((RooAbsReal *)iter.next())->getVal() * s; + Double_t result = ((RooAbsReal &)_coefList[0]).getVal() * s; for(Int_t i = 1; i < degree; i++) { - result = (result + t * TMath::Binomial(degree, i) * ((RooAbsReal *)iter.next())->getVal()) * s; + result = (result + t * TMath::Binomial(degree, i) * ((RooAbsReal &)_coefList[i]).getVal()) * s; t *= x; } - result += t * ((RooAbsReal *)iter.next())->getVal(); + result += t * ((RooAbsReal &)_coefList[degree]).getVal(); return result; } @@ -160,17 +156,15 @@ Double_t RooStepBernstein::analyticalIntegral(Int_t code, const char* rangeName) Int_t degree= _coefList.getSize()-1; // n+1 polys of degree n Double_t norm(0) ; - RooFIter iter = _coefList.fwdIterator() ; - Double_t temp=0; for (int i=0; i<=degree; ++i){ // for each of the i Bernstein basis polynomials // represent it in the 'power basis' (the naive polynomial basis) // where the integral is straight forward. - temp = 0; + Double_t temp = 0; for (int j=i; j<=degree; ++j){ // power basis≈ß temp += pow(-1.,j-i) * TMath::Binomial(degree, j) * TMath::Binomial(j,i) / (j+1); } - temp *= ((RooAbsReal*)iter.next())->getVal(); // include coeff + temp *= ((RooAbsReal&)_coefList[i]).getVal(); // include coeff norm += temp; // add this basis's contribution to total } @@ -725,9 +719,7 @@ RooGaussStepBernstein::RooGaussStepBernstein(const char* name, _coefList("coefficients","List of coefficients",this) { // Constructor - TIterator* coefIter = coefList.createIterator() ; - RooAbsArg* coef ; - while((coef = (RooAbsArg*)coefIter->Next())) { + for (RooAbsArg *coef : coefList) { if (!dynamic_cast(coef)) { cout << "RooGaussStepBernstein::ctor(" << GetName() << ") ERROR: coefficient " << coef->GetName() @@ -736,7 +728,6 @@ RooGaussStepBernstein::RooGaussStepBernstein(const char* name, } _coefList.add(*coef) ; } - delete coefIter ; } @@ -758,7 +749,6 @@ RooGaussStepBernstein::RooGaussStepBernstein(const RooGaussStepBernstein& other, Double_t RooGaussStepBernstein::evaluate() const { const Int_t degree = _coefList.getSize() - 1; // n+1 polys of degree n - RooFIter iter = _coefList.fwdIterator() ; double poly_vals[degree+1]; for( int i = 0; i <= degree; ++i ) { @@ -773,7 +763,7 @@ Double_t RooGaussStepBernstein::evaluate() const RooAbsReal* coef = NULL; for(Int_t i = 0; i <= degree; ++i) { // coef is the bernstein polynomial coefficient - coef = (RooAbsReal *)iter.next(); + coef = &(RooAbsReal &)_coefList[i]; // calculate the coefficient in the 'power basis' // i.e. the naive polynomial basis beta = 0.0; @@ -787,8 +777,6 @@ Double_t RooGaussStepBernstein::evaluate() const result += beta; } - //cout << result << endl; - return result; } @@ -811,7 +799,6 @@ Double_t RooGaussStepBernstein::analyticalIntegral(Int_t code, assert(code==1) ; const Int_t degree = _coefList.getSize() - 1; // n+1 polys of degree n - RooFIter iter = _coefList.fwdIterator() ; double integral_vals_hi[degree+1],integral_vals_lo[degree+1]; for( int i = 0; i <= degree; ++i ) { @@ -826,10 +813,9 @@ Double_t RooGaussStepBernstein::analyticalIntegral(Int_t code, double beta = 0.0; // iterate through each Double_t result = 0.0; - RooAbsReal* coef = NULL; for(Int_t i = 0; i <= degree; ++i) { // coef is the bernstein polynomial coefficient - coef = (RooAbsReal *)iter.next(); + RooAbsReal *coef = &(RooAbsReal &)_coefList[i]; // calculate the coefficient in the 'power basis' // i.e. the naive polynomial basis beta = 0.0; diff --git a/src/HZZ4L_RooCTauPdf_1D.cc b/src/HZZ4L_RooCTauPdf_1D.cc index 9aa0c86ea3a..76034e7a72c 100755 --- a/src/HZZ4L_RooCTauPdf_1D.cc +++ b/src/HZZ4L_RooCTauPdf_1D.cc @@ -31,16 +31,13 @@ _coefList("coefList", "List of funcficients", this), ctau_min(_ctau_min), ctau_max(_ctau_max) { - TIterator* coefIter = inCoefList.createIterator(); - RooAbsArg* func; - while ((func = (RooAbsArg*)coefIter->Next())) { + for (RooAbsArg* func : inCoefList) { if (!dynamic_cast(func)) { coutE(InputArguments) << "ERROR: :HZZ4L_RooCTauPdf_1D(" << GetName() << ") funcficient " << func->GetName() << " is not of type RooAbsReal" << endl; assert(0); } _coefList.add(*func); } - delete coefIter; nbins_ctau = _coefList.getSize(); for(int mp=0;mp<(nbins_ctau>101 ? 101 : nbins_ctau);mp++) Integral_T[mp] = dynamic_cast(_coefList.at(mp))->analyticalIntegral(1000); diff --git a/src/HZZ4L_RooCTauPdf_1D_Expanded.cc b/src/HZZ4L_RooCTauPdf_1D_Expanded.cc index abe7062d0e5..ae443264f9b 100755 --- a/src/HZZ4L_RooCTauPdf_1D_Expanded.cc +++ b/src/HZZ4L_RooCTauPdf_1D_Expanded.cc @@ -42,9 +42,7 @@ nLinearVariations(nLinearVariations_) nCoef=0; nFuncs=0; - TIterator* coefIter = inCoefList.createIterator(); - RooAbsArg* coef; - while ((coef = (RooAbsArg*)coefIter->Next())) { + for (RooAbsArg *coef : inCoefList) { if (!dynamic_cast(coef)) { coutE(InputArguments) << "ERROR::HZZ4L_RooCTauPdf_1D_Expanded(" << GetName() << ") coefficient " << coef->GetName() << " is not of type RooAbsReal" << endl; assert(0); @@ -52,7 +50,6 @@ nLinearVariations(nLinearVariations_) _coefList.add(*coef); nCoef++; } - delete coefIter; if (nCoef>2){ coutE(InputArguments) << "ERROR::HZZ4L_RooCTauPdf_1D_Expanded(" << GetName() << ") number coefficients " << nCoef << " is not supported." << endl; @@ -60,9 +57,7 @@ nLinearVariations(nLinearVariations_) } // else cout << "Number of coefficients: " << nCoef << endl; - TIterator* funcIter = inFuncList.createIterator(); - RooAbsArg* func; - while ((func = (RooAbsArg*)funcIter->Next())) { + for (RooAbsArg *func : inFuncList) { if (!dynamic_cast(func)) { coutE(InputArguments) << "ERROR::HZZ4L_RooCTauPdf_1D_Expanded(" << GetName() << ") function " << func->GetName() << " is not of type RooAbsReal" << endl; assert(0); @@ -70,7 +65,6 @@ nLinearVariations(nLinearVariations_) _funcList.add(*func); nFuncs++; } - delete funcIter; if (nLinearVariations>nCoef){ coutE(InputArguments) << "ERROR::HZZ4L_RooCTauPdf_1D_Expanded(" << GetName() << ") number of linear variations (" << nLinearVariations << ") is more than the number of coefficients (" << nCoef << ")!!!" << endl; diff --git a/src/HZZ4L_RooCTauPdf_2D.cc b/src/HZZ4L_RooCTauPdf_2D.cc index 6c3a90a4717..2981755b410 100755 --- a/src/HZZ4L_RooCTauPdf_2D.cc +++ b/src/HZZ4L_RooCTauPdf_2D.cc @@ -33,16 +33,13 @@ _coefList("coefList", "List of funcficients", this), ctau_min(_ctau_min), ctau_max(_ctau_max) { - TIterator* coefIter = inCoefList.createIterator(); - RooAbsArg* func; - while ((func = (RooAbsArg*)coefIter->Next())) { + for (RooAbsArg *func : inCoefList) { if (!dynamic_cast(func)) { coutE(InputArguments) << "ERROR: :HZZ4L_RooCTauPdf_2D(" << GetName() << ") funcficient " << func->GetName() << " is not of type RooAbsReal" << endl; assert(0); } _coefList.add(*func); } - delete coefIter; nbins_ctau = _coefList.getSize(); Integral_T = new double[nbins_ctau]; diff --git a/src/HZZ4L_RooSpinZeroPdf.cc b/src/HZZ4L_RooSpinZeroPdf.cc index 16736ed45ac..2e2231256e2 100755 --- a/src/HZZ4L_RooSpinZeroPdf.cc +++ b/src/HZZ4L_RooSpinZeroPdf.cc @@ -26,21 +26,17 @@ ClassImp(HZZ4L_RooSpinZeroPdf) _coefList("coefList","List of funcficients",this) { - TIterator* coefIter = inCoefList.createIterator() ; - RooAbsArg* func; - while((func = (RooAbsArg*)coefIter->Next())) { + for (RooAbsArg* func : inCoefList) { if (!dynamic_cast(func)) { coutE(InputArguments) << "ERROR: :HZZ4L_RooSpinZeroPdf(" << GetName() << ") funcficient " << func->GetName() << " is not of type RooAbsReal" << std::endl; assert(0); } _coefList.add(*func) ; } - delete coefIter; Integral_T1 = dynamic_cast(_coefList.at(0))-> analyticalIntegral(1000); Integral_T2 = dynamic_cast(_coefList.at(1))-> analyticalIntegral(1000); Integral_T4 = dynamic_cast(_coefList.at(2))-> analyticalIntegral(1000); -// _coefIter = _coefList.createIterator() ; } @@ -55,7 +51,6 @@ ClassImp(HZZ4L_RooSpinZeroPdf) Integral_T1 = other.Integral_T1; Integral_T2 = other.Integral_T2; Integral_T4 = other.Integral_T4; - // _coefIter = _coefList.createIterator() ; } diff --git a/src/HZZ4L_RooSpinZeroPdf_1D.cc b/src/HZZ4L_RooSpinZeroPdf_1D.cc index 14f31e8ab8e..6b9e7d4c092 100644 --- a/src/HZZ4L_RooSpinZeroPdf_1D.cc +++ b/src/HZZ4L_RooSpinZeroPdf_1D.cc @@ -27,18 +27,13 @@ ClassImp(HZZ4L_RooSpinZeroPdf_1D) _coefList("coefList","List of funcficients",this) { - TIterator* coefIter = inCoefList.createIterator() ; - RooAbsArg* func; - while((func = (RooAbsArg*)coefIter->Next())) { + for (RooAbsArg *func : inCoefList) { if (!dynamic_cast(func)) { coutE(InputArguments) << "ERROR: :HZZ4L_RooSpinZeroPdf_1D(" << GetName() << ") funcficient " << func->GetName() << " is not of type RooAbsReal" << std::endl; assert(0); } _coefList.add(*func) ; } - delete coefIter; - - _coefIter = _coefList.createIterator() ; } @@ -51,7 +46,6 @@ ClassImp(HZZ4L_RooSpinZeroPdf_1D) _coefList("coefList",this,other._coefList) { - _coefIter = _coefList.createIterator() ; } diff --git a/src/HZZ4L_RooSpinZeroPdf_1D_fast.cc b/src/HZZ4L_RooSpinZeroPdf_1D_fast.cc index 310704781ad..5d4cea09afc 100755 --- a/src/HZZ4L_RooSpinZeroPdf_1D_fast.cc +++ b/src/HZZ4L_RooSpinZeroPdf_1D_fast.cc @@ -28,27 +28,21 @@ HZZ4L_RooSpinZeroPdf_1D_fast::HZZ4L_RooSpinZeroPdf_1D_fast( obsList("obsList", "List of pdf observables", this), coefList("coefList", "List of pdf components", this) { - TIterator* coefIter = inObsList.createIterator(); - RooAbsArg* coef; - while ((coef = (RooAbsArg*)coefIter->Next())){ + for (RooAbsArg *coef : inObsList) { if (!dynamic_cast(coef)){ coutE(InputArguments) << "HZZ4L_RooSpinZeroPdf_1D_fast(" << GetName() << ") observable " << coef->GetName() << " is not of type RooAbsReal" << endl; assert(0); } obsList.add(*coef); } - delete coefIter; - coefIter = inCoefList.createIterator(); - coef=0; - while ((coef = (RooAbsArg*)coefIter->Next())){ + for (RooAbsArg *coef : inCoefList) { if (dynamic_cast(coef)==0 && dynamic_cast(coef)==0){ coutE(InputArguments) << "HZZ4L_RooSpinZeroPdf_1D_fast(" << GetName() << ") component " << coef->GetName() << " is not of type FastTemplateFunc_f" << endl; assert(0); } coefList.add(*coef); } - delete coefIter; } diff --git a/src/HZZ4L_RooSpinZeroPdf_2D.cc b/src/HZZ4L_RooSpinZeroPdf_2D.cc index d0dab44aa38..2cc39dffcad 100755 --- a/src/HZZ4L_RooSpinZeroPdf_2D.cc +++ b/src/HZZ4L_RooSpinZeroPdf_2D.cc @@ -32,16 +32,13 @@ ClassImp(HZZ4L_RooSpinZeroPdf_2D) _coefList("coefList","List of funcficients",this) { - TIterator* coefIter = inCoefList.createIterator() ; - RooAbsArg* func; - while((func = (RooAbsArg*)coefIter->Next())) { + for (RooAbsArg *func : inCoefList) { if (!dynamic_cast(func)) { coutE(InputArguments) << "ERROR: :HZZ4L_RooSpinZeroPdf_2D(" << GetName() << ") funcficient " << func->GetName() << " is not of type RooAbsReal" << std::endl; assert(0); } _coefList.add(*func) ; } - delete coefIter; Integral_T1 = dynamic_cast(_coefList.at(0))-> analyticalIntegral(1000); Integral_T2 = dynamic_cast(_coefList.at(1))-> analyticalIntegral(1000); @@ -52,8 +49,6 @@ ClassImp(HZZ4L_RooSpinZeroPdf_2D) Integral_T7 = dynamic_cast(_coefList.at(6))-> analyticalIntegral(1000); Integral_T8 = dynamic_cast(_coefList.at(7))-> analyticalIntegral(1000); Integral_T9 = dynamic_cast(_coefList.at(8))-> analyticalIntegral(1000); - -// _coefIter = _coefList.createIterator() ; } @@ -78,8 +73,6 @@ ClassImp(HZZ4L_RooSpinZeroPdf_2D) Integral_T7 = other.Integral_T7; Integral_T8 = other.Integral_T8; Integral_T9 = other.Integral_T9; - - // _coefIter = _coefList.createIterator() ; } diff --git a/src/HZZ4L_RooSpinZeroPdf_2D_fast.cc b/src/HZZ4L_RooSpinZeroPdf_2D_fast.cc index 338c590d36e..3a2c933ab61 100755 --- a/src/HZZ4L_RooSpinZeroPdf_2D_fast.cc +++ b/src/HZZ4L_RooSpinZeroPdf_2D_fast.cc @@ -37,27 +37,21 @@ HZZ4L_RooSpinZeroPdf_2D_fast::HZZ4L_RooSpinZeroPdf_2D_fast( obsList("obsList", "List of pdf observables", this), coefList("coefList", "List of pdf components", this) { - TIterator* coefIter = inObsList.createIterator(); - RooAbsArg* coef; - while ((coef = (RooAbsArg*)coefIter->Next())){ + for (RooAbsArg *coef : inObsList) { if (!dynamic_cast(coef)){ coutE(InputArguments) << "HZZ4L_RooSpinZeroPdf_2D_fast(" << GetName() << ") observable " << coef->GetName() << " is not of type RooAbsReal" << endl; assert(0); } obsList.add(*coef); } - delete coefIter; - coefIter = inCoefList.createIterator(); - coef=0; - while ((coef = (RooAbsArg*)coefIter->Next())){ + for (RooAbsArg *coef : inCoefList) { if (dynamic_cast(coef)==0 && dynamic_cast(coef)==0){ coutE(InputArguments) << "HZZ4L_RooSpinZeroPdf_2D_fast(" << GetName() << ") component " << coef->GetName() << " is not of type FastTemplateFunc_f" << endl; assert(0); } coefList.add(*coef); } - delete coefIter; } diff --git a/src/HZZ4L_RooSpinZeroPdf_phase.cc b/src/HZZ4L_RooSpinZeroPdf_phase.cc index 8850b3f41ff..2853ed3f801 100755 --- a/src/HZZ4L_RooSpinZeroPdf_phase.cc +++ b/src/HZZ4L_RooSpinZeroPdf_phase.cc @@ -28,22 +28,18 @@ ClassImp(HZZ4L_RooSpinZeroPdf_phase) _coefList("coefList","List of funcficients",this) { - TIterator* coefIter = inCoefList.createIterator() ; - RooAbsArg* func; - while((func = (RooAbsArg*)coefIter->Next())) { + for (RooAbsArg *func : inCoefList) { if (!dynamic_cast(func)) { coutE(InputArguments) << "ERROR: :HZZ4L_RooSpinZeroPdf_phase(" << GetName() << ") funcficient " << func->GetName() << " is not of type RooAbsReal" << std::endl; assert(0); } _coefList.add(*func) ; } - delete coefIter; Integral_T1 = dynamic_cast(_coefList.at(0))-> analyticalIntegral(1000); Integral_T2 = dynamic_cast(_coefList.at(1))-> analyticalIntegral(1000); Integral_T4 = dynamic_cast(_coefList.at(2))-> analyticalIntegral(1000); Integral_T5 = dynamic_cast(_coefList.at(3))-> analyticalIntegral(1000); -// _coefIter = _coefList.createIterator() ; } @@ -61,7 +57,6 @@ ClassImp(HZZ4L_RooSpinZeroPdf_phase) Integral_T2 = other.Integral_T2; Integral_T4 = other.Integral_T4; Integral_T5 = other.Integral_T5; - // _coefIter = _coefList.createIterator() ; } diff --git a/src/HZZ4L_RooSpinZeroPdf_phase_fast.cc b/src/HZZ4L_RooSpinZeroPdf_phase_fast.cc index 5ad8fe1cd99..0857cc5223d 100755 --- a/src/HZZ4L_RooSpinZeroPdf_phase_fast.cc +++ b/src/HZZ4L_RooSpinZeroPdf_phase_fast.cc @@ -31,27 +31,21 @@ HZZ4L_RooSpinZeroPdf_phase_fast::HZZ4L_RooSpinZeroPdf_phase_fast( obsList("obsList", "List of pdf observables", this), coefList("coefList", "List of pdf components", this) { - TIterator* coefIter = inObsList.createIterator(); - RooAbsArg* coef; - while ((coef = (RooAbsArg*)coefIter->Next())){ + for (RooAbsArg *coef : inObsList) { if (!dynamic_cast(coef)){ coutE(InputArguments) << "HZZ4L_RooSpinZeroPdf_phase_fast(" << GetName() << ") observable " << coef->GetName() << " is not of type RooAbsReal" << endl; assert(0); } obsList.add(*coef); } - delete coefIter; - coefIter = inCoefList.createIterator(); - coef=0; - while ((coef = (RooAbsArg*)coefIter->Next())){ + for (RooAbsArg *coef : inCoefList) { if (dynamic_cast(coef)==0 && dynamic_cast(coef)==0){ coutE(InputArguments) << "HZZ4L_RooSpinZeroPdf_phase_fast(" << GetName() << ") component " << coef->GetName() << " is not of type FastTemplateFunc_f" << endl; assert(0); } coefList.add(*coef); } - delete coefIter; } diff --git a/src/HybridNew.cc b/src/HybridNew.cc index 0c4688c094c..25b8a9dcd53 100644 --- a/src/HybridNew.cc +++ b/src/HybridNew.cc @@ -313,9 +313,8 @@ bool HybridNew::runSignificance(RooWorkspace *w, RooStats::ModelConfig *mc_s, Ro } if (saveHybridResult_) { TString name = TString::Format("HypoTestResult_mh%g",mass_); - RooLinkedListIter it = rValues_.iterator(); - for (RooRealVar *rIn = (RooRealVar*) it.Next(); rIn != 0; rIn = (RooRealVar*) it.Next()) { - name += Form("_%s%g", rIn->GetName(), rIn->getVal()); + for (RooAbsArg *rIn : rValues_) { + name += Form("_%s%g", rIn->GetName(), static_cast(rIn)->getVal()); } name += Form("_%u", RooRandom::integer(std::numeric_limits::max() - 1)); writeToysHere->WriteTObject(new HypoTestResult(*hcResult), name); @@ -693,8 +692,8 @@ std::pair HybridNew::eval(RooWorkspace *w, RooStats::ModelConfig } HybridNew::Setup setup; - RooLinkedListIter it = rVals.iterator(); - for (RooRealVar *rIn = (RooRealVar*) it.Next(); rIn != 0; rIn = (RooRealVar*) it.Next()) { + for (RooAbsArg *rInAbsArg : rVals) { + RooRealVar *rIn = static_cast(rInAbsArg); RooRealVar *r = dynamic_cast(mc_s->GetParametersOfInterest()->find(rIn->GetName())); r->setVal(rIn->getVal()); if (verbose) std::cout << " " << r->GetName() << " = " << rIn->getVal() << " +/- " << r->getError() << std::endl; @@ -811,8 +810,7 @@ std::unique_ptr HybridNew::create(RooWorkspace *w, R // print the values of the parameters used to generate the toy if (verbose > 2) { CombineLogger::instance().log("HybridNew.cc",__LINE__,"Using the following (post-fit) parameters for No signal hypothesis ",__func__); - std::unique_ptr iter(paramsToFit->createIterator()); - for (RooAbsArg *a = (RooAbsArg *) iter->Next(); a != 0; a = (RooAbsArg *) iter->Next()) { + for (RooAbsArg *a : *paramsToFit) { TString varstring = utils::printRooArgAsString(a); CombineLogger::instance().log("HybridNew.cc",__LINE__,std::string(Form(" %s",varstring.Data())),__func__); } @@ -839,8 +837,7 @@ std::unique_ptr HybridNew::create(RooWorkspace *w, R CombineLogger::instance().log("HybridNew.cc",__LINE__,"Using the following (post-fit) parameters for S+B hypothesis ",__func__); RooArgSet reportParams; reportParams.add(*paramsToFit); reportParams.add(poi); - std::unique_ptr iter(reportParams.createIterator()); - for (RooAbsArg *a = (RooAbsArg *) iter->Next(); a != 0; a = (RooAbsArg *) iter->Next()) { + for (RooAbsArg *a : reportParams) { TString varstring = utils::printRooArgAsString(a); CombineLogger::instance().log("HybridNew.cc",__LINE__,std::string(Form(" %s",varstring.Data())),__func__); } @@ -1148,9 +1145,8 @@ HybridNew::eval(RooStats::HybridCalculator &hc, const RooAbsCollection & rVals, } if (saveHybridResult_) { TString name = TString::Format("HypoTestResult_mh%g",mass_); - RooLinkedListIter it = rVals.iterator(); - for (RooRealVar *rIn = (RooRealVar*) it.Next(); rIn != 0; rIn = (RooRealVar*) it.Next()) { - name += Form("_%s%g", rIn->GetName(), rIn->getVal()); + for (RooAbsArg * rIn : rVals) { + name += Form("_%s%g", rIn->GetName(), static_cast(rIn)->getVal()); } name += Form("_%u", RooRandom::integer(std::numeric_limits::max() - 1)); writeToysHere->WriteTObject(new HypoTestResult(*hcResult), name); @@ -1454,8 +1450,8 @@ RooStats::HypoTestResult * HybridNew::readToysFromFile(const RooAbsCollection & if (verbose) std::cout << "Reading toys for "; TString prefix1 = TString::Format("HypoTestResult_mh%g",mass_); TString prefix2 = TString::Format("HypoTestResult"); - RooLinkedListIter it = rVals.iterator(); - for (RooRealVar *rIn = (RooRealVar*) it.Next(); rIn != 0; rIn = (RooRealVar*) it.Next()) { + for (RooAbsArg *rInAbsArg : rVals) { + RooRealVar *rIn = static_cast(rInAbsArg); if (verbose) std::cout << rIn->GetName() << " = " << rIn->getVal() << " "; prefix1 += Form("_%s%g", rIn->GetName(), rIn->getVal()); prefix2 += Form("_%s%g", rIn->GetName(), rIn->getVal()); diff --git a/src/MarkovChainMC.cc b/src/MarkovChainMC.cc index fe2e73e1864..5e72484e1d0 100644 --- a/src/MarkovChainMC.cc +++ b/src/MarkovChainMC.cc @@ -262,8 +262,7 @@ int MarkovChainMC::runOnce(RooWorkspace *w, RooStats::ModelConfig *mc_s, RooStat if (verbose > 1) { std::cout << "\nDiscrete model point " << (i+1) << std::endl; discreteModelPointSets_[i].Print("V"); } } RooArgSet discretePOI; - RooLinkedListIter iter = poi.iterator(); - for (RooAbsArg *a = (RooAbsArg *) iter.Next(); a != 0; a = (RooAbsArg *) iter.Next()) { + for (RooAbsArg *a : poi) { if (discreteModelPointSets_[0].find(a->GetName())) discretePOI.add(*a); } if (verbose > 1) { std::cout << "Discrete POI: " ; discretePOI.Print(""); } diff --git a/src/MultiDimFit.cc b/src/MultiDimFit.cc index d8519559f56..683d9ff480e 100644 --- a/src/MultiDimFit.cc +++ b/src/MultiDimFit.cc @@ -166,9 +166,8 @@ bool MultiDimFit::runSpecific(RooWorkspace *w, RooStats::ModelConfig *mc_s, RooS nOtherFloatingPoi_ = 0; deltaNLL_ = 0; int nConstPoi=0; - RooLinkedListIter iterP = mc_s->GetParametersOfInterest()->iterator(); std::string setConstPOI; - for (RooAbsArg *a = (RooAbsArg*) iterP.Next(); a != 0; a = (RooAbsArg*) iterP.Next()) { + for (RooAbsArg *a : *mc_s->GetParametersOfInterest()) { if (poiList_.contains(*a)) continue; RooRealVar *rrv = dynamic_cast(a); if (rrv == 0) { std::cerr << "MultiDimFit: Parameter of interest " << a->GetName() << " which is not a RooRealVar will be ignored" << std::endl; continue; } @@ -311,8 +310,7 @@ void MultiDimFit::initOnce(RooWorkspace *w, RooStats::ModelConfig *mc_s) { RooArgSet mcPoi(*mc_s->GetParametersOfInterest()); if (poi_.empty()) { - RooLinkedListIter iterP = mc_s->GetParametersOfInterest()->iterator(); - for (RooAbsArg *a = (RooAbsArg*) iterP.Next(); a != 0; a = (RooAbsArg*) iterP.Next()) { + for (RooAbsArg *a : *mc_s->GetParametersOfInterest()) { poi_.push_back(a->GetName()); } } @@ -372,8 +370,7 @@ void MultiDimFit::initOnce(RooWorkspace *w, RooStats::ModelConfig *mc_s) { RooArgSet mcNuis(*mc_s->GetNuisanceParameters()); if(saveSpecifiedNuis_=="all"){ specifiedNuis_.clear(); - RooLinkedListIter iterN = mc_s->GetNuisanceParameters()->iterator(); - for (RooAbsArg *a = (RooAbsArg*) iterN.Next(); a != 0; a = (RooAbsArg*) iterN.Next()) { + for (RooAbsArg *a : *mc_s->GetNuisanceParameters()) { if (poiList_.contains(*a)) continue; specifiedNuis_.push_back(a->GetName()); } @@ -384,8 +381,7 @@ void MultiDimFit::initOnce(RooWorkspace *w, RooStats::ModelConfig *mc_s) { while(token) { const RooArgSet* group = mc_s->GetWS()->set((std::string("group_") + token).data()); if (group){ - RooLinkedListIter iterN = group->iterator(); - for (RooAbsArg *a = (RooAbsArg*) iterN.Next(); a != 0; a = (RooAbsArg*) iterN.Next()) { + for (RooAbsArg *a : *group) { specifiedNuis_.push_back(a->GetName()); } }else if (!poiList_.find(token)){ @@ -406,8 +402,7 @@ void MultiDimFit::initOnce(RooWorkspace *w, RooStats::ModelConfig *mc_s) { } } if(saveInactivePOI_){ - RooLinkedListIter iterP = mc_s->GetParametersOfInterest()->iterator(); - for (RooAbsArg *a = (RooAbsArg*) iterP.Next(); a != 0; a = (RooAbsArg*) iterP.Next()) { + for (RooAbsArg *a : *mc_s->GetParametersOfInterest()) { if (poiList_.contains(*a)) continue; if (specifiedList_.contains(*a)) continue; RooRealVar *rrv = dynamic_cast(a); diff --git a/src/ProcessNormalization.cc b/src/ProcessNormalization.cc index 3ced2b9b58c..f61c9b17628 100644 --- a/src/ProcessNormalization.cc +++ b/src/ProcessNormalization.cc @@ -59,26 +59,23 @@ void ProcessNormalization::addOtherFactor(RooAbsReal &factor) { Double_t ProcessNormalization::evaluate() const { double logVal = 0.0; if (thetaListVec_.empty()) { - RooFIter iterTheta = thetaList_.fwdIterator(); std::vector & thetaListVec = const_cast&>(thetaListVec_); thetaListVec.reserve(thetaList_.getSize()); - for (RooAbsArg *a = iterTheta.next(); a != 0; a = iterTheta.next()) { + for (RooAbsArg *a : thetaList_) { thetaListVec.push_back(dynamic_cast(a)); } } if (asymmThetaListVec_.empty()) { - RooFIter iterTheta = asymmThetaList_.fwdIterator(); std::vector & asymmThetaListVec = const_cast&>(asymmThetaListVec_); asymmThetaListVec.reserve(asymmThetaList_.getSize()); - for (RooAbsArg *a = iterTheta.next(); a != 0; a = iterTheta.next()) { + for (RooAbsArg *a : asymmThetaList_) { asymmThetaListVec.push_back(dynamic_cast(a)); } } if (otherFactorListVec_.empty()) { - RooFIter iterOther = otherFactorList_.fwdIterator(); std::vector & otherFactorListVec = const_cast&>(otherFactorListVec_); otherFactorListVec.reserve(otherFactorList_.getSize()); - for (RooAbsArg *a = iterOther.next(); a != 0; a = iterOther.next()) { + for (RooAbsArg *a : otherFactorList_) { otherFactorListVec.push_back(dynamic_cast(a)); } } diff --git a/src/ProfiledLikelihoodRatioTestStatExt.cc b/src/ProfiledLikelihoodRatioTestStatExt.cc index b3378f154b0..5651a0da40f 100644 --- a/src/ProfiledLikelihoodRatioTestStatExt.cc +++ b/src/ProfiledLikelihoodRatioTestStatExt.cc @@ -152,8 +152,7 @@ ProfiledLikelihoodTestStatOpt::ProfiledLikelihoodTestStatOpt( DBG(DBG_PLTestStat_ctor, (std::cout << "All params: " << std::endl)) DBG(DBG_PLTestStat_ctor, (params_->Print("V"))) DBG(DBG_PLTestStat_ctor, (std::cout << "Snapshot: " << std::endl)) DBG(DBG_PLTestStat_ctor, (snap_.Print("V"))) DBG(DBG_PLTestStat_ctor, (std::cout << "POI: " << std::endl)) DBG(DBG_PLTestStat_ctor, (poi_.Print("V"))) - RooLinkedListIter it = poi.iterator(); - for (RooAbsArg *a = (RooAbsArg*) it.Next(); a != 0; a = (RooAbsArg*) it.Next()) { + for (RooAbsArg *a : poi) { // search for this poi in the parameters and in the snapshot RooAbsArg *ps = snap_.find(a->GetName()); RooAbsArg *pp = params_->find(a->GetName()); diff --git a/src/RobustHesse.cc b/src/RobustHesse.cc index 136682e83c5..ad5306b1c76 100644 --- a/src/RobustHesse.cc +++ b/src/RobustHesse.cc @@ -36,10 +36,8 @@ void RobustHesse::initialize() { // Get a list of the floating RooRealVars std::unique_ptr allpars(nll_->getParameters(RooArgSet())); - RooFIter iter = allpars->fwdIterator(); - RooAbsArg *item; std::vector allVars; - while ((item = iter.next())) { + for (RooAbsArg *item : *allpars) { RooRealVar *rrv = dynamic_cast(item); if (rrv && !rrv->isConstant()) { allVars.push_back(Var()); @@ -587,9 +585,7 @@ void RobustHesse::LoadHessianFromFile(std::string const& filename) { void RobustHesse::ProtectArgSet(RooArgSet const& set) { std::vector names; - RooFIter iter = set.fwdIterator(); - RooAbsArg *item; - while ((item = iter.next())) { + for (RooAbsArg *item : set) { RooRealVar *rrv = dynamic_cast(item); if (rrv && !rrv->isConstant()) { names.push_back(rrv->GetName()); diff --git a/src/RooCheapProduct.cc b/src/RooCheapProduct.cc index 4d5a95373ed..1583e076b44 100644 --- a/src/RooCheapProduct.cc +++ b/src/RooCheapProduct.cc @@ -6,8 +6,7 @@ RooCheapProduct::RooCheapProduct(const char *name, const char *title, const RooA terms_("!terms","Set of real product components",this), offset_(1.0) { - RooFIter iter = terms.fwdIterator(); - for (RooAbsArg *a = iter.next(); a != 0; a = iter.next()) { + for (RooAbsArg *a : terms) { RooAbsReal *rar = dynamic_cast(a); if (!rar) { throw std::invalid_argument(std::string("Component ")+a->GetName()+" of RooCheapProduct is a "+a->ClassName()); @@ -32,10 +31,9 @@ RooCheapProduct::RooCheapProduct(const RooCheapProduct& other, const char* name) Double_t RooCheapProduct::evaluate() const { if (vterms_.empty()) { - RooFIter iter = terms_.fwdIterator(); std::vector & vterms = const_cast&>(vterms_); vterms.reserve(terms_.getSize()); - for (RooAbsArg *a = iter.next(); a != 0; a = iter.next()) { + for (RooAbsArg *a : terms_) { vterms.push_back(dynamic_cast(a)); } } diff --git a/src/RooEFTScalingFunction.cc b/src/RooEFTScalingFunction.cc index 699cae17ac3..cd6805e4688 100644 --- a/src/RooEFTScalingFunction.cc +++ b/src/RooEFTScalingFunction.cc @@ -1,4 +1,4 @@ -#include "HiggsAnalysis/CombinedLimit/interface/RooEFTScalingFunction.h" +#include "../interface/RooEFTScalingFunction.h" ClassImp(RooEFTScalingFunction) @@ -10,8 +10,7 @@ RooEFTScalingFunction::RooEFTScalingFunction(const char *name, const char *title { // Add Wilson coefficients to terms_ container - RooFIter iter = terms.fwdIterator(); - for( RooAbsArg *a = iter.next(); a != 0; a = iter.next()) { + for (RooAbsArg *a : terms) { RooAbsReal *rar = dynamic_cast(a); if (!rar) { throw std::invalid_argument(std::string("Term ")+a->GetName()+" of RooEFTScalingFunction is a "+a->ClassName()); diff --git a/src/RooMorphingPdf.cc b/src/RooMorphingPdf.cc index 4c87c9df038..14ba9873667 100644 --- a/src/RooMorphingPdf.cc +++ b/src/RooMorphingPdf.cc @@ -48,11 +48,7 @@ RooMorphingPdf::RooMorphingPdf(const char* name, const char* title, mh_lo_(0.), mh_hi_(0.) { SetAxisInfo(); - TIterator* pdf_iter = pdfs.createIterator(); - RooAbsArg* pdf; - while ((pdf = reinterpret_cast(pdf_iter->Next()))) - pdfs_.add(*pdf); - delete pdf_iter; + pdfs_.add(pdfs); } RooMorphingPdf::RooMorphingPdf(const RooMorphingPdf& other, const char* name) diff --git a/src/RooMultiPdf.cxx b/src/RooMultiPdf.cxx index 7a2847eb4f4..6f86b18580a 100644 --- a/src/RooMultiPdf.cxx +++ b/src/RooMultiPdf.cxx @@ -24,11 +24,9 @@ RooMultiPdf::RooMultiPdf(const char *name, const char *title, RooCategory& _x, c c("_pdfs","The list of pdfs",this), x("_index","the pdf index",this,_x) { - TIterator *pdfIter=_c.createIterator(); int count=0; - RooAbsPdf *fPdf; - while ( (fPdf = (RooAbsPdf*) pdfIter->Next()) ){ + for (RooAbsArg *fPdf : _c) { c.add(*fPdf); // This is done by the user BUT is there a way to do it at construction? _x.defineType(Form("_pdf%d",count),count);//(fPdf->getParameters())->getSize()); @@ -54,10 +52,7 @@ RooMultiPdf::RooMultiPdf(const RooMultiPdf& other, const char* name) : fIndex=other.fIndex; nPdfs=other.nPdfs; - TIterator *pdfIter=(other.c).createIterator(); - - RooAbsPdf *fPdf; - while ( (fPdf = (RooAbsPdf*) pdfIter->Next()) ){ + for (RooAbsArg *fPdf : other.c) { c.add(*fPdf); std::unique_ptr variables(fPdf->getVariables()); std::unique_ptr nonConstVariables(variables->selectByAttrib("Constant", false)); diff --git a/src/RooParametricHist.cxx b/src/RooParametricHist.cxx index 59a825d5392..0efb3453448 100644 --- a/src/RooParametricHist.cxx +++ b/src/RooParametricHist.cxx @@ -17,9 +17,6 @@ #include "RooFit.h" #include "TFile.h" -#include "TIterator.h" - -//using namespace RooFit ; ClassImp(RooParametricHist) @@ -34,11 +31,7 @@ RooParametricHist::RooParametricHist(const char *name, pars("pars","pars",this) //SM_shape("SM_shape","SM_shape",this,_SM_shape), { - TIterator *varIter=_pars.createIterator(); - RooAbsReal *fVar; - while ( (fVar = (RooAbsReal*)varIter->Next()) ){ - pars.add(*fVar); - } + pars.add(_pars); if ( pars.getSize() != _shape.GetNbinsX() ){ std::cerr << " Warning, number of parameters not equal to number of bins in shape histogram! " << std::endl; assert(0); @@ -60,17 +53,8 @@ RooParametricHist::RooParametricHist(const RooParametricHist& other, const char* _hasMorphs=other._hasMorphs; _cval = other._cval; - TIterator *varIter=other.pars.createIterator(); - RooAbsReal *fVar; - while ( (fVar = (RooAbsReal*) varIter->Next()) ){ - pars.add(*fVar); - } - - TIterator *cIter=other._coeffList.createIterator(); - RooAbsReal *cVar; - while ( (cVar = (RooAbsReal*) cIter->Next()) ){ - _coeffList.add(*cVar); - } + pars.add(other.pars); + _coeffList.add(other._coeffList); for(int i=0; i<=N_bins; i++) { bins.push_back(other.bins[i]); @@ -109,11 +93,8 @@ RooArgList & RooParametricHist::getAllBinVars() const { double RooParametricHist::getFullSum() const { double sum=0; - TIterator *varIter=pars.createIterator(); - RooAbsReal *fVar; - int i=0; - while ( (fVar = (RooAbsReal*) varIter->Next()) ){ - double thisVal = fVar->getVal(); + for (int i = 0; i < pars.getSize(); ++i) { + double thisVal = static_cast(pars[i]).getVal(); if (_hasMorphs) thisVal*=evaluateMorphFunction(i); sum+=thisVal; i++; diff --git a/src/RooParametricHist2D.cxx b/src/RooParametricHist2D.cxx index 771c173499b..45434d2ec35 100644 --- a/src/RooParametricHist2D.cxx +++ b/src/RooParametricHist2D.cxx @@ -33,29 +33,13 @@ RooParametricHist2D::RooParametricHist2D( const char *name, pars("pars","pars",this) //SM_shape("SM_shape","SM_shape",this,_SM_shape), { - // std::cout << "Constructing..." << std::endl; - // std::cout << "_pars size... " << _pars.getSize() << std::endl; - // std::cout << "_pars type... " << typeid(_pars.first()).name() << std::endl; - - TIterator *varIter=_pars.createIterator(); - RooAbsReal *fVar; - while ( (fVar = (RooAbsReal*)varIter->Next()) ){ - // std::cout << "fVar type... " << typeid(fVar).name() << std::endl; - // std::cout << "*fVar type... " << typeid(*fVar).name() << std::endl; - - pars.add(*fVar); - } - - // std::cout << "Constructed..." << std::endl; - // std::cout << "pars size... " << pars.getSize() << std::endl; - // std::cout << "pars type... " << typeid(pars.first()).name() << std::endl; + pars.add(_pars); if ( pars.getSize() != _shape.GetNbinsY()*_shape.GetNbinsX() ){ std::cout << " Warning, number of parameters not equal to number of bins in shape histogram! " << std::endl; } initializeBins(_shape); - // std::cout << "Bins initialized" << std::endl; // initializeNorm(); cval = -1; @@ -75,20 +59,7 @@ RooParametricHist2D::RooParametricHist2D( const RooParametricHist2D& other, N_bins_y = other.N_bins_y; //sum = other.sum; - // std::cout << "Clone _pars size... " << other.pars.getSize() << std::endl; - // std::cout << "Clone other.pars.first() type... " << typeid(other.pars.first()).name() << std::endl; - // std::cout << "Clone *other.pars.first() type... " << typeid(*other.pars.first()).name() << std::endl; - // std::cout << "Clone &other.pars.first() type... " << typeid(&other.pars.first()).name() << std::endl; - - - TIterator *varIter=other.pars.createIterator(); - RooAbsReal *fVar; - // std::cout << "Check 1" << std::endl; - while ( (fVar = (RooAbsReal*)varIter->Next()) ){ - // std::cout << fVar->GetName() << ": " << typeid(&fVar).name() << std::endl; - pars.add(*fVar); - } - // std::cout << "Check 2" << std::endl; + pars.add(other.pars); for(int i=0; i<=N_bins_x; ++i) { bins_x.push_back(other.bins_x[i]); @@ -136,13 +107,10 @@ void RooParametricHist2D::initializeBins(const TH2 &shape) const { } double RooParametricHist2D::getFullSum() const { - //std::cout << "Getting full sum" << std::endl; double sum=0; - TIterator *varIter=pars.createIterator(); - RooAbsReal *fVar; - while ( (fVar = (RooAbsReal*)varIter->Next()) ){ - sum+=fVar->getVal(); + for (RooAbsArg *arg : pars) { + sum += static_cast(arg)->getVal(); } return sum; diff --git a/src/RooParametricShapeBinPdf.cc b/src/RooParametricShapeBinPdf.cc index 6b717750695..ff33ed60c6c 100644 --- a/src/RooParametricShapeBinPdf.cc +++ b/src/RooParametricShapeBinPdf.cc @@ -47,11 +47,7 @@ RooParametricShapeBinPdf::RooParametricShapeBinPdf(const char *name, const char xMin(0) { memset(&xArray, 0, sizeof(xArray)); - TIterator *varIter=_pars.createIterator(); - RooAbsReal *fVar; - while ( (fVar = (RooAbsReal*)varIter->Next()) ){ - pars.add(*fVar); - } + pars.add(_pars); setTH1Binning(_shape); RooAbsReal* myintegral; @@ -93,18 +89,8 @@ RooParametricShapeBinPdf::RooParametricShapeBinPdf(const RooParametricShapeBinPd xArray[i] = other.xArray[i]; } - TIterator *varIter=other.pars.createIterator(); - RooAbsReal *fVar; - while ( (fVar = (RooAbsReal*) varIter->Next()) ){ - pars.add(*fVar); - } - - TIterator *intIter=other.myintegrals.createIterator(); - RooAbsReal *fInt; - while ( (fInt = (RooAbsReal*) intIter->Next()) ){ - myintegrals.add(*fInt); - } - + pars.add(other.pars); + myintegrals.add(other.myintegrals); } //--------------------------------------------------------------------------- void RooParametricShapeBinPdf::setTH1Binning(const TH1 &_Hnominal){ diff --git a/src/RooSimultaneousOpt.cc b/src/RooSimultaneousOpt.cc index fd009151ac0..a10c3828a41 100644 --- a/src/RooSimultaneousOpt.cc +++ b/src/RooSimultaneousOpt.cc @@ -31,8 +31,7 @@ RooSimultaneousOpt::addExtraConstraints(const RooAbsCollection &pdfs) _extraConstraints.add(pdfs); } else { // slow - RooLinkedListIter iter = pdfs.iterator(); - for (RooAbsArg *a = (RooAbsArg *) iter.Next(); a != 0; a = (RooAbsArg *) iter.Next()) { + for (RooAbsArg *a : pdfs) { if (!_extraConstraints.contains(*a)) _extraConstraints.add(*a); } } diff --git a/src/RooSplineND.cc b/src/RooSplineND.cc index 56381ba7873..20fa95f2403 100644 --- a/src/RooSplineND.cc +++ b/src/RooSplineND.cc @@ -23,9 +23,8 @@ RooSplineND::RooSplineND(const char *name, const char *title, RooArgList &vars, float *b_map = new float(ndim_); - RooAbsReal *rIt; - TIterator *iter = vars.createIterator(); int it_c=0; - while( (rIt = (RooAbsReal*) iter->Next()) ){ + int it_c=0; + for (RooAbsArg *rIt : vars) { vars_.add(*rIt); std::vectortmpv(M_,0); v_map.insert(std::pair >(it_c,tmpv)); @@ -75,11 +74,7 @@ RooSplineND::RooSplineND(const RooSplineND& other, const char *name) : eps_ = other.eps_; axis_pts_ = other.axis_pts_; - RooAbsReal *rIt; - TIterator *iter = other.vars_.createIterator(); - while( (rIt = (RooAbsReal*) iter->Next()) ){ - vars_.add(*rIt); - } + vars_.add(other.vars_); w_mean = other.w_mean; w_rms = other.w_rms; @@ -113,11 +108,7 @@ RooSplineND::RooSplineND(const char *name, const char *title, const RooListProxy int ndim, int M, double eps, bool rescale, std::vector &w, std::map > &map, std::map > &rmap,double wmean, double wrms) : RooAbsReal(name, title),vars_("vars",this,RooListProxy()) { - RooAbsReal *rIt; - TIterator *iter = vars.createIterator(); - while( (rIt = (RooAbsReal*) iter->Next()) ){ - vars_.add(*rIt); - } + vars_.add(vars); ndim_ = ndim; M_ = M; eps_ = eps; diff --git a/src/SimpleCacheSentry.cc b/src/SimpleCacheSentry.cc index a3dff571d34..31b9627d856 100644 --- a/src/SimpleCacheSentry.cc +++ b/src/SimpleCacheSentry.cc @@ -31,8 +31,7 @@ SimpleCacheSentry::SimpleCacheSentry(const SimpleCacheSentry &other, const char void SimpleCacheSentry::addVars(const RooAbsCollection &vars) { - TIterator *iter = vars.createIterator(); - for (RooAbsArg *a = (RooAbsArg *) iter->Next(); a != 0; a = (RooAbsArg *) iter->Next()) { + for (RooAbsArg* a : vars) { if (_deps.containsInstance(*a)) continue; // RooRealVars can return true to isDerived() if the ranges or binning depend on // other parameters, so always add RooRealVars to the list @@ -44,7 +43,6 @@ void SimpleCacheSentry::addVars(const RooAbsCollection &vars) _deps.add(*a); } } - delete iter; } void SimpleCacheSentry::addFunc(const RooAbsArg &func, const RooArgSet *obs) diff --git a/src/SimpleProdPdf.cc b/src/SimpleProdPdf.cc index 532f9c65f6c..0d2fb1bbd99 100644 --- a/src/SimpleProdPdf.cc +++ b/src/SimpleProdPdf.cc @@ -10,9 +10,7 @@ SimpleProdPdf::SimpleProdPdf() : RooAbsPdf() {} SimpleProdPdf::SimpleProdPdf(const char* name, const char* title, RooArgList const& pdfList) : RooAbsPdf(name, title), _pdfList("!pdfs", "List of PDFs", this) { - RooFIter iter = pdfList.fwdIterator(); - RooAbsArg* arg; - while ((arg = (RooAbsArg*)iter.next())) { + for (RooAbsArg *arg : pdfList) { RooAbsPdf* pdf = dynamic_cast(arg); if (!pdf) { coutW(InputArguments) << "SimpleProdPdf::SimpleProdPdf(" << GetName() << ") list arg " @@ -27,10 +25,8 @@ SimpleProdPdf::SimpleProdPdf(const char* name, const char* title, RooArgList con SimpleProdPdf::SimpleProdPdf(const char* name, const char* title, RooArgList& pdfList, std::vector const& pdfSettings) : RooAbsPdf(name, title), _pdfList("!pdfs", "List of PDFs", this) { - RooFIter iter = pdfList.fwdIterator(); - RooAbsArg* arg; int iSetting = -1; - while ((arg = (RooAbsArg*)iter.next())) { + for (RooAbsArg *arg : pdfList) { ++iSetting; RooAbsPdf* pdf = dynamic_cast(arg); if (!pdf) { @@ -130,10 +126,8 @@ void SimpleProdPdf::printMetaArgs(std::ostream& os) const std::list* SimpleProdPdf::binBoundaries(RooAbsRealLValue& obs, Double_t xlo, Double_t xhi) const { - RooAbsPdf* pdf; - RooFIter pdfIter = _pdfList.fwdIterator(); - while ((pdf = (RooAbsPdf*)pdfIter.next())) { - std::list* hint = pdf->binBoundaries(obs, xlo, xhi); + for (RooAbsArg *pdf : _pdfList) { + std::list* hint = static_cast(pdf)->binBoundaries(obs, xlo, xhi); if (hint) { return hint; } diff --git a/src/SimplerLikelihoodRatioTestStatExt.cc b/src/SimplerLikelihoodRatioTestStatExt.cc index f62e441c72e..8e38d0d4379 100644 --- a/src/SimplerLikelihoodRatioTestStatExt.cc +++ b/src/SimplerLikelihoodRatioTestStatExt.cc @@ -56,11 +56,10 @@ SimplerLikelihoodRatioTestStatOpt::Evaluate(RooAbsData& data, RooArgSet& nullPOI if (paramsAlt_.get() == 0) paramsAlt_.reset(pdfAlt_->getParameters(data)); // if the dataset is not empty, redirect pdf nodes to the dataset - std::unique_ptr iterDepObs(pdfDepObs_.createIterator()); bool nonEmpty = data.numEntries() > 0; if (nonEmpty) { const RooArgSet *entry = data.get(0); - for (RooAbsArg *a = (RooAbsArg *) iterDepObs->Next(); a != 0; a = (RooAbsArg *) iterDepObs->Next()) { + for (RooAbsArg *a : pdfDepObs_) { a->redirectServers(*entry); } } @@ -76,8 +75,7 @@ SimplerLikelihoodRatioTestStatOpt::Evaluate(RooAbsData& data, RooArgSet& nullPOI // put back links in pdf nodes, otherwise if the dataset goes out of scope they have dangling pointers if (nonEmpty) { - iterDepObs->Reset(); - for (RooAbsArg *a = (RooAbsArg *) iterDepObs->Next(); a != 0; a = (RooAbsArg *) iterDepObs->Next()) { + for (RooAbsArg *a : pdfDepObs_) { a->redirectServers(*obs_); } } diff --git a/src/TestProposal.cc b/src/TestProposal.cc index f6df0e363b3..67b3f136825 100644 --- a/src/TestProposal.cc +++ b/src/TestProposal.cc @@ -3,7 +3,6 @@ #include #include #include -#include #include #include @@ -31,11 +30,10 @@ TestProposal::TestProposal(double divisor, const RooArgList &alwaysStepMe) : void TestProposal::Propose(RooArgSet& xPrime, RooArgSet& x ) { RooStats::SetParameters(&x, &xPrime); - RooLinkedListIter it(xPrime.iterator()); - RooRealVar* var; int n = xPrime.getSize(), j = floor(RooRandom::uniform()*n); const RooRealVar *indicatorPrime = discreteModelIndicator_ ? (RooRealVar*)xPrime.find(discreteModelIndicator_->GetName()) : 0; - for (int i = 0; (var = (RooRealVar*)it.Next()) != NULL; ++i) { + for (int i = 0; i < xPrime.getSize(); ++i) { + RooRealVar* var = static_cast(xPrime[i]); if (i == j) { if (alwaysStepMe_.contains(*var)) break; // don't step twice if (discreteModelIndicator_ != 0) { @@ -55,8 +53,7 @@ void TestProposal::Propose(RooArgSet& xPrime, RooArgSet& x ) break; } } - it = alwaysStepMe_.iterator(); - for (RooRealVar *poi = (RooRealVar*)it.Next(); poi != NULL; poi = (RooRealVar*)it.Next()) { + for (RooAbsArg *poi : alwaysStepMe_) { RooRealVar *var = (RooRealVar*) xPrime.find(poi->GetName()); if (var == 0) { std::cout << "ERROR: missing POI " << poi->GetName() << " in xPrime" << std::endl; diff --git a/src/ToyMCSamplerOpt.cc b/src/ToyMCSamplerOpt.cc index bbe2e8803c9..2f3c75c8763 100644 --- a/src/ToyMCSamplerOpt.cc +++ b/src/ToyMCSamplerOpt.cc @@ -145,8 +145,7 @@ toymcoptutils::SinglePdfGenInfo::generateAsimov(RooRealVar *&weightVar, double w if (boostAPA>0) { // trigger adaptive PA (setting boostAPA=1 will just use internal logic) if ( verbose > 0 ) CombineLogger::instance().log("ToyMCSamplerOpt.cc",__LINE__, "Using internal logic for binned/unbinned Asimov dataset generation",__func__); int nbins = 1; - RooLinkedListIter iter = observables_.iterator(); - for (RooAbsArg *a = (RooAbsArg *) iter.Next(); a != 0; a = (RooAbsArg *) iter.Next()) { + for (RooAbsArg *a : observables_) { RooRealVar *rrv = dynamic_cast(a); int mybins = rrv->getBins(); nbins *= (mybins ? mybins : 100); @@ -283,8 +282,7 @@ toymcoptutils::SinglePdfGenInfo::generateCountingAsimov() void toymcoptutils::SinglePdfGenInfo::setToExpected(RooProdPdf &prod, RooArgSet &obs) { - std::unique_ptr iter(prod.pdfList().createIterator()); - for (RooAbsArg *a = (RooAbsArg *) iter->Next(); a != 0; a = (RooAbsArg *) iter->Next()) { + for (RooAbsArg *a : prod.pdfList()) { if (!a->dependsOn(obs)) continue; RooPoisson *pois = 0; if ((pois = dynamic_cast(a)) != 0) { @@ -302,8 +300,7 @@ toymcoptutils::SinglePdfGenInfo::setToExpected(RooPoisson &pois, RooArgSet &obs) { RooRealVar *myobs = 0; RooAbsReal *myexp = 0; - std::unique_ptr iter(pois.serverIterator()); - for (RooAbsArg *a = (RooAbsArg *) iter->Next(); a != 0; a = (RooAbsArg *) iter->Next()) { + for (RooAbsArg *a : pois.servers()) { if (obs.contains(*a)) { assert(myobs == 0 && "SinglePdfGenInfo::setToExpected(RooPoisson): Two observables??"); myobs = dynamic_cast(a); diff --git a/src/VBFHZZ4L_RooSpinZeroPdf.cc b/src/VBFHZZ4L_RooSpinZeroPdf.cc index 156d658057d..d1846a5f8e8 100755 --- a/src/VBFHZZ4L_RooSpinZeroPdf.cc +++ b/src/VBFHZZ4L_RooSpinZeroPdf.cc @@ -34,23 +34,19 @@ ClassImp(VBFHZZ4L_RooSpinZeroPdf) ai("ai","ai",this,_ai), _coefList("coefList","List of funcficients",this) { - TIterator* coefIter = inCoefList.createIterator() ; - RooAbsArg* func; - while((func = (RooAbsArg*)coefIter->Next())) { + for (RooAbsArg *func : inCoefList) { if (!dynamic_cast(func)) { coutE(InputArguments) << "ERROR: :VBFHZZ4L_RooSpinZeroPdf(" << GetName() << ") funcficient " << func->GetName() << " is not of type RooAbsReal" << std::endl; assert(0); } _coefList.add(*func) ; } - delete coefIter; Integral_T1 = dynamic_cast(_coefList.at(0))-> analyticalIntegral(1000); Integral_T2 = dynamic_cast(_coefList.at(1))-> analyticalIntegral(1000); Integral_T3 = dynamic_cast(_coefList.at(2))-> analyticalIntegral(1000); Integral_T4 = dynamic_cast(_coefList.at(3))-> analyticalIntegral(1000); Integral_T5 = dynamic_cast(_coefList.at(4))-> analyticalIntegral(1000); -// _coefIter = _coefList.createIterator() ; } diff --git a/src/VBFHZZ4L_RooSpinZeroPdf_fast.cc b/src/VBFHZZ4L_RooSpinZeroPdf_fast.cc index 1688a1e5884..ca8b8c02333 100755 --- a/src/VBFHZZ4L_RooSpinZeroPdf_fast.cc +++ b/src/VBFHZZ4L_RooSpinZeroPdf_fast.cc @@ -31,27 +31,21 @@ VBFHZZ4L_RooSpinZeroPdf_fast::VBFHZZ4L_RooSpinZeroPdf_fast( obsList("obsList", "List of pdf observables", this), coefList("coefList", "List of pdf components", this) { - TIterator* coefIter = inObsList.createIterator(); - RooAbsArg* coef; - while ((coef = (RooAbsArg*)coefIter->Next())){ + for (RooAbsArg *coef : inObsList) { if (!dynamic_cast(coef)){ coutE(InputArguments) << "VBFHZZ4L_RooSpinZeroPdf_fast(" << GetName() << ") observable " << coef->GetName() << " is not of type RooAbsReal" << endl; assert(0); } obsList.add(*coef); } - delete coefIter; - coefIter = inCoefList.createIterator(); - coef=0; - while ((coef = (RooAbsArg*)coefIter->Next())){ + for (RooAbsArg *coef : inCoefList) { if (dynamic_cast(coef)==0 && dynamic_cast(coef)==0){ coutE(InputArguments) << "VBFHZZ4L_RooSpinZeroPdf_fast(" << GetName() << ") component " << coef->GetName() << " is not of type FastTemplateFunc_f" << endl; assert(0); } coefList.add(*coef); } - delete coefIter; } diff --git a/src/VVHZZ4L_RooSpinZeroPdf_1D_fast.cc b/src/VVHZZ4L_RooSpinZeroPdf_1D_fast.cc index 2118760435b..01a12dbd42a 100755 --- a/src/VVHZZ4L_RooSpinZeroPdf_1D_fast.cc +++ b/src/VVHZZ4L_RooSpinZeroPdf_1D_fast.cc @@ -28,27 +28,21 @@ VVHZZ4L_RooSpinZeroPdf_1D_fast::VVHZZ4L_RooSpinZeroPdf_1D_fast( obsList("obsList", "List of pdf observables", this), coefList("coefList", "List of pdf components", this) { - TIterator* coefIter = inObsList.createIterator(); - RooAbsArg* coef; - while ((coef = (RooAbsArg*)coefIter->Next())){ + for (RooAbsArg *coef : inObsList) { if (!dynamic_cast(coef)){ coutE(InputArguments) << "VVHZZ4L_RooSpinZeroPdf_1D_fast(" << GetName() << ") observable " << coef->GetName() << " is not of type RooAbsReal" << endl; assert(0); } obsList.add(*coef); } - delete coefIter; - coefIter = inCoefList.createIterator(); - coef=0; - while ((coef = (RooAbsArg*)coefIter->Next())){ + for (RooAbsArg *coef : inCoefList) { if (dynamic_cast(coef)==0 && dynamic_cast(coef)==0){ coutE(InputArguments) << "VVHZZ4L_RooSpinZeroPdf_1D_fast(" << GetName() << ") component " << coef->GetName() << " is not of type FastTemplateFunc_f" << endl; assert(0); } coefList.add(*coef); } - delete coefIter; } diff --git a/src/VerticalInterpHistPdf.cc b/src/VerticalInterpHistPdf.cc index cade9329b25..fca0b99a668 100644 --- a/src/VerticalInterpHistPdf.cc +++ b/src/VerticalInterpHistPdf.cc @@ -6,7 +6,6 @@ #include "RooFit.h" #include "Riostream.h" -#include "TIterator.h" #include "RooRealVar.h" #include "RooMsgService.h" #include "RooAbsData.h" @@ -103,8 +102,6 @@ VerticalInterpHistPdf::VerticalInterpHistPdf() : _cacheSingleGood(0) { // Default constructor - _funcIter = _funcList.createIterator() ; - _coefIter = _coefList.createIterator() ; } @@ -127,9 +124,7 @@ VerticalInterpHistPdf::VerticalInterpHistPdf(const char *name, const char *title assert(0); } - TIterator* funcIter = inFuncList.createIterator() ; - RooAbsArg* func; - while((func = (RooAbsArg*)funcIter->Next())) { + for (RooAbsArg *func : inFuncList) { RooAbsPdf *pdf = dynamic_cast(func); if (!pdf) { coutE(InputArguments) << "ERROR: VerticalInterpHistPdf::VerticalInterpHistPdf(" << GetName() << ") function " << func->GetName() << " is not of type RooAbsPdf" << std::endl; @@ -143,22 +138,14 @@ VerticalInterpHistPdf::VerticalInterpHistPdf(const char *name, const char *title delete params; _funcList.add(*func) ; } - delete funcIter; - TIterator* coefIter = inCoefList.createIterator() ; - RooAbsArg* coef; - while((coef = (RooAbsArg*)coefIter->Next())) { + for (RooAbsArg *coef : inCoefList) { if (!dynamic_cast(coef)) { coutE(InputArguments) << "ERROR: VerticalInterpHistPdf::VerticalInterpHistPdf(" << GetName() << ") coefficient " << coef->GetName() << " is not of type RooAbsReal" << std::endl; assert(0); } _coefList.add(*coef) ; } - delete coefIter; - - _funcIter = _funcList.createIterator() ; - _coefIter = _coefList.createIterator() ; - } @@ -177,9 +164,6 @@ VerticalInterpHistPdf::VerticalInterpHistPdf(const VerticalInterpHistPdf& other, _cacheSingleGood(0) { // Copy constructor - - _funcIter = _funcList.createIterator() ; - _coefIter = _coefList.createIterator() ; } @@ -188,8 +172,6 @@ VerticalInterpHistPdf::VerticalInterpHistPdf(const VerticalInterpHistPdf& other, VerticalInterpHistPdf::~VerticalInterpHistPdf() { // Destructor - delete _funcIter ; - delete _coefIter ; if (_cacheTotal) { delete _cacheTotal; for (int i = 0; i < _funcList.getSize(); ++i) delete _cacheSingle[i]; @@ -254,11 +236,11 @@ void VerticalInterpHistPdf::syncTotal() const { } for (int b = 1, nb = _cacheTotal->GetNbinsX(); b <= nb; ++b) { double val = _cacheSingle[0]->GetBinContent(b); - _coefIter->Reset(); - for (int i = 0; i < ndim; ++i) { + int i = 0; + for (RooAbsArg *coef : _coefList) { double dhi = _cacheSingle[2*i+1]->GetBinContent(b); double dlo = _cacheSingle[2*i+2]->GetBinContent(b); - double x = (dynamic_cast(_coefIter->Next()))->getVal(); + double x = dynamic_cast(coef)->getVal(); double alpha = x * 0.5 * ((dhi-dlo) + (dhi+dlo)*smoothStepFunc(x)); // alpha(0) = 0 // alpha(+1) = dhi @@ -271,6 +253,7 @@ void VerticalInterpHistPdf::syncTotal() const { } else { val += alpha; } + ++i; } if (val <= 0) val = 1e-9; _cacheTotal->SetBinContent(b, val); @@ -306,8 +289,6 @@ ClassImp(FastVerticalInterpHistPdf3D) FastVerticalInterpHistPdfBase::FastVerticalInterpHistPdfBase() { // Default constructor - _funcIter = _funcList.createIterator() ; - _coefIter = _coefList.createIterator() ; } @@ -329,9 +310,7 @@ FastVerticalInterpHistPdfBase::FastVerticalInterpHistPdfBase(const char *name, c assert(0); } - TIterator* funcIter = inFuncList.createIterator() ; - RooAbsArg* func; - while((func = (RooAbsArg*)funcIter->Next())) { + for (RooAbsArg *func : inFuncList) { RooAbsPdf *pdf = dynamic_cast(func); if (!pdf) { coutE(InputArguments) << "ERROR: VerticalInterpHistPdf::VerticalInterpHistPdf(" << GetName() << ") function " << func->GetName() << " is not of type RooAbsPdf" << std::endl; @@ -345,22 +324,14 @@ FastVerticalInterpHistPdfBase::FastVerticalInterpHistPdfBase(const char *name, c delete params; _funcList.add(*func) ; } - delete funcIter; - TIterator* coefIter = inCoefList.createIterator() ; - RooAbsArg* coef; - while((coef = (RooAbsArg*)coefIter->Next())) { + for (RooAbsArg *coef : inCoefList) { if (!dynamic_cast(coef)) { coutE(InputArguments) << "ERROR: VerticalInterpHistPdf::VerticalInterpHistPdf(" << GetName() << ") coefficient " << coef->GetName() << " is not of type RooAbsReal" << std::endl; assert(0); } _coefList.add(*coef) ; } - delete coefIter; - - _funcIter = _funcList.createIterator() ; - _coefIter = _coefList.createIterator() ; - } //_____________________________________________________________________________ @@ -374,20 +345,13 @@ FastVerticalInterpHistPdfBase::FastVerticalInterpHistPdfBase(const FastVerticalI _morphs(other._morphs), _morphParams(other._morphParams) { // Copy constructor - _funcIter = _funcList.createIterator() ; - _coefIter = _coefList.createIterator() ; _sentry.addVars(_coefList); _sentry.setValueDirty(); } //_____________________________________________________________________________ -FastVerticalInterpHistPdfBase::~FastVerticalInterpHistPdfBase() -{ - // Destructor - delete _funcIter ; - delete _coefIter ; -} +FastVerticalInterpHistPdfBase::~FastVerticalInterpHistPdfBase() = default; //_____________________________________________________________________________ @@ -627,12 +591,13 @@ void FastVerticalInterpHistPdf::setupCaches() const { _morphParams.resize(ndim); syncNominal(); //printf("Nominal template has been set up: \n"); _cacheNominal.Dump(); - _coefIter->Reset(); - for (int i = 0; i < ndim; ++i) { - _morphParams[i] = dynamic_cast(_coefIter->Next()); + int i = 0; + for (RooAbsArg *a : _coefList) { + _morphParams[i] = dynamic_cast(a); _morphs[i].sum.Resize(_cacheNominal.size()); _morphs[i].diff.Resize(_cacheNominal.size()); syncComponents(i); + ++i; } _cache = FastHisto(_cacheNominal); @@ -648,12 +613,13 @@ void FastVerticalInterpHistPdf2D::setupCaches() const { _morphParams.resize(ndim); syncNominal(); //printf("Nominal template has been set up: \n"); _cacheNominal.Dump(); - _coefIter->Reset(); - for (int i = 0; i < ndim; ++i) { - _morphParams[i] = dynamic_cast(_coefIter->Next()); + int i = 0; + for (RooAbsArg *a : _coefList) { + _morphParams[i] = dynamic_cast(a); _morphs[i].sum.Resize(_cacheNominal.size()); _morphs[i].diff.Resize(_cacheNominal.size()); syncComponents(i); + ++i; } _cache = FastHisto2D(_cacheNominal); @@ -668,12 +634,13 @@ void FastVerticalInterpHistPdf3D::setupCaches() const { _morphParams.resize(ndim); syncNominal(); //printf("Nominal template has been set up: \n"); _cacheNominal.Dump(); - _coefIter->Reset(); - for (int i = 0; i < ndim; ++i) { - _morphParams[i] = dynamic_cast(_coefIter->Next()); + int i = 0; + for (RooAbsArg *a : _coefList) { + _morphParams[i] = dynamic_cast(a); _morphs[i].sum.Resize(_cacheNominal.size()); _morphs[i].diff.Resize(_cacheNominal.size()); syncComponents(i); + ++i; } _cache = FastHisto3D(_cacheNominal); @@ -786,21 +753,17 @@ FastVerticalInterpHistPdf2Base::FastVerticalInterpHistPdf2Base(const char *name, assert(0); } if (pdf) { - RooArgSet *params = pdf->getParameters(obs); + std::unique_ptr params{pdf->getParameters(obs)}; if (params->getSize() > 0) { coutE(InputArguments) << "ERROR: VerticalInterpHistPdf::VerticalInterpHistPdf(" << GetName() << ") pdf " << func->GetName() << " (" << func->ClassName()<<") has some parameters." << std::endl; obs.Print(""); params->Print(""); assert(0); } - delete params; } } - TIterator* coefIter = inCoefList.createIterator() ; - RooAbsArg* coef; - while((coef = (RooAbsArg*)coefIter->Next())) _coefList.add(*coef) ; - delete coefIter; + _coefList.add(inCoefList); } //_____________________________________________________________________________ @@ -851,9 +814,7 @@ FastVerticalInterpHistPdf2Base::initBase() const { if (_initBase) return; - TIterator* coefIter = _coefList.createIterator() ; - RooAbsArg* coef; - while((coef = (RooAbsArg*)coefIter->Next())) { + for (RooAbsArg *coef : _coefList) { const RooAbsReal *rrv = dynamic_cast(coef); if (!rrv) { coutE(InputArguments) << "ERROR: VerticalInterpHistPdf::VerticalInterpHistPdf(" << GetName() << ") coefficient " << coef->GetName() << " is not of type RooAbsReal" << std::endl; @@ -861,8 +822,6 @@ FastVerticalInterpHistPdf2Base::initBase() const } _morphParams.push_back(rrv); } - delete coefIter; - _sentry.addVars(_coefList); _sentry.setValueDirty(); diff --git a/src/VerticalInterpPdf.cc b/src/VerticalInterpPdf.cc index aeaa3572bea..b68ee45bdab 100644 --- a/src/VerticalInterpPdf.cc +++ b/src/VerticalInterpPdf.cc @@ -4,7 +4,6 @@ #include "RooFit.h" #include "Riostream.h" -#include "TIterator.h" #include "TList.h" #include "RooRealProxy.h" #include "RooPlot.h" @@ -25,8 +24,6 @@ VerticalInterpPdf::VerticalInterpPdf() { // Default constructor // coverity[UNINIT_CTOR] - _funcIter = _funcList.createIterator() ; - _coefIter = _coefList.createIterator() ; _quadraticRegion = 0; _pdfFloorVal = 1e-15; _integralFloorVal = 1e-10; @@ -51,30 +48,21 @@ VerticalInterpPdf::VerticalInterpPdf(const char *name, const char *title, const assert(0); } - TIterator* funcIter = inFuncList.createIterator() ; - RooAbsArg* func; - while((func = (RooAbsArg*)funcIter->Next())) { + for (RooAbsArg *func : inFuncList) { if (!dynamic_cast(func)) { coutE(InputArguments) << "ERROR: VerticalInterpPdf::VerticalInterpPdf(" << GetName() << ") function " << func->GetName() << " is not of type RooAbsReal" << std::endl; assert(0); } _funcList.add(*func) ; } - delete funcIter; - TIterator* coefIter = inCoefList.createIterator() ; - RooAbsArg* coef; - while((coef = (RooAbsArg*)coefIter->Next())) { + for (RooAbsArg *coef : inCoefList) { if (!dynamic_cast(coef)) { coutE(InputArguments) << "ERROR: VerticalInterpPdf::VerticalInterpPdf(" << GetName() << ") coefficient " << coef->GetName() << " is not of type RooAbsReal" << std::endl; assert(0); } _coefList.add(*coef) ; } - delete coefIter; - - _funcIter = _funcList.createIterator() ; - _coefIter = _coefList.createIterator() ; if (_quadraticAlgo == -1) { // multiplicative morphing: no way to do analytical integrals. @@ -100,50 +88,37 @@ VerticalInterpPdf::VerticalInterpPdf(const VerticalInterpPdf& other, const char* _integralFloorVal(other._integralFloorVal) { // Copy constructor - - _funcIter = _funcList.createIterator() ; - _coefIter = _coefList.createIterator() ; } //_____________________________________________________________________________ -VerticalInterpPdf::~VerticalInterpPdf() -{ - // Destructor - delete _funcIter ; - delete _coefIter ; -} +VerticalInterpPdf::~VerticalInterpPdf() = default; //_____________________________________________________________________________ Double_t VerticalInterpPdf::evaluate() const { - // Calculate the current value - Double_t value(0) ; - // Do running sum of coef/func pairs, calculate lastCoef. - _funcIter->Reset() ; - _coefIter->Reset() ; - RooAbsReal* coef ; - RooAbsReal* func = (RooAbsReal*)_funcIter->Next(); + RooAbsReal* func = &(RooAbsReal&)_funcList[0]; + // Calculate the current value Double_t central = func->getVal(); - value = central; + Double_t value = central; if (_quadraticAlgo >= 0) { // additive interpolation - while((coef=(RooAbsReal*)_coefIter->Next())) { - Double_t coefVal = coef->getVal() ; - RooAbsReal* funcUp = (RooAbsReal*)_funcIter->Next() ; - RooAbsReal* funcDn = (RooAbsReal*)_funcIter->Next() ; + for (int iCoef = 0; iCoef < _coefList.getSize(); ++iCoef) { + Double_t coefVal = static_cast(_coefList[iCoef]).getVal() ; + RooAbsReal* funcUp = &(RooAbsReal&)_funcList[2 * iCoef + 1]; + RooAbsReal* funcDn = &(RooAbsReal&)_funcList[2 * iCoef + 2]; value += interpolate(coefVal, central, funcUp, funcDn); } } else { // multiplicative interpolation - while((coef=(RooAbsReal*)_coefIter->Next())) { - Double_t coefVal = coef->getVal() ; - RooAbsReal* funcUp = (RooAbsReal*)_funcIter->Next() ; - RooAbsReal* funcDn = (RooAbsReal*)_funcIter->Next() ; + for (int iCoef = 0; iCoef < _coefList.getSize(); ++iCoef) { + Double_t coefVal = static_cast(_coefList[iCoef]).getVal() ; + RooAbsReal* funcUp = &(RooAbsReal&)_funcList[2 * iCoef + 1]; + RooAbsReal* funcDn = &(RooAbsReal&)_funcList[2 * iCoef + 2]; value *= interpolate(coefVal, central, funcUp, funcDn); } } @@ -166,9 +141,7 @@ Bool_t VerticalInterpPdf::checkObservables(const RooArgSet* nset) const if (_quadraticAlgo == -1) return false; // multiplicative morphing. we don't care. - _coefIter->Reset() ; - RooAbsReal* coef ; - while((coef=(RooAbsReal*)_coefIter->Next())) { + for (RooAbsArg *coef : _coefList) { if (coef->dependsOn(*nset)) { coutE(InputArguments) << "RooRealPdf::checkObservables(" << GetName() << "): ERROR coefficient " << coef->GetName() << " depends on one or more of the following observables" ; nset->Print("1") ; @@ -176,12 +149,10 @@ Bool_t VerticalInterpPdf::checkObservables(const RooArgSet* nset) const } } - _funcIter->Reset() ; - _coefIter->Reset() ; - RooAbsReal* func ; - unsigned int ifunc = 0; - while((func = (RooAbsReal*)_funcIter->Next())) { - if (ifunc % 2 == 0) coef = (RooAbsReal*)_coefIter->Next(); + RooAbsReal * coef = nullptr; + for (int ifunc = 0; ifunc < _funcList.getSize(); ++ifunc) { + RooAbsReal* func = &(RooAbsReal&)_funcList[ifunc]; + if (ifunc % 2 == 0) coef = &(RooAbsReal&)_coefList[ifunc]; if (coef && func->observableOverlaps(nset,*coef)) { coutE(InputArguments) << "VerticalInterpPdf::checkObservables(" << GetName() << "): ERROR: coefficient " << coef->GetName() << " and FUNC " << func->GetName() << " have one or more observables in common" << std::endl; @@ -222,9 +193,8 @@ Int_t VerticalInterpPdf::getAnalyticalIntegralWN(RooArgSet& allVars, RooArgSet& cache = new CacheElem ; // Make list of function projection and normalization integrals - _funcIter->Reset() ; - RooAbsReal *func ; - while((func=(RooAbsReal*)_funcIter->Next())) { + for (RooAbsArg *funcAbsArg : _funcList) { + auto func = static_cast(funcAbsArg); RooAbsReal* funcInt = nullptr; if (isConditionalProdPdf(func)) { RooProdPdf *prod = static_cast(func); @@ -310,44 +280,33 @@ Double_t VerticalInterpPdf::analyticalIntegralWN(Int_t code, const RooArgSet* no // Handle trivial passthrough scenario if (code==0) return getVal(normSet2) ; - RooAbsReal *coef; Double_t value = 0; // WVE needs adaptation for rangeName feature CacheElem* cache = (CacheElem*) _normIntMgr.getObjByIndex(code-1) ; - TIterator* funcIntIter = cache->_funcIntList.createIterator() ; - RooAbsReal *funcInt = (RooAbsReal *) funcIntIter->Next(); - Double_t central = funcInt->getVal(); + Double_t central = static_cast(_funcList[0]).getVal(); value += central; - _coefIter->Reset() ; - while((coef=(RooAbsReal*)_coefIter->Next())) { - Double_t coefVal = coef->getVal(normSet2) ; - RooAbsReal * funcIntUp = (RooAbsReal*)funcIntIter->Next() ; - RooAbsReal * funcIntDn = (RooAbsReal*)funcIntIter->Next() ; + for (int iCoef = 0; iCoef < _coefList.getSize(); ++iCoef) { + Double_t coefVal = static_cast(_coefList[iCoef]).getVal(normSet2) ; + RooAbsReal * funcIntUp = &(RooAbsReal&)_funcList[2 * iCoef + 1]; + RooAbsReal * funcIntDn = &(RooAbsReal&)_funcList[2 * iCoef + 2]; value += interpolate(coefVal, central, funcIntUp, funcIntDn); } - delete funcIntIter ; - Double_t normVal(1) ; if (normSet2) { - TIterator* funcNormIter = cache->_funcNormList.createIterator() ; - - RooAbsReal* funcNorm = (RooAbsReal*) funcNormIter->Next(); - central = funcNorm->getVal(normSet2) ; + RooArgList& fnl = cache->_funcNormList; + central = static_cast(fnl[0]).getVal(normSet2) ; normVal = central; - _coefIter->Reset() ; - while((coef=(RooAbsReal*)_coefIter->Next())) { - RooAbsReal *funcNormUp = (RooAbsReal*)funcNormIter->Next() ; - RooAbsReal *funcNormDn = (RooAbsReal*)funcNormIter->Next() ; - Double_t coefVal = coef->getVal(normSet2) ; + for (int iCoef = 0; iCoef < _coefList.getSize(); ++iCoef) { + RooAbsReal *funcNormUp = &(RooAbsReal&)fnl[2 * iCoef + 1]; + RooAbsReal *funcNormDn = &(RooAbsReal&)fnl[2 * iCoef + 2]; + Double_t coefVal = static_cast(_coefList[iCoef]).getVal(normSet2) ; normVal += interpolate(coefVal, central, funcNormUp, funcNormDn); } - - delete funcNormIter ; } Double_t result = 0; diff --git a/src/utils.cc b/src/utils.cc index ad56448f1d5..7b6ecc61e47 100644 --- a/src/utils.cc +++ b/src/utils.cc @@ -13,7 +13,6 @@ #include #include -#include #include #include @@ -57,11 +56,7 @@ namespace { RooProduct(other) {} RooArgList realTerms() const { RooArgList ret; - RooFIter compRIter = _compRSet.fwdIterator() ; - RooAbsReal* rcomp; - while((rcomp=(RooAbsReal*)compRIter.next())) { - ret.add(*rcomp); - } + ret.add(_compRSet); return ret; } }; @@ -76,15 +71,13 @@ RooArgList utils::factors(const RooProduct &prod) { void utils::printRDH(RooAbsData *data) { std::vector varnames, catnames; const RooArgSet *b0 = data->get(); - TIterator *iter = b0->createIterator(); - for (RooAbsArg *a = 0; (a = (RooAbsArg *)iter->Next()) != 0; ) { + for (RooAbsArg *a : *b0) { if (a->InheritsFrom("RooRealVar")) { varnames.push_back(a->GetName()); } else if (a->InheritsFrom("RooCategory")) { catnames.push_back(a->GetName()); } } - delete iter; size_t nv = varnames.size(), nc = catnames.size(); printf(" bin "); for (size_t j = 0; j < nv; ++j) { printf("%16.16s ", varnames[j].c_str()); } @@ -167,9 +160,8 @@ RooAbsPdf *utils::factorizePdf(const RooArgSet &observables, RooAbsPdf &pdf, Roo } if (id == typeid(RooSimultaneousOpt)) { RooSimultaneousOpt &o = dynamic_cast(pdf); - RooLinkedListIter iter = o.extraConstraints().iterator(); if (o.extraConstraints().getSize() > 0) needNew = true; - for (RooAbsArg *a = (RooAbsArg *) iter.Next(); a != 0; a = (RooAbsArg *) iter.Next()) { + for (RooAbsArg *a : o.extraConstraints()) { if (!constraints.contains(*a) && (!a->getAttribute("ignoreConstraint")) ) constraints.add(*a); } } @@ -215,8 +207,7 @@ void utils::factorizePdf(const RooArgSet &observables, RooAbsPdf &pdf, RooArgLis } else if (id == typeid(RooSimultaneous) || id == typeid(RooSimultaneousOpt)) { if (id == typeid(RooSimultaneousOpt)) { RooSimultaneousOpt &o = dynamic_cast(pdf); - RooLinkedListIter iter = o.extraConstraints().iterator(); - for (RooAbsArg *a = (RooAbsArg *) iter.Next(); a != 0; a = (RooAbsArg *) iter.Next()) { + for (RooAbsArg *a : o.extraConstraints()) { if (!constraints.contains(*a) && (!a->getAttribute("ignoreConstraint"))) constraints.add(*a); } } @@ -251,10 +242,9 @@ void utils::factorizeFunc(const RooArgSet &observables, RooAbsReal &func, RooArg RooArgList components(prod->realComponents()); #endif //std::cout << "Function " << func.GetName() << " is a RooProduct with " << components.getSize() << " components." << std::endl; - std::unique_ptr iter(components.createIterator()); - for (RooAbsReal *funci = (RooAbsReal *) iter->Next(); funci != 0; funci = (RooAbsReal *) iter->Next()) { + for (RooAbsArg * funci : components) { //std::cout << " component " << funci->GetName() << " of type " << funci->ClassName() << "(dep obs? " << funci->dependsOn(observables) << ")" << std::endl; - factorizeFunc(observables, *funci, obsTerms, constraints, true); + factorizeFunc(observables, static_cast(*funci), obsTerms, constraints, true); } } else if (func.dependsOn(observables)) { if (!obsTerms.contains(func) || keepDuplicate) obsTerms.add(func); @@ -303,8 +293,7 @@ RooAbsReal *utils::fullCloneFunc(const RooAbsReal *pdf, const RooArgSet &obs, Ro RooArgSet tmp("RealBranchNodeList"), toClone; pdf->branchNodeServerList(&tmp); unsigned int nitems = tmp.getSize(); - RooFIter iter = tmp.fwdIterator(); - for (RooAbsArg *a = iter.next(); a != 0; a = iter.next()) { + for (RooAbsArg *a : tmp) { if (a == pdf) toClone.add(*a); else if (a->dependsOn(obs)) toClone.add(*a); } @@ -319,12 +308,9 @@ RooAbsReal *utils::fullCloneFunc(const RooAbsReal *pdf, const RooArgSet &obs, Ro void utils::getClients(const RooAbsCollection &values, const RooAbsCollection &allObjects, RooAbsCollection &clients) { - std::unique_ptr iterAll(allObjects.createIterator()); - std::unique_ptr iterVal(values.createIterator()); - for (RooAbsArg *v = (RooAbsArg *) iterVal->Next(); v != 0; v = (RooAbsArg *) iterVal->Next()) { + for (RooAbsArg *v : values) { if (typeid(*v) != typeid(RooRealVar) && typeid(*v) != typeid(RooCategory)) continue; - std::unique_ptr clientIter(v->clientIterator()); - for (RooAbsArg *a = (RooAbsArg *) clientIter->Next(); a != 0; a = (RooAbsArg *) clientIter->Next()) { + for (RooAbsArg *a : v->clients()) { if (allObjects.containsInstance(*a) && !clients.containsInstance(*a)) clients.add(*a); } } @@ -332,8 +318,7 @@ void utils::getClients(const RooAbsCollection &values, const RooAbsCollection &a bool utils::setAllConstant(const RooAbsCollection &coll, bool constant) { bool changed = false; - std::unique_ptr iter(coll.createIterator()); - for (RooAbsArg *a = (RooAbsArg *) iter->Next(); a != 0; a = (RooAbsArg *) iter->Next()) { + for (RooAbsArg *a : coll) { RooRealVar *v = dynamic_cast(a); RooCategory *cv = dynamic_cast(a); if (v && (v->isConstant() != constant)) { @@ -376,8 +361,7 @@ bool utils::checkModel(const RooStats::ModelConfig &model, bool throwOnFail) { if (model.GetParametersOfInterest() == 0) { ok = false; errors << "ERROR: model does not define parameters of interest.\n"; } else { - iter.reset(model.GetParametersOfInterest()->createIterator()); - for (RooAbsArg *a = (RooAbsArg *) iter->Next(); a != 0; a = (RooAbsArg *) iter->Next()) { + for (RooAbsArg *a : *model.GetParametersOfInterest()) { RooRealVar *v = dynamic_cast(a); if (!v) { ok = false; errors << "ERROR: parameter of interest " << a->GetName() << " is a " << a->ClassName() << " and not a RooRealVar\n"; continue; } if (v->isConstant()) { ok = false; errors << "ERROR: parameter of interest " << a->GetName() << " is constant\n"; continue; } @@ -386,8 +370,7 @@ bool utils::checkModel(const RooStats::ModelConfig &model, bool throwOnFail) { } } if (model.GetNuisanceParameters() != 0) { - iter.reset(model.GetNuisanceParameters()->createIterator()); - for (RooAbsArg *a = (RooAbsArg *) iter->Next(); a != 0; a = (RooAbsArg *) iter->Next()) { + for (RooAbsArg *a : *model.GetNuisanceParameters()) { RooRealVar *v = dynamic_cast(a); if (!v) { ok = false; errors << "ERROR: nuisance parameter " << a->GetName() << " is a " << a->ClassName() << " and not a RooRealVar\n"; continue; } if (v->isConstant()) { ok = false; errors << "ERROR: nuisance parameter " << a->GetName() << " is constant\n"; continue; } @@ -396,17 +379,15 @@ bool utils::checkModel(const RooStats::ModelConfig &model, bool throwOnFail) { } } if (model.GetGlobalObservables() != 0) { - iter.reset(model.GetGlobalObservables()->createIterator()); - for (RooAbsArg *a = (RooAbsArg *) iter->Next(); a != 0; a = (RooAbsArg *) iter->Next()) { + for (RooAbsArg *a : *model.GetGlobalObservables()) { RooRealVar *v = dynamic_cast(a); if (!v) { ok = false; errors << "ERROR: global observable " << a->GetName() << " is a " << a->ClassName() << " and not a RooRealVar\n"; continue; } if (!v->isConstant()) { ok = false; errors << "ERROR: global observable " << a->GetName() << " is not constant\n"; continue; } if (!pdf->dependsOn(*v)) { errors << "WARNING: pdf does not depend on global observable " << a->GetName() << "\n"; continue; } } } - std::unique_ptr params(pdf->getParameters(*model.GetObservables())); - iter.reset(params->createIterator()); - for (RooAbsArg *a = (RooAbsArg *) iter->Next(); a != 0; a = (RooAbsArg *) iter->Next()) { + ; + for (RooAbsArg *a : *std::unique_ptr{pdf->getParameters(*model.GetObservables())}) { if (a->getAttribute("flatParam") && a->isConstant()) { ok = false; errors << "ERROR: parameter " << a->GetName() << " is declared as flatParam but is constant.\n"; } @@ -435,8 +416,7 @@ bool utils::checkModel(const RooStats::ModelConfig &model, bool throwOnFail) { ok = false; errors << "ERROR: have nuisance parameters, but can't factorize the pdf\n"; } std::unique_ptr obsParams(factorizedPdf->getParameters(*model.GetObservables())); - iter.reset(model.GetNuisanceParameters()->createIterator()); - for (RooAbsArg *a = (RooAbsArg *) iter->Next(); a != 0; a = (RooAbsArg *) iter->Next()) { + for (RooAbsArg *a : *model.GetNuisanceParameters()) { if (!obsParams->contains(*a)) { errors << "WARNING: model pdf does not depend on nuisace parameter " << a->GetName() << "\n"; } @@ -611,14 +591,7 @@ utils::makePlots(const RooAbsPdf &pdf, const RooAbsData &data, const char *signa RooAbsPdf *pdfi = sim->getPdf(ds->GetName()); std::unique_ptr obs(pdfi->getObservables(ds)); if (obs->getSize() == 0) break; - TIterator *obs_iter = obs->createIterator(); - //std::cout << " PDF CHECKING " << std::endl; - //pdfi->Print("v"); - //ds->Print("v"); - //std::cout << " ------------ " << std::endl; - - //for (int iobs=0;iobsgetSize();iobs++){ - for (RooAbsArg *a = 0; (a = (RooAbsArg *)obs_iter->Next()) != 0; ) { + for (RooAbsArg *a : *obs) { RooRealVar *x = dynamic_cast(a); if (x == 0) continue; int nbins = x->numBins(); if (nbins == 0) nbins = 100; @@ -642,9 +615,7 @@ utils::makePlots(const RooAbsPdf &pdf, const RooAbsData &data, const char *signa } else if (pdf.canBeExtended()) { std::unique_ptr obs(pdf.getObservables(&data)); - //for (int iobs=0;iobsgetSize();iobs++){ - TIterator *obs_iter = obs->createIterator(); - for (RooAbsArg *a = 0; (a = (RooAbsArg *)obs_iter->Next()) != 0; ) { + for (RooAbsArg *a : *obs) { RooRealVar *x = dynamic_cast(a); if (x != 0) { ret.push_back(x->frame()); @@ -669,8 +640,8 @@ void utils::CheapValueSnapshot::readFrom(const RooAbsCollection &src) { src_ = &src; values_.resize(src.getSize()); } - RooLinkedListIter iter = src.iterator(); int i = 0; - for (RooAbsArg *a = (RooAbsArg *) iter.Next(); a != 0; a = (RooAbsArg *) iter.Next(), ++i) { + for (int i = 0; i < src.getSize(); ++i) { + RooAbsArg *a = src[i]; RooRealVar *rrv = dynamic_cast(a); if (rrv == 0) { RooCategory *rc = dynamic_cast(a); @@ -686,8 +657,8 @@ void utils::CheapValueSnapshot::readFrom(const RooAbsCollection &src) { void utils::CheapValueSnapshot::writeTo(const RooAbsCollection &src) const { if (&src == src_) { - RooLinkedListIter iter = src.iterator(); int i = 0; - for (RooAbsArg *a = (RooAbsArg *) iter.Next(); a != 0; a = (RooAbsArg *) iter.Next(), ++i) { + for (int i = 0; i < src.getSize(); ++i) { + RooAbsArg *a = src[i]; RooRealVar *rrv = dynamic_cast(a); if (rrv!=0) rrv->setVal(values_[i]); else { @@ -696,8 +667,8 @@ void utils::CheapValueSnapshot::writeTo(const RooAbsCollection &src) const { } } } else { - RooLinkedListIter iter = src_->iterator(); int i = 0; - for (RooAbsArg *a = (RooAbsArg *) iter.Next(); a != 0; a = (RooAbsArg *) iter.Next(), ++i) { + for (int i = 0; i < src_->getSize(); ++i) { + RooAbsArg *a = (*src_)[i]; RooAbsArg *a2 = src.find(a->GetName()); if (a2 == 0) continue; RooRealVar *rrv = dynamic_cast(a2); if (rrv!=0) rrv->setVal(values_[i]); @@ -712,8 +683,8 @@ void utils::CheapValueSnapshot::writeTo(const RooAbsCollection &src) const { void utils::CheapValueSnapshot::Print(const char *fmt) const { if (src_ == 0) { printf("\n"); return; } if (fmt[0] == 'V') { - RooLinkedListIter iter = src_->iterator(); int i = 0; - for (RooAbsArg *a = (RooAbsArg *) iter.Next(); a != 0; a = (RooAbsArg *) iter.Next(), ++i) { + for (int i = 0; i < src_->getSize(); ++i) { + RooAbsArg *a = (*src_)[i]; printf(" %3d) %-30s = %9.6g\n", i, a->GetName(), values_[i]); } printf("\n"); @@ -764,8 +735,7 @@ void utils::setModelParameters( const std::string & setPhysicsModelParameterExpr std::cout<<"interpreting "< iter(params.createIterator()); - for (RooAbsArg *tmp = (RooAbsArg*) iter->Next(); tmp != 0; tmp = (RooAbsArg*) iter->Next()) { + for (RooAbsArg *tmp : params) { bool isrvar = tmp->IsA()->InheritsFrom(RooRealVar::Class()); // check its type @@ -886,8 +856,7 @@ void utils::setModelParameterRanges( const std::string & setPhysicsModelParamete std::cout<<"interpreting "< iter(params.createIterator()); - for (RooAbsArg *a = (RooAbsArg*) iter->Next(); a != 0; a = (RooAbsArg*) iter->Next()) { + for (RooAbsArg *a : params) { RooRealVar *tmpParameter = dynamic_cast(a); const std::string &target = tmpParameter->GetName(); std::smatch match; @@ -1035,8 +1004,8 @@ bool utils::anyParameterAtBoundaries( const RooArgSet ¶ms, int verbosity ){ static std::unordered_map timesFoundAtBoundary; bool isAnyBad = false; - RooLinkedListIter iter = params.iterator(); int i = 0; - for (RooRealVar *a = (RooRealVar *) iter.Next(); a != 0; a = (RooRealVar *) iter.Next(), ++i) { + for (RooAbsArg *aAbsArg : params) { + RooRealVar *a = static_cast(aAbsArg); bool isBad = isParameterAtBoundary(*a); @@ -1062,8 +1031,7 @@ bool utils::anyParameterAtBoundaries( const RooArgSet ¶ms, int verbosity ){ int utils::countFloating(const RooArgSet ¶ms){ int count=0; - RooLinkedListIter iter = params.iterator(); int i = 0; - for (RooAbsArg *a = (RooAbsArg *) iter.Next(); a != 0; a = (RooAbsArg *) iter.Next(), ++i) { + for (RooAbsArg *a : params) { if (!a->isConstant()) count++; } return count; @@ -1084,8 +1052,7 @@ bool utils::freezeAllDisassociatedRooMultiPdfParameters(const RooArgSet & multiP // For each multiPdf, get the active pdf and remove its parameters // from this list of params and then freeze the remaining ones - RooLinkedListIter iter = multiPdfs.iterator(); - for (RooAbsArg *P = (RooAbsArg *) iter.Next(); P != 0; P = (RooAbsArg *) iter.Next()) { + for (RooAbsArg *P : multiPdfs) { RooMultiPdf *mpdf = dynamic_cast(P); RooAbsPdf *pdf = (RooAbsPdf*)mpdf->getCurrentPdf(); if (freezeDisassParams_verb) std::cout << " Current active PDF - " << pdf->GetName() < Date: Wed, 20 Dec 2023 21:02:23 +0100 Subject: [PATCH 95/98] Don't use `getParameters()` inline in range-based loop (#890) This causes segmentation errors because of wong object lifetimes. --- src/AsimovUtils.cc | 6 ++++-- src/Combine.cc | 6 ++++-- src/FitterAlgoBase.cc | 4 ++-- src/utils.cc | 3 ++- 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/AsimovUtils.cc b/src/AsimovUtils.cc index 7a5d99aec3f..5fd2cd976a6 100644 --- a/src/AsimovUtils.cc +++ b/src/AsimovUtils.cc @@ -20,7 +20,8 @@ RooAbsData *asimovutils::asimovDatasetNominal(RooStats::ModelConfig *mc, double if (verbose>2) { CombineLogger::instance().log("AsimovUtils.cc",__LINE__,"Parameters after fit for asimov dataset",__func__); - for (RooAbsArg *a : *std::unique_ptr{mc->GetPdf()->getParameters((const RooArgSet*) 0)}) { + std::unique_ptr params{mc->GetPdf()->getParameters((const RooArgSet*) 0)}; + for (RooAbsArg *a : *params) { TString varstring = utils::printRooArgAsString(a); CombineLogger::instance().log("AsimovUtils.cc",__LINE__,std::string(Form("%s",varstring.Data())),__func__); } @@ -64,7 +65,8 @@ RooAbsData *asimovutils::asimovDatasetWithFit(RooStats::ModelConfig *mc, RooAbsD if (verbose>2) { CombineLogger::instance().log("AsimovUtils.cc",__LINE__,"Parameters after fit for asimov dataset",__func__); - for (RooAbsArg *a : *std::unique_ptr{mc->GetPdf()->getParameters(realdata)}) { + std::unique_ptr params{mc->GetPdf()->getParameters(realdata)}; + for (RooAbsArg *a : *params) { TString varstring = utils::printRooArgAsString(a); CombineLogger::instance().log("AsimovUtils.cc",__LINE__,std::string(Form("%s",varstring.Data())),__func__); } diff --git a/src/Combine.cc b/src/Combine.cc index bcbcd2ab3c3..425aca0b03c 100644 --- a/src/Combine.cc +++ b/src/Combine.cc @@ -973,7 +973,8 @@ void Combine::run(TString hlfFile, const std::string &dataset, double &limit, do // print the values of the parameters used to generate the toy if (verbose > 2) { CombineLogger::instance().log("Combine.cc",__LINE__, "Generate Asimov toy from parameter values ... ",__func__); - for (RooAbsArg *a : *std::unique_ptr{genPdf->getParameters((const RooArgSet*)0)}) { + std::unique_ptr params{genPdf->getParameters((const RooArgSet*)0)}; + for (RooAbsArg *a : *params) { TString varstring = utils::printRooArgAsString(a); CombineLogger::instance().log("Combine.cc",__LINE__,varstring.Data(),__func__); } @@ -1069,7 +1070,8 @@ void Combine::run(TString hlfFile, const std::string &dataset, double &limit, do std::cout << "Generate toy " << iToy << "/" << nToys << std::endl; if (verbose > 2) { CombineLogger::instance().log("Combine.cc",__LINE__, std::string(Form("Generating toy %d/%d, from parameter values ... ",iToy,nToys)),__func__); - for (RooAbsArg *a : *std::unique_ptr{genPdf->getParameters((const RooArgSet*)0)}) { + std::unique_ptr params{genPdf->getParameters((const RooArgSet*)0)}; + for (RooAbsArg *a : *params) { TString varstring = utils::printRooArgAsString(a); CombineLogger::instance().log("Combine.cc" ,__LINE__,varstring.Data(),__func__); } diff --git a/src/FitterAlgoBase.cc b/src/FitterAlgoBase.cc index 7455028977b..c24fbe8a314 100644 --- a/src/FitterAlgoBase.cc +++ b/src/FitterAlgoBase.cc @@ -151,8 +151,8 @@ bool FitterAlgoBase::run(RooWorkspace *w, RooStats::ModelConfig *mc_s, RooStats: break; } - ; - for (RooAbsArg *a : *std::unique_ptr{mc_s->GetPdf()->getParameters(data)}) { + std::unique_ptr params{mc_s->GetPdf()->getParameters(data)}; + for (RooAbsArg *a : *params) { RooRealVar *rrv = dynamic_cast(a); if (rrv == 0 || rrv->isConstant()) continue; if (profileMode_ == ProfileUnconstrained && mc_s->GetNuisanceParameters()->find(*rrv) != 0) { diff --git a/src/utils.cc b/src/utils.cc index 7b6ecc61e47..e9423a8e5d2 100644 --- a/src/utils.cc +++ b/src/utils.cc @@ -387,7 +387,8 @@ bool utils::checkModel(const RooStats::ModelConfig &model, bool throwOnFail) { } } ; - for (RooAbsArg *a : *std::unique_ptr{pdf->getParameters(*model.GetObservables())}) { + std::unique_ptr params{pdf->getParameters(*model.GetObservables())}; + for (RooAbsArg *a : *params) { if (a->getAttribute("flatParam") && a->isConstant()) { ok = false; errors << "ERROR: parameter " << a->GetName() << " is declared as flatParam but is constant.\n"; } From d46392a59f7cc8daf5c499d9739f7813e0861636 Mon Sep 17 00:00:00 2001 From: nckw Date: Fri, 22 Dec 2023 17:41:48 +0000 Subject: [PATCH 96/98] 1.0 to dash --- data/tutorials/CAT23001/template-analysis-datacard.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/tutorials/CAT23001/template-analysis-datacard.txt b/data/tutorials/CAT23001/template-analysis-datacard.txt index 172a2366c81..b5d80ee4c31 100644 --- a/data/tutorials/CAT23001/template-analysis-datacard.txt +++ b/data/tutorials/CAT23001/template-analysis-datacard.txt @@ -13,6 +13,6 @@ process 0 1 rate 24 100 # -------------------------------- lumi lnN 1.1 1.0 -bgnorm lnN 1.0 1.3 +bgnorm lnN - 1.3 alpha shape - 1 # uncertainty on background shape and normalization. sigma shape 0.5 - # uncertainty on signal shape. From f32cb0f65f389c45f72462cfe5364f98bbe5dc88 Mon Sep 17 00:00:00 2001 From: nckw Date: Fri, 29 Dec 2023 20:55:59 +0000 Subject: [PATCH 97/98] Suppress output in low verbose mode (#891) Co-authored-by: Nick Wardle --- src/CachingNLL.cc | 12 ++++++------ src/HybridNew.cc | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/CachingNLL.cc b/src/CachingNLL.cc index ed7c802f1cd..434dfd451e8 100644 --- a/src/CachingNLL.cc +++ b/src/CachingNLL.cc @@ -1031,12 +1031,12 @@ cacheutils::CachingSimNLL::setup_() } } - std::cout << "SimNLL created with " << nchannels << " channels, " << - constrainPdfs_.size() << " generic constraints, " << - constrainPdfsFast_.size() << " fast gaussian constraints, " << - constrainPdfsFastPoisson_.size() << " fast poisson constraints, " << - constrainPdfGroups_.size() << " fast group constraints, " << - std::endl; + + if (verb) { + CombineLogger::instance().log("CachingNLL.cc",__LINE__,std::string(Form( + "SimNLL created with %d channels, %d generic constraints, %d fast gaussian constraints, %d fast poisson constraints, %d fast group constraints.", + (int)nchannels, (int)constrainPdfs_.size(),(int)constrainPdfsFast_.size(),(int)constrainPdfsFastPoisson_.size(),(int)constrainPdfGroups_.size())),__func__); + } setValueDirty(); } diff --git a/src/HybridNew.cc b/src/HybridNew.cc index 25b8a9dcd53..0f910462725 100644 --- a/src/HybridNew.cc +++ b/src/HybridNew.cc @@ -273,7 +273,7 @@ void HybridNew::setupPOI(RooStats::ModelConfig *mc_s) { } bool HybridNew::run(RooWorkspace *w, RooStats::ModelConfig *mc_s, RooStats::ModelConfig *mc_b, RooAbsData &data, double &limit, double &limitErr, const double *hint) { - RooFitGlobalKillSentry silence(verbose <= 1 ? RooFit::WARNING : RooFit::DEBUG); + RooFitGlobalKillSentry silence(verbose <= 1 ? RooFit::FATAL : RooFit::DEBUG); //double minimizerTolerance_ = ROOT::Math::MinimizerOptions::DefaultTolerance(); //std::string minimizerAlgo_ = ROOT::Math::MinimizerOptions::DefaultMinimizerAlgo(); From 3c6987611e8b5eebaa7b784fddbb4133e6ac68c1 Mon Sep 17 00:00:00 2001 From: Aliya Nigamova Date: Sun, 31 Dec 2023 20:22:52 +0100 Subject: [PATCH 98/98] Update installation instructions to fix compilation in el9 machines (#882) * Update installation instructions * add singularity instructions --- docs/index.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/docs/index.md b/docs/index.md index 5e772a51f83..e79bfe47c07 100644 --- a/docs/index.md +++ b/docs/index.md @@ -32,9 +32,11 @@ releases on github under The nominal installation method is inside CMSSW. The current release targets the CMSSW `11_3_X` series because this release has both python2 and python3 ROOT bindings, allowing a more gradual migration of user code to python3. Combine is -fully python3-compatible and, with some adaptations, can also work in 12_X releases. +fully python3-compatible and, with some adaptations, can also work in 12_X releases. +CMSSW `11_3_X` runs on slc7, which can be setup using apptainer ([see detailed instructions](http://cms-sw.github.io/singularity.html)): ```sh +cmssw-el7 cmsrel CMSSW_11_3_4 cd CMSSW_11_3_4/src cmsenv @@ -55,7 +57,7 @@ scramv1 b clean; scramv1 b # always make a clean build Setting up the environment (once): ```sh -export SCRAM_ARCH=slc7_amd64_gcc700 +cmssw-el7 cmsrel CMSSW_10_2_13 cd CMSSW_10_2_13/src cmsenv @@ -73,13 +75,13 @@ scramv1 b clean; scramv1 b # always make a clean build ### SLC6/CC7 release `CMSSW_8_1_X` -Setting up the environment (once): +Setting up OS using apptainer ([see detailed instructions](http://cms-sw.github.io/singularity.html)): ```sh # For CC7: -export SCRAM_ARCH=slc7_amd64_gcc530 +cmssw-el7 # For SLC6: -export SCRAM_ARCH=slc6_amd64_gcc530 +cmssw-el6 cmsrel CMSSW_8_1_0 cd CMSSW_8_1_0/src

    1uzE5gWn~<%s~~7lJz9 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 Date: Tue, 1 Aug 2023 13:17:45 +0100 Subject: [PATCH 38/98] Small update to description of `toysFrequentist` toys --- docs/part3/runningthetool.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/part3/runningthetool.md b/docs/part3/runningthetool.md index a4a93a6fa7a..9e696897e36 100644 --- a/docs/part3/runningthetool.md +++ b/docs/part3/runningthetool.md @@ -192,7 +192,7 @@ The following are options which define how the toys will be generated, * `--toysNoSystematics` the nuisance parameters in each toy are *not* randomised when generating the toy datasets - i.e their nominal values are used to generate the data. Note that for methods which profile (fit) the nuisances, the parameters are still floating when evaluating the likelihood. - * `--toysFrequentist` the nuisance parameters in each toy are set to their nominal values which are obtained *after fitting first to the data*, with POIs fixed, before generating the data. For evaluating likelihoods, the constraint terms are instead randomised within their Gaussian constraint pdfs around the post-fit nuisance parameter values. + * `--toysFrequentist` the nuisance parameters in each toy are set to their nominal values which are obtained *after fitting first to the data*, with POIs fixed, before generating the data. For evaluating likelihoods, the constraint terms are instead randomised within their pdfs around the post-fit nuisance parameter values. If you are using `toysFrequentist`, be aware that the values set by `--setParameters` will be *ignored* for the toy generation as the *post-fit* values will instead be used (except for any parameter which is also a parameter of interest). You can override this behaviour and choose the nominal values for toy generation for any parameter by adding the option `--bypassFrequentistFit` which will skip the initial fit to data or by loading a snapshot (see below). From 76fa6ac694e0cef9fda5c617ba6721f763217e51 Mon Sep 17 00:00:00 2001 From: Nick Smith Date: Tue, 22 Aug 2023 09:15:31 -0500 Subject: [PATCH 39/98] Use static cast for speed --- src/CMSInterferenceFunc.cxx | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/CMSInterferenceFunc.cxx b/src/CMSInterferenceFunc.cxx index 10af7517013..c9aad55f3ce 100644 --- a/src/CMSInterferenceFunc.cxx +++ b/src/CMSInterferenceFunc.cxx @@ -74,6 +74,16 @@ void CMSInterferenceFunc::initialize() const { size_t nbins = edges_.size() - 1; size_t ncoef = coefficients_.getSize(); + for (size_t i=0; i < ncoef; ++i) { + if ( coefficients_.at(i) == nullptr ) { + throw std::invalid_argument("Lost coefficient " + std::to_string(i)); + } + if ( not coefficients_.at(i)->InheritsFrom("RooAbsReal") ) { + throw std::invalid_argument( + "Coefficient " + std::to_string(i) + " is not a RooAbsReal" + ); + } + } if ( binscaling_.size() != nbins ) { throw std::invalid_argument( "Number of bins as determined from bin edges (" @@ -99,7 +109,7 @@ void CMSInterferenceFunc::initialize() const { void CMSInterferenceFunc::updateCache() const { for (int i=0; i < coefficients_.getSize(); ++i) { - auto* coef = dynamic_cast(coefficients_.at(i)); + auto* coef = static_cast(coefficients_.at(i)); if ( coef == nullptr ) throw std::runtime_error("Lost coef!"); evaluator_->setCoefficient(i, coef->getVal()); } From 7f90b0c2df0d242c1a5ec9e533bc74a36f1a25da Mon Sep 17 00:00:00 2001 From: Nick Smith Date: Wed, 23 Aug 2023 14:02:58 -0500 Subject: [PATCH 40/98] Implement a PhysicsModel to set up interference morphing --- .flake8 | 3 +- python/InterferenceModels.py | 166 +++++++++++++++++++++++++++++++++++ test/test_interference.py | 69 ++++++--------- 3 files changed, 195 insertions(+), 43 deletions(-) create mode 100644 python/InterferenceModels.py diff --git a/.flake8 b/.flake8 index 6742d005678..5b45d35fefd 100644 --- a/.flake8 +++ b/.flake8 @@ -15,5 +15,6 @@ # E741: ambiguous variable name 'l' (too pedantic! get a good font) # E711: sometimes needed for comparison to ROOT nullptr (better to cast to bool) # F401: unused import (some may have side effects, need to clean by hand) -ignore = F403,F405,E402,W504,E203,W503,E262,E265,E266,E501,E741,E711,F401 +# E721: do not compare types (new, could be fixed relatively easily) +ignore = F403,F405,E402,W504,E203,W503,E262,E265,E266,E501,E741,E711,F401,E721 max-line-length = 160 diff --git a/python/InterferenceModels.py b/python/InterferenceModels.py new file mode 100644 index 00000000000..f9289f30dd2 --- /dev/null +++ b/python/InterferenceModels.py @@ -0,0 +1,166 @@ +import gzip +import json +import pickle +import re + +import numpy as np +import ROOT +from HiggsAnalysis.CombinedLimit.PhysicsModel import PhysicsModelBase_NiceSubclasses + + +def read_scaling(path: str): + if path.endswith(".json"): + with open(path) as fin: + out = json.load(fin) + elif path.endswith(".json.gz"): + with gzip.open(path, "rt") as fin: + out = json.load(fin) + elif path.endswith(".pkl.gz"): + with gzip.open(path, "rb") as fin: + out = pickle.load(fin) + else: + raise RuntimeError(f"Unrecognized scaling data path {path}; must be either .json, .json.gz, or .pkl.gz") + # normalize + if not isinstance(out, list): + raise RuntimeError("Scaling data in invalid format: expected list") + expected_fields = {"channel", "process", "parameters", "scaling"} + for item in out: + if not isinstance(item, dict): + raise RuntimeError("Scaling data in invalid format: expected each item in list to be a dict") + missing = expected_fields - set(item) + if missing: + raise RuntimeError(f"Missing fields in scaling item: {missing}") + shortname = item["channel"] + "/" + item["process"] + if not all(isinstance(par, str) for par in item["parameters"]): + raise RuntimeError(f"Parameters must be a list of strings in {shortname}") + try: + item["scaling"] = np.array(item["scaling"], dtype=float) + except ValueError as ex: + raise RuntimeError(f"Scaling data invalid: could not normalize array for {shortname}") from ex + if len(item["scaling"].shape) != 2: + raise RuntimeError(f"Scaling data invalid: array shape incorrect for {shortname}") + npar = len(item["parameters"]) + if item["scaling"].shape[1] != npar * (npar + 1) // 2: + raise RuntimeError(f"Scaling data invalid: array has insufficent terms for parameters in {shortname}") + return out + + +class InterferenceModel(PhysicsModelBase_NiceSubclasses): + def __init__(self): + self.verbose = False + self.scaling = None + self.scaling_map = {} + self.explict_pois = None + super(InterferenceModel, self).__init__() + + def processPhysicsOptions(self, physOptions): + processed = [] + for po in physOptions: + if po == "verbose": + self.verbose = True + processed.append(po) + elif po.startswith("scalingData="): + self.scaling = read_scaling(po[len("scalingData=") :]) + processed.append(po) + elif po.startswith("POIs="): + self.explict_pois = po[len("POIs=") :].split(":") + processed.append(po) + if self.scaling is None: + raise RuntimeError("Must specify --PO=scalingData= physics option!") + # make map for quick lookup + for item in self.scaling: + self.scaling_map[(item["channel"], item["process"])] = item + return processed + super(InterferenceModel, self).processPhysicsOptions(physOptions) + + def getPOIList(self): + poiNames = [] + if self.explict_pois: + if self.verbose: + print("Building explicitly requested POIs:") + for poi in self.explict_pois: + if self.verbose: + print(f" - {poi}") + self.modelBuilder.doVar(poi) + poiname = re.sub(r"\[.*", "", poi) + if not self.modelBuilder.out.var(poiname): + raise RuntimeError(f"Could not find POI {poiname} after factory call") + poiNames.append(poiname) + # RooFit would also detect duplicate params with mismatched factory, but this is faster + constructed = {} + for item in self.scaling: + item["parameters_inworkspace"] = [] + for param in item["parameters"]: + if param in constructed: + rooparam = constructed[param] + else: + rooparam = self.modelBuilder.factory_(param) + if not rooparam: + raise RuntimeError(f"Failed to build {param}") + if not self.explict_pois and isinstance(rooparam, ROOT.RooRealVar) and not rooparam.isConstant(): + if self.verbose: + print(f"Assuming parameter {param} is to be a POI (name: {rooparam.GetName()})") + poiNames.append(rooparam.GetName()) + constructed[param] = rooparam + # save for later use in making CMSInterferenceFunc + item["parameters_inworkspace"].append(rooparam) + if self.verbose: + print(f"All POIs: {poiNames}") + return poiNames + + def getYieldScale(self, channel, process): + string = "%s/%s" % (channel, process) + try: + item = self.scaling_map[(channel, process)] + except KeyError: + if self.verbose: + print(f"Will scale {string} by 1") + return 1 + print(f"Will scale {string} using CMSInterferenceFunc dependent on parameters {item['parameters']}") + item["found"] = True + # We don't actually scale the total via this mechanism + # and we'll set up the shape effects in done() since shapes aren't available yet + return 1 + + def done(self): + for item in self.scaling_map.values(): + channel = item["channel"] + process = item["process"] + string = "%s/%s" % (channel, process) + if "found" not in item: + if self.verbose: + print(f"Did not find {string} in workspace, even though it is in scaling data") + continue + + hfname = f"shapeSig_{channel}_{process}_morph" + histfunc = self.modelBuilder.out.function(hfname) + if not histfunc: + # if there are no systematics, it ends up with a different name? + hfname = f"shapeSig_{process}_{channel}_rebinPdf" + histfunc = self.modelBuilder.out.function(hfname) + # TODO: support FastVerticalInterpHistPdf2 + if not isinstance(histfunc, ROOT.CMSHistFunc): + self.modelBuilder.out.Print("v") + raise RuntimeError( + f"Could not locate the CMSHistFunc for {string}.\nNote that CMSInterferenceFunc currently only supports workspaces that use CMSHistFunc" + ) + + funcname = hfname + "_externalMorph" + + tpl = histfunc.cache() + edges = [tpl.GetEdge(i) for i in range(tpl.size() + 1)] + params = ROOT.RooArgList() + for p in item["parameters_inworkspace"]: + params.add(p) + + scaling_array = ROOT.std.vector["std::vector"]() + nbins, ncoef = item["scaling"].shape + scaling_array.reserve(nbins) + for sbin in item["scaling"]: + scaling_array.push_back(sbin) + + self.modelBuilder.out.safe_import(ROOT.CMSInterferenceFunc(funcname, "", histfunc.getXVar(), params, edges, scaling_array)) + func = self.modelBuilder.out.function(funcname) + histfunc.injectExternalMorph(func) + + +interferenceModel = InterferenceModel() diff --git a/test/test_interference.py b/test/test_interference.py index a5c302683c6..d5681b195bc 100755 --- a/test/test_interference.py +++ b/test/test_interference.py @@ -2,6 +2,7 @@ import ROOT import numpy as np import subprocess +import json def array2vector_2d(array): @@ -92,13 +93,13 @@ def to_TH1(name, array): """ ) -subprocess.call("text2workspace.py card.txt".split(" ")) -fcard = ROOT.TFile.Open("card.root") -w = fcard.Get("w") - -scaling = array2vector_2d( - np.array( - [ +# write the scaling data +scaling = [ + { + "channel": "ch1", + "process": "VBFHH", + "parameters": ["expr::a0('@0*@1', kv[1,0,2], kl[1,0,2])", "expr::a1('@0*@0', kv[1,0,2])", "k2v[1,0,2]"], + "scaling": [ [ 3.303536746664150e00, -8.541709820382220e00, @@ -259,41 +260,25 @@ def to_TH1(name, array): -4.949344845658728e01, 4.515984622267106e01, ], - ] - ) -) - -kv, k2v, kl = ( - w.factory("kv[1, 0, 2]"), - w.factory("k2v[1, 0, 2]"), - w.factory("kl[1, 0, 2]"), -) - -w.Import( - ROOT.CMSInterferenceFunc( - "ch1_vbfhh_morph", - "", - w.var("CMS_th1x"), - ROOT.RooArgList( - w.factory("expr('@0*@1', kv, kl)"), - w.factory("expr('@0*@0', kv)"), - k2v, - ), - list(range(21)), - scaling, - ), - ROOT.RooFit.RecycleConflictNodes(), -) -func = w.function("ch1_vbfhh_morph") -print(func.getVal()) + ], + }, +] -histfunc = w.function("shapeSig_ch1_VBFHH_morph") -histfunc.injectExternalMorph(func) +with open("scaling.json", "w") as fout: + json.dump(scaling, fout) -fout = ROOT.TFile("card_morph.root", "recreate") -w.Write() -fout.Close() +t2wcmd = [ + "text2workspace.py", + "card.txt", + "-P", + "HiggsAnalysis.CombinedLimit.InterferenceModels:interferenceModel", + "--PO", + "verbose", + "--PO", + "scalingData=scaling.json", + "--PO", + "POIs=kl[1,0,2]:kv[1,0,2]:k2v[1,0,2]", +] -subprocess.call( - "combine -M MultiDimFit card_morph.root --redefineSignalPOIs kv,k2v,kl --freezeParameters r --setParameters r=1,kv=1,k2v=1,kl=1 -t 100".split(" ") -) +subprocess.call(t2wcmd) +subprocess.call("combine -M MultiDimFit card.root -t 100".split(" ")) From 45dd13b14a291d61ee70ccaca790e1999c535e25 Mon Sep 17 00:00:00 2001 From: Nick Smith Date: Wed, 23 Aug 2023 15:45:08 -0500 Subject: [PATCH 41/98] Docs for interference model --- docs/part2/physicsmodels.md | 86 ++++++++++++++++++++++++++++++++++++- 1 file changed, 84 insertions(+), 2 deletions(-) diff --git a/docs/part2/physicsmodels.md b/docs/part2/physicsmodels.md index e5822449f54..6f30fe010a7 100644 --- a/docs/part2/physicsmodels.md +++ b/docs/part2/physicsmodels.md @@ -213,7 +213,7 @@ The `PhysicsModel` that encodes the signal model above is the [twoHypothesisHigg The two processes (S and S_ALT) will get different scaling parameters. The LEP-style likelihood for hypothesis testing can now be performed by setting **x** or **not_x** to 1 and 0 and comparing two likelihood evaluations. -### Interference +### Signal-background interference Since there are no such things as negative probability distribution functions, the recommended way to implement this is to start from the expression for the individual amplitudes and the parameter of interest $k$, @@ -225,7 +225,7 @@ $$ where -$\mu = k^2, ~S = A_{s}^2,~B = Ab^2$ and $ S+B+I = (As + Ab)^2$. +$\mu = k^2, ~S = A_{s}^2,~B = Ab^2$ and $S+B+I = (As + Ab)^2$. With some algebra you can work out that, @@ -244,3 +244,85 @@ An example of this scheme is implemented in a [HiggsWidth](https://gitlab.cern.c self.modelBuilder.factory_( "expr::qqH_b_func(\"1-sqrt(@0)\", CMS_zz4l_mu)") self.modelBuilder.factory_( "expr::qqH_sbi_func(\"sqrt(@0)\", CMS_zz4l_mu)") ``` + +### Multi-process interference + +The above formulation can be extended to multiple parameters of interest +(POIs). See +[AnalyticAnomalousCoupling](https://github.com/amassiro/AnalyticAnomalousCoupling) +for an example. However, the computational performance scales quadratically +with the number of POIs, and can get extremely expensive for 10 or more, as may +be encountered often with EFT analyses. To alleviate this issue, an accelerated +interference modeling technique is implemented for template-based analyses via +the `interferenceModel` physics model. At present, this technique only works with +`CMSHistFunc`-based workspaces, as these are the most common workspace types +encountered and the default when using +[autoMCStats](https://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part2/bin-wise-stats). + +To use this physics model, you will first need to derive a nominal template and +a scaling matrix that describes how the POI vector $\theta$ morphs the nominal +template. For each bin yield $y(\theta) = y_0 (\theta^\top M \theta)$; +find $y_0$ and put it into the datacard as a signal process; then find $M$ and +save the upper triangular component as an array in a `scaling.json` file with a +syntax as follows: + +```json +[ + { + "channel": "my_channel", + "process": "my_nominal_process", + "parameters": ["sqrt_mu[1,0,2]", "Bscaling[1]"], + "scaling": [ + [0.5, 0.1, 1.0], + [0.6, 0.2, 1.0], + [0.7, 0.3, 1.0] + ] + } +] +``` + +where the parameters are declared using RooFit's [factory +syntax](https://root.cern.ch/doc/v622/classRooWorkspace.html#a0ddded1d65f5c6c4732a7a3daa8d16b0). +Then, to construct the workspace, run + +```bash +text2workspace.py card.txt -P HiggsAnalysis.CombinedLimit.InterferenceModels:interferenceModel --PO verbose --PO scalingData=scaling.json +``` +For large amounts of scaling data, you can optionally use gzipped json (`.json.gz`) or pickle (`.pkl.gz`) files with 2D numpy arrays for the scaling coefficients instead of lists. + +The above formulation, assuming the nominal template `B` has three bins, would +be equivalent to the previous section's if the `S` template is `[0.5, 0.6, +0.7]*B` and the `I` template is `[0.05, 0.1, 0.15]*B`. You could pick any +nominal template, and adjust the scaling as appropriate. Generally it is +advisable to use a nomlinal template corresponding to near where you expect the +POIs to land so that the shape systematic effects are well-modeled in that +region. + +It may be the case that the relative contributions of the terms are themselves +a function of the POIs. For example, in VBF di-Higgs production, BSM +modifications to the production rate can be parameterized in the "kappa" +framework via three diagrams, with scaling coefficients $\kappa_V$, +$\kappa_\lambda \kappa_V$, and $\kappa_{2V}$, respectively, that interfere. In +that case, you can declare formulas with the factory syntax to represent each +amplitude as follows: + +```json +[ + { + "channel": "a_vbf_channel", + "process": "VBFHH", + "parameters": ["expr::a0('@0*@1', kv[1,0,2], kl[1,0,2])", "expr::a1('@0*@0', kv[1,0,2])", "k2v[1,0,2]"], + "scaling": [ + [3.303536746664150e00, -8.541709820382220e00, 4.235348320712800e00, 2.296464188467882e01, -1.107996258835088e01, 5.504469544697623e00], + [2.206443321428910e00, -7.076836641962523e00, 4.053185685866683e00, 2.350989689214267e01, -1.308569222837996e01, 7.502346155380032e00] + ] + } +] +``` + +However, you will need to manually specify what the POIs should be when creating the workspace using the `POIs=` physics option, e.g. + +```bash +text2workspace.py card.txt -P HiggsAnalysis.CombinedLimit.InterferenceModels:interferenceModel \ + --PO scalingData=scaling.json --PO 'POIs=kl[1,0,2]:kv[1,0,2]:k2v[1,0,2]' +``` From 6f5e6de006ad3dee916fd7c51cb3d5092da0c773 Mon Sep 17 00:00:00 2001 From: Nicholas Smith Date: Wed, 23 Aug 2023 15:59:18 -0500 Subject: [PATCH 42/98] Some clarifications in docs --- docs/part2/physicsmodels.md | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/docs/part2/physicsmodels.md b/docs/part2/physicsmodels.md index 6f30fe010a7..93afadbb333 100644 --- a/docs/part2/physicsmodels.md +++ b/docs/part2/physicsmodels.md @@ -225,7 +225,7 @@ $$ where -$\mu = k^2, ~S = A_{s}^2,~B = Ab^2$ and $S+B+I = (As + Ab)^2$. +$\mu = k^2, ~S = A_{s}^2,~B = A_b^2$ and $S+B+I = (A_s + A_b)^2$. With some algebra you can work out that, @@ -286,23 +286,37 @@ syntax](https://root.cern.ch/doc/v622/classRooWorkspace.html#a0ddded1d65f5c6c473 Then, to construct the workspace, run ```bash -text2workspace.py card.txt -P HiggsAnalysis.CombinedLimit.InterferenceModels:interferenceModel --PO verbose --PO scalingData=scaling.json +text2workspace.py card.txt -P HiggsAnalysis.CombinedLimit.InterferenceModels:interferenceModel \ + --PO verbose --PO scalingData=scaling.json ``` For large amounts of scaling data, you can optionally use gzipped json (`.json.gz`) or pickle (`.pkl.gz`) files with 2D numpy arrays for the scaling coefficients instead of lists. The above formulation, assuming the nominal template `B` has three bins, would be equivalent to the previous section's if the `S` template is `[0.5, 0.6, -0.7]*B` and the `I` template is `[0.05, 0.1, 0.15]*B`. You could pick any +0.7]*B` and the `I` template is `[0.05, 0.1, 0.15]*B`. More explicitly, we are setting + +$$ +y_0 = A_b^2, \qquad +M = \frac{1}{A_b^2} \begin{bmatrix} + A_s^2 & A_s A_b \\ + A_s A_b & A_b^2 + \end{bmatrix}, \qquad \theta = \begin{bmatrix} + \sqrt{\mu} \\ + 1 + \end{bmatrix} +$$ + +You could pick any nominal template, and adjust the scaling as appropriate. Generally it is -advisable to use a nomlinal template corresponding to near where you expect the +advisable to use a nominal template corresponding to near where you expect the POIs to land so that the shape systematic effects are well-modeled in that region. It may be the case that the relative contributions of the terms are themselves a function of the POIs. For example, in VBF di-Higgs production, BSM modifications to the production rate can be parameterized in the "kappa" -framework via three diagrams, with scaling coefficients $\kappa_V$, -$\kappa_\lambda \kappa_V$, and $\kappa_{2V}$, respectively, that interfere. In +framework via three diagrams, with scaling coefficients $\kappa_V \kappa_\lambda$, +$\kappa_V^2$, and $\kappa_{2V}$, respectively, that interfere. In that case, you can declare formulas with the factory syntax to represent each amplitude as follows: From 5a56b57732ffa12ec1261a56f70820f596edb97a Mon Sep 17 00:00:00 2001 From: Ramkrishna Sharma Date: Fri, 25 Aug 2023 16:19:47 +0200 Subject: [PATCH 43/98] Update text to link in usefullinks.md (#854) * Update text to link in usefullinks.md * Update usefullinks.md --- docs/part4/usefullinks.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/part4/usefullinks.md b/docs/part4/usefullinks.md index cc7ef28d437..3e7c4f446d1 100644 --- a/docs/part4/usefullinks.md +++ b/docs/part4/usefullinks.md @@ -72,7 +72,7 @@ There is no document currently which can be cited for using the combine tool, ho * Combine reports the fit status in some routines (for example in the `FitDiagnostics` method). These are typically the status of the last call from Minuit. For details on the meanings of these status codes see the [Minuit2Minimizer](https://root.cern.ch/root/html/ROOT__Minuit2__Minuit2Minimizer.html) documentation page. * _Why does my fit not converge?_ * There are several reasons why some fits may not converge. Often some indication can be obtained from the `RooFitResult` or status which you will see information from when using the `--verbose X` (with $X>2$) option. Sometimes however, it can be that the likelihood for your data is very unusual. You can get a rough idea about what the likelihood looks like as a function of your parameters (POIs and nuisances) using `combineTool.py -M FastScan -w myworkspace.root` (use --help for options). - * We have seen often that fits in combine using `RooCBShape` as a parametric function will fail. This is related to an optimisation that fails. You can try to fix the problem as described in this issue: https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/issues/347 (i.e add the option `--X-rtd ADDNLL_CBNLL=0`). + * We have seen often that fits in combine using `RooCBShape` as a parametric function will fail. This is related to an optimisation that fails. You can try to fix the problem as described in this issue: [issues#347](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/issues/347) (i.e add the option `--X-rtd ADDNLL_CBNLL=0`). * _Why does the fit/fits take so long?_ * The minimisation routines are common to many methods in combine. You can tune the fitting using the generic optimisation command line options described [here](http://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part3/runningthetool/#generic-minimizer-options). For example, setting the default minimizer strategy to 0 can greatly improve the speed since this avoids running Hesse. In calculations such as `AsymptoticLimits`, Hesse is not needed and hence this can be done, however, for `FitDiagnostics` the uncertainties and correlations are part of the output so using strategy 0 may not be particularly accurate. * _Why are the results for my counting experiment so slow or unstable?_ From a7737f9fa2afddb332c8e8746e41dd41868ade48 Mon Sep 17 00:00:00 2001 From: Nicholas Smith Date: Fri, 25 Aug 2023 14:47:17 -0500 Subject: [PATCH 44/98] Improve interference docs --- docs/part2/physicsmodels.md | 66 ++++++++++++++++++++++--------------- 1 file changed, 39 insertions(+), 27 deletions(-) diff --git a/docs/part2/physicsmodels.md b/docs/part2/physicsmodels.md index 93afadbb333..61c30f1252c 100644 --- a/docs/part2/physicsmodels.md +++ b/docs/part2/physicsmodels.md @@ -215,17 +215,17 @@ The two processes (S and S_ALT) will get different scaling parameters. The LEP-s ### Signal-background interference -Since there are no such things as negative probability distribution functions, the recommended way to implement this is to start from the expression for the individual amplitudes and the parameter of interest $k$, +Since there are no such things as negative probability distribution functions, the recommended way to implement this is to start from the expression for the individual amplitudes $A$ and the parameter of interest $k$, $$ -\mathrm{Yield} = (k * A_{s} + A_{b})^2 -= k^2 * A_{s}^2 + k * 2 A_{s} A_{b} + A_{b}^2 +\mathrm{Yield} = |k * A_{s} + A_{b}|^2 += k^2 * |A_{s}|^2 + k * 2 \Re(A_{s}^* A_{b}) + |A_{b}|^2 = \mu * S + \sqrt{\mu} * I + B $$ where -$\mu = k^2, ~S = A_{s}^2,~B = A_b^2$ and $S+B+I = (A_s + A_b)^2$. +$\mu = k^2, ~S = |A_{s}|^2,~B = |A_b|^2$ and $S+B+I = |A_s + A_b|^2$. With some algebra you can work out that, @@ -254,15 +254,27 @@ for an example. However, the computational performance scales quadratically with the number of POIs, and can get extremely expensive for 10 or more, as may be encountered often with EFT analyses. To alleviate this issue, an accelerated interference modeling technique is implemented for template-based analyses via -the `interferenceModel` physics model. At present, this technique only works with +the `interferenceModel` physics model. In this model, each bin yield $y$ is parameterized +$$y(\theta) = y_0 (\theta^\top M \theta)$$ +as a function of the POI vector $\theta$, a nominal template $y_0$, and a scaling matrix $M$. +To see how this parameterization relates to that of the previous section, we can define: + +$$ +y_0 = A_b^2, \qquad +M = \frac{1}{A_b^2} \begin{bmatrix} + |A_s|^2 & \Re(A_s^* A_b) \\ + \Re(A_s A_b^*) & |A_b|^2 + \end{bmatrix}, \qquad \theta = \begin{bmatrix} + \sqrt{\mu} \\ + 1 + \end{bmatrix} +$$ + +which leads to the same parameterization. At present, this technique only works with `CMSHistFunc`-based workspaces, as these are the most common workspace types encountered and the default when using [autoMCStats](https://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part2/bin-wise-stats). - -To use this physics model, you will first need to derive a nominal template and -a scaling matrix that describes how the POI vector $\theta$ morphs the nominal -template. For each bin yield $y(\theta) = y_0 (\theta^\top M \theta)$; -find $y_0$ and put it into the datacard as a signal process; then find $M$ and +To use this model, for each bin find $y_0$ and put it into the datacard as a signal process, then find $M$ and save the upper triangular component as an array in a `scaling.json` file with a syntax as follows: @@ -282,29 +294,29 @@ syntax as follows: ``` where the parameters are declared using RooFit's [factory -syntax](https://root.cern.ch/doc/v622/classRooWorkspace.html#a0ddded1d65f5c6c4732a7a3daa8d16b0). +syntax](https://root.cern.ch/doc/v622/classRooWorkspace.html#a0ddded1d65f5c6c4732a7a3daa8d16b0) +and each row of the `scaling` field represents the scaling information of a bin, e.g. if $y_0 = |A_b|^2$ +then each row would contain three entries: +$$|A_s|^2 / |A_b|^2,\quad \Re(A_s^* A_b)/|A_b|^2,\quad 1$$ + +For several coefficients, one would enumerate as follows: +```python +scaling = [] +for ibin in range(nbins): + binscaling = [] + for icoef in range(ncoef): + for jcoef in range(icoef, ncoef): + binscaling.append(amplitude_squared_for(ibin, icoef, jcoef)) + scaling.append(binscaling) +``` + Then, to construct the workspace, run ```bash text2workspace.py card.txt -P HiggsAnalysis.CombinedLimit.InterferenceModels:interferenceModel \ --PO verbose --PO scalingData=scaling.json ``` -For large amounts of scaling data, you can optionally use gzipped json (`.json.gz`) or pickle (`.pkl.gz`) files with 2D numpy arrays for the scaling coefficients instead of lists. - -The above formulation, assuming the nominal template `B` has three bins, would -be equivalent to the previous section's if the `S` template is `[0.5, 0.6, -0.7]*B` and the `I` template is `[0.05, 0.1, 0.15]*B`. More explicitly, we are setting - -$$ -y_0 = A_b^2, \qquad -M = \frac{1}{A_b^2} \begin{bmatrix} - A_s^2 & A_s A_b \\ - A_s A_b & A_b^2 - \end{bmatrix}, \qquad \theta = \begin{bmatrix} - \sqrt{\mu} \\ - 1 - \end{bmatrix} -$$ +For large amounts of scaling data, you can optionally use gzipped json (`.json.gz`) or pickle (`.pkl.gz`) files with 2D numpy arrays for the scaling coefficients instead of lists. The function `numpy.triu_indices(ncoef)` is helpful for extracting the upper triangle of a square matrix. You could pick any nominal template, and adjust the scaling as appropriate. Generally it is From 171431ab6f4a6955b5c73d708439253c1b69513c Mon Sep 17 00:00:00 2001 From: Nick Smith Date: Tue, 29 Aug 2023 15:37:49 -0500 Subject: [PATCH 45/98] Actually test the CMSInterferenceFunc against reference values --- test/test_interference.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/test/test_interference.py b/test/test_interference.py index d5681b195bc..918ef8a4921 100755 --- a/test/test_interference.py +++ b/test/test_interference.py @@ -281,4 +281,24 @@ def to_TH1(name, array): ] subprocess.call(t2wcmd) + +fws = ROOT.TFile.Open("card.root") +w = fws.Get("w") + +def setvars(x, kl, kv, k2v): + w.var("CMS_th1x").setVal(x) + w.var("kl").setVal(kl) + w.var("kv").setVal(kv) + w.var("k2v").setVal(k2v) + +func = w.function(f"shapeSig_ch1_VBFHH_morph_externalMorph") +assert func + +setvars(0, 1, 1, 1) +assert abs(func.getVal() - 1.0) < 1e-14, func.getVal() +setvars(1, 1.1, 1, 1) +assert abs(func.getVal() - 0.8586229062809139) < 1e-14, func.getVal() +setvars(2, 1.1, 0.9, 1.3) +assert abs(func.getVal() - 4.372110974178483) < 1e-14, func.getVal() + subprocess.call("combine -M MultiDimFit card.root -t 100".split(" ")) From 886335c3f69b17e5166aba0ca386c68455a634a8 Mon Sep 17 00:00:00 2001 From: Nick Smith Date: Tue, 29 Aug 2023 17:05:06 -0500 Subject: [PATCH 46/98] Switch to lower triangular ordering This allows to extend the array at the end when adding new terms --- interface/CMSInterferenceFunc.h | 4 +- src/CMSInterferenceFunc.cxx | 4 +- test/test_interference.py | 188 +++++--------------------------- 3 files changed, 31 insertions(+), 165 deletions(-) diff --git a/interface/CMSInterferenceFunc.h b/interface/CMSInterferenceFunc.h index 4d8525b5027..1cf7262418d 100644 --- a/interface/CMSInterferenceFunc.h +++ b/interface/CMSInterferenceFunc.h @@ -17,8 +17,8 @@ class CMSInterferenceFunc : public RooAbsReal { /* * For a coefficients list of length n and edges array of length b+1, * the binscaling nested vector should have b entries (for b bins) with - * each being of length n*(n+1)/2, corresponding to the upper triangular - * elements of the scaling matrix, i.e. (m_00, m_01, m_02, ..., m_11, m_12, ...) + * each being of length n*(n+1)/2, corresponding to the lower triangular + * elements of the scaling matrix, i.e. (m_00, m_10, m_11, m_20, m_21, m_22, ...) */ CMSInterferenceFunc( const char* name, diff --git a/src/CMSInterferenceFunc.cxx b/src/CMSInterferenceFunc.cxx index c9aad55f3ce..34e96097103 100644 --- a/src/CMSInterferenceFunc.cxx +++ b/src/CMSInterferenceFunc.cxx @@ -10,7 +10,7 @@ class _InterferenceEval { Eigen::MatrixXd mat(ncoef, ncoef); size_t k=0; for(size_t i=0; i Date: Tue, 29 Aug 2023 17:13:39 -0500 Subject: [PATCH 47/98] Also switch to lower triangular in docs --- docs/part2/physicsmodels.md | 12 +++++++----- test/test_interference.py | 2 +- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/docs/part2/physicsmodels.md b/docs/part2/physicsmodels.md index 61c30f1252c..a00cf0249d8 100644 --- a/docs/part2/physicsmodels.md +++ b/docs/part2/physicsmodels.md @@ -275,7 +275,7 @@ which leads to the same parameterization. At present, this technique only works encountered and the default when using [autoMCStats](https://cms-analysis.github.io/HiggsAnalysis-CombinedLimit/part2/bin-wise-stats). To use this model, for each bin find $y_0$ and put it into the datacard as a signal process, then find $M$ and -save the upper triangular component as an array in a `scaling.json` file with a +save the lower triangular component as an array in a `scaling.json` file with a syntax as follows: ```json @@ -305,7 +305,7 @@ scaling = [] for ibin in range(nbins): binscaling = [] for icoef in range(ncoef): - for jcoef in range(icoef, ncoef): + for jcoef in range(icoef + 1): binscaling.append(amplitude_squared_for(ibin, icoef, jcoef)) scaling.append(binscaling) ``` @@ -316,7 +316,9 @@ Then, to construct the workspace, run text2workspace.py card.txt -P HiggsAnalysis.CombinedLimit.InterferenceModels:interferenceModel \ --PO verbose --PO scalingData=scaling.json ``` -For large amounts of scaling data, you can optionally use gzipped json (`.json.gz`) or pickle (`.pkl.gz`) files with 2D numpy arrays for the scaling coefficients instead of lists. The function `numpy.triu_indices(ncoef)` is helpful for extracting the upper triangle of a square matrix. +For large amounts of scaling data, you can optionally use gzipped json (`.json.gz`) or pickle (`.pkl.gz`) +files with 2D numpy arrays for the scaling coefficients instead of lists. The function `numpy.tril_indices(ncoef)` +is helpful for extracting the lower triangle of a square matrix. You could pick any nominal template, and adjust the scaling as appropriate. Generally it is @@ -339,8 +341,8 @@ amplitude as follows: "process": "VBFHH", "parameters": ["expr::a0('@0*@1', kv[1,0,2], kl[1,0,2])", "expr::a1('@0*@0', kv[1,0,2])", "k2v[1,0,2]"], "scaling": [ - [3.303536746664150e00, -8.541709820382220e00, 4.235348320712800e00, 2.296464188467882e01, -1.107996258835088e01, 5.504469544697623e00], - [2.206443321428910e00, -7.076836641962523e00, 4.053185685866683e00, 2.350989689214267e01, -1.308569222837996e01, 7.502346155380032e00] + [3.30353674666415, -8.54170982038222, 22.96464188467882, 4.2353483207128, -11.07996258835088, 5.504469544697623], + [2.20644332142891, -7.076836641962523, 23.50989689214267, 4.053185685866683, -13.08569222837996, 7.502346155380032] ] } ] diff --git a/test/test_interference.py b/test/test_interference.py index 8605f3e93da..725bdd676d0 100755 --- a/test/test_interference.py +++ b/test/test_interference.py @@ -157,7 +157,7 @@ def setvars(x, kl, kv, k2v): w.var("k2v").setVal(k2v) -func = w.function(f"shapeSig_ch1_VBFHH_morph_externalMorph") +func = w.function("shapeSig_ch1_VBFHH_morph_externalMorph") assert func setvars(0, 1, 1, 1) From f99a2eec84e56e943b6a80727dbca64b72987e75 Mon Sep 17 00:00:00 2001 From: Nick Smith Date: Tue, 29 Aug 2023 17:59:57 -0500 Subject: [PATCH 48/98] =?UTF-8?q?Python2=20compatibility=20=F0=9F=98=A2?= =?UTF-8?q?=F0=9F=98=A2=F0=9F=98=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- python/InterferenceModels.py | 41 +++++++++++++++++++----------------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/python/InterferenceModels.py b/python/InterferenceModels.py index f9289f30dd2..83589057fa5 100644 --- a/python/InterferenceModels.py +++ b/python/InterferenceModels.py @@ -8,7 +8,7 @@ from HiggsAnalysis.CombinedLimit.PhysicsModel import PhysicsModelBase_NiceSubclasses -def read_scaling(path: str): +def read_scaling(path): if path.endswith(".json"): with open(path) as fin: out = json.load(fin) @@ -19,7 +19,7 @@ def read_scaling(path: str): with gzip.open(path, "rb") as fin: out = pickle.load(fin) else: - raise RuntimeError(f"Unrecognized scaling data path {path}; must be either .json, .json.gz, or .pkl.gz") + raise RuntimeError("Unrecognized scaling data path {path}; must be either .json, .json.gz, or .pkl.gz".format(path=path)) # normalize if not isinstance(out, list): raise RuntimeError("Scaling data in invalid format: expected list") @@ -29,19 +29,20 @@ def read_scaling(path: str): raise RuntimeError("Scaling data in invalid format: expected each item in list to be a dict") missing = expected_fields - set(item) if missing: - raise RuntimeError(f"Missing fields in scaling item: {missing}") + raise RuntimeError("Missing fields in scaling item: {missing}".format(missing=missing)) shortname = item["channel"] + "/" + item["process"] if not all(isinstance(par, str) for par in item["parameters"]): - raise RuntimeError(f"Parameters must be a list of strings in {shortname}") + raise RuntimeError("Parameters must be a list of strings in {shortname}".format(shortname=shortname)) try: item["scaling"] = np.array(item["scaling"], dtype=float) - except ValueError as ex: - raise RuntimeError(f"Scaling data invalid: could not normalize array for {shortname}") from ex + except ValueError: + # python3: raise from ex + raise RuntimeError("Scaling data invalid: could not normalize array for {shortname}".format(shortname=shortname)) if len(item["scaling"].shape) != 2: - raise RuntimeError(f"Scaling data invalid: array shape incorrect for {shortname}") + raise RuntimeError("Scaling data invalid: array shape incorrect for {shortname}".format(shortname=shortname)) npar = len(item["parameters"]) if item["scaling"].shape[1] != npar * (npar + 1) // 2: - raise RuntimeError(f"Scaling data invalid: array has insufficent terms for parameters in {shortname}") + raise RuntimeError("Scaling data invalid: array has insufficent terms for parameters in {shortname}".format(shortname=shortname)) return out @@ -79,11 +80,11 @@ def getPOIList(self): print("Building explicitly requested POIs:") for poi in self.explict_pois: if self.verbose: - print(f" - {poi}") + print(" - {poi}".format(poi=poi)) self.modelBuilder.doVar(poi) poiname = re.sub(r"\[.*", "", poi) if not self.modelBuilder.out.var(poiname): - raise RuntimeError(f"Could not find POI {poiname} after factory call") + raise RuntimeError("Could not find POI {poiname} after factory call".format(poiname=poiname)) poiNames.append(poiname) # RooFit would also detect duplicate params with mismatched factory, but this is faster constructed = {} @@ -95,16 +96,16 @@ def getPOIList(self): else: rooparam = self.modelBuilder.factory_(param) if not rooparam: - raise RuntimeError(f"Failed to build {param}") + raise RuntimeError("Failed to build {param}".format(param=param)) if not self.explict_pois and isinstance(rooparam, ROOT.RooRealVar) and not rooparam.isConstant(): if self.verbose: - print(f"Assuming parameter {param} is to be a POI (name: {rooparam.GetName()})") + print("Assuming parameter {param} is to be a POI (name: {name})".format(param=param, name=rooparam.GetName())) poiNames.append(rooparam.GetName()) constructed[param] = rooparam # save for later use in making CMSInterferenceFunc item["parameters_inworkspace"].append(rooparam) if self.verbose: - print(f"All POIs: {poiNames}") + print("All POIs: {poiNames}".format(poiNames=poiNames)) return poiNames def getYieldScale(self, channel, process): @@ -113,9 +114,9 @@ def getYieldScale(self, channel, process): item = self.scaling_map[(channel, process)] except KeyError: if self.verbose: - print(f"Will scale {string} by 1") + print("Will scale {string} by 1".format(string=string)) return 1 - print(f"Will scale {string} using CMSInterferenceFunc dependent on parameters {item['parameters']}") + print("Will scale {string} using CMSInterferenceFunc dependent on parameters {parameters}".format(string=string, parameters=item["parameters"])) item["found"] = True # We don't actually scale the total via this mechanism # and we'll set up the shape effects in done() since shapes aren't available yet @@ -128,20 +129,22 @@ def done(self): string = "%s/%s" % (channel, process) if "found" not in item: if self.verbose: - print(f"Did not find {string} in workspace, even though it is in scaling data") + print("Did not find {string} in workspace, even though it is in scaling data".format(string=string)) continue - hfname = f"shapeSig_{channel}_{process}_morph" + hfname = "shapeSig_{channel}_{process}_morph".format(channel=channel, process=process) histfunc = self.modelBuilder.out.function(hfname) if not histfunc: # if there are no systematics, it ends up with a different name? - hfname = f"shapeSig_{process}_{channel}_rebinPdf" + hfname = "shapeSig_{process}_{channel}_rebinPdf".format(channel=channel, process=process) histfunc = self.modelBuilder.out.function(hfname) # TODO: support FastVerticalInterpHistPdf2 if not isinstance(histfunc, ROOT.CMSHistFunc): self.modelBuilder.out.Print("v") raise RuntimeError( - f"Could not locate the CMSHistFunc for {string}.\nNote that CMSInterferenceFunc currently only supports workspaces that use CMSHistFunc" + "Could not locate the CMSHistFunc for {string}.\nNote that CMSInterferenceFunc currently only supports workspaces that use CMSHistFunc".format( + string=string + ) ) funcname = hfname + "_externalMorph" From 9e40e3c1d12f1f5c2ea8aea0bbb52ebc8189184a Mon Sep 17 00:00:00 2001 From: Nick Smith Date: Tue, 29 Aug 2023 21:23:52 -0500 Subject: [PATCH 49/98] Ensure contiguous --- python/InterferenceModels.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/python/InterferenceModels.py b/python/InterferenceModels.py index 83589057fa5..9726da3edfd 100644 --- a/python/InterferenceModels.py +++ b/python/InterferenceModels.py @@ -34,7 +34,8 @@ def read_scaling(path): if not all(isinstance(par, str) for par in item["parameters"]): raise RuntimeError("Parameters must be a list of strings in {shortname}".format(shortname=shortname)) try: - item["scaling"] = np.array(item["scaling"], dtype=float) + # coerce into numpy with C-contiguous memory (needed for fast std::vector copy) + item["scaling"] = np.ascontiguousarray(item["scaling"], dtype=float) except ValueError: # python3: raise from ex raise RuntimeError("Scaling data invalid: could not normalize array for {shortname}".format(shortname=shortname)) From 5b061b92e73945837a8511768e91756ace1a86f9 Mon Sep 17 00:00:00 2001 From: Nick Smith Date: Tue, 29 Aug 2023 22:01:27 -0500 Subject: [PATCH 50/98] Allow robustHesse without a fit --- src/RobustHesse.cc | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/RobustHesse.cc b/src/RobustHesse.cc index 41371dc7b50..136682e83c5 100644 --- a/src/RobustHesse.cc +++ b/src/RobustHesse.cc @@ -101,6 +101,13 @@ int RobustHesse::setParameterStencil(unsigned i) { double boundLo = rrv->getMin(); double boundHi = rrv->getMax(); + // If we skip initial fit (e.g. to compute from asimov point) + // need a guess for the initial step size + if ( rrv->getError() == 0.0 ) { + valLo = x + 1e-3*(boundLo - x); + valHi = x + 1e-3*(boundHi - x); + } + bool closeToLo = valLo < boundLo; bool closeToHi = valHi > boundHi; From be06332993ffcaa53d7f2865beb9f0136a14b616 Mon Sep 17 00:00:00 2001 From: nckw Date: Wed, 6 Sep 2023 09:19:04 +0100 Subject: [PATCH 51/98] Move batch/grid scripts into separate folder --- test/{ => jobSumission}/combine_crab.cfg | 0 test/{ => jobSumission}/combine_crab.sh | 0 test/{ => jobSumission}/makeAsymptoticGrid.py | 0 test/{ => jobSumission}/makeGrid2DUsingCrab.py | 0 test/{ => jobSumission}/makeGridUsingCrab.py | 0 test/{ => jobSumission}/mkBayesUsingCrab.py | 0 test/plotParametersFromToys.C | 2 +- 7 files changed, 1 insertion(+), 1 deletion(-) rename test/{ => jobSumission}/combine_crab.cfg (100%) rename test/{ => jobSumission}/combine_crab.sh (100%) mode change 100755 => 100644 rename test/{ => jobSumission}/makeAsymptoticGrid.py (100%) rename test/{ => jobSumission}/makeGrid2DUsingCrab.py (100%) mode change 100755 => 100644 rename test/{ => jobSumission}/makeGridUsingCrab.py (100%) mode change 100755 => 100644 rename test/{ => jobSumission}/mkBayesUsingCrab.py (100%) diff --git a/test/combine_crab.cfg b/test/jobSumission/combine_crab.cfg similarity index 100% rename from test/combine_crab.cfg rename to test/jobSumission/combine_crab.cfg diff --git a/test/combine_crab.sh b/test/jobSumission/combine_crab.sh old mode 100755 new mode 100644 similarity index 100% rename from test/combine_crab.sh rename to test/jobSumission/combine_crab.sh diff --git a/test/makeAsymptoticGrid.py b/test/jobSumission/makeAsymptoticGrid.py similarity index 100% rename from test/makeAsymptoticGrid.py rename to test/jobSumission/makeAsymptoticGrid.py diff --git a/test/makeGrid2DUsingCrab.py b/test/jobSumission/makeGrid2DUsingCrab.py old mode 100755 new mode 100644 similarity index 100% rename from test/makeGrid2DUsingCrab.py rename to test/jobSumission/makeGrid2DUsingCrab.py diff --git a/test/makeGridUsingCrab.py b/test/jobSumission/makeGridUsingCrab.py old mode 100755 new mode 100644 similarity index 100% rename from test/makeGridUsingCrab.py rename to test/jobSumission/makeGridUsingCrab.py diff --git a/test/mkBayesUsingCrab.py b/test/jobSumission/mkBayesUsingCrab.py similarity index 100% rename from test/mkBayesUsingCrab.py rename to test/jobSumission/mkBayesUsingCrab.py diff --git a/test/plotParametersFromToys.C b/test/plotParametersFromToys.C index f699092f7d3..4e721d79afe 100644 --- a/test/plotParametersFromToys.C +++ b/test/plotParametersFromToys.C @@ -1,5 +1,5 @@ // Producing suite of plots for diagnostic purposes in CombinedLimit -// Designed to work with mlfit.root file produced with MaxLikelihoodFit +// Designed to work with fitDiagnostics.root file produced with FitDiagnostics // ROOT includes From 57eda5ca3d56f5c4f81cd17c2b85f666d515598b Mon Sep 17 00:00:00 2001 From: nckw Date: Wed, 6 Sep 2023 11:30:02 +0100 Subject: [PATCH 52/98] Update settinguptheanalysis.md Use html directly in sys analyser output --- docs/part2/settinguptheanalysis.md | 135 ++++++++++++++++++++--------- 1 file changed, 96 insertions(+), 39 deletions(-) diff --git a/docs/part2/settinguptheanalysis.md b/docs/part2/settinguptheanalysis.md index de41ba0fe2d..1bcef4be641 100644 --- a/docs/part2/settinguptheanalysis.md +++ b/docs/part2/settinguptheanalysis.md @@ -382,41 +382,6 @@ name rateParam bin process rootfile:workspacename The name should correspond to the name of the object which is being picked up inside the RooWorkspace. A simple example using the SM XS and BR splines available in HiggsAnalysis/CombinedLimit can be found under [data/tutorials/rate_params/simple_sm_datacard.txt](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/data/tutorials/rate_params/simple_sm_datacard.txt) -After running `text2workspace.py` on your datacard, you can check the normalisation objects using the tool `test/printWorkspaceNormalisations.py`. See the example below for the [data/tutorials/shapes/simple-shapes-parametric.txt](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/data/tutorials/shapes/simple-shapes-parametric.txt) datacard. - - -```nohighlight - text2workspace.py data/tutorials/shapes/simple-shapes-parametric.txt - python test/printWorkspaceNormalisations.py data/tutorials/shapes/simple-shapes-parametric.root - ... - - --------------------------------------------------------------------------- - --------------------------------------------------------------------------- - Channel - bin1 - --------------------------------------------------------------------------- - Top-level normalisation for process bkg -> n_exp_final_binbin1_proc_bkg - ------------------------------------------------------------------------- - RooProduct::n_exp_final_binbin1_proc_bkg[ n_exp_binbin1_proc_bkg * shapeBkg_bkg_bin1__norm ] = 521.163 - ... is a product, which contains n_exp_binbin1_proc_bkg - RooRealVar::n_exp_binbin1_proc_bkg = 1 C L(-INF - +INF) - ------------------------------------------------------------------------- - default value = 521.163204829 - --------------------------------------------------------------------------- - Top-level normalisation for process sig -> n_exp_binbin1_proc_sig - ------------------------------------------------------------------------- - Dumping ProcessNormalization n_exp_binbin1_proc_sig @ 0x464f700 - nominal value: 1 - log-normals (1): - kappa = 1.1, logKappa = 0.0953102, theta = lumi = 0 - asymm log-normals (0): - other terms (1): - term r (class RooRealVar), value = 1 - - ------------------------------------------------------------------------- - default value = 1.0 -``` - -This tells us that the normalisation for the background process, named `n_exp_final_binbin1_proc_bkg` is a product of two objects `n_exp_binbin1_proc_bkg * shapeBkg_bkg_bin1__norm`. The first object is just from the **rate** line in the datacard (equal to 1) and the second is a floating parameter. For the signal, the normalisation is called `n_exp_binbin1_proc_sig` and is a `ProcessNormalization` object which contains the rate modifications due to the systematic uncertainties. You can see that it also has a "*nominal value*" which again is just from the value given in the **rate** line of the datacard (again=1). #### Extra arguments @@ -576,13 +541,65 @@ The default output is a `.html` file which allows you to expand to give more det $ python test/systematicsAnalyzer.py data/tutorials/shapes/simple-shapes-TH1.txt > out.html ``` -![systematics analyzer output](images/sysanalyzer.png) + + + + +Nuisance Report + +

  • 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 Ts&G*0v_JQl8>Jf_x$wULT{*M0 From fb10272c191a45cc780c19584828249ec7c7ef16 Mon Sep 17 00:00:00 2001 From: rkansal47 Date: Thu, 27 Jul 2023 08:44:48 -0500 Subject: [PATCH 31/98] docs --- docs/part3/runningthetool.md | 2 +- src/Combine.cc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/part3/runningthetool.md b/docs/part3/runningthetool.md index a4a93a6fa7a..7a229b8f29c 100644 --- a/docs/part3/runningthetool.md +++ b/docs/part3/runningthetool.md @@ -55,7 +55,7 @@ There are a number of useful command line options which can be used to alter the - `--freezeParameters name1[,name2,...]` Will freeze the parameters with the given names to their set values. This option supports the use of regexps via by replacing `name` with `rgx{some regular expression}` for matching to *constrained nuisance parameters* or `var{some regular expression}` for matching to *any* parameter. For example `--freezeParameters rgx{CMS_scale_j.*}` will freeze all constrained nuisance parameters with the prefix `CMS_scale_j`, while `--freezeParameters var{.*rate_scale}` will freeze any parameter (constrained nuisance or otherwise) with the suffix `rate_scale`. - use the option `--freezeParameters allConstrainedNuisances` to freeze all nuisance parameters that have a constraint term (i.e not `flatParams` or `rateParams` or other freely floating parameters). - - similarly the option `--floatParameters` sets the parameter floating. + - similarly the option `--floatParameters` sets the parameter floating (and also accepts regexps, as of version > 9.1.0). - groups of nuisances (constrained or otherwise), as defined in the datacard, can be frozen using `--freezeNuisanceGroups`. You can also specify to freeze nuisances which are *not* contained in a particular group using a **^** before the group name (`--freezeNuisanceGroups=^group_name` will freeze everything except nuisance parameters in the group "group_name".) - all *constrained* nuisance parameters (not `flatParam` or `rateParam`) can be set floating using `--floatAllNuisances`. diff --git a/src/Combine.cc b/src/Combine.cc index 56d46be90e9..a638b4267b7 100644 --- a/src/Combine.cc +++ b/src/Combine.cc @@ -144,7 +144,7 @@ Combine::Combine() : ("validateModel,V", "Perform some sanity checks on the model and abort if they fail.") ("saveToys", "Save results of toy MC in output file") ("floatAllNuisances", po::value(&floatAllNuisances_)->default_value(false), "Make all nuisance parameters floating") - ("floatParameters", po::value(&floatNuisances_)->default_value(""), "Set to floating these parameters (note freeze will take priority over float)") + ("floatParameters", po::value(&floatNuisances_)->default_value(""), "Set to floating these parameters (note freeze will take priority over float), also accepts regexp with syntax 'rgx{}' or 'var{}'") ("freezeAllGlobalObs", po::value(&freezeAllGlobalObs_)->default_value(true), "Make all global observables constant") ; miscOptions_.add_options() From 06ef905dd07009f97a293d44bb267536bce8697b Mon Sep 17 00:00:00 2001 From: rkansal47 Date: Thu, 27 Jul 2023 09:21:10 -0500 Subject: [PATCH 32/98] refactor parse regex --- interface/Combine.h | 1 + src/Combine.cc | 171 ++++++++++++++++---------------------------- 2 files changed, 61 insertions(+), 111 deletions(-) diff --git a/interface/Combine.h b/interface/Combine.h index 6fd5cccc913..5aea6a5e41a 100644 --- a/interface/Combine.h +++ b/interface/Combine.h @@ -70,6 +70,7 @@ class Combine { private: bool mklimit(RooWorkspace *w, RooStats::ModelConfig *mc_s, RooStats::ModelConfig *mc_b, RooAbsData &data, double &limit, double &limitErr) ; + std::string parseRegex(std::string instr, const RooArgSet *nuisances, RooWorkspace *w) ; void addDiscreteNuisances(RooWorkspace *); void addNuisances(const RooArgSet *); void addFloatingParameters(const RooArgSet &); diff --git a/src/Combine.cc b/src/Combine.cc index a638b4267b7..04cfdccd385 100644 --- a/src/Combine.cc +++ b/src/Combine.cc @@ -215,6 +215,64 @@ void Combine::applyOptions(const boost::program_options::variables_map &vm) { makeToyGenSnapshot_ = (method == "FitDiagnostics" && !vm.count("justFit")); } +std::string Combine::parseRegex(std::string instr, const RooArgSet *nuisances, RooWorkspace *w) { + // expand regexps + while (instr.find("rgx{") != std::string::npos) { + size_t pos1 = instr.find("rgx{"); + size_t pos2 = instr.find("}",pos1); + std::string prestr = instr.substr(0,pos1); + std::string poststr = instr.substr(pos2+1,instr.size()-pos2); + std::string reg_esp = instr.substr(pos1+4,pos2-pos1-4); + + //std::cout<<"interpreting "< iter(nuisances->createIterator()); + for (RooAbsArg *a = (RooAbsArg*) iter->Next(); a != 0; a = (RooAbsArg*) iter->Next()) { + const std::string &target = a->GetName(); + std::smatch match; + if (std::regex_match(target, match, rgx)) { + matchingParams = matchingParams + target + ","; + } + } + + instr = prestr+matchingParams+poststr; + instr = boost::replace_all_copy(instr, ",,", ","); + } + + // expand regexps + while (instr.find("var{") != std::string::npos) { + size_t pos1 = instr.find("var{"); + size_t pos2 = instr.find("}",pos1); + std::string prestr = instr.substr(0,pos1); + std::string poststr = instr.substr(pos2+1,instr.size()-pos2); + std::string reg_esp = instr.substr(pos1+4,pos2-pos1-4); + + // std::cout<<"interpreting "< iter(w->componentIterator()); + for (RooAbsArg *a = (RooAbsArg*) iter->Next(); a != 0; a = (RooAbsArg*) iter->Next()) { + + if ( ! (a->IsA()->InheritsFrom(RooRealVar::Class()) || a->IsA()->InheritsFrom(RooCategory::Class()))) continue; + + const std::string &target = a->GetName(); + // std::cout<<"var "< iter(nuisances->createIterator()); - for (RooAbsArg *a = (RooAbsArg*) iter->Next(); a != 0; a = (RooAbsArg*) iter->Next()) { - const std::string &target = a->GetName(); - std::smatch match; - if (std::regex_match(target, match, rgx)) { - matchingParams = matchingParams + target + ","; - } - } - - floatNuisances_ = prestr+matchingParams+poststr; - floatNuisances_ = boost::replace_all_copy(floatNuisances_, ",,", ","); - - } - - // expand regexps - while (floatNuisances_.find("var{") != std::string::npos) { - size_t pos1 = floatNuisances_.find("var{"); - size_t pos2 = floatNuisances_.find("}",pos1); - std::string prestr = floatNuisances_.substr(0,pos1); - std::string poststr = floatNuisances_.substr(pos2+1,floatNuisances_.size()-pos2); - std::string reg_esp = floatNuisances_.substr(pos1+4,pos2-pos1-4); - - // std::cout<<"interpreting "< iter(w->componentIterator()); - for (RooAbsArg *a = (RooAbsArg*) iter->Next(); a != 0; a = (RooAbsArg*) iter->Next()) { - - if ( ! (a->IsA()->InheritsFrom(RooRealVar::Class()) || a->IsA()->InheritsFrom(RooCategory::Class()))) continue; - - const std::string &target = a->GetName(); - // std::cout<<"var "<argSet(floatNuisances_.c_str()))); RooArgSet toFloat; @@ -679,62 +683,7 @@ void Combine::run(TString hlfFile, const std::string &dataset, double &limit, do } if (freezeNuisances_ != "") { - - // expand regexps - while (freezeNuisances_.find("rgx{") != std::string::npos) { - size_t pos1 = freezeNuisances_.find("rgx{"); - size_t pos2 = freezeNuisances_.find("}",pos1); - std::string prestr = freezeNuisances_.substr(0,pos1); - std::string poststr = freezeNuisances_.substr(pos2+1,freezeNuisances_.size()-pos2); - std::string reg_esp = freezeNuisances_.substr(pos1+4,pos2-pos1-4); - - //std::cout<<"interpreting "< iter(nuisances->createIterator()); - for (RooAbsArg *a = (RooAbsArg*) iter->Next(); a != 0; a = (RooAbsArg*) iter->Next()) { - const std::string &target = a->GetName(); - std::smatch match; - if (std::regex_match(target, match, rgx)) { - matchingParams = matchingParams + target + ","; - } - } - - freezeNuisances_ = prestr+matchingParams+poststr; - freezeNuisances_ = boost::replace_all_copy(freezeNuisances_, ",,", ","); - - } - - // expand regexps - while (freezeNuisances_.find("var{") != std::string::npos) { - size_t pos1 = freezeNuisances_.find("var{"); - size_t pos2 = freezeNuisances_.find("}",pos1); - std::string prestr = freezeNuisances_.substr(0,pos1); - std::string poststr = freezeNuisances_.substr(pos2+1,freezeNuisances_.size()-pos2); - std::string reg_esp = freezeNuisances_.substr(pos1+4,pos2-pos1-4); - - // std::cout<<"interpreting "< iter(w->componentIterator()); - for (RooAbsArg *a = (RooAbsArg*) iter->Next(); a != 0; a = (RooAbsArg*) iter->Next()) { - - if ( ! (a->IsA()->InheritsFrom(RooRealVar::Class()) || a->IsA()->InheritsFrom(RooCategory::Class()))) continue; - - const std::string &target = a->GetName(); - // std::cout<<"var "<argSet(freezeNuisances_.c_str()))); RooArgSet toFreeze; From 6d2977e1ef7373ff9d4eb6619be9976f6ef4c643 Mon Sep 17 00:00:00 2001 From: rkansal47 Date: Thu, 27 Jul 2023 09:27:22 -0500 Subject: [PATCH 33/98] comments and indentation --- src/Combine.cc | 48 ++++++++++++++++++++++-------------------------- 1 file changed, 22 insertions(+), 26 deletions(-) diff --git a/src/Combine.cc b/src/Combine.cc index 04cfdccd385..b2281c7928f 100644 --- a/src/Combine.cc +++ b/src/Combine.cc @@ -216,7 +216,7 @@ void Combine::applyOptions(const boost::program_options::variables_map &vm) { } std::string Combine::parseRegex(std::string instr, const RooArgSet *nuisances, RooWorkspace *w) { - // expand regexps + // expand regexps inside the "rgx{}" option while (instr.find("rgx{") != std::string::npos) { size_t pos1 = instr.find("rgx{"); size_t pos2 = instr.find("}",pos1); @@ -224,7 +224,6 @@ std::string Combine::parseRegex(std::string instr, const RooArgSet *nuisances, R std::string poststr = instr.substr(pos2+1,instr.size()-pos2); std::string reg_esp = instr.substr(pos1+4,pos2-pos1-4); - //std::cout<<"interpreting "<argSet(floatNuisances_.c_str()))); RooArgSet toFloat; if (floatNuisances_=="all") { toFloat.add(*nuisances); @@ -672,8 +669,8 @@ void Combine::run(TString hlfFile, const std::string &dataset, double &limit, do } if (verbose > 0) { - std::cout << "Set floating the following parameters: "; toFloat.Print(""); - Logger::instance().log(std::string(Form("Combine.cc: %d -- Set floating the following parameters: ",__LINE__)),Logger::kLogLevelInfo,__func__); + std::cout << "Floating the following parameters: "; toFloat.Print(""); + Logger::instance().log(std::string(Form("Combine.cc: %d -- Floating the following parameters: ",__LINE__)),Logger::kLogLevelInfo,__func__); std::unique_ptr iter(toFloat.createIterator()); for (RooAbsArg *a = (RooAbsArg*) iter->Next(); a != 0; a = (RooAbsArg*) iter->Next()) { Logger::instance().log(std::string(Form("Combine.cc: %d %s ",__LINE__,a->GetName())),Logger::kLogLevelInfo,__func__); @@ -685,7 +682,6 @@ void Combine::run(TString hlfFile, const std::string &dataset, double &limit, do if (freezeNuisances_ != "") { freezeNuisances_ = parseRegex(freezeNuisances_, nuisances, w); - //RooArgSet toFreeze((freezeNuisances_=="all")?*nuisances:(w->argSet(freezeNuisances_.c_str()))); RooArgSet toFreeze; if (freezeNuisances_=="allConstrainedNuisances") { toFreeze.add(*nuisances); @@ -713,7 +709,7 @@ void Combine::run(TString hlfFile, const std::string &dataset, double &limit, do std::unique_ptr iter(toFreeze.createIterator()); for (RooAbsArg *a = (RooAbsArg*) iter->Next(); a != 0; a = (RooAbsArg*) iter->Next()) { Logger::instance().log(std::string(Form("Combine.cc: %d %s ",__LINE__,a->GetName())),Logger::kLogLevelInfo,__func__); - } + } } utils::setAllConstant(toFreeze, true); if (nuisances) { @@ -731,24 +727,24 @@ void Combine::run(TString hlfFile, const std::string &dataset, double &limit, do for (std::vector::iterator ng_it=nuisanceGroups.begin();ng_it!=nuisanceGroups.end();ng_it++){ bool freeze_complement=false; if (boost::algorithm::starts_with((*ng_it),"^")){ - freeze_complement=true; - (*ng_it).erase(0,1); - } + freeze_complement=true; + (*ng_it).erase(0,1); + } - if (!w->set(Form("group_%s",(*ng_it).c_str()))){ - std::cerr << "Unknown nuisance group: " << (*ng_it) << std::endl; - throw std::invalid_argument("Unknown nuisance group name"); - } - RooArgSet groupNuisances(*(w->set(Form("group_%s",(*ng_it).c_str())))); - RooArgSet toFreeze; + if (!w->set(Form("group_%s",(*ng_it).c_str()))){ + std::cerr << "Unknown nuisance group: " << (*ng_it) << std::endl; + throw std::invalid_argument("Unknown nuisance group name"); + } + RooArgSet groupNuisances(*(w->set(Form("group_%s",(*ng_it).c_str())))); + RooArgSet toFreeze; - if (freeze_complement) { - RooArgSet still_floating(*mc->GetNuisanceParameters()); - still_floating.remove(groupNuisances,true,true); - toFreeze.add(still_floating); - } else { - toFreeze.add(groupNuisances); - } + if (freeze_complement) { + RooArgSet still_floating(*mc->GetNuisanceParameters()); + still_floating.remove(groupNuisances,true,true); + toFreeze.add(still_floating); + } else { + toFreeze.add(groupNuisances); + } if (verbose > 0) { std::cout << "Freezing the following nuisance parameters: "; toFreeze.Print(""); } utils::setAllConstant(toFreeze, true); @@ -758,7 +754,7 @@ void Combine::run(TString hlfFile, const std::string &dataset, double &limit, do mc->SetNuisanceParameters(newnuis); if (mc_bonly) mc_bonly->SetNuisanceParameters(newnuis); nuisances = mc->GetNuisanceParameters(); - } + } } } From 1d215accb81a165534024fdc40d4f3443de59940 Mon Sep 17 00:00:00 2001 From: nckw Date: Thu, 27 Jul 2023 21:35:54 +0100 Subject: [PATCH 34/98] Update nonstandard.md --- docs/part3/nonstandard.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/part3/nonstandard.md b/docs/part3/nonstandard.md index c8ba2324e91..353fe55731a 100644 --- a/docs/part3/nonstandard.md +++ b/docs/part3/nonstandard.md @@ -444,8 +444,8 @@ void makeRooMultiPdfWorkspace(){ // Save to a new workspace - TFile *fout = new TFile("workspace.root","RECREATE"); - RooWorkspace wout("workspace","workspaace"); + TFile *fout = new TFile("toyhgg_in.root","RECREATE"); + RooWorkspace wout("multipdf","multipdf"); data->SetName("data"); wout.import(*data); From c520741beacd21ca10a472a54d94a71504e9cb9c Mon Sep 17 00:00:00 2001 From: nckw Date: Thu, 27 Jul 2023 21:41:00 +0100 Subject: [PATCH 35/98] Update nonstandard.md --- docs/part3/nonstandard.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/part3/nonstandard.md b/docs/part3/nonstandard.md index 353fe55731a..ec42a7fd4fa 100644 --- a/docs/part3/nonstandard.md +++ b/docs/part3/nonstandard.md @@ -444,8 +444,8 @@ void makeRooMultiPdfWorkspace(){ // Save to a new workspace - TFile *fout = new TFile("toyhgg_in.root","RECREATE"); - RooWorkspace wout("multipdf","multipdf"); + TFile *fout = new TFile("workspace.root","RECREATE"); + RooWorkspace wout("workspace","workspace"); data->SetName("data"); wout.import(*data); @@ -460,7 +460,7 @@ void makeRooMultiPdfWorkspace(){ The signal is modelled as a simple Gaussian with a width approximately that of the diphoton resolution and the background is a choice of 3 functions. An exponential, a power-law and a 2nd order polynomial. This choice is accessible inside combine through the use of the [RooMultiPdf](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/interface/RooMultiPdf.h) object which can switch between the functions by setting its associated index (herein called **pdf_index**). This (as with all parameters in combine) is accessible via the `--setParameters` option. -To asses the bias, one can throw toys using one function and fit with another. All of this only needs to use one datacard [hgg_toy_datacard.txt](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/tree/81x-root606/data/tutorials/bias_studies/hgg_toy_datacard.txt) +To asses the bias, one can throw toys using one function and fit with another. All of this only needs to use one datacard [hgg_toy_datacard.txt](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/tree/main/data/tutorials/bias_studies/hgg_toy_datacard.txt) The bias studies are performed in two stages. The first is to generate toys using one of the functions under some value of the signal strength **r** (or $\mu$). This can be repeated for several values of **r** and also at different masses, but here the Higgs mass is fixed to 125 GeV. From e5dc8ecdfd8d8e80127feed8ead261d809279eb9 Mon Sep 17 00:00:00 2001 From: nckw Date: Thu, 27 Jul 2023 22:01:11 +0100 Subject: [PATCH 36/98] Add files via upload --- docs/part3/images/discrete_profile.png | Bin 22535 -> 164761 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/part3/images/discrete_profile.png b/docs/part3/images/discrete_profile.png index 2aaefb9b429c4901ad05ce207e4fd9bdf43cf398..0546bbfd589b9ab8bc074a17c12d5dd5e2a4131e 100644 GIT binary patch literal 164761 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%0D?DR4d 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