Update Limit Setting - #107
Conversation
…Update_Limit_Setting
There was a problem hiding this comment.
Pull request overview
This PR reworks the dilepton (DL) limit-setting configuration for the HH→bbWW Run 3 analysis. It moves the datacard inputs to per-era, DNN-significance-sliced HME shapes, expands the set of eras (adding a combined Run3_Early era group), adds a second signal process (XtoHHto2Tau2B), relaxes zero/negative-bin handling for sparse background/signal templates, and introduces a limit_plots/campaigns block that drives PlotResonantLimitsTask overlay plots. Supporting changes update the stacked-plot style config with nested stat/syst uncertainty band styling and remove now-unneeded datacard-time rebinning.
Changes:
- Datacard config (
x_hh_bbww_DL_run3.yaml): new${ERA}-prefixed input pattern, expandederas+era_groups, DNN-slicedSR/*_dnnNcategories, addedXtoHHto2Tau2Bsignal, negative/zero-bin tolerances, and a newcampaigns+limit_plotsoverlay section. global.yaml: removed dead commentedQCDRegionsentries and droppedStatInference.hist_bins(rebinning now handled byHistRebinTask).cms_stacked.yaml: added nested (stat + syst) background uncertainty band styling keys.
Reviewed changes
Copilot reviewed 3 out of 3 changed files in this pull request and generated 1 comment.
| File | Description |
|---|---|
| config/Datacards/x_hh_bbww_DL_run3.yaml | Restructures DL datacard inputs, eras, categories, processes, and adds limit-overlay/campaign config |
| config/global.yaml | Cleans up dead QCDRegions comments and removes datacard-time hist_bins rebinning |
| config/plot/cms_stacked.yaml | Adds styling keys for nested stat-only vs total uncertainty bands |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| external_limits: | ||
| - config/Datacards/run2_spin0_DL_external_limits.json |
|
@cms-flaf-bot please test
|
|
pipeline#15509625 started |
|
pipeline#15509625 passed |
|
@cms-flaf-bot please test
|
|
pipeline#15512407 started |
|
pipeline#15512407 passed |
DY has no usable MC statistics in the b-tagged same-flavour categories: over the 232 eE/muMu SR slices of Run3_Early its effective MC count has a median of 5.8 and sits below the binning's own min_bkg_neff of 4 in 42% of them, with five slices going negative outright and blocking the datacards. TT, ST and VV are all fine (median N_eff 471 / 211 / 97). Two changes, both in x_hh_bbww_DL_run3.yaml: - min_dnn_bkg_each: 0.01 requires every non-negligible background to be positive in every DNN slice. min_bkg_neff only ever gated the *summed* background, which never binds -- a background that had fluctuated negative was hidden inside a healthy total. min_dnn_bkg_neff is available but left at 0: requiring those backgrounds to be measured rather than merely positive costs 35% of the Asimov Z in muMu/res2b at m500. - TotalBkg merges TT/DY/ST/VV into one template in SR/boosted, all three channels. The gate fixes slice integrals but eE/SR/boosted_dnn1 still has negative *bins* inside a positive slice, and quantile mass binning makes every bin of an n<=5 slice signal-carrying, so the unconditional rejection fires. eMu gains DY, which its own channel list had excluded from that channel's background entirely. Validated by rerunning the full chain on v2605a (rebin -> datacards -> limits): negative shapes 5 -> 0 of 1392, datacards build under the unmodified resolveNegativeBins, and the expected limit moves by +1.46% geometric mean over ten mass points (+4.8% worst, at 700 GeV). Split: binning gate +0.22%, merge and strict acceptance +1.24%. Bumps StatInference to 44b27b1. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Carries the slice-naming cleanup: the DNN selection each slice stands for is now
the slice directory's own title rather than a dnn_slices.json side-car, so there
is no path for a reader to be handed wrongly and no key name for producer and
consumer to agree on. Directories are also created a level at a time, fixing the
stale parent titles nested mkdir left behind ("muMu" was titled
"muMu/SR/res2b_dnn0").
Datacard-neutral: rebuilt from a fresh rebin of all four sub-eras, the datacard
.txt files are identical and all 40992 shape histograms unchanged.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
config/Datacards/run2_hepdata_radion_results.json is the unprocessed HEPData submission for HIG-21-005 (7.4 kB: doi, headers, keywords, location). Nothing reads it. The file the limit plots actually consume is the digitised run2_spin0_DL_external_limits.json, referenced six times across x_hh_bbww_DL_run3.yaml and x_hh_bbww_DL_run3_1D.yaml via external_limits, and that stays. The converter that turned one into the other, StatInference's hepdata_to_external_limits.py, was already dropped from that PR for the same reason. Recoverable from de37048 if the digitisation ever needs redoing. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
No description provided.