From 3776908e9bb0882c8dbf1ca36a4de8773e72176f Mon Sep 17 00:00:00 2001 From: Sayan Date: Wed, 8 Jul 2026 11:14:10 +0200 Subject: [PATCH] Fix QCD Shape unc, calulated at hist merge step, not event wise Unc, so added data-driven flag so that it do not crash before histMerge --- Analysis/AnalysisCacheProducer.py | 5 ++++- Analysis/HistMergerFromHists.py | 9 +++++---- Analysis/HistProducerFromNTuple.py | 5 ++++- Analysis/HistTupleProducer.py | 5 ++++- 4 files changed, 17 insertions(+), 7 deletions(-) diff --git a/Analysis/AnalysisCacheProducer.py b/Analysis/AnalysisCacheProducer.py index 08b973a8..65fabe98 100644 --- a/Analysis/AnalysisCacheProducer.py +++ b/Analysis/AnalysisCacheProducer.py @@ -159,7 +159,10 @@ def createAnalysisCache( Utilities.InitializeCorrections(setup, dataset_name, stage="AnalysisCache") scale_uncertainties = set() if setup.global_params["compute_unc_variations"]: - scale_uncertainties.update(unc_cfg_dict["shape"].keys()) + for unc_name, unc_params in unc_cfg_dict["shape"].items(): + if isinstance(unc_params, dict) and unc_params.get("data_driven", False): + continue + scale_uncertainties.add(unc_name) print("Scale uncertainties to consider:", scale_uncertainties) producer_config = setup.global_params["payload_producers"][producer_to_run] diff --git a/Analysis/HistMergerFromHists.py b/Analysis/HistMergerFromHists.py index a419c2b4..1dcc372b 100644 --- a/Analysis/HistMergerFromHists.py +++ b/Analysis/HistMergerFromHists.py @@ -45,17 +45,18 @@ def fill_hists( unc_source="Central", data_type="data", ): + load_source = "Central" if unc_source == "QCDScale" else unc_source var_check = f"{var_input}" for key_tuple, hist_map in items_dict.items(): for var, var_hist in hist_map.items(): - scales = ["Up", "Down"] if unc_source != "Central" else ["Central"] + scales = ["Up", "Down"] if load_source != "Central" else ["Central"] for scale in scales: - if unc_source != "Central" and dataset_type != data_type: - var_check = f"{var_input}_{unc_source}_{scale}" + if load_source != "Central" and dataset_type != data_type: + var_check = f"{var_input}_{load_source}_{scale}" if var != var_check: continue - final_key = (key_tuple, (unc_source, scale)) + final_key = (key_tuple, (load_source, scale)) if dataset_type not in all_hist_dict.keys(): all_hist_dict[dataset_type] = {} if final_key not in all_hist_dict[dataset_type]: diff --git a/Analysis/HistProducerFromNTuple.py b/Analysis/HistProducerFromNTuple.py index cea2f934..025a7718 100644 --- a/Analysis/HistProducerFromNTuple.py +++ b/Analysis/HistProducerFromNTuple.py @@ -250,7 +250,10 @@ def BuildAllHistActions( uncs_to_compute.update( { key: setup.global_params["scales"] - for key in unc_cfg_dict["shape"].keys() + for key, params in unc_cfg_dict["shape"].items() + if not ( + isinstance(params, dict) and params.get("data_driven", False) + ) } ) print(uncs_to_compute) diff --git a/Analysis/HistTupleProducer.py b/Analysis/HistTupleProducer.py index e7c61b2a..69924be5 100644 --- a/Analysis/HistTupleProducer.py +++ b/Analysis/HistTupleProducer.py @@ -92,7 +92,10 @@ def createHistTuple( print("Norm uncertainties to consider:", norm_uncertainties) scale_uncertainties = set() if setup.global_params["compute_unc_variations"]: - scale_uncertainties.update(unc_cfg_dict["shape"].keys()) + for unc_name, unc_params in unc_cfg_dict["shape"].items(): + if isinstance(unc_params, dict) and unc_params.get("data_driven", False): + continue + scale_uncertainties.add(unc_name) print("Scale uncertainties to consider:", scale_uncertainties) print("Defining binnings for variables")