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/.github/workflows/ci.yml b/.github/workflows/ci.yml index be3abdaab78..81a571f14a0 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 @@ -65,3 +65,9 @@ jobs: run: | 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 + python test_interference.py diff --git a/Makefile b/Makefile index c5d9a120597..3f077a271e6 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 = @@ -97,7 +98,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 -I$(PARENT_DIR) 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/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/contributing.md b/contributing.md new file mode 100644 index 00000000000..172ed36f2b3 --- /dev/null +++ b/contributing.md @@ -0,0 +1,119 @@ +# Contributing + +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. + +Guidelines for contributions are below. + +In general you should always perform the following steps when contributing. + +1. Make your changes; +2. Test your changes to ensure they work and don't break anything; +3. If this changes any user-facing aspect, ensure that the appropriate documentation is updated; +4. Check code style (see below), and fix any issues; +5. Create your pull request; +6. Iterate with the maintainers until the request is merged. + +## Code Style + + +We ask that you put some effort into the readability of your code. +We are, however, always happy to help if there is an issue. + +We use linting as part of our ci/cd for the python code. +That means your code will be checked automatically, and you must make sure it conforms to certain rules. + +Currently no linting or automatic checks of C++ code are implemented. +Although we do not have a well-defined style guide for C++, we always appreciate readable and well-formatted code. + +### Technical details on linting + +we use `flake8` and `black` for linting. +To run the linting locally before making your pull request, or before making a commit, you can do the following. + +ensure `flake8` and `black` are installed: + +``` + python -m pip install -q flake8 black +``` + +and then from the main directory of this repository run + + +flake8: +``` +flake8 . +``` + +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. + + +## Updating Documentation + +It is crucial to our user base and developers that the documentation is well-maintained. +For that reason, whenever you make a change you should consider whether this requires a corresponding documentation update. + +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! +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: + +- your documentation is understandable to the audience being targeted; +- your documentation is clear and concise; and +- your documentation fits in properly with the overall documentation structure. + +### Technical details of the documentation + +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. + +In order to check the documentation rendering (features such as latex math rendering, etc) locally, you can generate the site on your local computer and check it in your browser. +To do so, after [installing mkdocs](https://www.mkdocs.org/getting-started/) and [pymdown extensions](https://facelessuser.github.io/pymdown-extensions/installation/) and the [cinder theme](https://sourcefoundry.org/cinder/) via: + +``` +python -m pip install mkdocs pymdown-extensions mkdocs-cinder +``` + + you can do: + +``` +mkdocs build +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. +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. +This will simplify any potential conflicts when you make your pull request. + +## Requested Contributions + +As part of the long term planning, we have a number of changes we are targeting, but have not yet had a chance to implement. +As well as the [issues](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/issues) listed on the github issues tracker, you can see the [projects](https://github.com/orgs/cms-analysis/projects) listed under the general cms-analysis organization, where we have defined several projects and areas we are targeting. +If you're interested in getting involved in any of these projects please contact us at [cms-cat-stats-conveners@cern.ch](mailto:cms-cat-stats-conveners@cern.ch). + + 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/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/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. 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/index.md b/docs/index.md index 839d91dfce4..e21061d2aa4 100644 --- a/docs/index.md +++ b/docs/index.md @@ -15,7 +15,11 @@ The code can be checked out from GIT and compiled on top of a CMSSW release that # Installation instructions -## Within CMSSW (recommended) +Installation instructions and recommended versions can be found below. +Since v9.0.0, the versioning follows the [semantic versioning 2.0.0 standard](https://semver.org/). +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 @@ -37,12 +41,12 @@ cmsenv git clone https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit.git HiggsAnalysis/CombinedLimit cd HiggsAnalysis/CombinedLimit ``` -Update to a recommended tag - currently the recommended tag is **v9.0.0**: [see release notes](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/releases/tag/v9.0.0) +Update to a recommended tag - currently the recommended tag is **v9.1.0**: [see release notes](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/releases/tag/v9.1.0) ```sh cd $CMSSW_BASE/src/HiggsAnalysis/CombinedLimit git fetch origin -git checkout v9.0.0 +git checkout v9.1.0 scramv1 b clean; scramv1 b # always make a clean build ``` @@ -113,14 +117,18 @@ 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: -``` +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: +```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 @@ -168,6 +176,9 @@ _Prerequisites_ 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. +See [contributing.md](https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit/blob/main/contributing.md) for details about contributing. + # Combine Tool 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: diff --git a/docs/mystyle.css b/docs/mystyle.css index b98f18b87a2..57f24c52e2b 100644 --- a/docs/mystyle.css +++ b/docs/mystyle.css @@ -6,3 +6,14 @@ overflow-y: auto } } + +details { + display: block; + border-left: 0.1em solid #909090; + padding-left: 0.5em; +} + +details[open] { + padding-bottom: 0.5em; +} + 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 diff --git a/docs/part2/images/BB.png b/docs/part2/images/BB.png new file mode 100644 index 00000000000..bdd87880290 Binary files /dev/null and b/docs/part2/images/BB.png differ diff --git a/docs/part2/images/narrow.png b/docs/part2/images/narrow.png index 05d66437e2f..3d578cc31b2 100644 Binary files a/docs/part2/images/narrow.png and b/docs/part2/images/narrow.png differ diff --git a/docs/part2/images/wide.png b/docs/part2/images/wide.png index 7270b579ec5..14ad2d32412 100644 Binary files a/docs/part2/images/wide.png and b/docs/part2/images/wide.png differ diff --git a/docs/part2/physicsmodels.md b/docs/part2/physicsmodels.md index e5822449f54..a00cf0249d8 100644 --- a/docs/part2/physicsmodels.md +++ b/docs/part2/physicsmodels.md @@ -213,19 +213,19 @@ 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$, +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 = 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, @@ -244,3 +244,113 @@ 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. 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 model, for each bin find $y_0$ and put it into the datacard as a signal process, then find $M$ and +save the lower 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) +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 + 1): + 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 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 +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^2$, 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.30353674666415, -8.54170982038222, 22.96464188467882, 4.2353483207128, -11.07996258835088, 5.504469544697623], + [2.20644332142891, -7.076836641962523, 23.50989689214267, 4.053185685866683, -13.08569222837996, 7.502346155380032] + ] + } +] +``` + +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]' +``` diff --git a/docs/part2/settinguptheanalysis.md b/docs/part2/settinguptheanalysis.md index de41ba0fe2d..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) @@ -382,43 +382,8 @@ 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 +### 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 @@ -573,16 +538,90 @@ 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 ``` -![systematics analyzer output](images/sysanalyzer.png) +which will produce the following output in html format. + + + + + +Nuisance Report + +

Nuisance Report

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Nuisance (types)RangeProcessesChannels
lumi (lnN)1.0001.100 background, signal bin1(1) [+]
alpha (shape)1.1111.150 background bin1(1) [+]
bgnorm (lnN)1.0001.300 background, signal bin1(1) [+]
sigma (shape)1.0001.000 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 +686,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). diff --git a/docs/part3/commonstatsmethods.md b/docs/part3/commonstatsmethods.md index 04ac5d7d0aa..059b2f4bc87 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 -- @@ -186,8 +184,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 +247,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 @@ -262,24 +259,23 @@ 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 +#### 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 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 +#### 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) @@ -289,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**. @@ -299,13 +295,13 @@ 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), - 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). @@ -360,8 +356,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 +526,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). @@ -599,10 +595,23 @@ 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**. +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. + +/// details | **qLHC test stat example** + +![](images/exampleLHC.jpg) + +/// + +/// details | **qTEV test stat example** + +![](images/exampleTEV.jpg) + +/// + ## Computing Significances with toys @@ -712,11 +721,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: @@ -727,11 +742,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) +/// + +/// details | **Goodness-of-fit for CR-only model** -??? "Goodness-of-fit for CR-only model" - ![](images/gof_CRonly.png) +![](images/gof_CRonly.png) +/// ### Making a plot of the GoF test-statistic distribution @@ -795,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 @@ -831,8 +850,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
@@ -868,7 +886,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, @@ -912,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: @@ -981,7 +999,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 @@ -1005,11 +1023,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 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. +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. -##### 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, @@ -1021,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/images/Unfolding_Comparison.png b/docs/part3/images/Unfolding_Comparison.png new file mode 100644 index 00000000000..a91e0cf25f1 Binary files /dev/null and b/docs/part3/images/Unfolding_Comparison.png differ diff --git a/docs/part3/images/Unfolding_Regularization_comparison.png b/docs/part3/images/Unfolding_Regularization_comparison.png new file mode 100644 index 00000000000..8ba9c6c4b1f Binary files /dev/null and b/docs/part3/images/Unfolding_Regularization_comparison.png differ diff --git a/docs/part3/images/bayes1D.png b/docs/part3/images/bayes1D.png index 0915d739b6d..a4cad67d699 100644 Binary files a/docs/part3/images/bayes1D.png and b/docs/part3/images/bayes1D.png differ diff --git a/docs/part3/images/discrete_profile.png b/docs/part3/images/discrete_profile.png index 2aaefb9b429..0546bbfd589 100644 Binary files a/docs/part3/images/discrete_profile.png and b/docs/part3/images/discrete_profile.png differ diff --git a/docs/part3/images/exampleLHC.jpg b/docs/part3/images/exampleLHC.jpg new file mode 100644 index 00000000000..8c2c4143a9c Binary files /dev/null and b/docs/part3/images/exampleLHC.jpg differ diff --git a/docs/part3/images/exampleTEV.jpg b/docs/part3/images/exampleTEV.jpg new file mode 100644 index 00000000000..2487e7fb09b Binary files /dev/null and b/docs/part3/images/exampleTEV.jpg differ diff --git a/docs/part3/images/masking_tutorial.png b/docs/part3/images/masking_tutorial.png index 3105e1c06ec..aae9a2f83af 100644 Binary files a/docs/part3/images/masking_tutorial.png and b/docs/part3/images/masking_tutorial.png differ diff --git a/docs/part3/nonstandard.md b/docs/part3/nonstandard.md index 71af28eff95..347f7f805a3 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! @@ -341,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). @@ -443,7 +445,7 @@ void makeRooMultiPdfWorkspace(){ // Save to a new workspace TFile *fout = new TFile("workspace.root","RECREATE"); - RooWorkspace wout("workspace","workspaace"); + RooWorkspace wout("workspace","workspace"); data->SetName("data"); wout.import(*data); @@ -458,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. 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.) diff --git a/docs/part3/runningthetool.md b/docs/part3/runningthetool.md index a4a93a6fa7a..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. @@ -192,21 +192,21 @@ 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). !!! 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,12 +314,12 @@ 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, 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 ``` diff --git a/docs/part3/simplifiedlikelihood.md b/docs/part3/simplifiedlikelihood.md index d145a111b76..382dda73a49 100644 --- a/docs/part3/simplifiedlikelihood.md +++ b/docs/part3/simplifiedlikelihood.md @@ -1,6 +1,6 @@ # Procedure for creating and validating simplified likelihood inputs -This page is to give a brief outline for the creation of (potentially aggregated) predictions and their covariance to facilitate external reinterpretation using the simplified likelihood (SL) approach. Instructions for validating the simplified likelihood method (detailed in the note [here](https://cds.cern.ch/record/2242860/files/NOTE2017_001.pdf) and [here](https://arxiv.org/abs/1809.05548)) in the linear mode are also given. +This page is to give a brief outline for the creation of (potentially aggregated) predictions and their covariance to facilitate external reinterpretation using the simplified likelihood (SL) approach. Instructions for validating the simplified likelihood method (detailed in the CMS note [here](https://cds.cern.ch/record/2242860/files/NOTE2017_001.pdf) and "[The Simplified Likelihood Framework](https://link.springer.com/article/10.1007/JHEP04(2019)064)" paper) are also given. ## Requirements @@ -15,7 +15,7 @@ bash checkoutSL.sh ls work-tools/stats-tools ``` -If you also want to validate your inputs and perform fits/scans using them, you can use the package [SLtools](https://gitlab.cern.ch/SimplifiedLikelihood/SLtools/-/blob/master/README.md) for this. +If you also want to validate your inputs and perform fits/scans using them, you can use the package [SLtools](https://gitlab.cern.ch/SimplifiedLikelihood/SLtools/-/blob/master/README.md) from [The Simplified Likelihood Framework](https://link.springer.com/article/10.1007/JHEP04(2019)064) paper for this. ``` git clone https://gitlab.cern.ch/SimplifiedLikelihood/SLtools.git ``` @@ -109,7 +109,7 @@ At this point you now have the inputs as ROOT files necessary to publish and run 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) for this. The first step is to convert the ROOT files into python configs to run in the tool. +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. ### Convert ROOT to Python diff --git a/docs/part4/usefullinks.md b/docs/part4/usefullinks.md index cc7ef28d437..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 @@ -72,7 +75,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?_ 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? 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? 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 53c09837458..28d0b5c6d86 100644 --- a/interface/CMSHistFunc.h +++ b/interface/CMSHistFunc.h @@ -15,6 +15,7 @@ #include "CMSHistV.h" #include "FastTemplate_Old.h" #include "SimpleCacheSentry.h" +#include "CMSExternalMorph.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,7 @@ class CMSHistFunc : public RooAbsReal { friend class CMSHistV; friend class CMSHistSum; + void injectExternalMorph(CMSExternalMorph& morph); /* – RooAbsArg::setVerboseEval(Int_t level) • Level 0 – No messages @@ -190,6 +192,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 +219,7 @@ class CMSHistFunc : public RooAbsReal { void applyRebin() const; - ClassDef(CMSHistFunc, 1) + ClassDef(CMSHistFunc, 2) }; diff --git a/interface/CMSHistSum.h b/interface/CMSHistSum.h index 4fe3e375ac9..23b39c95635 100644 --- a/interface/CMSHistSum.h +++ b/interface/CMSHistSum.h @@ -73,9 +73,13 @@ 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; + void injectExternalMorph(int idx, CMSExternalMorph& morph); + protected: RooRealProxy x_; @@ -128,6 +132,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 +150,7 @@ class CMSHistSum : public RooAbsReal { private: - ClassDef(CMSHistSum,1) + ClassDef(CMSHistSum,2) }; #endif diff --git a/interface/CMSInterferenceFunc.h b/interface/CMSInterferenceFunc.h new file mode 100644 index 00000000000..14be41fcca2 --- /dev/null +++ b/interface/CMSInterferenceFunc.h @@ -0,0 +1,55 @@ +#ifndef CMSInterferenceFunc_h +#define CMSInterferenceFunc_h +#include "RooListProxy.h" +#include "SimpleCacheSentry.h" + +#include "CMSExternalMorph.h" + +class _InterferenceEval; + +class CMSInterferenceFunc : public CMSExternalMorph { + 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 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, + const char* title, + RooRealVar& x, + const std::vector& edges, + const RooArgList& coefficients, + 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; + + bool hasChanged() const override { return !sentry_.good(); }; + const std::vector& batchGetBinValues() const override; + + protected: + RooListProxy coefficients_; + std::vector> binscaling_; + + mutable SimpleCacheSentry sentry_; //! + mutable std::unique_ptr<_InterferenceEval> evaluator_; //! + + private: + void initialize() const; + void updateCache() const; + + ClassDefOverride(CMSInterferenceFunc, 1) +}; + +#endif // CMSInterferenceFunc_h 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/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/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/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); 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/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/interface/ToyMCSamplerOpt.h b/interface/ToyMCSamplerOpt.h index 0a533813769..3db8a8572dd 100644 --- a/interface/ToyMCSamplerOpt.h +++ b/interface/ToyMCSamplerOpt.h @@ -10,7 +10,7 @@ namespace toymcoptutils { class SinglePdfGenInfo { public: enum Mode { Binned, BinnedNoWorkaround, Poisson, Unbinned, Counting }; - SinglePdfGenInfo(RooAbsPdf &pdf, const RooArgSet& observables, bool preferBinned, const RooDataSet* protoData = NULL, int forceEvents = 0) ; + SinglePdfGenInfo(RooAbsPdf &pdf, const RooArgSet& observables, bool preferBinned, const RooDataSet* protoData = NULL, int forceEvents = 0, bool canUseSpec = true) ; ~SinglePdfGenInfo() ; RooAbsData *generate(const RooDataSet* protoData = NULL, int forceEvents = 0) ; RooDataSet *generateAsimov(RooRealVar *&weightVar, double weightScale = 1.0, int verbose = 0) ; @@ -22,6 +22,7 @@ namespace toymcoptutils { Mode mode_; RooAbsPdf *pdf_; RooArgSet observables_; + bool canUseSpec_; RooAbsPdf::GenSpec *spec_; TH1 *histoSpec_; bool keepHistoSpec_; @@ -33,7 +34,7 @@ namespace toymcoptutils { }; class SimPdfGenInfo { public: - SimPdfGenInfo(RooAbsPdf &pdf, const RooArgSet& observables, bool preferBinned, const RooDataSet* protoData = NULL, int forceEvents = 0) ; + SimPdfGenInfo(RooAbsPdf &pdf, const RooArgSet& observables, bool preferBinned, const RooDataSet* protoData = NULL, int forceEvents = 0, bool canUseSpec = true) ; ~SimPdfGenInfo() ; RooAbsData *generate(RooRealVar *&weightVar, const RooDataSet* protoData = NULL, int forceEvents = 0) ; RooAbsData *generateAsimov(RooRealVar *&weightVar, int verbose = 0 ) ; @@ -77,6 +78,7 @@ class ToyMCSamplerOpt : public RooStats::ToyMCSampler{ // We can't use the NuisanceParameterSampler because, even if public, there's no interface file for it mutable RooDataSet *nuisValues_; mutable int nuisIndex_; + bool genNuis_; mutable RooRealVar *weightVar_; mutable std::map genCache_; 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 diff --git a/python/InterferenceModels.py b/python/InterferenceModels.py new file mode 100644 index 00000000000..16d6ba3bcfe --- /dev/null +++ b/python/InterferenceModels.py @@ -0,0 +1,184 @@ +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): + 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("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") + 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("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("Parameters must be a list of strings in {shortname}".format(shortname=shortname)) + try: + # 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)) + if len(item["scaling"].shape) != 2: + 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("Scaling data invalid: array has insufficent terms for parameters in {shortname}".format(shortname=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(" - {poi}".format(poi=poi)) + self.modelBuilder.doVar(poi) + poiname = re.sub(r"\[.*", "", poi) + if not self.modelBuilder.out.var(poiname): + 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 = {} + 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("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("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("All POIs: {poiNames}".format(poiNames=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("Will scale {string} by 1".format(string=string)) + return 1 + 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 + 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("Did not find {string} in workspace, even though it is in scaling data".format(string=string)) + continue + + 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 = "shapeSig_{process}_{channel}_rebinPdf".format(channel=channel, process=process) + histfunc = self.modelBuilder.out.function(hfname) + if not histfunc: + # assume this is a CMSHistSum workspace + 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( + "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" + + 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(), edges, params, scaling_array)) + func = self.modelBuilder.out.function(funcname) + if isinstance(histfunc, ROOT.CMSHistFunc): + histfunc.injectExternalMorph(func) + elif isinstance(histfunc, ROOT.CMSHistSum): + postfix = "bin{channel}_proc_{process}".format(channel=channel, process=process) + for idx, coef in enumerate(histfunc.coefList()): + if coef.GetName() in ("n_exp_" + postfix, "n_exp_final_" + postfix): + if self.verbose: + print("Injecting external morph for " + funcname) + histfunc.injectExternalMorph(idx, func) + break + + +interferenceModel = InterferenceModel() 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/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 dfa7e8b7e62..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) { @@ -352,7 +348,7 @@ double AsymptoticLimits::getCLs(RooRealVar &r, double rVal, bool getAlsoExpected if (doCLs_) { *limit = (pb != 0 ? pmu/pb : 0); *limitErr = 0 ; } else { *limit = (pmu); *limitErr = 0; } Combine::commitPoint(true, quantiles[iq]); - if (verbose > 0) printf("Expected %4.1f%%: Pmu = %.5f Pb = %.5f CLs = %.5f\n", quantiles[iq]*100, pmu, pb, pmu/pb); + if (verbose > 0) printf("Expected %4.1f%%: Pmu = %.5f 1-Pb = %.5f CLs = %.5f\n", quantiles[iq]*100, pmu, pb, pmu/pb); } } return doCLs_ ? CLs : Pmu ; @@ -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/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 6c7463d7943..045f802e278 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() && static_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 = 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/src/CMSInterferenceFunc.cxx b/src/CMSInterferenceFunc.cxx new file mode 100644 index 00000000000..e0ecc8e056f --- /dev/null +++ b/src/CMSInterferenceFunc.cxx @@ -0,0 +1,128 @@ +#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 + ) : + CMSExternalMorph(other, name), + coefficients_("coefficients", this, other.coefficients_), + binscaling_(other.binscaling_), + sentry_(name ? TString(name) + "_sentry" : TString(other.GetName())+"_sentry", "") +{ +} + +CMSInterferenceFunc::CMSInterferenceFunc( + const char* name, + const char* title, + RooRealVar& x, + const std::vector& edges, + RooArgList const& coefficients, + const std::vector> binscaling + ) : + CMSExternalMorph(name, title, x, edges), + coefficients_("coefficients", "", this), + binscaling_(binscaling), + sentry_(TString(name) + "_sentry", "") +{ + coefficients_.add(coefficients); +} + +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_.good() ? "clean" : "dirty") << "\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(); + + 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 (" + + 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 lower 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) + ")" + ); + } + } + + 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) { + auto* coef = static_cast(coefficients_.at(i)); + if ( coef == nullptr ) throw std::runtime_error("Lost coef!"); + evaluator_->setCoefficient(i, coef->getVal()); + } + evaluator_->computeValues(); + sentry_.reset(); +} + +const std::vector& CMSInterferenceFunc::batchGetBinValues() const { + if ( not evaluator_ ) initialize(); + if ( not sentry_.good() ) updateCache(); + return evaluator_->getValues(); +} + 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/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; } diff --git a/src/Combine.cc b/src/Combine.cc index 392c00fd110..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; @@ -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() @@ -215,6 +215,62 @@ 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 inside the "rgx{}" option + 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::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()) { + 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 inside the "var{}" option + 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::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()) { + + 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()))); + floatNuisances_ = parseRegex(floatNuisances_, nuisances, w); + + 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::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); } if (freezeNuisances_ != "") { + freezeNuisances_ = parseRegex(freezeNuisances_, nuisances, w); - // 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; if (freezeNuisances_=="allConstrainedNuisances") { toFreeze.add(*nuisances); @@ -682,12 +704,12 @@ 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); if (nuisances) { @@ -705,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); @@ -732,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(); - } + } } } @@ -956,15 +978,15 @@ void Combine::run(TString hlfFile, const std::string &dataset, double &limit, do utils::setAllConstant(*mc->GetParametersOfInterest(), false); w->saveSnapshot("clean", utils::returnAllVars(w)); } else { - toymcoptutils::SimPdfGenInfo newToyMC(*genPdf, *observables, !unbinned_); + toymcoptutils::SimPdfGenInfo newToyMC(*genPdf, *observables, !unbinned_); // 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) @@ -985,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(); @@ -999,7 +1019,7 @@ void Combine::run(TString hlfFile, const std::string &dataset, double &limit, do std::unique_ptr nuisancePdf; if (nToys > 0) { if (genPdf == 0) throw std::invalid_argument("You can't generate background-only toys if you have no background-only pdf in the workspace and you have set --noMCbonly"); - toymcoptutils::SimPdfGenInfo newToyMC(*genPdf, *observables, !unbinned_); + toymcoptutils::SimPdfGenInfo newToyMC(*genPdf, *observables, !unbinned_, NULL, 0, toysFrequentist_); double expLimit = 0; unsigned int nLimits = 0; w->loadSnapshot("clean"); @@ -1059,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__); } } @@ -1215,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); } } @@ -1231,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/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; diff --git a/src/HybridNew.cc b/src/HybridNew.cc index 780b02784df..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()); @@ -1638,29 +1631,22 @@ std::pair HybridNew::updateGridPoint(RooWorkspace *w, RooStats::M RooRealVar *r = dynamic_cast(poi.first()); if (expectedFromGrid_) { applyExpectedQuantile(*point->second); - point->second->SetTestStatisticData(point->second->GetTestStatisticData() + (isProfile ? EPS : EPS)); + point->second->SetTestStatisticData(point->second->GetTestStatisticData() + (isProfile ? -EPS : EPS)); } else { Setup setup; std::unique_ptr hc = create(w, mc_s, mc_b, data, point->first, setup); RooArgSet nullPOI(*setup.modelConfig_bonly.GetSnapshot()); if (isProfile) nullPOI.setRealValue(r->GetName(), point->first); 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; + point->second->SetTestStatisticData(testStat + (isProfile ? -EPS : EPS)); } - 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/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) 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; 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/ToyMCSamplerOpt.cc b/src/ToyMCSamplerOpt.cc index 63e7e4499af..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 @@ -22,7 +22,7 @@ ToyMCSamplerOpt::ToyMCSamplerOpt(RooStats::TestStatistic& ts, Int_t ntoys, RooAb ToyMCSampler(ts, ntoys), globalObsPdf_(globalObsPdf), globalObsValues_(0), globalObsIndex_(-1), - nuisValues_(0), nuisIndex_(-1), + nuisValues_(0), nuisIndex_(-1), genNuis_(generateNuisances), weightVar_(0) { if (!generateNuisances) fPriorNuisance = 0; // set things straight from the beginning @@ -63,9 +63,10 @@ ToyMCSamplerOpt::~ToyMCSamplerOpt() } -toymcoptutils::SinglePdfGenInfo::SinglePdfGenInfo(RooAbsPdf &pdf, const RooArgSet& observables, bool preferBinned, const RooDataSet* protoData, int forceEvents) : +toymcoptutils::SinglePdfGenInfo::SinglePdfGenInfo(RooAbsPdf &pdf, const RooArgSet& observables, bool preferBinned, const RooDataSet* protoData, int forceEvents, bool canUseSpec) : mode_(pdf.canBeExtended() ? (preferBinned ? Binned : Unbinned) : Counting), pdf_(&pdf), + canUseSpec_(canUseSpec), spec_(0),histoSpec_(0),keepHistoSpec_(0),weightVar_(0) { if (pdf.canBeExtended()) { @@ -104,7 +105,7 @@ toymcoptutils::SinglePdfGenInfo::generate(const RooDataSet* protoData, int force RooAbsData *ret = 0; switch (mode_) { case Unbinned: - if (spec_ == 0) spec_ = protoData ? pdf_->prepareMultiGen(observables_, RooFit::Extended(), RooFit::ProtoData(*protoData, true, true)) + if (spec_ == 0 && canUseSpec_) spec_ = protoData ? pdf_->prepareMultiGen(observables_, RooFit::Extended(), RooFit::ProtoData(*protoData, true, true)) : pdf_->prepareMultiGen(observables_, RooFit::Extended()); if (spec_) ret = pdf_->generate(*spec_); else ret = pdf_->generate(observables_, RooFit::Extended()); @@ -142,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()) { @@ -170,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); @@ -209,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_); @@ -324,7 +319,7 @@ toymcoptutils::SinglePdfGenInfo::setToExpected(RooPoisson &pois, RooArgSet &obs) myobs->setVal(myexp->getVal()); } -toymcoptutils::SimPdfGenInfo::SimPdfGenInfo(RooAbsPdf &pdf, const RooArgSet& observables, bool preferBinned, const RooDataSet* protoData, int forceEvents) : +toymcoptutils::SimPdfGenInfo::SimPdfGenInfo(RooAbsPdf &pdf, const RooArgSet& observables, bool preferBinned, const RooDataSet* protoData, int forceEvents, bool canUseSpec) : pdf_(&pdf), cat_(0), observables_(observables), @@ -342,13 +337,13 @@ toymcoptutils::SimPdfGenInfo::SimPdfGenInfo(RooAbsPdf &pdf, const RooArgSet& obs RooAbsPdf *pdfi = simPdf->getPdf(cat_->getLabel()); if (pdfi == 0) throw std::logic_error(std::string("Unmapped category state: ") + cat_->getLabel()); RooAbsPdf *newpdf = utils::factorizePdf(observables, *pdfi, dummy); - pdfs_[ic] = new SinglePdfGenInfo(*newpdf, observables, preferBinned); + pdfs_[ic] = new SinglePdfGenInfo(*newpdf, observables, preferBinned, NULL, 0, canUseSpec); if (newpdf != 0 && newpdf != pdfi) { ownedCrap_.addOwned(*newpdf); } } } else { - pdfs_.push_back(new SinglePdfGenInfo(pdf, observables, preferBinned, protoData, forceEvents)); + pdfs_.push_back(new SinglePdfGenInfo(pdf, observables, preferBinned, protoData, forceEvents, canUseSpec)); } } @@ -705,7 +700,7 @@ ToyMCSamplerOpt::Generate(RooAbsPdf& pdf, RooArgSet& observables, const RooDataS //utils::printPdf(&pdf); toymcoptutils::SimPdfGenInfo *& info = genCache_[&pdf]; if (info == 0) { - info = new toymcoptutils::SimPdfGenInfo(pdf, observables, fGenerateBinned, protoData, forceEvents); + info = new toymcoptutils::SimPdfGenInfo(pdf, observables, fGenerateBinned, protoData, forceEvents, !genNuis_); info->setCopyData(false); if (!fPriorNuisance && importanceSnapshots_.empty()) info->setCacheTemplates(true); } diff --git a/src/classes.h b/src/classes.h index 6e5cf34f4b2..8006a82b9ae 100644 --- a/src/classes.h +++ b/src/classes.h @@ -67,6 +67,9 @@ #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" #include "HiggsAnalysis/CombinedLimit/interface/PolinomialExponent_1p.hpp" #include "HiggsAnalysis/CombinedLimit/interface/PolinomialExponent_2p.hpp" diff --git a/src/classes_def.xml b/src/classes_def.xml index e0c5347db62..f344eb49962 100644 --- a/src/classes_def.xml +++ b/src/classes_def.xml @@ -33,6 +33,7 @@ + @@ -221,6 +222,11 @@ + + + + + @@ -228,4 +234,5 @@ + 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]++; 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 diff --git a/test/plotTestStatCLs.py b/test/plotTestStatCLs.py index 797f9f41d0a..ea5de7630e3 100755 --- a/test/plotTestStatCLs.py +++ b/test/plotTestStatCLs.py @@ -15,6 +15,7 @@ ROOT.gROOT.SetBatch(1) ROOT.gROOT.ProcessLine(".L $CMSSW_BASE/src/HiggsAnalysis/CombinedLimit/test/plotting/hypoTestResultTree.cxx") ROOT.gROOT.ProcessLine(".L $CMSSW_BASE/src/HiggsAnalysis/CombinedLimit/test/plotting/qmuPlot.cxx") +ROOT.gStyle.SetOptStat(0) from ROOT import hypoTestResultTree, q0Plot, qmuPlot @@ -25,12 +26,12 @@ "--invert", default=False, action="store_true", - help="Invert Alt for Null in Plotting (+ numbers)", + help="Invert Alt for Null in Plotting (+ numbers). Necessary for some test-statistics (but not typical for limits/significance)", ) parser.add_option( "-o", "--output", - default="cls_qmu_distributions.root", + default="test_stat_distributions.root", type="str", help="outputfile for plots", ) @@ -40,7 +41,15 @@ "--val", default="all", type="str", - help="poi values, comma separated (type all to make a plot for every value found in the file?!)", + help="poi values, comma separated (type all to make a plot for every value found in the file)", +) +parser.add_option( + "", + "--sub-label", + default="", + type="str", + dest="sub_label", + help="change sub-label from q to q_sub_label (doesn't apply if using --signif option", ) parser.add_option( "-r", @@ -68,7 +77,7 @@ "--expected", default=False, action="store_true", - help="Replace observation with expected (under alt hyp)", + help="Replace observation with expected (under alt hyp - useful for limits)", ) parser.add_option( "-q", @@ -89,7 +98,23 @@ "--signif", action="store_true", default=False, - help="If significance, don't plot Pmu, i.e make the q0 plot", + help="If significance, plot the distribution of q0 by default for the background only hypothesis", +) + +parser.add_option( + "", + "--plot_both", + action="store_true", + default=False, + help="If --signif, Force plotting of both distributions (including for signal injected).", +) +parser.add_option( + "", + "--save-as-pdf", + dest="save_as_pdf", + action="store_true", + default=False, + help="Save plots as pdfs as well as Canvases in root files.", ) (options, args) = parser.parse_args() @@ -97,6 +122,8 @@ options.expected = True if options.expected and options.quantileExpected < 0: sys.exit("You should specify a quantile for the expected result, eg 0.5 for median expected") +if options.plot_both and not options.signif: + sys.exit("plot_both only works with significance test-stat distribution") def findPOIvals(fi, m): @@ -146,7 +173,7 @@ def findPOIvals(fi, m): ft = ROOT.TFile.Open("tmp_out.root") print("Plotting ... ") if options.signif: - can = q0Plot(float(m), options.poi, options.rebin) + can = q0Plot(float(m), options.poi, float(pv), options.rebin, options.plot_both) else: can = qmuPlot( float(m), @@ -157,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 0347684c060..e75bf6759ad 100644 --- a/test/plotting/qmuPlot.cxx +++ b/test/plotting/qmuPlot.cxx @@ -100,7 +100,7 @@ double tailReal(TTree *t, std::string br, double cv, int mode){ -TCanvas *q0Plot(float mass, std::string poinam , int rebin=0) { +TCanvas *q0Plot(float mass, std::string poinam , float poival, int rebin=0, bool plotBoth=false) { if (gFile == 0) { std::cerr << "You must have a file open " << std::endl; return 0; } TTree *t = (TTree *) gFile->Get("q"); @@ -110,12 +110,19 @@ TCanvas *q0Plot(float mass, std::string poinam , int rebin=0) { c1->SetBottomMargin(0.15); TH1F *qB; - TH1F *qS; + //TH1F *qS; t->Draw("max(2*q,0)>>qB","weight*(type==-1)"); qB = (TH1F*) gROOT->FindObject("qB")->Clone(); qB->SetName("NullHyp"); qB->Print(); + + TH1F *qS = new TH1F("qS","qS",qB->GetNbinsX(),qB->GetBinLowEdge(1),qB->GetBinLowEdge(qB->GetNbinsX())+1); + + t->Draw("max(2*q,0)>>qS","weight*(type==+1)"); + qS = (TH1F*) gROOT->FindObject("qS")->Clone(); + qS->SetName("AltHyp"); + qS->Print(); double yMin = 4.9/qB->Integral(); @@ -126,14 +133,18 @@ TCanvas *q0Plot(float mass, std::string poinam , int rebin=0) { if (rebin>0){ qB->Rebin(rebin); + qS->Rebin(rebin); } double nB = qB->Integral(); qB->Scale(1.0/qB->Integral()); + qS->Scale(1.0/qS->Integral()); gStyle->SetOptStat(0); c1->SetLogy(1); qB->SetLineColor(kRed); qB->SetLineWidth(2); + qS->SetLineColor(kBlue); + qS->SetLineWidth(2); qO->SetLineColor(kBlack); qO->SetLineWidth(3); @@ -159,6 +170,7 @@ TCanvas *q0Plot(float mass, std::string poinam , int rebin=0) { leg1->SetLineColor(1); leg1->AddEntry(qB, "expected for Null", "L"); + if (plotBoth) leg1->AddEntry(qS, Form("expected for Alternative (%s=%g)",poinam.c_str(),poival), "L"); leg1->AddEntry(qO, "observed value", "L"); TLegend *leg2 = new TLegend(.58,.67,.93,.54); @@ -170,6 +182,9 @@ TCanvas *q0Plot(float mass, std::string poinam , int rebin=0) { leg2->AddEntry(qB1, Form("CL_{b} = %.4f (%.1f#sigma)", pB,sig), "F"); qB->Draw(); qB1->Draw("HIST SAME"); + if (plotBoth){ + qS->Draw("same"); + } qO->Draw(); qB->Draw("AXIS SAME"); qB->GetYaxis()->SetRangeUser(yMin, 2.0); @@ -187,7 +202,7 @@ TCanvas *q0Plot(float mass, std::string poinam , int rebin=0) { -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; } @@ -198,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)"); @@ -278,7 +303,7 @@ TCanvas *qmuPlot(float mass, std::string poinam, double poival, int mode=0, int double pSerr = clS * TMath::Hypot(pBerr/pB, pMUerr/pMU); printf("Pmu = %.4f +/- %.4f\n", pMU , pMUerr); printf("1-Pb = %.4f +/- %.4f\n", pB , pBerr); - printf("CLs = %.4f +/- %.4f\n", pMu , pMuerr); + printf("CLs = %.4f +/- %.4f\n", clS , pSerr); // Worst way to calculate ! TH1F *qS1 = tail(qS, qObs,mode); @@ -306,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); @@ -316,7 +343,7 @@ TCanvas *qmuPlot(float mass, std::string poinam, double poival, int mode=0, int leg2->AddEntry(qS1, Form("p_{#mu} = %.4f", pMU), "F"); //if (mode==0) leg2->AddEntry(qB1, Form("1-p_{b} = %.4f", pB), "F"); - leg2->AddEntry("", Form("CL_{s} = %.4f", pS), ""); + leg2->AddEntry("", Form("CL_{s} = %.4f", clS), ""); qB->Draw(); @@ -339,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); diff --git a/test/test_interference.py b/test/test_interference.py new file mode 100755 index 00000000000..a97e2414093 --- /dev/null +++ b/test/test_interference.py @@ -0,0 +1,202 @@ +#!/usr/bin/env python3 +import ROOT +import numpy as np +import subprocess +import json + + +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 +""" + ) + +# 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.30353674666415, -8.54170982038222, 22.96464188467882, 4.2353483207128, -11.07996258835088, 5.504469544697623], + [2.20644332142891, -7.076836641962523, 23.50989689214267, 4.053185685866683, -13.08569222837996, 7.502346155380032], + [2.323314512827915, -9.040565356058327, 35.97836755817654, 6.135410429832603, -23.87500375686657, 16.25863529518014], + [0.5925805332888091, -3.139640204484572, 17.13589230378096, 1.976422909655008, -10.515009347222, 6.627980447033357], + [0.3505170703269003, -2.237551781735236, 14.84170437843385, 1.483246407331564, -9.493221195626012, 6.302831691298613], + [0.2334740816002986, -1.79981530542472, 14.40275907010786, 1.22573469124098, -9.473328823485497, 6.458585723630323], + [0.1959374052725543, -1.757624939190617, 16.26453309470772, 1.257071800464856, -11.27433100208976, 8.089297781650776], + [0.186504029519429, -1.822069966644771, 18.49884116334009, 1.391201452068932, -13.60944960795888, 10.39529105220993], + [0.0972664880869715, -1.169327097322687, 14.59008882076805, 0.863528399754145, -10.3792682464399, 7.682778579161866], + [0.0878055201507951, -1.156467907936071, 15.89008007570035, 0.9032722960981284, -11.89269332401088, 9.31389227584649], + [0.2006114827320551, -2.776793529232688, 39.12099794229794, 2.335437756631023, -32.32054661687562, 27.20219535392458], + [0.05179066270217598, -0.8550833654170061, 14.82948643635128, 0.6753041305320768, -11.17147343869588, 8.821228248108168], + [0.05095452842967559, -0.948210749952708, 18.25692153880631, 0.7561787601252029, -14.08060600559859, 11.23739992361621], + [0.01801729907958822, -0.4102710173962256, 9.828612567782274, 0.2950547079487041, -6.724075992501888, 4.831954737036956], + [0.02762233787081839, -0.6400852678490596, 15.46123935330864, 0.5127706114146487, -11.88156027745066, 9.528888176590677], + [0.031654990010153, -0.7790988142691099, 19.86193598270219, 0.648607157613526, -15.97020317079789, 13.30779868219462], + [0.01316620750610005, -0.3821583465978776, 11.67177892863827, 0.2914985575363581, -8.480579644763935, 6.457533731506537], + [0.02886802887767344, -0.8369930524359994, 24.91187028333814, 0.7103796160970196, -20.57801184441048, 17.4685122492831], + [0.02930989281275648, -0.9242683589392606, 29.81526833971985, 0.7918145320034853, -25.01001674094063, 21.4403629032202], + [0.0516036089235802, -1.673006024492507, 55.06880032083917, 1.526329404862879, -49.49344845658728, 45.15984622267106], + ], + }, +] + +with open("scaling.json", "w") as fout: + json.dump(scaling, fout) + +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]", +] + +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") + + +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("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() + +# toy generation is different between the histsum and histfunc models, somehow +ntoys = 10 +ret = subprocess.call("combine -M GenerateOnly card.root -t {ntoys} --saveToys".format(ntoys=ntoys).split(" ")) +assert ret == 0 + +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( + "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") +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("Out of {ntoys} toys, {ndiff} are not matching (tolerance: 1e-4) between CMSHistFunc and CMSHistSum".format(ntoys=ntoys, ndiff=ndiff))