From 09c26a9042a2ab3aed555b013533183f9ff8159a Mon Sep 17 00:00:00 2001 From: JackmanHe Date: Fri, 24 Jul 2026 15:33:22 +0200 Subject: [PATCH 1/9] New zmm zbb channel --- CMakeLists.txt | 8 +- README.md | 38 ++++ UPDATE.md | 215 ++++++++++++++++++ app/nano_merge.cpp | 56 ++++- app/nano_run.cpp | 41 +++- configs/base.yaml | 27 ++- configs/common/read_branches_v12.yaml | 3 + configs/common/read_branches_v15.yaml | 8 + configs/common/read_branches_v9.yaml | 3 + configs/run/zbb_2024_v15.yaml | 20 ++ configs/run/zmm_2024_v15.yaml | 16 ++ configs/samples/xsec_2024.conf | 34 +++ configs/samples/zbb_2024_v15_DATA.yaml | 18 ++ configs/samples/zbb_2024_v15_MC.yaml | 26 +++ configs/samples/zmm_2024_v15_DATA.yaml | 18 ++ configs/samples/zmm_2024_v15_MC.yaml | 15 ++ .../2023-08-11/WJetsCorr_collection_ewk.root | Bin 0 -> 164926 bytes .../2023-08-11/ZJetsCorr_collection_ewk.root | Bin 0 -> 164242 bytes include/nano/helpers/MuonCorrection.h | 37 +++ include/nano/helpers/NloEWWeightProducer.h | 30 +++ .../nano/producers/HeavyFlavBaseProducer.h | 25 ++ .../producers/HeavyFlavZbbSampleProducer.h | 20 ++ .../producers/HeavyFlavZmmSampleProducer.h | 21 ++ src/helpers/MuonCorrection.cpp | 178 +++++++++++++++ src/helpers/NloEWWeightProducer.cpp | 117 ++++++++++ src/producers/HeavyFlavBaseProducer.cpp | 103 ++++++++- src/producers/HeavyFlavZbbSampleProducer.cpp | 92 ++++++++ src/producers/HeavyFlavZmmSampleProducer.cpp | 155 +++++++++++++ 28 files changed, 1310 insertions(+), 14 deletions(-) create mode 100644 UPDATE.md create mode 100644 configs/run/zbb_2024_v15.yaml create mode 100644 configs/run/zmm_2024_v15.yaml create mode 100644 configs/samples/xsec_2024.conf create mode 100644 configs/samples/zbb_2024_v15_DATA.yaml create mode 100644 configs/samples/zbb_2024_v15_MC.yaml create mode 100644 configs/samples/zmm_2024_v15_DATA.yaml create mode 100644 configs/samples/zmm_2024_v15_MC.yaml create mode 100644 data/vjets-ewk/2023-08-11/WJetsCorr_collection_ewk.root create mode 100644 data/vjets-ewk/2023-08-11/ZJetsCorr_collection_ewk.root create mode 100644 include/nano/helpers/MuonCorrection.h create mode 100644 include/nano/helpers/NloEWWeightProducer.h create mode 100644 include/nano/producers/HeavyFlavZbbSampleProducer.h create mode 100644 include/nano/producers/HeavyFlavZmmSampleProducer.h create mode 100644 src/helpers/MuonCorrection.cpp create mode 100644 src/helpers/NloEWWeightProducer.cpp create mode 100644 src/producers/HeavyFlavZbbSampleProducer.cpp create mode 100644 src/producers/HeavyFlavZmmSampleProducer.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 9e68bcc..47243cc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,7 +5,7 @@ set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) -find_package(ROOT REQUIRED COMPONENTS Core MathCore Physics RIO Tree TreePlayer) +find_package(ROOT REQUIRED COMPONENTS Core Hist MathCore Physics RIO Tree TreePlayer) find_package(yaml-cpp REQUIRED) find_package(Python3 REQUIRED COMPONENTS Interpreter) enable_testing() @@ -25,15 +25,19 @@ add_library(nanoaodtools_cpp src/helpers/FatjetGenMatching.cpp src/helpers/JetMETCorrector.cpp src/helpers/JmeVariation.cpp + src/helpers/MuonCorrection.cpp + src/helpers/NloEWWeightProducer.cpp src/helpers/PuWeightProducer.cpp src/helpers/TopPtWeightProducer.cpp src/producers/HeavyFlavBaseProducer.cpp src/producers/HeavyFlavMinimalProducer.cpp src/producers/HeavyFlavMuonSampleProducer.cpp + src/producers/HeavyFlavZbbSampleProducer.cpp + src/producers/HeavyFlavZmmSampleProducer.cpp ) target_include_directories(nanoaodtools_cpp PUBLIC include) -target_link_libraries(nanoaodtools_cpp PUBLIC CMSJMECalculators ROOT::Core ROOT::MathCore ROOT::Physics ROOT::RIO ROOT::Tree ROOT::TreePlayer yaml-cpp) +target_link_libraries(nanoaodtools_cpp PUBLIC CMSJMECalculators ROOT::Core ROOT::Hist ROOT::MathCore ROOT::Physics ROOT::RIO ROOT::Tree ROOT::TreePlayer yaml-cpp) add_executable(nano_run app/nano_run.cpp) target_link_libraries(nano_run PRIVATE nanoaodtools_cpp) diff --git a/README.md b/README.md index da00e9f..58572c0 100644 --- a/README.md +++ b/README.md @@ -66,6 +66,8 @@ The implemented channels are: - `muon`: a heavy-flavour muon control region targeting semileptonic ttbar-like phase space, enriched in boosted top/W jets. - `minimal`: a lightweight boosted-AK8 stream that runs the shared lepton cleaning, JME, and fatjet preparation, then keeps the leading cleaned AK8 jet above the configured `channels.minimal.leading_fatjet_pt_min` threshold. +- `zbb`: a 2024 NanoAOD v15 boosted dijet control region with two AK8 probes and an optional secondary-vertex requirement. +- `zmm`: a 2024 NanoAOD v15 boosted `Z -> mumu` recoil control region with muon scale/smearing and efficiency scale factors. Main files: @@ -105,6 +107,34 @@ build/nano_run \ --num-events 5000 ``` +The 2024 zbb and zmm channels use their matching runtime cards: + +```bash +build/nano_run \ + --input-files input.root \ + --output-file zmm_2024.root \ + --config configs/run/zmm_2024_v15.yaml \ + --channel zmm \ + --num-events 5000 +``` + +Their muon payloads are resolved by campaign from +`/cvmfs/cms-griddata.cern.ch/cat/metadata/MUO`. The 2024 card follows the +campaign's `latest` directory by default; override +`muon_corrections.campaigns.2024_NanoAODv15.version` to pin a dated release. + +For an end-to-end environment, build, run, and output check, use: + +```bash +scripts/run_2024_z_channel.sh zmm mc +scripts/run_2024_z_channel.sh zbb mc +``` + +The script accepts an optional input ROOT file, output directory, event limit, +and variation list. Run `scripts/run_2024_z_channel.sh --help` for the complete +argument order. When the input is omitted, it resolves one representative +2024 NanoAOD v15 file with DAS. + `--input-files` accepts one file or a comma-separated list. Local paths, `root://...` paths, and `/store/...` paths are supported. If `--variations` is omitted, it defaults to `nominal`. Outputs are always written with a variation suffix, so the example above writes `muon_2018_test_nominal.root`. @@ -138,6 +168,10 @@ build/nano_make_condor \ --num-events -1 ``` +For example, replace the sample, runtime card, and channel with +`configs/samples/zbb_2024_v15_MC.yaml`, `configs/run/zbb_2024_v15.yaml`, and +`zbb` to submit the 2024 zbb workflow. + This creates the requested Condor work directory, copies a merged config snapshot, packs the repository, and writes `submit.jdl`. Submit manually: @@ -155,6 +189,10 @@ After jobs finish, return to the repository root and merge Condor pieces with: build/nano_merge /path/to/output ``` +To merge only selected output variations, pass a comma-separated list, for example +`build/nano_merge /path/to/output --variations nominal`. If omitted, all supported +variations found under `pieces/` are merged. + Pass the base output directory, not the `pieces/` subdirectory. `nano_merge` reads input pieces from `/pieces/`. It first writes merged ROOT files to a temporary directory, then copies all merged outputs back under `/`. diff --git a/UPDATE.md b/UPDATE.md new file mode 100644 index 0000000..dfae972 --- /dev/null +++ b/UPDATE.md @@ -0,0 +1,215 @@ +# Staged Changes + +Recorded at: `2026-07-24 15:26:52 CEST` + +This document records only the 27 files currently staged in Git. Unstaged and untracked workspace files are excluded. + +## 1. Build and Runtime Interfaces + +- `CMakeLists.txt` + - Adds the ROOT `Hist` component and `ROOT::Hist` library. + - Compiles `MuonCorrection.cpp`, `NloEWWeightProducer.cpp`, `HeavyFlavZbbSampleProducer.cpp`, and `HeavyFlavZmmSampleProducer.cpp`. +- `app/nano_run.cpp` + - Adds the `zbb` and `zmm` channels to `nano_run`. + - Adds YAML parsing for `muon_corrections` and `nlo_ew`. + - The default Muon campaign version is `latest`; the default scale/smearing file is `muon_scalesmearing.json.gz` and the default SF file is `muon_Z.json.gz`. +- `app/nano_merge.cpp` + - Adds `--variations nominal,jes_up,...` to merge only selected variations. + - If omitted, all variations are merged; nominal files are also subject to the filter. + - Invalid, repeated, or incomplete variation arguments produce a usage error. +- `README.md` + - Adds descriptions and 2024 v15 run examples for the `zbb` and `zmm` channels. + - Documents the Muon payload path, the default `latest` campaign version, and how to pin a version. + - Adds an end-to-end example using `scripts/run_2024_z_channel.sh` and describes its arguments. + - Adds a Condor example using `zbb_2024_v15_MC.yaml`. + - Adds an example for merging with `nano_merge --variations nominal`. + +## 2. Common Configuration and Input Branches + +- `configs/base.yaml` + - Updates the AK4 JEC tags from `Summer24Prompt24_V3` to `Summer24Prompt24_V5`. + - Updates the AK4 JER tag from `Summer24Prompt24_JRV1_MC` to `Summer24Prompt24_JRV2_MC`. + - Adds Muon correction configuration: + - Payload root: `/cvmfs/cms-griddata.cern.ch/cat/metadata/MUO` + - Campaign: `2024_NanoAODv15` + - Payload subdirectory: `Run3-24CDEReprocessingFGHIPrompt-Summer24-NanoAODv15` + - Version: `latest` + - Files: `muon_scalesmearing.json.gz` and `muon_Z.json.gz` + - Adds NLO EW configuration: + - Payload directory: `data/vjets-ewk/2023-08-11` + - W file/main histogram: `WJetsCorr_collection_ewk.root` / `evj_pTV_kappa_EW` + - Z file/main histogram: `ZJetsCorr_collection_ewk.root` / `eej_pTV_kappa_EW` + - W uncertainties: `evj_pTV_d1kappa_EW`, `evj_pTV_d2kappa_EW`, `evj_pTV_d3kappa_EW` + - Z uncertainties: `eej_pTV_d1kappa_EW`, `eej_pTV_d2kappa_EW`, `eej_pTV_d3kappa_EW` +- `configs/common/read_branches_v9.yaml` and `configs/common/read_branches_v12.yaml` + - Add `LHE_Vpt`, `LHEPart_pdgId`, and `LHEPart_pt`. +- `configs/common/read_branches_v15.yaml` + - Adds `Muon_charge`, `Muon_highPtId`, `Muon_pfIsoId`, and `Muon_nTrackerLayers`. + - Adds `SV_pt`, `LHE_Vpt`, `LHEPart_pdgId`, and `LHEPart_pt`. + +## 3. New zbb Channel + +Related files: + +- `include/nano/producers/HeavyFlavZbbSampleProducer.h` +- `src/producers/HeavyFlavZbbSampleProducer.cpp` +- `configs/run/zbb_2024_v15.yaml` +- `configs/samples/zbb_2024_v15_DATA.yaml` +- `configs/samples/zbb_2024_v15_MC.yaml` + +The runtime card uses 2024 NanoAOD `v15`, inherits the base configuration, v15 branches, and stored tagger names, and uses the following preselection: + +```text +Sum$(abs(FatJet_eta)<2.4)>1 +``` + +Required triggers are `HLT_AK8PFJet380_SoftDropMass30` and `HLT_AK8PFJet500`. + +Event selection and processing: + +- Requires two JME-corrected AK8 jets. +- The two jets must have transverse momenta above `450` and `200 GeV`, respectively. +- The two leading jets must satisfy `|DeltaPhi| > pi/2`. +- The runtime card defaults to `require_sv_cut: true`; when enabled, at least two secondary vertices are required. +- A jet is marked as qualified only when it has exactly two linked subjets. +- At least one of the two probe jets must be qualified. +- Both leading probe jets are written to the output; `fj_2_*` branches are generated from the corresponding `fj_1_*` branches. +- Adds `passHTTrig`, recording `HLT_AK8PFJet380_SoftDropMass30`. +- Adds `genVpt`, recording the generator transverse momentum of a hard-process W/Z; if no hard-process copy is found, the maximum W/Z `pT` is used. + +Sample configuration: + +- DATA: `JetMET0` and `JetMET1`, covering Run2024 C–I and the I v2 NanoAOD v15 datasets. +- MC: + - `qcd-mg`: 8 QCD HT bins, from `200to400` through `2000`. + - `top`: 1 `TTto4Q` sample. + - `v-qq`: 3 W→qq and 3 Z→qq `PTQQ` bins. + - `vv-qq`: `WWto4Q`, `WZto4Q`, and `ZZto4Q`. + +## 4. New zmm Channel and Muon Corrections + +Related files: + +- `include/nano/producers/HeavyFlavZmmSampleProducer.h` +- `src/producers/HeavyFlavZmmSampleProducer.cpp` +- `include/nano/helpers/MuonCorrection.h` +- `src/helpers/MuonCorrection.cpp` +- `configs/run/zmm_2024_v15.yaml` +- `configs/samples/zmm_2024_v15_DATA.yaml` +- `configs/samples/zmm_2024_v15_MC.yaml` + +The runtime card uses 2024 NanoAOD `v15` and the following preselection: + +```text +Sum$(Muon_pt>50 && abs(Muon_eta)<2.4 && Muon_highPtId)>0 +&& Sum$(Muon_pt>25 && abs(Muon_eta)<2.4 && Muon_highPtId)>1 +``` + +Required triggers are `HLT_Mu50` and `HLT_TkMu50`. + +Event selection and output: + +- Applies the Muon scale correction; MC receives additional resolution smearing. +- Requires exactly two isolated muons passing the ID, `abs(eta)<2.4`, and `pfIsoId>1` requirements. +- The Muon ID is either `pt>15` with `looseId`, or `pt>30` with `highPtId != 0`. +- The two muons must have opposite charge, with leading/subleading `pT` above `60/30 GeV`. +- The dimuon system must have `pT > 450 GeV` and `70 < m < 110 GeV`. +- Selects corrected AK8 recoil jets with `DeltaR > 0.8` from both muons and keeps only the leading jet. +- Adds `passMuTrig`, `leptonicZ_pt`, `leptonicZ_mass`, and `genVpt`. +- Adds `pt`, `eta`, `phi`, `mass`, and `miniIso` branches for `muon0_*` and `muon1_*`. +- MC adds the following SFs and their `stat/syst` up/down variations: `muonHLTSF`, `muonIDSF`, `muonISOSF`, and `muonIDISOSF`. + +Muon correction implementation: + +- Looks up the campaign using `era + "_NanoAOD" + nano_version`. +- Reads data/MC scale, random smearing, and scale factors from correctionlib payloads. +- MC smearing uses the event number, luminosity block, and phi to generate reproducible random inputs, followed by an inverse Crystal Ball CDF. +- Scale factors are multiplied across the two muons; muons outside the eta or minimum-pT range return a factor of 1. +- Corrected pT is protected against non-finite values, excessive changes, and crossing `200 GeV`; invalid results fall back to the original pT. + +Sample configuration: + +- DATA: `Muon0` and `Muon1`, covering Run2024 C–I and the I v2 NanoAOD v15 datasets. +- MC: + - `DY`: 3 `PTLL` bins (200, 400, and 600). + - `top`: `TTto2L2Nu`, `TWminusto2L2Nu`, and `TbarWplusto2L2Nu`. + - `v-lep`: `WWto2L2Nu`, `WZto2L2Q`, and `ZZto2L2Q`. + +## 5. Common Outputs, NLO EW, and the HeavyFlav Base Class + +Related files: + +- `include/nano/producers/HeavyFlavBaseProducer.h` +- `src/producers/HeavyFlavBaseProducer.cpp` +- `include/nano/helpers/NloEWWeightProducer.h` +- `src/helpers/NloEWWeightProducer.cpp` + +`ProducerConfig` additions: + +- `MuonEraConfig` and the Muon campaign map. +- `NloEWConfig`, including W/Z files, the nominal histogram, and three uncertainty histograms for each boson. +- Boolean, numeric, and string maps in `channel_options`. + +New common HeavyFlav outputs and logic: + +- `LHE_Vpt`: for MC DY, reads the physical branch first; for W/Z, searches `LHEPart` by PDG ID `24/23` and falls back to the physical branch when needed; DATA is set to `-1`. +- `genVpt`: prefers W/Z particles with the hard-process flag in `GenPart`, otherwise uses the maximum W/Z `pT`. +- `nlo_ew_weight`, `nlo_ew_weight_up`, and `nlo_ew_weight_down`, all initialized to `1`. +- For zbb, generates the complete set of `fj_2_*` default branches automatically. +- Adds `fj_1_parTmass = rawMass * globalParT3_massCorrX2p`. +- When filling zbb jets, preserves the leading-jet values and writes the second jet to `fj_2_*`. + +NLO EW weight logic: + +- Samples starting with `Wto` or `WJetsTo` use the W payload. +- Samples starting with `Zto`, `ZJetsTo`, `DYto`, or `DYJetsTo` use the Z payload. +- Uses the hard-process W/Z `pT`; values below `100 GeV` retain the default weight. +- The nominal weight is `1 + kappa`; the three uncertainty histogram deviations are combined in quadrature for the up/down weights. +- ROOT histograms are cloned and detached from the source file; missing files, histograms, or uncertainty entries raise an error. + +## 6. Sample Cross Sections and Correction Data + +- `configs/samples/xsec_2024.conf` + - Adds 2024 zbb/zmm MC cross sections in pb. + - Covers `TTto4Q`, 8 QCD HT bins, W/Z→qq, four-quark VV, 3 DY `PTLL` bins, dileptonic/single-top samples, and leptonic VV samples. + - The values are documented as being ported from NanoHRTTools `samples_nanov15/xsec_2024.conf`. +- `data/vjets-ewk/2023-08-11/WJetsCorr_collection_ewk.root` + - Adds the W+jets NLO EW nominal weight and three uncertainty histogram payloads. +- `data/vjets-ewk/2023-08-11/ZJetsCorr_collection_ewk.root` + - Adds the Z+jets/DY NLO EW nominal weight and three uncertainty histogram payloads. + +## 7. Staged File List + +The 27 staged files are: + +```text +CMakeLists.txt +README.md +app/nano_merge.cpp +app/nano_run.cpp +configs/base.yaml +configs/common/read_branches_v12.yaml +configs/common/read_branches_v15.yaml +configs/common/read_branches_v9.yaml +configs/run/zbb_2024_v15.yaml +configs/run/zmm_2024_v15.yaml +configs/samples/xsec_2024.conf +configs/samples/zbb_2024_v15_DATA.yaml +configs/samples/zbb_2024_v15_MC.yaml +configs/samples/zmm_2024_v15_DATA.yaml +configs/samples/zmm_2024_v15_MC.yaml +data/vjets-ewk/2023-08-11/WJetsCorr_collection_ewk.root +data/vjets-ewk/2023-08-11/ZJetsCorr_collection_ewk.root +include/nano/helpers/MuonCorrection.h +include/nano/helpers/NloEWWeightProducer.h +include/nano/producers/HeavyFlavBaseProducer.h +include/nano/producers/HeavyFlavZbbSampleProducer.h +include/nano/producers/HeavyFlavZmmSampleProducer.h +src/helpers/MuonCorrection.cpp +src/helpers/NloEWWeightProducer.cpp +src/producers/HeavyFlavBaseProducer.cpp +src/producers/HeavyFlavZbbSampleProducer.cpp +src/producers/HeavyFlavZmmSampleProducer.cpp +``` + +The following are outside the scope of this document: `CMSJMECalculators`, `templates/condor/process.sh.in`, `scripts/`, and all other unstaged or untracked files. diff --git a/app/nano_merge.cpp b/app/nano_merge.cpp index a9761a8..de92a1b 100644 --- a/app/nano_merge.cpp +++ b/app/nano_merge.cpp @@ -36,8 +36,9 @@ constexpr std::array kAllowedVariations = { constexpr std::size_t kHaddChunkSize = 200; constexpr std::string_view kUsage = - "Usage: nano_merge [--resume-from ]\n" + "Usage: nano_merge [--variations ] [--resume-from ]\n" " : base Condor output directory; piece files are read from /pieces\n" + " --variations: comma-separated variation list; omitted means all variations\n" " --resume-from: reuse a previous nano_merge temporary directory and skip groups whose temporary output already exists"; std::string shell_quote(const fs::path &path) { @@ -100,20 +101,52 @@ using FileGroup = std::vector; struct CliOptions { fs::path output_dir; fs::path resume_dir; + std::set variations; + bool filter_variations = false; }; CliOptions parse_args(int argc, char **argv) { - if (argc != 2 && argc != 4) { + if (argc < 2) { throw std::runtime_error(std::string(kUsage)); } CliOptions options; options.output_dir = fs::path(argv[1]); - if (argc == 4) { - const std::string flag = argv[2]; - if (flag != "--resume-from") { - throw std::runtime_error(std::string(kUsage)); + bool has_resume = false; + bool has_variations = false; + for (int index = 2; index < argc; ++index) { + const std::string flag = argv[index]; + if (flag == "--resume-from") { + if (has_resume || ++index >= argc) { + throw std::runtime_error(std::string(kUsage)); + } + options.resume_dir = fs::path(argv[index]); + has_resume = true; + continue; + } + if (flag == "--variations") { + if (has_variations || ++index >= argc) { + throw std::runtime_error(std::string(kUsage)); + } + const std::string value = argv[index]; + if (value.empty()) { + throw std::runtime_error(std::string(kUsage)); + } + std::stringstream values(value); + std::string variation; + while (std::getline(values, variation, ',')) { + if (variation.empty() || allowed_variations().count(variation) == 0) { + throw std::runtime_error("Unknown variation in --variations: " + variation); + } + options.variations.insert(variation); + } + if (options.variations.empty()) { + throw std::runtime_error(std::string(kUsage)); + } + options.filter_variations = true; + has_variations = true; + continue; } - options.resume_dir = fs::path(argv[3]); + throw std::runtime_error(std::string(kUsage)); } return options; } @@ -281,6 +314,9 @@ int main(int argc, char **argv) { } const std::set allowed = allowed_variations(); + const auto selected = [&cli](const std::string &variation) { + return !cli.filter_variations || cli.variations.count(variation) != 0; + }; // nickname -> files without variation std::map no_variation; // variation -> nickname -> files @@ -311,11 +347,17 @@ int main(int argc, char **argv) { std::cerr << "Skipping unknown variation: " << filename << "\n"; continue; } + if (!selected(variation)) { + continue; + } by_variation[variation][nickname].push_back({idx, entry.path()}); ++total_root; continue; } if (std::regex_match(filename, match, no_var_re)) { + if (!selected("nominal")) { + continue; + } const std::string nickname = match[1].str(); const int idx = std::stoi(match[2].str()); no_variation[nickname].push_back({idx, entry.path()}); diff --git a/app/nano_run.cpp b/app/nano_run.cpp index 56290b2..6683289 100644 --- a/app/nano_run.cpp +++ b/app/nano_run.cpp @@ -3,6 +3,8 @@ #include "nano/io/RootOutputFile.h" #include "nano/producers/HeavyFlavMinimalProducer.h" #include "nano/producers/HeavyFlavMuonSampleProducer.h" +#include "nano/producers/HeavyFlavZbbSampleProducer.h" +#include "nano/producers/HeavyFlavZmmSampleProducer.h" #include "runtime_common.h" @@ -112,7 +114,7 @@ CliOptions parse_args(int argc, char **argv) { } if (opts.input_files.empty() || opts.output_file.empty() || opts.config_file.empty()) { - throw std::runtime_error("Usage: nano_run --input-files --output-file --config [--channel muon|minimal] [--num-events -1] [--run-data] [--variations nominal,jes_up,...] [--set key=value]. If omitted, --variations defaults to nominal."); + throw std::runtime_error("Usage: nano_run --input-files --output-file --config [--channel muon|minimal|zbb|zmm] [--num-events -1] [--run-data] [--variations nominal,jes_up,...] [--set key=value]. If omitted, --variations defaults to nominal."); } return opts; } @@ -315,6 +317,37 @@ nano::ProducerConfig make_config(const YAML::Node &settings, const std::string & item.second["correction_key"].as(), }; } + if (settings["muon_corrections"]) { + const auto node = settings["muon_corrections"]; + config.muon_payload_dir = node["payload_dir"].as(); + for (const auto &item : node["campaigns"]) { + config.muon_eras[item.first.as()] = { + item.second["payload_subdir"].as(), + item.second["version"] ? item.second["version"].as() : "latest", + item.second["scale_smearing_file"] ? item.second["scale_smearing_file"].as() : "muon_scalesmearing.json.gz", + item.second["sf_file"] ? item.second["sf_file"].as() : "muon_Z.json.gz", + }; + } + } + if (settings["nlo_ew"]) { + const auto node = settings["nlo_ew"]; + const auto uncertainty_histograms = [](const YAML::Node &histograms) { + std::vector names; + for (const auto &histogram : histograms) { + names.push_back(histogram.as()); + } + return names; + }; + config.nlo_ew = { + node["payload_dir"].as(), + node["w_file"].as(), + node["z_file"].as(), + node["w_histogram"].as(), + node["z_histogram"].as(), + uncertainty_histograms(node["w_uncertainty_histograms"]), + uncertainty_histograms(node["z_uncertainty_histograms"]), + }; + } if (settings["jet_veto_map"]) { const auto node = settings["jet_veto_map"]; config.jet_veto_map_enabled = node["enabled"] ? node["enabled"].as() : false; @@ -333,6 +366,12 @@ nano::ProducerConfig make_config(const YAML::Node &settings, const std::string & } std::unique_ptr make_producer(const nano::ProducerConfig &config) { + if (config.channel == "zbb") { + return std::make_unique(config); + } + if (config.channel == "zmm") { + return std::make_unique(config); + } if (config.channel == "muon") { return std::make_unique(config); } diff --git a/configs/base.yaml b/configs/base.yaml index dfd71d6..c055b93 100644 --- a/configs/base.yaml +++ b/configs/base.yaml @@ -341,9 +341,9 @@ jec: jes_uncertainties: [Total] jet: algo: AK4PFPuppi - jec_tag_mc: Summer24Prompt24_V3_MC - jec_tag_data: Summer24Prompt24_V3_DATA - jer_tag_mc: Summer24Prompt24_JRV1_MC + jec_tag_mc: Summer24Prompt24_V5_MC + jec_tag_data: Summer24Prompt24_V5_DATA + jer_tag_mc: Summer24Prompt24_JRV2_MC fatjet: algo: AK8PFPuppi jec_tag_mc: inherit @@ -441,6 +441,27 @@ pu: payload_subdir: Run3-25Prompt-Summer24-NanoAODv15/latest/puWeights_2025pp_Golden_Summer24_25ns_69200ub.json.gz correction_key: Collisions25_goldenJSON +# Muon scale, smearing, and efficiency payloads. Campaign versions are kept +# explicit so a runtime card can pin a dated payload for reproducibility. +muon_corrections: + payload_dir: /cvmfs/cms-griddata.cern.ch/cat/metadata/MUO + campaigns: + 2024_NanoAODv15: + payload_subdir: Run3-24CDEReprocessingFGHIPrompt-Summer24-NanoAODv15 + version: latest + scale_smearing_file: muon_scalesmearing.json.gz + sf_file: muon_Z.json.gz + +# NLO electroweak corrections for W/Z+jets and DY samples. +nlo_ew: + payload_dir: data/vjets-ewk/2023-08-11 + w_file: WJetsCorr_collection_ewk.root + z_file: ZJetsCorr_collection_ewk.root + w_histogram: evj_pTV_kappa_EW + z_histogram: eej_pTV_kappa_EW + w_uncertainty_histograms: [evj_pTV_d1kappa_EW, evj_pTV_d2kappa_EW, evj_pTV_d3kappa_EW] + z_uncertainty_histograms: [eej_pTV_d1kappa_EW, eej_pTV_d2kappa_EW, eej_pTV_d3kappa_EW] + # Numeric year label written to the output `year` branch. The mapping follows # the historical Python producer convention, where split eras such as 2022EE # and 2023BPix use half-step labels. diff --git a/configs/common/read_branches_v12.yaml b/configs/common/read_branches_v12.yaml index 7b16781..69540a6 100644 --- a/configs/common/read_branches_v12.yaml +++ b/configs/common/read_branches_v12.yaml @@ -129,3 +129,6 @@ read_branches: - GenPart_status - GenPart_statusFlags - GenPart_genPartIdxMother + - LHE_Vpt + - LHEPart_pdgId + - LHEPart_pt diff --git a/configs/common/read_branches_v15.yaml b/configs/common/read_branches_v15.yaml index 0e2f91d..890713d 100644 --- a/configs/common/read_branches_v15.yaml +++ b/configs/common/read_branches_v15.yaml @@ -27,10 +27,14 @@ read_branches: - Muon_eta - Muon_phi - Muon_mass + - Muon_charge - Muon_dxy - Muon_dz - Muon_tightId - Muon_looseId + - Muon_highPtId + - Muon_pfIsoId + - Muon_nTrackerLayers - Muon_miniPFRelIso_all - Electron_pt - Electron_eta @@ -165,3 +169,7 @@ read_branches: - GenPart_status - GenPart_statusFlags - GenPart_genPartIdxMother + - SV_pt + - LHE_Vpt + - LHEPart_pdgId + - LHEPart_pt diff --git a/configs/common/read_branches_v9.yaml b/configs/common/read_branches_v9.yaml index c7c7caf..b8a3a5b 100644 --- a/configs/common/read_branches_v9.yaml +++ b/configs/common/read_branches_v9.yaml @@ -135,3 +135,6 @@ read_branches: - GenPart_status - GenPart_statusFlags - GenPart_genPartIdxMother + - LHE_Vpt + - LHEPart_pdgId + - LHEPart_pt diff --git a/configs/run/zbb_2024_v15.yaml b/configs/run/zbb_2024_v15.yaml new file mode 100644 index 0000000..b0e2a06 --- /dev/null +++ b/configs/run/zbb_2024_v15.yaml @@ -0,0 +1,20 @@ +# Zbb channel runtime card for 2024 v15. + +extends: + - ../base.yaml + - ../common/nano_branches_v15.yaml + - ../common/stored_tagger_names_v15.yaml + - ../common/read_branches_v15.yaml + +era: "2024" +nano_version: "v15" + +preselection: Sum$(abs(FatJet_eta)<2.4)>1 + +required_triggers: + - HLT_AK8PFJet380_SoftDropMass30 + - HLT_AK8PFJet500 + +channels: + zbb: + require_sv_cut: true diff --git a/configs/run/zmm_2024_v15.yaml b/configs/run/zmm_2024_v15.yaml new file mode 100644 index 0000000..50ec812 --- /dev/null +++ b/configs/run/zmm_2024_v15.yaml @@ -0,0 +1,16 @@ +# Zmm channel runtime card for 2024 v15. + +extends: + - ../base.yaml + - ../common/nano_branches_v15.yaml + - ../common/stored_tagger_names_v15.yaml + - ../common/read_branches_v15.yaml + +era: "2024" +nano_version: "v15" + +preselection: Sum$(Muon_pt>50 && abs(Muon_eta)<2.4 && Muon_highPtId)>0 && Sum$(Muon_pt>25 && abs(Muon_eta)<2.4 && Muon_highPtId)>1 + +required_triggers: + - HLT_Mu50 + - HLT_TkMu50 diff --git a/configs/samples/xsec_2024.conf b/configs/samples/xsec_2024.conf new file mode 100644 index 0000000..17bfaac --- /dev/null +++ b/configs/samples/xsec_2024.conf @@ -0,0 +1,34 @@ +# Cross sections in pb for the 2024 zbb and zmm samples. +# Values are ported from NanoHRTTools samples_nanov15/xsec_2024.conf. + +419.7 /TTto4Q_TuneCP5_13p6TeV_powheg-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM + +1961000 /QCD-4Jets_Bin-HT-200to400_TuneCP5_13p6TeV_madgraphMLM-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM +96690 /QCD-4Jets_Bin-HT-400to600_TuneCP5_13p6TeV_madgraphMLM-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM +13620 /QCD-4Jets_Bin-HT-600to800_TuneCP5_13p6TeV_madgraphMLM-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM +3049 /QCD-4Jets_Bin-HT-800to1000_TuneCP5_13p6TeV_madgraphMLM-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM +891.3 /QCD-4Jets_Bin-HT-1000to1200_TuneCP5_13p6TeV_madgraphMLM-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM +384.6 /QCD-4Jets_Bin-HT-1200to1500_TuneCP5_13p6TeV_madgraphMLM-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM +126.8 /QCD-4Jets_Bin-HT-1500to2000_TuneCP5_13p6TeV_madgraphMLM-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM +26.63 /QCD-4Jets_Bin-HT-2000_TuneCP5_13p6TeV_madgraphMLM-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM + +164.5 /Wto2Q-2Jets_Bin-PTQQ-200_TuneCP5_13p6TeV_amcatnloFXFX-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM +8.999 /Wto2Q-2Jets_Bin-PTQQ-400_TuneCP5_13p6TeV_amcatnloFXFX-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v3/NANOAODSIM +2.258 /Wto2Q-2Jets_Bin-PTQQ-600_TuneCP5_13p6TeV_amcatnloFXFX-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM +70.27 /Zto2Q-2Jets_Bin-PTQQ-200_TuneCP5_13p6TeV_amcatnloFXFX-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM +3.779 /Zto2Q-2Jets_Bin-PTQQ-400_TuneCP5_13p6TeV_amcatnloFXFX-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM +0.5092 /Zto2Q-2Jets_Bin-PTQQ-600_TuneCP5_13p6TeV_amcatnloFXFX-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM + +50.79 /WWto4Q-1Jets-4FS_TuneCP5_13p6TeV_amcatnloFXFX-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM +24.75 /WZto4Q-1Jets-4FS_TuneCP5_13p6TeV_amcatnloFXFX-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM +7.807 /ZZto4Q-1Jets_TuneCP5_13p6TeV_amcatnloFXFX-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM + +10.77 /DYto2L-2Jets_Bin-MLL-50-PTLL-200_TuneCP5_13p6TeV_amcatnloFXFX-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v1/NANOAODSIM +0.5921 /DYto2L-2Jets_Bin-MLL-50-PTLL-400_TuneCP5_13p6TeV_amcatnloFXFX-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM +0.08097 /DYto2L-2Jets_Bin-MLL-50-PTLL-600_TuneCP5_13p6TeV_amcatnloFXFX-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v3/NANOAODSIM +98.04 /TTto2L2Nu_TuneCP5_13p6TeV_powheg-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v3/NANOAODSIM +4.665 /TWminusto2L2Nu_TuneCP5_13p6TeV_powheg-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM +4.665 /TbarWplusto2L2Nu_TuneCP5_13p6TeV_powheg-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM +13.35 /WWto2L2Nu_TuneCP5_13p6TeV_powheg-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM +7.568 /WZto2L2Q_TuneCP5_13p6TeV_powheg-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM +6.788 /ZZto2L2Q_TuneCP5_13p6TeV_powheg-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM diff --git a/configs/samples/zbb_2024_v15_DATA.yaml b/configs/samples/zbb_2024_v15_DATA.yaml new file mode 100644 index 0000000..e6ef766 --- /dev/null +++ b/configs/samples/zbb_2024_v15_DATA.yaml @@ -0,0 +1,18 @@ +# DATA samples for the 2024 zbb control region. +jetmet: +- [/JetMET0/Run2024C-MINIv6NANOv15-v1/NANOAOD, + /JetMET0/Run2024D-MINIv6NANOv15-v1/NANOAOD, + /JetMET0/Run2024E-MINIv6NANOv15-v1/NANOAOD, + /JetMET0/Run2024F-MINIv6NANOv15-v2/NANOAOD, + /JetMET0/Run2024G-MINIv6NANOv15-v2/NANOAOD, + /JetMET0/Run2024H-MINIv6NANOv15-v2/NANOAOD, + /JetMET0/Run2024I-MINIv6NANOv15-v2/NANOAOD, + /JetMET0/Run2024I-MINIv6NANOv15_v2-v1/NANOAOD] +- [/JetMET1/Run2024C-MINIv6NANOv15-v1/NANOAOD, + /JetMET1/Run2024D-MINIv6NANOv15-v1/NANOAOD, + /JetMET1/Run2024E-MINIv6NANOv15-v1/NANOAOD, + /JetMET1/Run2024F-MINIv6NANOv15-v2/NANOAOD, + /JetMET1/Run2024G-MINIv6NANOv15-v2/NANOAOD, + /JetMET1/Run2024H-MINIv6NANOv15-v2/NANOAOD, + /JetMET1/Run2024I-MINIv6NANOv15-v1/NANOAOD, + /JetMET1/Run2024I-MINIv6NANOv15_v2-v2/NANOAOD] diff --git a/configs/samples/zbb_2024_v15_MC.yaml b/configs/samples/zbb_2024_v15_MC.yaml new file mode 100644 index 0000000..1617147 --- /dev/null +++ b/configs/samples/zbb_2024_v15_MC.yaml @@ -0,0 +1,26 @@ +# MC samples for the 2024 zbb control region. +qcd-mg: +- /QCD-4Jets_Bin-HT-200to400_TuneCP5_13p6TeV_madgraphMLM-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM +- /QCD-4Jets_Bin-HT-400to600_TuneCP5_13p6TeV_madgraphMLM-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM +- /QCD-4Jets_Bin-HT-600to800_TuneCP5_13p6TeV_madgraphMLM-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM +- /QCD-4Jets_Bin-HT-800to1000_TuneCP5_13p6TeV_madgraphMLM-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM +- /QCD-4Jets_Bin-HT-1000to1200_TuneCP5_13p6TeV_madgraphMLM-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM +- /QCD-4Jets_Bin-HT-1200to1500_TuneCP5_13p6TeV_madgraphMLM-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM +- /QCD-4Jets_Bin-HT-1500to2000_TuneCP5_13p6TeV_madgraphMLM-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM +- /QCD-4Jets_Bin-HT-2000_TuneCP5_13p6TeV_madgraphMLM-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM + +top: +- /TTto4Q_TuneCP5_13p6TeV_powheg-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM + +v-qq: +- /Wto2Q-2Jets_Bin-PTQQ-200_TuneCP5_13p6TeV_amcatnloFXFX-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM +- /Wto2Q-2Jets_Bin-PTQQ-400_TuneCP5_13p6TeV_amcatnloFXFX-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v3/NANOAODSIM +- /Wto2Q-2Jets_Bin-PTQQ-600_TuneCP5_13p6TeV_amcatnloFXFX-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM +- /Zto2Q-2Jets_Bin-PTQQ-200_TuneCP5_13p6TeV_amcatnloFXFX-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM +- /Zto2Q-2Jets_Bin-PTQQ-400_TuneCP5_13p6TeV_amcatnloFXFX-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM +- /Zto2Q-2Jets_Bin-PTQQ-600_TuneCP5_13p6TeV_amcatnloFXFX-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM + +vv-qq: +- /WWto4Q-1Jets-4FS_TuneCP5_13p6TeV_amcatnloFXFX-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM +- /WZto4Q-1Jets-4FS_TuneCP5_13p6TeV_amcatnloFXFX-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM +- /ZZto4Q-1Jets_TuneCP5_13p6TeV_amcatnloFXFX-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM diff --git a/configs/samples/zmm_2024_v15_DATA.yaml b/configs/samples/zmm_2024_v15_DATA.yaml new file mode 100644 index 0000000..35be624 --- /dev/null +++ b/configs/samples/zmm_2024_v15_DATA.yaml @@ -0,0 +1,18 @@ +# DATA samples for the 2024 zmm control region. +muon: +- [/Muon0/Run2024C-MINIv6NANOv15-v1/NANOAOD, + /Muon0/Run2024D-MINIv6NANOv15-v1/NANOAOD, + /Muon0/Run2024E-MINIv6NANOv15-v1/NANOAOD, + /Muon0/Run2024F-MINIv6NANOv15-v1/NANOAOD, + /Muon0/Run2024G-MINIv6NANOv15-v1/NANOAOD, + /Muon0/Run2024H-MINIv6NANOv15-v1/NANOAOD, + /Muon0/Run2024I-MINIv6NANOv15-v1/NANOAOD, + /Muon0/Run2024I-MINIv6NANOv15_v2-v1/NANOAOD] +- [/Muon1/Run2024C-MINIv6NANOv15-v1/NANOAOD, + /Muon1/Run2024D-MINIv6NANOv15-v1/NANOAOD, + /Muon1/Run2024E-MINIv6NANOv15-v1/NANOAOD, + /Muon1/Run2024F-MINIv6NANOv15-v1/NANOAOD, + /Muon1/Run2024G-MINIv6NANOv15-v2/NANOAOD, + /Muon1/Run2024H-MINIv6NANOv15-v2/NANOAOD, + /Muon1/Run2024I-MINIv6NANOv15-v1/NANOAOD, + /Muon1/Run2024I-MINIv6NANOv15_v2-v1/NANOAOD] diff --git a/configs/samples/zmm_2024_v15_MC.yaml b/configs/samples/zmm_2024_v15_MC.yaml new file mode 100644 index 0000000..e7503c5 --- /dev/null +++ b/configs/samples/zmm_2024_v15_MC.yaml @@ -0,0 +1,15 @@ +# MC samples for the 2024 zmm control region. +DY: +- /DYto2L-2Jets_Bin-MLL-50-PTLL-200_TuneCP5_13p6TeV_amcatnloFXFX-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v1/NANOAODSIM +- /DYto2L-2Jets_Bin-MLL-50-PTLL-400_TuneCP5_13p6TeV_amcatnloFXFX-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM +- /DYto2L-2Jets_Bin-MLL-50-PTLL-600_TuneCP5_13p6TeV_amcatnloFXFX-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v3/NANOAODSIM + +top: +- /TTto2L2Nu_TuneCP5_13p6TeV_powheg-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v3/NANOAODSIM +- /TWminusto2L2Nu_TuneCP5_13p6TeV_powheg-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM +- /TbarWplusto2L2Nu_TuneCP5_13p6TeV_powheg-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM + +v-lep: +- /WWto2L2Nu_TuneCP5_13p6TeV_powheg-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM +- /WZto2L2Q_TuneCP5_13p6TeV_powheg-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM +- /ZZto2L2Q_TuneCP5_13p6TeV_powheg-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM diff --git a/data/vjets-ewk/2023-08-11/WJetsCorr_collection_ewk.root b/data/vjets-ewk/2023-08-11/WJetsCorr_collection_ewk.root new file mode 100644 index 0000000000000000000000000000000000000000..f681f61fc1e93ff8af50e79d59e2c0719914fb5f GIT binary patch literal 164926 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 z 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

q&t4*}U!@M7&%V^IHSm z7&@-Et8Rx25jx^JxPQp!eOL9;G0)=$keDL~=4Bu8ZCrBA>wz8+o(?4|aBJ+zqy``0 zz0j5_0Ev?Rj7buI#w5|-W0JD)-y}l$_n2hF_-_{dk0$_)B*1_q{yiS01M>Ft;5gqv z5T<~cz#vD!=7dZz1|HTumR-TvYSwdh>t}9k6a44miHWrI+k*W;0p*EIB!f<1VEftf%9sL+Utpyz)>l+yi)DNEil9Vo<>?g@P;+>|*g>~doF79>GESV)KcdAy$j8R0Un+Dk;ldjVibybu} zDFW}pz89fk(8ox=iVSB65l<b=CBII?Rx1oy8{o)++vWg`{~Z)Wg$xI8BI z-Yqs7k8oD~waPA`k7<(DI`8@1lL_vMs1N8XrW$vPFUK)1@((ND7)-X+1nE1iR11$1 zXHI!PgWg`CeADJeCTdU+gf*32pf1ev0Hc6ndPD=?SaDVRgJXD6_p$Js<}k zV=yE$UeEaHTW}WsbQ|f*O^$A^N@>0s|K11PuhNflm>W;j(Eti9{e<1)JuUTY!at7^MlV%9SWm`sgTD~Q!H{33hr@nsIR z@mYNcxYR*E#GR*sWn9>a~VpqF)FOUk!oZTt@Tk~!kN{SVC2Y0kl2iOIJvUj`4h z(tbg6B5AgLO9eS79u(3r zs$x^ucNlzvEA_--}wXCpC-LZE8hss`+t+uGCvsCAWgSu$*teHYYUb1|5 zX(-odprta4zH{983uI!3kF7QlfB1;MY-nG+*j;~}!WO-IQHlG=14ru^;`};3|Eh6n zV8X*iVBN=dXj-6o+^hzuqg!Ps9s+sZ!bP>gDMw?J!#if4L7pjqO40wMlKS%hpc2!6 zQ|a%gzhw!ob>}^Xq&AJQZSag5BZwfRy3U(R?^T zKBPxDLoRU%X(WPVFG_o0D2+)>I(r1>T{6Ybz%s(hrcDKh_{-BK6G_Q9(9uz7E-})^ z*D>V;GSYO+RT_>dZY2ZC0G`y)e=5Slo#?ILs$iFph{7`94#|Lbfehc7h9dI%mdE3P zA3|~tx5SHLx65)*;GTiTuz)+93yQOH;C>qEdS*skYEwE&__dx(zAT_Vt!!Srjw|vT z9!h1Dcu5IgB`}E{;13_pnX0V<+cQ8Gc4V1PM7i*Ae%!sHUqBqyPf156U6_=8+E zLG(OziKV!a_E%4?V*xWi4Ov1H6yyMxU?Xu05X-E5=JC-Ef+F>Ny8o zG^f=WRYI_hu8kW?6t>+ zdVU~|f-1Gf;?8BCXN)n(k74=L_Kbj0Oh}-#AvM@9s?RfzncqZ>ZmJeps2`NOp~dPF ze(lEXT|gVKH8NLzo1Yk=PS8AmS=^4IO{k8?n8Fd1eh|BUTJx!?{n9##X9LG2%;XLe z|HW2L`aZFf*4?f%y;jGjl{l#Qj{s5oqE#l>YGeBtPimhZw%y-Nm`!Vy@A z5;rF|GGBX0cZRCt7dBNV(2)b#h`kQ%^rT&!`pV1-ykoK=ftT1Rn)e%lm!#fIn->Ft zv|j?=jS04n?Ur%+Rs0%v3@3T66}EUDG%7OM5WR29v1UgMpi(g2Q2f(~mr5Etq#Yq# zEpPkEb|s;H9fG?f(h4?ZTbw-Jk%u0vVpC^a1_-QZ5%e8{Dp)wftkNQ&aL^Wpym(7o zm|MM4W`dUb3}9y|NfH?@`zG580`H)rTR~?g#N{Id?zOGmrd_(Q#o~U`zc=gS z$e>+nD}EcjB(BO2rNP+}e%}`sYd~zv+1j9iwD)+FZ?aulD}Bf1U~N40H|&H*1OLz= zO~na`Z`4gmUI&WJ;)-jfS;3S9ACyk3nh?||bnsnQgdcL=v_9!r0z+5B(D-Sg$bsMQ z<6to8RHFIV(C4a!oiSVqUpmeV+HCy&0(Y=z`z%N9e38>5cVbzz;plpJg!2Pd?XCn+ zeFm2JPa5d}81=7<+y5JgnE#tbe?R>tA^n?1e}!V{O96T|gxx5R6ZPd4l^wSC!^WqW z8e?^=7ZZQFcF*Z#TBSR#AYfxmyZ>~dV5ODIg zbHC#t7?Iq%zZW*y3EtnqG_3MlPzWrn4Ny2ZU(Bg|{uMYNJ@tNLvH_@G5`)JL$R;6T z_5ptTC?uVJpyy{i8S?Wg&}YYA9OtQ11o*;k0)~}XN9!OISU{&LyuJz;>{78XM^_$Q zNI<;xY{zFFxs!oEmk#S3E{ajcA#k!MIA(D<4JE4TwsAdofVO_3+>#RG6&O}W6T4|b zh8#Nv%3jVNQ)Nak9IKZ*F{oi4mWBf6A6q7h=h$!tuTTapSl@mG5yF8$6vQ4+^lfCe z?P=m3Lm{D33?LsBNyj+Q?J$TQ6ltnkB3dP6)oN&(5U5GO?`&AK5rM zISGsS(2#jLHE6cGcLR}CFb{88;lF>i*?21}by=AiO38 zq@VRj;~RdxS02p8nB1*ng?XS~yGoJPsD+-y_B|cpa!_x(8ia+pkPuN-(e&6sJS18Z zcbGffj=rS7l%Lr;gS6b6Wk=s5A6l4)b>Pdr>d+b=n*GJ&Gs^sc!;7jX?0OD!b<&m!B@GO_p zWsF1zJ$=yk=LCIwkB(|+7h;h&24NiGL6I%wve@-WLpilfe8;}%GpD%x z5_YTssiAJ?8kP1DYkHHt*VTr+3nQXEUeE{>LS%RULU^sPH!QyTV_%BO{WWuR+b%ei z^4+UE{TA(--4+ly;uC--mWy7g56tWP98>eehQY{{)MXCBcE^$dl}b zimz!Yfy5S)SGVxyK;4L!@cC^{#a1hr3G>r*_5mnWKFwEN@N)&{-NAfo;8O)nrM%t6 zY{)!iOmC&x0kQ;$@Z$5-eMy1`K;7rYN|kg~FDMFzoCeP8)T{qsjbc|Bq9DKmB8I`_tCw2SOvV z8)0SllbQ+@y6Q^%dgByg`;%hNNkO36bd)$`3rU^fHnD`;kgz0h2m-C+h;nRV4wRxu zKD)r7m{E{O)n0!EY#ys4L-W7)n$mY)3Hm z0qdPWW0#UY6qql$uG2Hq8xas(>bV}zb7 z59>RdB2sMFBkj>cORn#Xq#qs5z#hgR2kUz)75do-py!g%4g?n72Z|>K#uN3}qw6PP z0I4yDz2l%RoSeu~hgHtb&zFV1Q-odhubcmx0SE2UEsE<=V*@ZLUd((Gz$5~*g=E~X z?*h{_h_9QYZs(w-kUW0vU*CnLm`7$9Dzvv|@b*_}zlFL&?!0)X_!1VxU|Xfw1b2ju z&m^_e4sBTSXA(Fg*em)g{>079Esor51DLOm-trYTQy=BAwp@=v2GfB-3BKZX@E$@g zd-c9A=CA4xUEAu{pR(*l;<0l$FQZvYHhEZVHGr(hhAXm($qF^Ttg9%cd*rALaXZ6D z7Edi4z9%DufgG*TB}Yov3%bw?cDhEP?PSl-CYh@po$qbXy^F*1-tob^az6mCZL_T2 zN~nXkA6p-&h6^@1M79Ql@X_Sgj}nxU?`* zJYPD*$6?ej=9kg$m-*C%JGtzFT|lxbW9zXSB64?NN9TwfD0ujD6rHE%U>|;9J&>!n52SiQ>k33Awzyw|pP!zPya1b4DII6cb;4jx_4Ke@9~Si6=ogJ)?^= zV%@n(iQkffrczXI`~iu+8!FCZ@dz`ahZnDevLw#G*TCw|PxFIOC*$Hi-}9Bq(+z2MIZC#ZW8y2ocpRhC zcN$6FIn8l4nOPl^B06e6rLbO(30JILYiGfxQp|yWKzdP?!vm<4@Mlz#{39oc|CWfdtGU*4qOSo&XY04|Au0ZIO+9pLh37m#X;=0E|N@Cg+Okvd%L;n!|?F;llO zp_|x!eKeBlCg4#7KdKvbCzIbc$yA3)_J_4*FpXzoHo*h-ICQ~pq`!k}mVxC-ZOI)W^jkqUE;fe_&DNby% zvc80*Ii`FOPjO86B959bY#@ED&N>e*MiehpvQbtb2(2t*ddhM@H$|&-9z4itxtZZ zZWHWK(OCme7TAun@7|9mkZjlVJp1Yta#PZidCmi$a01)^^JI{yRsFPadjM>%I8^l{ z_#@b4*h>6xw%=CqJT6yq)OYr4;daKmGKamjRdc2UeB$nMz1J*)ElbtNDql9J{dU87 zIU*mJ+r!P3(ly-_*HvEeha-DQG^PX?3^2>r$>hkS+uUC+w=mNO##5hKb;G_M0gvx7 zmMTf%0Se6SIMsS*y9F`EcDt}Vocn73Sd^lHTfw#H6Mw!{d+2E7 z2+td~kuoi)#c}$&9ld^!qryj+l`F0wnAtfJ^{V9CHRG_>eFK%V;)u@PsWHq?-t9}S zol#%WwX?q?;W*ifR#KCISdgNwVQ^F#Z(oQ~M?+e)n5G|S2Gl0@YJ@$adNda8P4L_K zm6#1Jw18s1ZPm^1+z4wMcuac5B%?^tKej6xxe+8oyimB%yxOIDGbk``_|y2OiSO7{ z4kn(o^7828C%t{2S-TOXsJuZ|<+XY;QqxV4?wrt?`CT#6zCR3 zh>_}PkQqNiS$HiELc>ULe;&*3=|pya0m0Z(aQ1$g0HPZlSpi63aI(}|CL`3KdS4%+ z(E&C)VMh!dBu3w!F5>gGs&>&Kf4jrvwaKTf?+%mn4{O>WNsmBEAWMzD;J|vMdH^I9 z0jb+ITz-j`Ob!$!A1EjqAS>(_2M43WFg&644GUA&9etGYg;x6Ty`}}E`nU0N*x5nU z)%?hTeQR@I8I<~{;+cR^4?x*~%6;Iz_+8!EBu!}^P^XJ>XCJv z5n527rxfvDz(Q_Q0XItM`?-1}y*MLljw3vvK*RJ!ExzJz(qA-0sHAwPq*M}&yAuXk z6VM@m?8C*KSaZu67v_JI@EMku&C0LG%5wTNK(yNu0~LH`8Y)jlQ0yG`7sRnn;|nG{ zUc|)JXw$!!`s>>s!DHYA6qlWkAs8mgyFGZjt>b27S~d_b`;GFUZ$Y>jx?-^p zE`GbyUe`xfPs~Z{y7qh1jdxA(^cb8`1t}&T=CQknx+cEmh)C>KDqqE~Su`u*(rtS3*YgIla+MlaQ&F2&NIMX_r2YF{M!e|vbbMN~UKJs9=lrd|wQz`G5J%d&yU zYW7A5mRgr$c4CufX>~tl`-EFmX|JxaVuW~}p_9(Zfc%Wkb=f3luODf+<6Yl?QR$~t zQK7>V=d4Uk$g>PYhrc1EIA?{y`bASm+tWMHzo6E$v38u~R|3f zgCPOrfb?On!yy9TvmUQlP#pX-^&M>}77w)zQ93bwawuO_8t2>nDJK^B;)^i1rz<|S zPHmy{I6Aqv^;;q#s*+1fy5jL{so*2^az(vlEERiFEH|k!?r&;j`L+721zx z(+h+BnD>wDDqahSP&-0+sQx6g{fKVHYA=1TG^-iEqYsU0O~ zo|@hF7)OvcxDTChX=q0IQ?db0t+M(IEowr25O7}oohm6M2Rv7e1MckimAmf zQ&-Ck!6@jO%1n@@2hT=i3VuwFWJ{4jHU!E9F|)G1Cn`pme!3n-b5f)%5Bfesk+ zI3W5Z!v;5FJ9x+FnxmU-{Wy$!!0*uOv!3zM4sav+^mogB2_mw?y)289LFZg*f#!md!qv^;E`q3VJjvd$(lz?nwaW-0RxWS-l z(9|{Hb7`(`60bqFRGK$Rd@fj_Mw(9aJKt~uHO32CGdu}Nlt7C-E-r(sX>W^K@k^0L zTQCo=x=AHEtWGJ|YXZ;O-wt${b%EoewjP^O@gl`Kd? zQ(jk^3MAPYrNqbyKKJOjrsd=(;HA7u-}nwuVkz5OSAkN(zGl7hsomFpH*EJ%L_kJ! zK)qB`Fn%hDXetBf3;W01@s1Qx#gme(iitl(iW$Q7_*s%zQokJf5;zhn+JL+z4^SbK+fqpxqEC>L8LjQ>$N1p!^KTQ9` z4-)`CeE-1Dr8ul}R4x()mK&S}dLI*VreWK}ITH1$0K||KL6Dy!1@lmCMOSY(mr$c6~sk!6A>2gUo(lZ2}!LCiX@S8Utb^ z%Myk{ktOM&5y(s$3xvnTqQ%4U$fy`ZY(jGY;pp(jiE=Rtvt!z+rCDP3_ragLC=TD* zRCT~snAQ$yr4DUXP-sa@To<2z1Rxa27YF>l_&*#u7RXA~EObw|xJHJ5OT~cl2@gvu zgF=4`Jk})2Fq63>mQL9fNGT&3dm!amlXE2tlP?AD0Ur$GGnY|Umr@Uemg7LmQbxvj zK~B0uO)~Sl;vrd#n#blY;icR8-!<1<$d!o^+F6F4+j-8qM{Ji~lMJvN^O!#( z6TrLHUw8M#y^^YDgqw}E*2q#)M>w;q=k-*MybL=_&}oCTC)7>pp%90(#PGncCi+xG zogJCTnm(mlN-pKd;~p5JXMwAUzYX{m&-*S^Kru=1AM<(HmA6?wYzlZaAAA`)u&5ph z$X;RL2RZ0nyfpSSfhz<11(7Vb=qDOJrY}j3L0I0*Jv#s>mQ26WsibOFFW;ziNA`5XivYY> zoozhn%m<0cgIbzaD6qyqxI6r!mpl(ejxZjOneLtLq3rD`If z@JTFi%5DXl^~IvHh|hd?mpOpXffkAalu=#R;e0RNhPuX$<|ei$v6YV(?8=sgaD+Ql z-lvp?qWlnkiMpotqz$bkijMEI!jxDo<=kw`l9v&~{0we$8PO?R4J))GNeFLd#wT$% zpCn+ID~|FKVm<2f>-+nlsMUpEAW1iLe>Yw8ROAT#FAll({hu6S{wIf+|Nk8N>&y=_ zS}p~eS1DmRVu9no=8<^c#%-DVilrH*!ID*5brih%DecQxKol0~ui;)48K1#-JtT7tg zk+O+>I}d*k)rggky{5?Pofv{69v~H-nLpfvzn3k;!rVNL7`%hO=+CTb*Ptz_zmi| zE-(m!NZUxxk&%M-7ZFc6u_t9lwYHQiS#os`P#{fNsOl1G$EK(&9IC1Zl6MaAD?>)L z>YqtS2H;m>+@>68!GNEx7-(UmoBpBQGiYitMS~eR^-c-*^C~r9j$MOMq8ER5aI3@H zt7V(g#`P){_x<$u7Z;BKUt9#u`s0K=!3xmc8NoYmr8j%up;BsWtpZm+H>Gj^oB*_X zO_AOv)vQBU8qFEVCd6F;vVQ&8tI=_IbLxM?80KX3U9DT+SP%w!>u{Jw6Uh-{2vhul} z3#Xm>YBofMlhAP-u2Yu`uQe*29q{1N3?{eH?iL;jtApYhbmd4;hK+MzSJIRhI9@Bv z6%PK8x7)eQQq57x(t{~{oBPGA|7ODih$|=A-KPNor2C**om@Qsy76(6^!$D_r$^ZR2;V7tE5b7{Wx1;W=fIeBr6Uc{$~=OJ<#rlk(C>hxK}We;{fF*OL0I zRVngu^fIvTp_0fs6}`n7r3qk*;aM~!)K4OJuA?cqiA8=MK3ZQ36g3hz;Imds6HNGe zH-jr^x zbw4mkclIL}S7yUjgU#xksM-enN9Qjay%TzKgK7_)+ed9Cveb`STP6Y;?m8&nf_jN73Z-?nVGlUllNnF#hrWWSvg*#&fM;sHxQFV+LHL@DA309o z&jk5Z;7$y^&D4uBT;r8>&Q>nDaXGb1JduK!UxeH5C)tGqZgKup3x_<_a#66-_c-d| zDe5D)jY5+N7MTV)X*omyM~4n-yAj{!Io{LgvF>+kPh|3|F$uXT*&pB!QVa0pQN z_^*NyMEO}`tU+BYABa=|F(fL#uwe+ikjT!6L-HcHtI5aJ+%`b|QBj2E=tz6KIVEV4ZK=kW;2bZa?UI32l98#rOt7qzwMu8&b zeYAZIB?9ySrUG`kNNI>zRjL#Bp#4)uZYc0EF%NS~d_HN&AFo{*9(plRF!Uk0Je`U9Cjkt$0`TNV=K-?6s^ zrPVKmT_vQJx=1bYD3!5%ZNJk@6Y2>S)>Mj0IhNJPvdTK9r(8`h<65xh8< z99kZp=?g^@d|8!3%-X+J)9OL_gjIBPS3Yuc5&$K?wXm~|it8tiM#ra;c5i)p zA1SJq0xRdQJOcSl5FkzHeL6qv9Gjs)n00{#(a^XGhT#TmA0a1mtrT>kS#kDm?g2$H zuDywb0D0CM?JTl>4S9G9ci)=C-tE0!&9%)=sjjhsrAzj`+kE$`$y+3zGxy~EMbIu9Z|+w-*q+(B5#~h% z!9MM4ddX~cJ+&6AjWjQeo+ozjnLVAZdP!Snv-sYH0-)<*KE$n}4*8dJdvY=o^eAEp z$d00%p-4_plEDq+`l$?FUEC`JkiTBrsvK(2<2=5j< zm+jva!e{!OTKo39TI4r{zQN&aeu_DY+)`r^^crmtCx5Tdcly|^RNP#AT+u9dR48Tn zT3j5h1w$ApdlrXTk)zh7X}92X$!Kc(v9{^fFarvr1l0@pHW z?N`EAXoevSU1MjM8F$+o>&bT7ThL}LA@#`^VvwbKLe9{&)nO@?&!gPk!r(enaZp(Bp%kgMtEL@sNE^9**P6#MA->-X5t%_ z=|Ty<{c4U7H^*SEnsDNkc2%_rj?u$+i}b++BDI7S-BJSo=R=L=b9l#Z3^6dLK9}V3 zJP)U2ldn81tuA+as|SLkLn?#8oSz-rIe9Q$&Nq4hS~bzPv=RV?{_5TT4^hZ(=Kq|A zSpP{ORse-q{-)5s8nE4#=dBpJQ#pwW^8#qSwq0YE1OAV+|_20HH#W`0RVSRVzb|J zF_YyFWZc`*L?%y~Fb=5p8VpzpVm#}8L7IFRT7>8t^IVlqi+MX$e4F{f>i%x%1=qZ+ zZ>8W+rUrSncY%_qxg#Kfw<#jo-GSzWJwm+tHNMq-BI-p%w2eU9;pTZXsey+p&}9tz zQHa}ayxZWw+mIAJ5g0_;lVq9!(6|*&YQIF-wN5pqMJ&(*VF+W9QN;ZC!*@R_k@~Yj= zUZdC-02p+(DAtxFcJOd?jpbNVg%(xefVBWkP2NIy$>6j#Za-7k53*t-?jX$WtETI| zw-!kV#h0}*|M*PqT3kWpz$pe|mmE)-k6YQpI6zt0KS(dUQ+|C=l#3v7g1c#(R|Bb7 zgqtk$m4HYm)_6@xPFSqBf4zNqI>(h*@2!-Njw+f0H{2ObxJWgdTT>n=weDPFhY!`r z$VY{nx-!twMDqh?66hviv9bwH+PA#*#i2WtbZFoqdbk4`{8;>D?a_r>poOR4;#mi3 zMn6AWuAYCW!7kAZ(L@lV7UfC57{RCrP?F_L@28!WqrmC|Y5yP{1D`h@tN*a5m-kFY zMRLU7JW(LD06ZZiHS8phL&1}}Q)_$U{Iz8-WHe`G*5>TTw7+?wiD!Wo9*mICDGBMy zR(ntU)TMruWtL2&r(HTuiMrNjqEW(l4Z_XRRi!dTx54B_4{%^%=s`1C^#aej67qs ze(Nhi#XU zu|xo4*P!o2+%j^?VHCihfbalt8zPFc5IiJH*Qu2wtv<9}Mn~0nnOPHcn0gtMLh9P**V7>C)Z7sYk|Pn(VN^(Up)wey+GitAq`o{lUl+@JiBR~}LXllYuslPE?Z z%-Ri;u*TFEC~>`CgF~`f{#J!t?9RUXd~*}?q3)%|Y~~q!Toc7_X83t+u4InR;er$W zYe58<8%op@of`sAP-*x$++ypPVk)xLd@IO4I~B>9wfq-Tg*j~uXyr|SY?iu8Ka@KU^xf_vYRo0f~kf3kXV$IJp5oyfT#I?bgNCg z(rmn_dip6%)ihlgHBT1s!}5~c$%InbyUye-ju(h^BMX|d&1j12=E(-)fHtda|JYVM z8lVcLyv>9r&kWrV@Zx~>op-#Aw&IaCMTV?r|9DTj+L^^cBkvbE>)db3w*mU{3}-Ly$F`W5|-PjNzg<5EX#T6`cefY#>XW61W!YUSO@P8KrG9NfDlG%|3}w3M%SHo ze?PXJ#%ydiwv)!T(b%?~#*Nw7wr#sH8k^6_%-neH`Omwvey`8^tZVQ6Mfc?7nGRCw z5VN*wFY6kcEn|8)g@Y3oH0!4;6Tv8qZ+$SYSn?&}Uxr$zSAr=&k>Tq433j#1Q-cVu=0!z!3dp zVmN5S)_`G~>6=GU` z=_MR>Vxzl8#$otZvp_tPUP-YEPmVz-@&$DGo#bvfqqoM_aFggWG+OIh%7SFM1MzH}eoX$Gz%IOrO z;{egJWk(E{b9gnhhSjr>chEV=fg+{kCr8ZHOxN_L*vsq9H(Trgd$nOelr$IVEoDJ@!*hcJV1(p!eHq1;u06 zuqWJoxM8}Ig7N**N#oswKunBsLi^i;=xGGj=SKtqNXL}1vGFZLD3m^*%EocXVb=GR z?y=g7hJ9}@$V4ay^l}Op{UO3@O}7U)99Z7aoanSSs&%o{3;(9>hB4~ocSo9#s(ewDaZRj zdW|bSeqOTJe=9T~gJbhz1`%&6wNfZoBk+*!q-khP8Yt_ogJX$6M!zx$`#hn7DsVpI zdlo5MvrO4f%grwopBrF`=oE?cRc?V1@|s<|1@%BF(F`@tu~8Ribzb1=*7921mzC1? znqo>!I=*MINj06XQx;}9&tEq#1#N}wv^qgF*1u++RfZcQ&UB=2q;Pe&JtEreh>0_< z#P%XJ?o+%fnGP~@rnLPl`=t7hXmZX9$R2WyBJqX@7S{4Bm^kTZ#8E1S;bZ0gHg9p+ znw5Ick)MpjuT|tTr>oy;@;Vgbw#SH2y4Uy(9Es!DGLVqRsTAaMEVsB2;}o7JayB>_ zDfx!nY@Z&ua;X&h%GWuBkI8D|5hes?IEFOoC=X)ySGrac9Ljfvhu2-*t~ibkC8z14 zzOedC019BOig5rK`m=@TzhFWQM)8v0(`N^4(h)SA<`V$093o4!Yt3GH2zZ9ryi^Po(;~q10^-W27VUML5NfQ1^*Y z1Jz<~CGN8)C?|9xj2gEJaNt`YxUz319qR=kZdmgoM`BS?3Sn zoDNu(Tqr5CGRk#qv={{4%+W*SMj z2AY9WwiK=@xOB|pE%As75i|3%Rrj-6z^4Dt!&2)8!h0Xv*H?m_?287YXtg1tC69%I zR~-z(Ox%4o5T#pc{QKX>#cJcKB7GRv1F&E>&k90qzD>1??wlq9uLDHV6Xjafr@eK&3pj2g(ZIZu# z*>1Q5n`kcOtfkX98~f957O&jQ>UxKH9z4xh%4-e=lQ!O8w=6U5VsZmOsg137q7Ru6 zshWFtbk3~#F3C6df$gv}Ih(j=V75f{olcrldy+_{8fORtlH2mcm0CN`$f2k7?KSUn zKz&0h8N|s{gezsX#&d3{!j7#Cqdx_K4-ODG8g(E}(9XDR@?!!gMlGT$ofA^-Ep*V} ztiQybeL)-kfIGj3|Th;R6Kg(*&6W5nU%M zWRcaKol+N`KMmisYOB1Oq75I@=<&o`N;prlk9O*mk=euIPhQ#5e634b5P7bW==dSm zvHXIbn@CTmF_Dr0GOeX}+U#auXMZ?UzW!w>Jt8^@A;K>||KI@0cxE)8xP6=ZgerC< zt_#evob#(Tr^c<+I!j3w8#L$kFqzEShHnVQUA~=XjgeJzAd3&mCiSdE_R>k@SLM?` z&h)P?KRy~j{_c6n8*>Myc;c= zGI{*+Ha2Vp2&e$x^4MsxSa@5ZeXJljwl%#g`vF?1VR<6p&K0AsjBqjqG?_945Qo!k zsNin?&N~cI$5HOToM(SjqG74)83j+1(*o8yFR{?C(7)5i`!VjO4Sll!6JHwe~oh+?v7t077kgTCJ&TW zftSdNoq#TtUsbX>^Ka4Fn46Z|Y6iIh%lE>Kd>WHMzqPtTNW?L@xrt9%bC z$#>fN+u{vBf(m|bPg0_k9-d=GNZdAbG@BQwaetPdrPH)h1_f@zxoc6Gh9#nv`RiJJ zv^`W>^U5LGE#_`DuGAOQUj7Y&pUr`Iz9)<&oU1E{L*@sb*ehe2X6t+|GewxvvXe`k z=0aV5c^%2aPuNOxeyF?e zLtm=v8O^1$8OVbnlz_`zS|0rL z;mQ=-zuDnWUw#T*oE3k^=fMa4K5)cPxvtB$!H5;9A zbB$Ky%Qgf6QDt+?E4m9`I)#k-lG{|&|%YK5(_~zFl{VSaBpaW|06aWhSDHam_!`316Ve3dS z|2Kt@|I60#hgOl{?_d7pkm$cMLjJItQHl$NCUKBLAlq^@jF?U52;m<U)iGm z<$rAl_+L4(%CCj3BH_f4AW2C10e1YzD5OD}GgnU|ds{Q3G7bgen=nU|7xtbx+gLw= zriSRtMIz8bXFwwwAR$BmVe_wK%10&IHY3hu6(nFYq-jtRFcm$Y5*u74F2~0MTH}a-uy7*Zo^*UG(4KVU zgtoxRp+S&bTB363Yl~9&RGg+zk|R9}yq&$(yvUi@K1LHPhZ~>-`zAI}4F{f>_KM5cVv!m)4g*oJ!g>5S(g!4GIdiz{IfRRzWar}xp0(io@> zT3O#7&oyjZ++Q5DgB^7JOH|+%My)Q}tt_4E@7k!%)E$rx=62@-8{vS?TFVomopZe` z7v)vy3u~yz+f5hwvpVOE!=p zAHyy56|nt?R|T$2*H)?Tf8ybp425DNL{_V6wxx-#xZTvj$5Ie@nOkXrh3gNdkqaqu z7@5^(XwJY?*Gw=y8UhbthC6F78^C^zTCX-`pA+gMt>#;~;SBUp$Dzdv;a^fh(e&KL z4ZQK#)j?Dc?8@kM)dmPG5OT-vF1;@lL?|?$Ft{_N2MXD*uEV5eei10RfnM^cU)gu} zk^Q1~R(|!`V}h2KNummG72gUHxufksgl61b5!;c19Vexr`ZhQcpc@zw?gUNuWO`Of1z20pBv-fN{ z@YbLM3Cv}vKX^br_H=A){GKv|p(H=Yrwb9mSUhC4kTW*EhX910TAb%L=lt}LaY$0{ z(%lHd)`!5bdkM82`p0MgWHZvc-RK=+C6t^QZz}EJA&!SW>t}=+NEq<|^*Mbu1_a zH;P!S>UgATC@3hnQB8c9J|S^15pt{&D3aOMWnrQO-(E#qt#0$7xNTZ#-s9DFSf&EQ zgY@RkYd+Hnp3OCf1B3jtU?m0xJQ146STY3z-T@^fgCl%NwBUa5Gw6ujkjG|^V0HCZ z0EDVyYwWAaqA%y;m=vEs@0c^;qXxi{GSi7lb`r`&#%=^7h|^LMQ$9KL1vU~X2PS5Y zBw$2Gk)%zm~f=A*pWg zgAf!Bk%D-$r?%D3wxC2_NTBDZ?Fn%sN}`kH!}Ak|?Fln11aIx6Q_Uq($#TZ-^3bFx z9d;@AxA>-Eam-dmj-Rr(0p=za$MCFnre3wR(7jSJYYgqY&*Q6olo@^%Bu~ zOngLe&pryrA#zfCmd+6?c$yV<38f4~L}!|vLF%UnC6 zrlidTPQPWhiEK?vl?c>Y-poK|wUVn%fv;w_16aBn~&&y`1%(g>jq8vwbm!Z)Xxxba&wZiSxw<*{X?{Vp$aLUGZs-_DeQ1*MampNiXye(~d` zSY!7bywZ*ILS{Yyk$O4d4H(sy-<132c!w%<*|@@EksmcT;U{~GB_?r$`eYAIa%t(c_W^qShi9?3s7Q5W zb1phBAf8g1Ye|MQUGInmjod9sUGF15B)^t{KJ+);t*Y=qRBEQz#AYMW^q-q8w!)!G zT?Q_nMlt;wx7NOTef`B%F=*kU71Rz0zLxL9#6hd036IO5+Xe${mW8@!Ko;-F$kK8IB-Z!bC9-^WRn8Tr3yVT zF3$6k>dUr#&*srw$urCrg}Ck>I%TWrhqBgQ1XjIh11#WL?zK+>|TRD?&;qAdIHVio27 z>W?hx)=kK)!ztcNega|MW*m$)_6gv<_qOXDQ)T<3kmy6V7g zUVR==1UuSx*o9w3_pl$LJ@L6Ksk?3Yya5d7v^C`98>Rm0>_XUdIl@-jE+gtvq+Zc7 zbNdh_uBR}P0**cShHI69*Vh(26m}cO_5qn7!{k@+C^0Wz)Aw}a6B26vGS?i_OBkQ+ zQN;~9-I#z>llbY|2O16t$Y`aQ&7j33;pJqLo2|oSw&xZra4jll&(9{TpkLOdPBr*o z@rRwLx(x_ygTZ22ZA^VDpPD>+>Ok%eL+bWN++1gi?9pW2;ccQY5yq64fJxB?v~a_N z+ppMuSEg?O`^k9XHWJ~xe(JyX1J0{r-!t8hwFLqDa;}{ae!N{ZQkh-diwCBzEiSIFV1Z*U~SkB_WcKaWv43eV@FHL2o8@tQ~b-N z{ezf%4wN%IudB=LN7OY>O*R4KN{S_kjuZ(X>e>@dDO1I1QaM3p?>EMQ3GrviA0_xz zSE};Oz$s}yH+0`o7uqrsk420*+3?PPNfg7ms24})27pQ-4UF-tAqy zyV$vQAl}Xm7jeZCAd$UJG*@y$iVD7mvRMcI|Ko&vpGx}<(E4+kJK1`5|9!#uSxF`M z48%0u(^ROS;E>gCPSl@rs@ZN7)WdMoRwQdEI#BDZVvZ@>?Z4e-yaOwkW`+YO^k)~y ze^ICqFq{3AO!PPAF#r7vfI|HLLm?YVCM#E{Kqmzv?f^&d@bUPPu4Z2$BsZ88qNQ%a zD>bQ{Jnn`uViYk&Bp5>uEGQAI7RE7!RDhszJ;^s=8;WAAc`J!g2@NmXfupgqo#1bi znR*~Go9KSR5DE#YFwIk5R8(w%b`r5Fjg&Nosc6`ab6^Ch@O#u0YtqmdO~0DhGsaM4 zMZ2sA?gxj2MN#$oo*?WP1Q9G{`A;Ngr0jP?5j=<;0BdS#i8trp#2KjpUKw~OsS z^W;n)ZbUtCr2$5=+SERQ!~Xdt1eBgQI76%fY8eDsBS)q@UE>>G(R0%q%cb2dNAk>^ z&s>9Gf!B=FLGC@d<~<6iNZza84+B!Fw8UM-AF(xHxCZMxg% z-sdywpf!Y)%t4TtZV~99bA|BNR4^58zbV;QTJFv@Y~JIl!jM4fw6gtAE)ewdGl_Bn-N2L z>YzT^Uo47CkUWijlF+lVAg8qvY{rggmyW%c#}8aMty&A=Vt%(G#@1GuauAqlg6W4p7GS2m67|sUdZx{ihnBC)MlB2z=Gu`uEVfgLV?=ja zvHKwO;q(T`-Bdt^8PK!;3V|6KpZT^+enC*7oZ4$+#*dC?<4_v{USB)- zj2n-uayHMwbvni6&M`HhV|{7y3HxArhfUs|eq*2c_BGMd_1^kE)k>0=VUqQF{_E8$ zJ1Q<2Y@+A+#1wxCr1BC+F=Cxd9!z^%bao|5v436Lv2=`u9-mv< zh)vdR|LNoRkpwz4w*@CfNE8S@^D5M@&tnP8gFEZR)-9BSi6gXCqw@wztggT_`xfB` z4GTiDLz9Sie04$ons|oR2N(iGN2=ou5d7*w(+^+TwKyo2W3?Gb{q5V02F?exi<=5e zbzh}mzM~eUt!UtEuP?R>@ygvo%#+1fly~FL`A6hvc)!sf7XMG^JMN_RX^eI$8z_u4uv&%$g1D;I%Fx8$Rslk#P&b(YywOYtY+2 zhDWS9Ox0lfW-I-1S!O(Yb*tA4YY)nlzQp0B0A0_lB*syNX$K?62dF$ONBsYq&3;Dx zGmBXM#-a}i^?zowKbwi@6Jut4#nGTc!&eCFl=(@yax%W~f*A`&!J#=48d4dRfh}lM z<$(i#2SKk}MZ&W5%LxE35jd#1fH7oNOvN^W!-BPH(Z@!`;AKkO((!}94$#3>^g=owANq+k)*7>WASF(MgowUNonh{r@rh)0Vf1)fS=EMIOyY4-~6@7o1) ztuzYmJC3Bt+ z^i7p5&<72WGv&Au#r?z7nm*ho5Za0cOGMPR*e8yPI245t&31&9z-u*gN&Xrv@!23R zASU&f1Xr$NB)?i{*u)faxF}RD;P)s)HQe@I7y)CEc7IxnrIq4H)0)1 zN&_0;Y8^|j(h_r(;4l6}R0eoPQL*P*GUTi%6-^^+oBk{%AZj7{ak0Go>GleoB=Igo zz@*(VHW=V3n{gclT<%%Q=-FOgf|u#7A1c$YJ8@<(ABYgVE)i)b4@aW0_K1@Y%(5Db zL9@J9-s6Zjuv0|B_amHlx@uC((;AZf%B8ZNm(5wr9zD8#NAN9Iz4f6{A3QOX)p}b` z4R*r0f~1O;oPl(nFJ;N84G8?4ZJbCbmEzBTHQEDMO`z2De>7e{fMtJQ#L!^6^<(~t z=C!}%&7f%RaS9W-g%ulB>G8d1MT}Ai|Cxcqohb#a6j=+_yK@Bl!cPW!h0c1Ap-SnZ!6Gb7*zsS1dw4{ORIDz8ieJL-2hrf5=;1Juy@x`u z?gW$_lJH15+$OW2EduK%_pfCqqy>JOoZ@uSafSwDEXXu$`nR!kj_%ap$k#oxtR>`q2z&qFgDX;LfLO8Rf6;DhEt811OsBix&p`bM47rR0kU$ z70>t15UCRf6lWS&k3WeuC>FU9{|*yp{9bQMp^|neC?WfkBpmN%juNrSfubq_r4qdc z5~j7p z0nX_ae}?nr^47(Ye@@$K{{BgS$or~LRrwYpR(X-_e5n!pO2dGlNUD_R{ULy^Xz*J8 zVZx6!m94>+?n-B`iWzgl1@2DdcF^w^?)^d0S1k(s)AgzGH*iUpdAPZf2!76aKz*+z zT_P)Ncrd=GASc;^G^R~}l)m-xkBar|t4cjlYn&iNqqc?ThG|>QIo6AfIw*?=oVOY$ zc!=8#Z~+?{OqLaLkB)KeV%>tP^|ZVYYGpZ6A?teEy^cj20z_9jfPSdFJHH4(qCZO- z|Lav$iTTeYV*MM5K4jGF|MM!M-J zm;#x(^hQr1yh8fUK*k-Y&mfIgGhCQwU>uvRj{qKMJTJqR$8ZpAzQh73{7|d?x3~V! zKamx0OiN=Bl1ecK>S@->g=Nr3&Z<(AQ9}_``$_g9E}-@es0W=@Sk)dH zF@wBpAh6!EC%~ddNIx*7J`f&)&@)oX5tZDEaiRWa*f-{dddsjgd89Xo1_9nOhB?ZRnVVL)6Be^zCEGl>4w(VxP4rWkqVLtT?I-gVuZb|bfx14cX?TLvYh*l8|i9M{#S~Ckr z)?m5TT>F;tMOS}|3*$l4$(IfPll;u7>;;MbZJyh%UCqZW%e7Uw}Bj-+49CWQnK2QYNP8N1B^4=`0K_Stz795hKU)gY~| zAIF`k?!>+{((@~)PxvC#FCCZhVZKlNR}$N&ax^%xW1hN;v9!VKbACCjJCaD7r38ol zDui(plS?&p{%V{Xv!q!-RF&NC?qTfmirYsgqAY~XZ@JwB_6+D;`U2`Fd#3l3xH zDdJ1+M$KWyC<6y5k{83mI!iX7i+ux?#y2F%hUH*4*E1ApsIOx5r~lJn@BU}$P=-e* zpmYdHtpR=txe6Bo4$PN5`zwL5BM_Fe2eaa@nV_$BVfuD$df(P?yx(KwS>g2biP#pt zzA@MUF+7J>}$6y|AwIXHU;Y@^(i7 zpnTq(IL=9{e7gj)D3*36L%2_oC$sQ8k6oaX+!uWG2hE82_*DqjK2M0W<7QMYskn56G8UBI#8tXSD&twe`Qld4ocKAj5`$l<_p#+icZ@?oAB>yn+QU0 zdJRv@kOE)pQB^tlL#i!rmj`w2{Rsk3Zmx%l#8j~S zXt@WEPU+g~5__}r=r?)i$DB+Hf<-H8%5OZVFG(jrB&v5DtU5qJ{J zjB2mAPYRK-zM6L^-yZ2;qjH>q$~*ALpoX+#90j|0Y%Mw8&{S-hvAy#(M2Z(L!&;x& zPTi%yH*A2x^9GN)a?`)?B5Xo}jYKGn`c(}(ik7PECeKOd;vHsjsBroz3t^jib#Tt1 zL(Hz-dB1%lkhW=>>nPq;-Y?x*EX%T{#ZTFJ<2r!Xx~c!2NQ#%V_c$Z>tq1u!1$axB zT(9OUfJc978UKq%O;rEPBlf@X=tES^`EMTmsb-`X!FR?YOb>NP0#Oz#5hN-Dt3H4U zb&5;|ftA;EQ&X(sHxFk}2Lsjgiei@? zFfb^hx$RxF_>+fl9$D%!#U{pd@e1@v-iO1L*oX;1RK;C*5URbS476rgZaA3=3EdJuyzyuiH%OQFdBw!th;cMg^B2HqvyUzO7|uLLr5RJ$%IVo(egzY>)%;=Y_$IEs72-NL z`eE%*C1M#Bp_}~5Yx?y%>Y8pdYj+LkximU{sRTLuS_=Jq?I&o+5}{$vu7g@H5{FU} z7jWLn*4!YZ8UgouVQMUh*sY<*@RK^!L&W>Mf8H0PF6os*#Hj4kNi@KJmETq`%Tnlx zhrg^Nb~N++(p0nZq?6kLx$IMe?MdrTJ=V@I^;e(i%AVDUcdLHu*RSfG_=X_1ku_>I zpE-iLp0>|Y-0uNVTkt+gSU^_IOQbu3UsrKnp&o@%TU`(o+a6uHgZWK@bvm!LAqpgC zh@>f_0G(f?59D(~MK#SFIeMWuBb1Qwu3q{*exe(@>9Du#7ELpTIQMB;>@DYo@;yf`}go-~C zy)cW?KtMJs<+ZgBvc?i55~24p_6O%_c84>jQCbs@^xiiPwZ6?+k0S=7=w~kFS94#u zfJUE7yiektPMcqn&LL(Trt8(RLqN^_E=4=FmiUfjV^l8*_g)-TY2_e>1y@HKIwQOA zmxGFn2qgHc(s6cb$szqw&-d(V8oSb;zE=yxwAAA#=!!?AbJqd;nZh1$Wtl&oUPS#8 z_o3}nNZ8{bn)}6$fA77nShQEaIAaWwX*8XmaSZUqt?i^mhwE-H4{%Kpy@iz#4NUHyLLu3OiK?%3W2m-q$ug@Pe3>4yocK`#9Et^xT z4-=%2rx%e3!_+nWKt-sF@kx(x%Ml?o%utyZB@!SDw_>g_LlZbqJ3zBr=Vt?kr}Fqy zMnwN{!vB1b`G>nTse1^QBtpNh59*N^0w89LMoMVEMom>Cio`fyqKN(#61J)S{KtaG z#DwuBoxLfK*t=U?H2nZUMm2>}**8&|Xd3_dpuR$6!|*=FgoM5JZk=J+ms!wUECf z!v&0kN5k0PXc?CD$b5Etimn6=b`H zDwkRdnwm9`N?Pr=RPh4Jf-v&JF%(WDf79^yLwbhouZru*8o8ZJ^Yw?J-xQH}zi8&^ zwCM#ZWHJw(CL_#L4d)7cvPmU^xQ9Q9famMn?nwU6(JWX<_eCgzdBq~`>x6?{^j-Ub z)6`m5-_7?^Kud|HkF7xpG!6Z?)@*eIwzrUU5t5)SJ)Rb8-NjF8Nu%Ypoo`558L6A_ zq26HUN~Kan#o!Bv>8v?t$@~pZU7NBE__5Oj90~63Bo`cGn%)U?zA6`kCUWy&GI-N? z7?%#d(?g9lcuIa=whB%=aVoY?LI;?X2Y&4#k#1U(5C{HirMEJb-7t^3wf@tvTNr!| zQrFLfw(dJC&EN!nawFD*8Dc_P@1~WjH%*^ywU0mZ09;TlmiKt3zw&_?FPp|}?7pCsW-$nB z`ZydGt}BNU_}bi$=mw$5d8d<8;u&FR>kpP$5$%L~*s(uT?oLLjSrF9b)U~KE(nb0I z40Z5$>6A<5`v`>ydsjpHBhsID+Avfq52erhCZ2iBy>$#$Q37Um(7f8?>- zcUA;M7ua~F3}p8x9ju<<>J}{=1vjsBLqN5qP_}ljgT%QEtT>q5AW`eBE`9q6DIvjF zDoyO)SG#_!d=*jkWq)8JI#X7@uj3>QEd#;)GcAfoeqL;K9fw=PF9f5vHMeGYXS^CQ zJXxpyx*qS_0I2&@_zU$%&Ot~7v|Y+s7ndiSU{9GY`#!c1LD8weDK4}`e6j5cGpO*H zvQgC}+5i-lqkKRJEN(HT>^Odp{8R6)@fQNJ#Dk~LZ!`J`dmbz@OnWLEhuRGM&>LfaGywV8>ivRxzZ?Bc)W0P@@R~YZi;}2l*== zSo)5zVS%OihK3>y2p=^WqXx#oLmM%qH67d5GTWuVW3m-}bi!JF`l}NbP%s2|4pH{O z3BbXmjuB%7#eQbWFsZyy*k0$6giDh&N z3t6&iG*5Wj_@}?aGcR+!YB%WLTcXW^2Hy7&6;q{o!FH|vV?go{?Me1$Rfpt;^GV2s z61>Kwvizp%#UpFw4{o9?ad1CnBzfqPE7@II| zeL0yY`YO(ERUf-^>4Y&vZ+2}F98T0#=sYWvi4nVpt@+rnl->W+D?DJ`ih)aqRI-B) z8rLPcy&N1yty0$0!$2AiH$D2EIn_`v`DsfvQx3{X+zcC|jTrRcBF)Q?56buX@^-X< z6|wurCNusl7vzTGRRme3x&CMte#kMt)b@DAn!eMtJJ6!|{bYz0AxkdN?Asc5;N%Uu zw{aW-aL;nZ9{K;j@Iw$mY=h8V+`!vXO=D2b-`v{>w)hh{=BFN=+Qrf1_C&K3D zDC7$1z_tEvzpe%pq*jV~^eip#$GvRUN@p>l$Cs|AcUL@I^vc<}nsdSLA+g%o54Mk5 zPJj$XrUJkPAB&nqM}lPCG0r-$!mk3D}9W5tJD<_UEPwcUJ(oQs5W_eMXf`X zl@8~nZ8zv>-AE@}$F~sUYB`YO&la|R%_qepPb3*WrT1NoHhdWb=&DJa20_bOrzuGqL1|o26XwItO?4a;^myx4o5{g#sO!OiM^(#P3J=rZ( z*lxgO`6hpycP0iYdNtVMGtg93nW{Lx|A4^l6my?!F2@@zX>M3qi{hxEE(=)ZjBcc& zd)c4Dj`CWEh>y8uFfoUSPkP~ktj}t9Bvxznu)T3yAU#OK1G7wOxTkgQp1{@pGOO(q zz)*AvL9$Pt&wiPT@OwYjnZAiblL>rTdDYqB%oA2Y!r1**ogg+;R>L&1EQklRBV_)S z28qv}K|<#qKEEHsY?M#DpVz_5lYSJ7#@Ul)FLSlS6JRx)!zlplrokfqcU{y!{Es|h z`kTI*i2=YPzJHHr(9(%wXoIE#6atj>dg3r5Q~kk0HR?HPU0wmO>nK#I_Oh3 zpF5M;&qv#a^^BTujtuM0#Eb%we-Q$V_k}UB)1sHt962l;!md+tSX-|Rv7?VRfhCNB z?(UE*PLVdDHz_N8*pn%Mz6{6^@jk8yFSgLAo1#> zgmDFMJbQ=~DD1F}P5bCO^BDajka3dzo!W#ZZE<}5cvtyq2}edYpHy1;Ctt*en979ZkGrIMuS5=u_C2fvYpXju4zt4@;klK~QZH)2L3&akj~iI5wboO{R~#GB>ALc6 z8|o@a?{iF(#BTD9Ej{K=7@8uKWP~Nw9`ciR_T}MBz3+#3n|m5ynmu$)8RM;>Rs`xR zy@8Eg+i>diDVxBnkK~BL=K#I(dRmp{MsSrw?ycQKJ(q1|q7tUPC=lD6X0#|h(B@vW zlesu0ltyq82;5b7!pXMQ%p$Po$*Vbhd@o@!#ux_#cz}=Q;w?-BC6c3i``j8;ke9(G z(}NovaX37flv^dg=hn^d(L6>%O8PhNCTnEgnuBPSv&TcwhgY=#(6!>3Xb9T}4G4;B%|?WZ~^t@)=6Oa&R9zrZk7cBpI~qJf3r zYM)9QdlB+>csx*T!slkqIqBBb`W{AXTAQXn3nZ#J5>=C92-gQk$QYs^*>R8yuvhX6 zAJg&7Tm$uB3g54@srEdpH;!YzA^FSVXsQOie4?b2YM8a97Ju+X6Gy*+G zh4dQ#$QoapbosYOBN^2@adY{-wVDmoklkvux{BzrOhTwc_wa6DiMi?3k;k+8 ztg=@==`XVZ_C*qj$Dsv+GLTVma)OfH-urV zq#Xx-ZxvHE8ZNZ#8rUcs5;^%VLo40y4D69~6mYl@`ZdyUR;Ac*pnm_q+2c=XV`?y= zVWhNZEVk$nY;{Tuqha7!88d=$m_rb8HH#oF>L>F3-!C655)u^+YvCGT7ZH{IjkZ$_ z2+9X!Q>Q|Tmhl2iv&&^iz6-;YZYI12J#<50L<{k}!|-Oq zegx5rYev;q#6UUQ&^I*HOr|+j%TQkHV#OHLS2w!tgxdKNfY*cKnKFO|V8C}uFT>7% zOFA;RDEj8ruwBH?{jwJP-op9bO61^2pw|uP?ywfklUx`@uNY_S7z{_y$&5p+b2bWC zUS#D(p8f3iTbFf_s5AsV4*WZI5|7?N6SwkR0#=6dHBJ$CYggDo=i>fW$kx{$?h?k99Z4@qW^N-;ZmP^=7>j0cqT(B++Zys+N zV_+-r-gRg#G7f1g2W7|AfZwAkh=H&DTdqr@jw+f!t26E%r5stl5e)Rtv*oa400E5%_H8A{h}9|8p)+uytHosS6`sQoX_KRs8p*`wr|YSTWC)AxKc^d1Pk!3njIs183V4pw>} zo(P$*zHpA{jQ9CWz_glCJov*ic5iOZ1n=H|CgQo*q6AIeN`I4}$r4!7T36e@(rE9G zXOYGrH$o(KWwa}6l;iny0;BKTOj+CKd&2zl>56-|Bd~ndr5y-QQ6Au&QzC8EHan~KM>D>i zvo7?F)L-jtMj?P^wHAe_(x|4^FijHhL4l5 zIz|mA_#?x>jJS_SQB-V)-I}+#k-M$9QJGJE*D8Dbj9GN=8S&{i%(a%wG_EA#ETo$M#P(qE>t zF96e7t6@n%?7IC}dhmraJSgj0YNfMnm1u~WW0UClf?2hwn0|c#S(?DJ6Kw-sKfm_V978A1h@}tDb36*kHI;@=Lh1EXyedD$&oL>CRWiX)ZJ|D)@y0^(e=W{tbMhQ=W{1eajJB{&4P z;O=gX1`qD;?(VL^-7Pr5J*SyH|ID1p?AyNVi~81DZ`D(1WzaS-tununIWo@V;uG({ zE46f|6$DUF7^$hs)6(>>P|sl&#{&IE*PM7(WRAM(t(Olxr4hgy&kB2N)?t|%{YMlU zVJ?nQNglOy5UtPE=f~p&z?l-0Quy&hH#u8IZ-m9cpfm*3)#hpl*4MvyxRn&Z0y&8c z=TY2!n?|XvMH0~z)5jF6>|iCh?QU)0QG2~1C!8M^>9H=T#U6UW#P`MNf^8Uu&31ly z8D0iUAC$QBgvX$OV)zB^eA{~;6x+oo2Ly8%>lp=-iKw=3)?;xBVKAzpzr+_3h0y3u zKeY#cgvX7~qf|?dStEAVU)F^|N55@#wbu6sCbpy%S42^76&mKbr^`}|(;M z!l=MMq>}U|4V79^dxsQ`VfJLSZFGkusq>Oj>?#W_>21Tu%yftvdubx)CaFd$X^p$W zzda;jA7hi9aq=Oi;!wU-e^VTzB6Ixr@?_+Cmvp=sM*zwHU@awWC0{lp;%$W29N3lc_GUX4GHa~RBS zXt6XPK+HPCvu2Aq_v4u9w-yi3`WeTcFucsr<8yezYplU|?D!P2Z$h=Lk_f(8X`ePRYxT30s%n}K~ml!m9m>L`l;Mw4` z!Qy3Yv~H$VKdA5wlB2p089)2y<+Ad{DZ04Q;Ax=Hn@3;26;e-EUyZMBJY<5j$mXos zfra%#$Q|!+Lr@HlRJ;!qKD$O^Wp(rEq>&=RBEr6NR`#vbjhiX>EtUkzgM2-oon`3& zH(;yZ2_G~B5%V=93_ZiuKa#!^8?sb@?UP(fPq{}o=&^_q5H2fR&P#9g^gU?);299y z(*C*DZ@`4rc}&cC@f(N-aF1C-}=Hm+0Q+2FlkZQOwHic zO;5;dj=MYJqYcUTod3OtA17P{{rBT9@+yP1>=|n5RlS>ofVBXjT)jh{mo>^vcT$Bcr67>~w2bMD2diJ?XoJbsiW zsmhMCz4m_F&%+7a>NlpPaZa{S2`dOpjpM`J2A!G#Iu$I7qT1eiR*xuUH|M|h?$)4N zk8TP}Q+m7Bf4|z^ClPSmM7o!Ve1uFKB)`SyUEI8N8b8U%An;vCych4&4II}|i8odo z7yLnaGYGrg-K+Wa^M7j#A{E+GZ9U87SD_GcD!c6D_H|c(H~*_h1hrpggCf5G>9;QEkMKYrm1z@+gC6#*)T$-~8qRrB|@?uJEl$UvYaGuJWP zMX>=RCGj$R!ZG^knyoaHq^~1MzNZq*RWim)BVq;rKc%tx;2)I6c`74d%r6?&e$X=- z#j26$B-I&Y|E-l29+CDl3FTJ@&N~!JHCLgOAc7v+M(ocK{irdJIE> zgLA-g9ss=))guzsv!L!mHpOFEM}?B?^&r;POzqrZJfc|9CVl|D&laFQwG1!sEWyl> zxl}vT=6(s8PG|AoIoS2*XOb_;3LGX!yBKQwc$uwvy|{C@`DYIh%rATp6P=8(wY~%8 zm65o9ZlayPneTWOYaq22)-qrUMeaEHv-!KGR(7+FiC~-NQ05KK2=#VIh&olwa0S}} zcesAhKuQf%>;3zyopC$dJ-#m0eD}Ai&0p-7N6+ z)wNO8G0_kX@lw(6sl#rwvv6s>Sz!RPEA=U@*bxGDsm$wm` zM3*BT@iQetURzmRU(B&7Hh*2hCt7uV<0F@AoD7W13^Z8 z02IeooSk@uB$eL%me2EF7HX{D_*}SYtFD&T=lw2amC)d80V+d!>Fr^aFx6WMcIq-D zaYo|l9Y1kEPqV8)jw0zvYJ7?p!EFUX+8JeI#c&l^XB%ujc`XN8n~hqPwm;tbmuKy( zswP-haQ<$}*6*b6`{`=Ktpi=H?QV?X5c{lv(Xaw)q*f+Byq34wB!A53etI1uYr;){#R^l8TIo_c!K;h<+eu7w@afj~vb{P*l6eJ2(r zgimK(DAh_y5vM#7#hs16ulo%VDzq^3-pi^PRemJJb@>q{nlQ=~HRyp&N_931T!<#S z7;^D=324i94Z#)w)M~vE^GnFTzj+-0@D#0j|Gf_VVY6m^vswS!Q}oxRh$)Z^5VJYp zs6QmaQ4fJZqzUY4Rz%w+rG!X^w*2OZNss|C?bp`*V+vf`uL&-s=q3i-&`<=~tPp(A zVM=Dvb<7+sIQ$o06!6#L!n(iFOw$$Roy+UN?&{S);vOBa)BO_XxS%Q_dr_WQ@nl9} zm;(Pfr z`!S0=Mo(}(UykwThJo(xFT^EtgLOPIrBN2_s1`(H3j^fwqT&|5wtQ4Pl9EX|WLRdt zpowToBZ+x1hFMKAX_AWmGkS(BfPNZG-;Q>wUlkZD)`KCVzAr(ef-$lP+}+i+GBX6gpXd(@qikLSvk!LIWX$Q}VY=CHQ%p{Ip7m$+0m2>sayyG9%(B0Nv=rq z&;$F0TmkIyiY8H2sGNq-nvhp09CHCtnGF_7a6DUtnQ}pV?>-2)>AlopOBnX`?-Ciyoqg` zs=y%vDn0G&8xcJ3Kc2~C2MY~tWZD=C$oTJc%6^c0-9xV4rZm|=Bnm+k5+M4_7W(-YmN9E<4!o2T!d;9DR58ON0 zs7EGVlYj+tBMFr)W>;@Be*QTu2mzNB8>DbGKbx=eXKFXYwte-KBL@bTVm}mvf445fp%6P)&TqMC4yTIn%K@(d`G6u8dw^l^m zqzER|H|H!-L)cfmTystM!n&0^_#gDwepYW7JWQ#?3R91b{K1GHcTc+Je<&JFx&JZx zq&}!5>(jS+0nDQB8-zv01GePT^)$}Oh#NyD&*De{TdImpE1701TftQasTL-wS$F05 zc6Vm`Z)BqN(fq^zH4JS*{=EqOVYFs_Gg^ZPY5zS8jrf9N;6wI6K}k`TS^C29UQQ^&GVD;Er-F2imS(j9wP#fMS2taub|DWU&2N!T;>s-kbJkQ0J7%uiOSF=I_9nDK3p2ik~WZ58iEG3nD!&4!n=9Jg#FJ6guWLs<|R=r zN~+$UGy-WYAZRS+;+)7v+!>5>!QnWYl|ayHm4Oyj_BpG8mYFXlD-JZE#Z2fe0jn{I zpLdxbFl$ruH9APMAgVju+pBu(fb;qK-$$b3i%8IsXgRz^%pjUh3sg0I7Pil{A%-iQ zg5tmT;D@=QJm@>l@3FC!hK{*86%1-PNJ2UD^_Mv95q;v=Y`FxA4Pj>~fJj&`51qLu9_KN7hQ{w0NQN)21 zDfg++qUbh~k&ctBWrsFQ&3ECO4=K=Ydjr2#uc2u0_q|?}T&d#_71VUA&`LO0vS`mI z;vMEb5<3t1yAk2BX%d41u!kGDCWe6QPpvg1TJ}`l_@}yca~srWU;U-bdQtn@#O}qn zo`qbM98Ah`@82~o?A4#t6@!svcZ#fR+ihw`C7SU8(N2^S_{-doNS#KTjSVZiajr%e z>eR5%?8%N6#;ReuaC&t!jETYdu-M5}DgrK+g76N1iJ+}khCka%A*J=Ki=hgUHC3Nr zzYcoBuZ*nB92`nwbk*0Ye%y)`G|FElB_T)WtQfj&^bsZdT~Tg5CQo@TH+jp;eib@2 z+^Wh$Ak^3S3CpQ-k{mvRKOdhLap){}qWsXAfx@gO=dsEVN%D*agW<|w;>#zv)}TFc zBmELJDlb+^Ro?;=#C2Kw6kaKWS#8lXQY@(i8;rofiNpOKJ_YywCDpbAsayG?LdMq# za*d6fHDgIs-=7MJm2x`J%>gdhc081`Vp_Ub>c5-qK`;1DD_NQ#9r`1QzxVC$b?6U+ zHS3$f`ahERf8B>_5X*UmhZv#ZLy;hx0kM&&Slo$fbmxIyc$3g>6j+xu@1*;rhj5Xy z1g9}BE0hbO0SYGPM}4M&y<8G{G$I^$rm|R&U&(I&=XvN7#7E;I2X!La3;o4Mb5Rji zts#?ruh#cO*SBs%!(sgbx>RqGK?c}@HZsCDK3do>*SC!f&1@W=T$N;7A9z2?1L#d# zOv`gY$7~QG0;(gnh#i3=9c-HFQ=Skw{}PVkY`@S`o&qKPu6DeaGA--&Yq@zHEVZs28> z@+vLnKd+TkS`ZdK&U_f5HYuGM1yy&9D8Uqi-puM#=?VW@$jY@dt?mzz9Wqz`wUANV zy4`}JucjqrPWCaQZ?E@7Yb3wBM(Gn0AnvZ3*Lu>RH@PW7WI9*^<5ytQe5}`ynNk~8 z5FlkY=W-S_bxN%uEmDs?QlCt^4%^!VVdf$Cmle1M_o+bs!SCVX1+ra0gdP%VTd0m%`l1<;a zj<|NU@}6#vl8^f1m6?9pf{dJL3}E^@r1SO4_+_YP&p&l085cj;&kr*hBR1s}Gel}6 z>OCb-L+UIof%VWnoxg()NX-1j(TYNdwuXkyh_~pcDeBTpT1wQ$SMZh63KGzwR7%S& z0MQ*ux6W#R0o1O5ezw3r5OQ7-SN0eq%%LOE+0A4Qc40hlam?(Eb{u_a3Z#W)ozdjt zd?C*&(m#5qe%;&MneH%K^7J|Tk(QD2Q@v}&a-ktMs}ZPLdQqBOM~eK^-?Lk4_I|146)=^^>F*%L05xDFYsj-9tnB3q2{ zIx+4%Kb8GXz(b#^h|#Y-c3IuxP$W&~64{`TvRqxA_XHHvp#OA^QdV@?n(_|ikQ75m zM8nbm8$Ow^!3E#=dlwz545KJ2di7p4or7Va%IZv{8i@&<+q-Fg_<;vH; zn234WtW_n2KKn{MQy-h0&`C%L?F2a@;=rF;b2oPY!X+SrsLp-11+hpf={$IkSS76) z&YqYNG569#6>K;umwum$C>#ay=S|yea72Y3=XpO`YsomUm^GFfOd{>YMoRkK-=*H{ zrVY7XUwl5;2F*nLqxs_?E&9VvboBT6SJpp#)~s(n>wn*>{~7jR&?`n06fa7R6$V5G z<42m6e4aop;tL8ta*gNAulj|yh&P!W$~VW2MvJN7c!>s%{{p$xRi(-CuD6fbmN{@5 zD^#R5y6M6el-~ZU-1Ry3iF?Dr{_Fv?nMsp+x%A~lpLzA=pn*2Cf53?n%(T85D1Qvld1YD{6_ny+IGC@Dld01VKTfgJ<^zNz(=T3ec82iXo>*BZuWA z#2pt24$1OrOC*=M7hVST34>Q!=%3XK)&);z@Oj&d{-+#I;wC_Q}){le<;hCU(g!<$< z9mA|E2f`E4E21alp=Zp4DVR*4dnHKU$A?#ilhM0S@G()xA;8nA0CCv`XN?)B)M$Gw zmRr7XPu(oHz+g{Bm;sq4RC75&?#4kK)}gco6vg)80wHtjWF8p#x#Q9Zcemcvg@0MC zpObj5k4To&ViJQbc6m4tOgHqkTPyg-o;dP-ArfQ&FPEp(UCxe`JU3MkNc@j>-!%}E z9F|Ea3*ftRK7=|fJzFdqTL3iU2mD3m8J7m-(5q~2@0EWoJ4vj1>6Kjy(;GQX8WYwM zb@gXo3}BIfX~YrUOe8lm&cX#3!0-r)kJw(VqoaI%c2IGMtglk4Y^Lcnz#il3q&ZlL ztGdbsVocO9sfS8wdgcyxEw}bhT4bS~FeZOERJrSUH+g%JLJH0mF=Rq7o!s@*s%Fe( zkBY+4&*Zqb52k+h#I{rd%LlbO3w#vWWPjE;S64%5@^szM#q&hq)1pEm`x@z&XzwY% zHw|~MnXkDo9p1fiSiQ|VK?Ws6_Tf)04Y1`TX592ZRoYAORP;C8y z(^DxCM1RY(zl+f4YQOn`U=a;%9D5eT5GH>tR^f6~MQS9Xp*EZ&cXc64Hf<%1cCaQ2?3(#_Xau(8W22mhHqsT+XVy+tgQ zF~SAaMp$^RJZKc)LVcjRfa}$TOMPm>bq>AY-|3A&5ZB`oK0lpM*u9u@Ge3!rTE=|- zJzSJr1O4_3Hs{uo_X*o#M-NHHp!m+%x51Y+Ti;AJxn&R7;MKP46G1^{6fX{|TGe|0 z-hudB);k;9T}@3Xdfp@3x(B^PeJA+Hh6SIAD%u{FjY&tfF+=)&Y@c=0#ejaj-yJLM z-b4|-Sm$NH?ZsrC0CFCGzD448#Xkw_VM z?EP-i|p z7hmn1UqF!$DckZ`kQDv#fPa?r_hZo?Mr+nLqxHWdAAdcYF`>Fye#jC-q^Th#s1EUk zC#-ZZc4I8_CzChP?UG@JgYp-Y>B2y@L#~=*0iTLjul>cMnn$x%UPZtPC1nRA^A!#$ z9i!UGSMuloVm2D#gv&6qwg=KP3ug?4Jm9ej4H>w(>lbiwGU}w^P)5STV|sMnye(&b z;St}RK)%MH@Z@Fq0YerLv(Y|}%_Tg%f(%E@bT1agR3oO2hMa^&AJ-@>dMZueaNoy1 z8r!t}I0EdH^QHyaQQ*6sA%}gh5NI;$h!Z0QHhrr`Bj|~Nv1Vs(&^q7b3W((VNf98& zVj3ePUG;|1*DA>75kUnyFweOWjQFFE81SPp?tRt{qNU@b-6I&eGo&dMqp`53y*u=? z)rOoyK-u%Vin~dwnfiX26{LtS;${lGBTmRpjg9#QyiruWn2yrQ)1g3yu?KXR0;2p6K4^WPL{QKAK;oW`zYSyr1kH z;qjeJMB$}%Mf2vDTVnkQ2hNKEw}NmE`H`7leq|ectFy*|l|v`UO0NHlb0q{>Thyt~ zxx)LCHig$ut(QL!`lzbF0iCK6F|4i7Al&b+ND*kRoJ^sP8spdEnOWb zDj%Ozkv(uRM zJOu~z!Dv}FOAqV;b>XdJFf^pa#4}Z+Pl&pAw3@$e@}oIN?InW1wumLr=i|D!rlcjt zYyyoB`Br;HodvAN_TGwK&DlNPFU(j$r*Rw%^8~LCrOEQZH1Oc}^XN5eoV65_CK(i5 z5g<0+sKoZ^^VP#vH$}ePr|our2r>e?X;=48=+&7tdyG$HF-X_1eMbZU)<_XL3*!$l zI&~3oD-jsUb`tIJLy;1J-qa+g>p~Pt!4dC&K*hwBba)gt$4Wd0i;h>kP&|x&&`H=O zlDsT_ye>P!3thtDLrcLDypKnfOOCn#7}$(k=4pY~BqvxT*O)KzI;@JA9wJ`S6)Y3x zH+=5w+1baB#7h~e3&kb!$U6Pr(o6&H&o(04Sw-ULJD_vp+?^U52w4|5l0E{;*iHy;-b9{(UI=YeBm-Cx?p;i4CUvg@CiVi(XxIfSC|H-4%;SK5FRp z-a^V35IscqPM9TxcHkNe3Wz}H7h`g|1}CHA&t*sfDHH&&5jn!Dv?aK4rX5X7%)c@A zlKz|9;p}BUgEv_Ci;hIPFagK`O4=uc^q4D4Oj;n+GZnCHq+i4(AV|OY6qe5QJL(6! zOkM$%;_Orhj$*C_u9~vrx%2{+oU=nIA zMdj((DAn$kjmGnwB=(iRJ|;|-gI)1q1dFAqP(9Ofb_dn-cQNei!5-h0-!-I8mS@JZ zNGe;+2wc9_!9LMx?E<@v)uY(-yrKYeXEMptvp1G0ulqz9<%BOv)InXq3j&@E`pB86 zF4$Ep^MNi!ir&}O)<{E3sFQI2y}589+lO4kEtkpjt*qJu{DgY6>0nF$0Vy3wR9NW; zD{pMTl@{H+6}(Mz!EvyIkVRL~*Z71oF8`QT_zw&;dYkiDS1KZ;l0N-K7gPyhUYf$iJ4FckZH!)}w4bLxQ^^ma>M zgZYj~68twO9&E>#7?B~@l*)NHLFMU6*AHxnC{7XA`A+k`d1@9O9{sSREo#^1xb{Cn$w0Y*wRakhCqN(_aOqDiFK_e0E{!}i9uakpK%$HOG zOA^U=5OPP42k%8M;{_TIuWUlM?V0)~XM@fK3nAFRa(%B7@_`#>H2-NOZWw!zqPxXW zLf&YkJLQc2-r}l@T9>1H?X~yaF0XcC<)+nR!$GM_oqp+&YwG0%>B&V;@A0Ly#p2Qh zu+w^p!g+3Nl(v~Qytpy1Khrs*A1l?zxg#IPBQP9?f!U#I@>f%8#MxkV<>}@^b#Bc4 zsjreZkH07p^J#+(YQ>+Kr`3)*@KA2w^YH=8x6Ug%$U>$hePo6(ssWKmd! zd;{u(xfZa52Ij$ObWtqoL6)pgL3GBS=!XdN0Qzwe-M;z0zR`XtZlAirQ}r&YH7Uq3 z^ta)@*!5D4U`1PwT5dbC{{O`u{|AsIWeXpx2LWVvzp0N6CgBUuI}h9BN!8{U=3RPC z7e(_ccBa3*;?IYSM{#w2N!Mhz}m9G1?%nb&HS*@jR)>^*As#1-}|2MGb+7`nNagaL8M>nB=m2pUoX@ z>m&!09MdF8I1b6F(nCN1Sr9CZpadHPkPR)KnEJebOoJF9*t8gNWSFG5C#_MC&4>O; zqawF#D2ET!bEX37T5M9tc$cMYIKrbl;*M-Af@Pc=S()Lbj_##L%aJzAgnyk=H% zJguGO-y zK4raz_iq}uazK`H@F($d!tg1epL=NVb9wR7wsGr0x5?U^4YfF+q#3jMmy}rBM!o(# zOV4KAgoS?mpfv$06hU($I;MaIZL48rHR-p}w|H>Iz7NoeC2I33C8Ds}PjjVX^wl1= zOjSha-d4A1;)l^s3GYhpPBVA10weq&W>FKCLZv*^BCObbXm%#|rs|;8x zx)ehoB4{!8vb*LYg7?ua5?@kOsiQfd3Z_QJVAm}!jF^8CWln=MT_#G^Dck%yOqQiUAg8;LAu1&rR(Y; z0xj*O@T(b_wBqU|_{vrkzI|Eq@6+8`%NzoHlTTzm_FBm--Scj-m$5R1QyGdm9V{Oj zS-C$QQAP5K8A(Z8{ishHEPcpZt8YBpZl=o;sLm;_lwe$TVA2fzp1`54-fk(vfl5zvN~ z*%ud?ZnOV7@jH$C&eLHs{TsS?I1!6I!KVp4QgnkU601l!?$-7%WeWRLbaBb7`C0_I zNM1*s=q&^I++2A}N2ZwpL_e3$&7#CT9Faz1#{HQMy!>48NMGAfLbP+_xT&S_?f49+Ik!O#tYdX+{wWsbJUhEe#vYD>dYCbC`pMXZ5euTM@~`X zzSj9q6^DB#PZ8q1AT;o*_xEuUgs86gT^uL<^n}!p3H)pV+mqiRYSRzIChL)c)UQvo zO%1H#NUWMb0d80V9<6kH9&>@b%v*BkTa1uf@3{4I1FM!$fHxhYo!{VBl3E~Pa(I(k z?ifT}_Ax-PG-rOFZaA}ZHizlM_ukSn)ox-loDAZz-dmSZAc0Z^;&!x3lZwBT?h{=BS`*z<_MKZj}5>*YYVzsw< zHLsk+G6gp(nxU&AZzS^BILO_i5tGkqualg&7&?OM{#nuo6Dy)j^TL4$Iwm`Vwjfs; z{Gm0)#A#Sz9%YZcaw7vg;Z^Zj`JVKm%fsD5c6`(6m-W_TM(<`d1nCX~n`@#m-Iq0s zE+*-vj|`T6dkE0Hmm)ZD?uIaUX?W4iP3VaftEMo8ifjcIHTB z#e7539mdzn+?rb`Y)NUAeO@l2 z7}0_|>p5WF`6YHVwu6siK|jAi}sc(D*aDDz?s`i<_hr z2P$FVuG?ArG*BlC*WbODmGt{5C~t9wMUs=4@~TdI4QuCZH6YkU(3J^@_{D}2va%~Z z)=vVadWh;4xdAmCF%bnjDl7Ohx17r5NVx4!)>6bq5HeZX%As`v8+SI_{W7B^!G)9d zLERK4*}2p0B-k@L(2N>8IR>z?hk^bh1KD0&w&Y0+VOPX09y=HLB4=c_5JG_FLv3%G z46gcuV=lX^K4xAZQ{HU42`M|rG5g#Rll}~n3t3t}#Oe8t-^l5?kfhnH&|MY6qQRcS zTzvUOPy(HR*CG63J0+VW_Y{=-nO);7rAhYMAVg=-b$8d$j<&@e%Ot6=4Z_kgcN5;*VtRC+vn2 zhK1fEofbg5mmQ+*2_OeAMhu7vU9$a-%p}ASY==URkH%3flOE0OGjxh_DCO8TXK*K{%6ZHX4W6*_R2(+jB<+)88+yWPud`eoswEE4P zuriK`F(!?Ip6?NdXN88GSOyA7pZzjcZdMh_9BhF)h&Mb^m4??ma+N#P6W#ESt_HYs zio|H^5ycZ{Ib$kHI7hx00-7ZsyW=R|#br7xyhF;RS5ZnZR(R_l+EXY&T~So6S5P&S z3WVJ=(T*GJp@}M`l|S^gO=p<9NxH1-sHpyS#P-<2G^@;MtkA)wnXUuEH5xJD8*N#@ z7Oxo%1DqOV2m{2IZ{~t@*KN-&{wi7w8iVfm*4XwKoba^;%OG8AbDC(UmBIAvd2wct zn4`DLn%8CXBEp$@=b9p!>cE%#qfOE4ZmV8%!GY9?J<1}@3AWs*f0sMI%jsBsz-EKb ztwzEaR$GRa1Cj9y!XZ&Z{z@AD?k!j1l_B(I=az!9{v?kehvX@0T=i;k5Nc@(=ScUa zXh7MRDXjW^L`_P1WcSLQ&mld-5hNnvLm$wPw2i!#+g_O!%-P^p#=nqv(WaH%Zt3ZL z(`+VP6dG@ryHEqKJOO+LWYoqTu@&^WiG^Vy=Z(M3u@mMf@)Vf!kwEV{Y}ZQ7v#R(b z7gVwNZYOuLuTS1_@<-_Yt}CB+A4@+3WyKswIRwH8msjpah4iDHbVoJoJK>N$QAedQ zEg{*#a)lBU`zOX)_QhtLa?{+aL%}A0h40BIAmG1IbNL%mw z7w<7e;2JNlE_<%fcsQd;>M9^y_mGW0RSR?tuWP6g&`>v|Cr-=x(2*_j7sp#AO9-bt zwabYme!sY)9~|R$Av3St);W642q7_lXKr35(UbbUrrae=(qQC=iqqx?$yha5-oaH; z+V{pgd;(hQOge z|GgId;jCtRb5?Wx*EGa*B1On5A}T7_r|GEeNXX35&7TPE?@B{c>D47BG|>b04c?C# zNCA*wVAdG!6%_)28_VpnucxOFM+blZ1Yx+uF#v~bh*gVh0O{50f?nWw;>q@AX&h@l zNcA`ab-s#*1fqK&fQa~>Mm?V4)o9!5`TGUK@hoKCbohps)2w4qv0+^I zu3oCsZ{37d>nk}U4l5{y&lJc5XXS&1m_zzp5aSUM&Ikg<4ixQ#e*xKua^+Z$8mqdy zhX?Lg%uBFg0BM260(k{vQ;Pe9zP8zHb0m5rxt=2!?0eNTBZ>^h&9OB-U_iRk;tKnM z=bsq)2ukx8v>-20rl>;3tYQW$*cOaQNoQA_>_AJcc}Z%76T_Dh&G@)u6N?{&pm+QM zLzv{>vqDFlOUx3z3^RjzLY)Fj7dwRS+|2(`KD`#*+*QkUKm4(dCAT65fA?)E%WNzN zEahZczQLrmO_{kG{dU^5`sr>}eF{~tTH4M_XbPqQhcdhPz+)>u=TnA<96cA$K2Edt zJ-lnOPP$=>i~d4*t5~!r{`6`~Urvnc5Ps6x1Ro~&tK3xX4I&dn4Ni9SxjdXxX0z_5 zOuT=nR2^2+GB}40w(;_aiY?x2Or8T`_kfPd-m~Yswla_dS_;-SzQ*HeP`HbKd*MmM zpJg+{V~srSj@mVF(n{J~8sa?Eg0@W%9q!!;9S`3V;>p>>>%&cne7y~Xs3 z7Q=UFtaI1pkGACZqn>K9eCI-0Kj-Y0&N1MUwXa2<@ zZhh(tgcLP1@^#%2jG!c%oT`w_7-t5Rj>Sk5uR3Ner?91R>USaoc#70nicd#pgl-1+ zCYPi5Qu1Fxw(8WRK|hvxch}QZ5H}6p3-3i%rWyS+<(jBoR zJzdlB4Po!-=*FtSFNtl$%&#BJsU!__PhK7%dnu+e*X*v`!DC=T_pSR}(GIgt=N^R- z$rAb`wHj8UU00t6702x`FgHE=7M4PZhK$Ey=pjOXer$S}w>YH;U+|G7x1hKe-B(a7 zC9|CrQsP|~)w1@eJFi?u)T9{K>PW|SXNgy3?#KB1WZc@u3gWAe!H0QN|7#wCpZ$9c`omSt z_U5Yok9p{y8`&s51tr=R*gz~mD2on}X0)f7ui+D=&U=J1`fuM5Ai?ol5Lqq89t9Vp zgAOh}3kK6iQrq73&qsk%s|^*1gg?G^x-rj@KRT8(3$Y#pc-lAcw7Yi0 ztsqF+k##Z$%+B(k^y)C^$=B?De5Yy&>Vsx3@h9u6<=?;BF+ef=`YxUWMQYtIUt5+lUC8& z{Ar-pJaCOfUL@{$HNSJWMYcLyq#q;XYze9;uitMB>rr~d^pxwHd~?9dAZmms=Qm(h z&@uf+3en0=g5D?G0RyxjKZh0ZqUwD6y;gWx%Vmo+nQn@w4POy4g74&x+Z619xWL{B z>5^64(jo>fU@E`h;%(SvVf?smhXvM@kS@PM0xv}PPFD13-`Dmc>J`^H0YVoep54Hi z*dOSB$wmS%=-SA_u`iDeY;BZvHlG)qj$OGQ6x@1n1dKGj(GmysZ!;z;^QCx&$ zM9fOi6tB2F& zRY8g!xtzPrMFnJ+S3c!MAoT4Vh0>AJhcJ2J@evz9t_*hETg=ZBik3dUTX4(oAjMgy!tJ3{A3xVdi6+tBAmjt;_hp*O zAk`;?+DsZ9xcd0obMU~Y#dej}QW|=avZ0Tac~C2sXOnfEpM-u~2m9eZ7H`sVP*rwz zMk2^en3cZX``X#8Du1~exI%l(xU%9QiG%D{k<0bVXkI-Ggtq|k@_E6 z#Dr>`2nV&0VFuvtGJ|Q@CN#w#F8UWWnANwX4 ziy03T0^VB&)}c?|YbMuS@o^WmPWaj!*V}58EDCNZ;q#i4^Pb3-$8AmEZ3B!tv93U; zp(2BjFirb-6cm+1=6Dn}vkWQmB1Z~U9xf^Ds04K4N~j(K8ONG%W?8wUe5f80*3gM= zAgnsjjkN~?ML#>OiYDfB4pdL@NC=}oMnVII6pKFhw~MOq3%KAaMLG3cs5fG4lwps% zigrNwPcfA>TJ9;?P#`FMUpxnzg?bQSl5a+Y-g77r=3OSx8eEhbcr|a~f^O9D$eFEg z91thJ!m5o?9|?YPx&yjBvN?yi^Qxlu-}pB(Pqp)yrsa++q~|kP$JbM@=5~OeLc7a| z?{xi&?SiwI4(XGmbvmaxqrs4ld&J*8!`n*8m`wg;>$VbZ`TgA)=H%=6P2`HB@Ujbe zPau)ug}tNK7fn_qQ)82@su$loVSb(AR(r$`=9cSInP(7~QEUP>DX(B(8>KPC5e&Qg zF6~;)Zk1d)d-I*de;ZeYXWLY+H$#-IXU_OsTEQ-|qwZPA90nM=Y6nm8AnHX)_4Dq- z=$FfV(RH{rzi7&HsO#7w1amQ^eQ87TY`AS~+rvTzH$3R^;ju*3v4aU%7&!BlkB%`N zU!s6Z+ET{#vcur06+?{VLD0`tqgV^`#%@49JpO5)3Lx8P(@EJt^?+rQ9}}AseBNEp zXvLw8zNKYKApQUkE5;#^)yWTzp>W+krUxEp_nM`0x&$&ch86b0G30`Dlx~L*Fj*dqlW9-Q;fF7-|N<-=wO{8`0FQ}@wB`itxSnjQtdHjRgLIkg=Wco?&BHU9X0WEve{aXI*8kCfYGHD|X1(Mx|} z#5X4QJ_Ty^KDE_pRpcUGnI|n(00vyK`|in~qq~4GCjY9IybGT8tYRd@w_MjbI4v{2 zmqRt!Skr+8IJXEjfVUoSiVEaFVhOr1HL_gfh1LpnBW#?&gR(~4U#A7{%6wJuoU+Fj z<*FyS{$>mzZ&Wq&yWrzR@?qOyfg2h#mtpX>DwvNaz{YD1U~AKM>#!9{0rz4#e<2x% zZ)rx~lyN7`2MkP+F`IM}vHd0S3*GJ`T)EQuN%4fQ(bU%i#^p~#vhD7Px|-my(AdyF z8(7j}(;iwx&tE})Mnn3|{JSIdAKq%VH*Yonzt*z9nuTm0FiMrC zR0^3Xky|uc{m}eKuUEmL5$o!Pg1NFp1jy9M0od=eB<@kdKBWgVOX|bmDCh}2VCb;H zk~@5lu$s=EstJ+}LPy$$(A2AJM->CrPyd@6d**?s;YRKdPVe~kRt8kR7D?q6p67rU zkKLoq-nzUOY@S_^Kij?q%|wO~V`H}j$EF(y$y4>Yb%O=`JTT2erl9aWe@F!Sm)au8 znz8V48J_T;Rgg7;A?y}Xm(KGjHSMZmRyS#nIjc>6Q-y4N?&R-qe$ZJp@q-@ktu#X( zV$pC|;+W(1QizB~e%gwOvp({R4KhD^S=!suV{Q~u@(e=(QT20X>VQ)G*&|TE+S9l3 zMxG0O-wggL9|#R9Kf~(5z(ix@mvv0$-x{U@wSN>jla>9z$cV?tn88#{@x6fd$YC-N zMpjbGrF>K>IE&5r*@D&MGclis%Y>I50E&1VY0lfS8nPZecLbhu%z3!AY14t}iD#i8zLE`qtpmgZ zl}FKr#zFwL&hBw;Y^l}1IHhXp33H~agiqt8Rsx)8Fvn4Cm}}8{c6A5)7mF=Ny0of? zs;_oR>RpBfUK7ix;%#C%EUcYMz+j2s=A5WgjhFCddDrr}Fn3g!v0(j+{Q~votMXv7 zj2vVX-B}Nh&1JZ{Ei& z_Z4S2o&Jwhj@aFd>nhHf+L%D6kN)qNQ2Hojd661}0=5TTAfWsuByHz zYgDG9abpkzdrPyg!SYXp`92>xzFn5llrIihC1?YXGsgw-Zgn%Y7O;UNMpiMSx;m%YxKy}0Yjc7b7RQu`l z?V!9O99~-TA=_-ghH=tik_>RO>inRieG9dfqj7B6rwQ4Ulm7yb;MCuRINgPF7YWj5 zUq|1W1J<%)ufV#QA*-z*ox5ysly>!(l=90OXE8wbk#h8ElIGWsi_p3@7V|qHyGBM^ zXlysbGx-Wdkxy6FOzc`JN|&Yq-g!;FVTeU7tj=qZVe$NE>&y7U{S$TqrVNsK81o5s z#@z6;uLD&ypCCWmX|mUjrufF_yq(x>ca7MLI9ocqV7lC5V50^4)Wu9uG`= z>U&>)PSu0RE8#AF&cOeghj4BGUWooMRemy6S5@#+6VEgMPyoTQBLhlqaua4SyREt2hg_lfT~Q#zLwu&zp-wJJ0?Y0 zg80?-6zv=&ggd|rnQJ6B$Kt6rzokMpoog{2^?$T2nt^=P9<(@O!uPUtjb9#|oBO+2 zREbUIq)O$gj)+y$fea{e4FgJbq9$K_FFcZd@-gUlgjOv=09{(qwS(Y4VqvJ7!qZ{@ zKf2y3EDkl>+Qlgxf_vc*+}+*XU4y&36z&pSf(Hxk!3hu`5Q4i)aCbSC)qVEv-Roc1 zJat7qqrN%kJH`NMQulYYgE(=32Fnued4#3`%%&97GXR7;8-yHe5F>TJ781In8$|~( zrl-ykU$X>h>zqeclu)w#{joix?*kZ-44eSdjC?Xz)MIcq?Us9Z0xY$ERh&`%N5vUe zde41i`iG`$iCBZ3OQI7boM!L7dy5(4_b{FX1KFv^q8r{h8sEiu7a|uVI4$0wCKC2> zP8F~En)Uc!?8c}!eEnxy%si0*a_%U1k$xiXJ)(?{YEZhS^OrF#;IGeQ?t!{2Ec#Yz z_v7I=^I!wch-g8+i(*t-yUZ+DsUv>Wp2e~dbrXMM>u;3Rgx;SE3?^Y{0(W60si2J* zb=_(+gWj#EOS?tH5C@YsZuO3=c%C1=@>D(ZCpKF4i15!#`;6oa`m`QcA~wHyi7F8cwA zr0m;Im!8V^r6q1B%Uim9a$I}8c42mDl;s6pt&6Ep>f>bUy;_LpYefOgK51z*)-U7e zav?KbR^|5)R2e~enf~oDTjh!7SS|@E)o4iu0)>U46o$D9wJe`ecq`ecH5t+FysgTTdcnIvU z4z*v_p(m;0qa=z#;@8VS>n+f_RdXDxiaGcw6yxAIvT(A*iZ_1NuzKP z&}SBCT{4S$3put{qAuIkS(jn?K8q?PHZ^I;U%uXFk^su6-476EGHU>V*NxvrL`Y0LGd@X5iY__1J@e%(`qv z+FA6u674!K`a-Q=`h(psJKVUWbJj2{VUMICa9Zpy_pvxu7QA^H!a)Cl(ei&E?JJP{ z35NwABIm3)Zuk{k!D+E+lX_FCW7}cu>xQ_&H61&(!e6dKiJu_7#6>K0C79dV z7aDb9%s0rYgxogEu#7AY)${y5givK?ULKc-j+|848c(&VU|kNlaqM@g2N{QM&{wWpwpZakHTW+YnhS;QWyKlQ940PY}I5H z9F^3?yA|3^uP8?CYjq#$e+z5!`PSk52A|}1`J+tF2MbWc9r=4EOJ%3Gns1UHes^h* z5EHgl4R^J6OSYGHM11Qi9Cgfuxf1%HVM?(@1p|0{n5V2PW`=dW!Q)wbV93|zNtXA znkNmy`*0k%>Q=o7l zHP8FV0loI@|~)TLj?QrTp9^J8H(TrBRzm5n&;*}~F;+hex`*ot)$_{A#_@{B=O8x)NM;{0 z8&pJeOUhQTC3FR(9#j!6E5JEL6`wldq}yxr8;I23!-8WR(@5b}wGvdd!0|+kiHDP{ zyBGnhxVDu&zvcr3rEaFMMrqcy%5lNrj3wpBY)|cBGmZ@=Nge8C@qNT6kM;w~PMKHW zm{?w3=9MJgUV^Wii_A?d#adEFJ4Co(V~43y>}$L0uNKE0l1!qmS%Fn!c%n|Uw}~@D zn6lHL>Znc{X!)xd^3o7wBj(3+L(+M;u^O*3T6x=EGF>i(?3mu0bZn#c%6IQ_=@k^Z zghS#cuC`L_5de88Yn|lk5PHp}kRMv3$`VTQ&L4mfI-CJVuHw^uVr=SfHiqvQ+~SFI zyJ(@12$}sRm*DFd^f4(~myqUMwwba|J52}!YifP<$ITd5T&ux>WItPh5nQL`hF20}`W}>Wl~buqn5$nb!?@mZivf6+gy9F-7y-4RCgw zWlCUq*cZHZ#e+yWP}{CDa1k2Q6~DR)r-OFmKWn>U%8ux(I$d>oCMShOHdIbHQuKLo zf^X=>7TW}^@>?%d5(0g9oHZ=ur)a2eB}95KbC@X!2W2%T{62!Smu!S9mCt<4SODe^~1O)uMm-U7e7`BJHci zrJ#^S(P5FcU^s#WwP}H$RMxi1&_a;$fFt6%nF11HPw{cA`x2i3S)ZV6%N{s^iS3X~ zC}Jvw9q@V?o5GUABDenrh^X$|y8pxw{WX(u(v*ZIA5wxFTdOg`Uai$dqrN5lP>7Pb zK#PmIh}*a_ps@FR<`$c;Lr=vguPqMX94xUb_?Zs}uJRa>blo-qJ39#Q$WAzke|DIw z4sT7P6LU#c0$7dSr{JLO({S8chiCDRKEB@}90}kv7j?1-X$Mz%bd!Mn`7Jd=-jtx# zkJoD8I;>5Tpi)$gLz7Ze%|qwXgh51jX}ax535j9);B!-jYYYt22oQ@rB&aby3cRNF znFBqL_d^M7$|4j3!|P-qL9z7FOq}ElN95JLAk8_@EP214kZB&MP81T0jRa z66SOBJbS2g70GAm4RmXJ&g07aWXNpK@W)mw z0#WTo%P_@wCOn)^-HUP#_aol&PHtz88Uj6BPxR}PT-YsN zp2Y-t2+GrH@3Nsw0tOgrK|em`skS~=dor^qkzy#JJcT7x)VXNb;a^{Ub2y9+_+)-i zeYNpu$RcxkSLc<|S9WfLgN@tvC_(1>_NAa*SE2F&kS0~Gpi!9MG(PRS=(n!QA z^YJ%HUtN>+JndW2F0SC43nQ!VKpxV%!*?&vBrDYW=1AW2y{sI~%|44nxpzW`BNx|@ zt?M+t5djXpeyNX6E>E$h>r5?!W5-Z1$UUhC%g?N!a>35|bq>U6G_&sZhHV&1P>Ue* za}gSw$A@n#$`VPWK`cHMqS!IYBSpgrdSW+EG$n*tC-nR8gZLJ#iNS8yvIf4bS&oz* z>DnO?pAPAA?S(8AlGL+RS_02cE8($M(Cdh_%BW#CSi`DJ)B@~z!D^!(dfKiY)KOc} z=SbybLg53o)=KjGwDvO>j*AjEWBB8M?=Rg77y_Ep$z`ucQGR~W;{7Mr0~;Fv8*W+{tsZ017h4!O z(&oZUq+%9MUn%q}`TakM)mvbk7OX{oJDJg?{<9YS4XEb$162R#is-M|Y&W^AE;*ss z0$SY&vDD*R2!4VK6V9kSQe4KiX1@A+z~V2IsDY`FFceyIbCe%RD8uJd4w_*yG7pvN zqBMk*<7O%h@_4D=`>SlzLX7>8C^{_j|Nmt*^WBO;+_90^9NuCa8MTy5aP>hVmmMhc zI8Q)Vni{&(wv18~F>otmZD@0X)QXhO+7L2trj&h@Db(^=bA_FA4V~8KySWNxP~My92e1XgzI;5 zi3%jd)ItCs^ZO6I`w5^o!E+WLxM^`p!d)=3PE`DJFQ^;_^nB1`W9>sPK56CO=+Q!34-{5au4di^&0My?1Z-Sq2 zTKE_%tR7y@-5Je3Jp2fKYK*j8!jum7IuA*&|BfGO6{!0ABQ)^lqf?guBB6ywPPMo% zq1f}ybhkW_2+_s(qQh5}?Qq}&XP-@-T6lAdB6DaXE${xy2&8jks@47dV@Tt0y%pN# z`UbV%MC=p>a(?^SbwkHpu$Qa6OMxp<8$p8hf-}|m^x&6b6ukwTdz*vEIs|}c<}a<1 z9t37vZ@ctKg`%BL1kCJC-mA`H{jQv1~;6w{JGuVJVwn=k6e=o5spKiU_jbO26cKV(wl^O2k=tgk0tuqAn2eOSV@ryTvjQmmNn& z8d`LAAHLZ^HW97C7t$kL^&P(+yc*Stdn7;9Lc*6bX|2-2Oj>~+zzR}chOQQ1J@21Uua*YCCxkl8Ltx6+$J7|F_63=U3&X4VI&kiBBPTVkt;+!6=! zx{7%lX+Y2&7A97G85Vtih{XIjLBgg5lQ&ur1~fEm6u6v8OtL!YcIOmBNZ~0bN7JU> z(W=`9UHOj$wl-YMTC(mScoi5CKft&q(3b5EX^fE8Cj9Q`fq1(2<^P=kAFSP@>Oj)2 zfbEWg&8ab?@{|~#P+=}l>!VyiQTsjCc8R%%d#FpcxoO}g1Yf#R@Nro2YYq5qBmfn*~1XBqk%Rn75Van=9YREMM>c8F3RLEzUS>WGZuA&77I z|Ac2&#j90C*NRa>jF<;9MnMsZ?$ns=Sp&(DXIO!%3v5H$ab{au(|MXq2<@(6?VHpA0S+4r zx*hmphKK*NnZ4iGOPX7u9lS@)QUN1Dh0tcBRF~HR5|O+k0J0%=!<5dW6;Sls zku3l7UgS{|cs~1A!5Jj@RWw^5MFcXKH-~yxBzCh>{6QmnqR{LQPmOuar&^nO^C&L2 zuL8!1G$q|TP@_hRq9!yk_Ur)Ie89sx;wfpmel-%)teEp@nSNIkQ%No`D-^|Nr0m{I zY^sQ6N-Vk1OCeB5E`Tk&@R>}Y7`iCUQ=(M`^x?*%=6%ufwZ{oT5q|?hK|zg@lL0LV zwaX+aM*9y(6!9;PD6#oyEZ)~;pkMocbVxuE!T432ki9a3GS6Up2;6U0^E-Gpdf~dF zpUcG1o(>7s1rC#`v%ifUpX-SsWUrOKcgpbBa0@!(FmHD601`zForv@S(dLC@;ajne}ArKK;tnLoORvT-FP3a zk9}9&C)lROI%SM##GS{W*!gjTJ?OY*HkawV%Op4Lt{5}8#?PmAoa8=a+c9X>DSYE7 z!_lBI3%*CNU+G8he(xQ^89}s(_<5VQlc+n~F(=`okL9Kpz$ML3rXGH<@}q;iqHa>I zj|W}P4T;5Vypd=1Ap3`Wk0B42BXsCCztI%%E=PKrS_d%@V{4C?$HUJ|wNair zos#sp+b9;NIIyQ` zT7mQdv&o+V`*nlkfZ3qT-`fS9-r|h$J^)okhC4N-t5}Ccb_Y5gV3KPJx704)3#%EX z0Svi`jahx1-Rwnq`0NCu+z+?8yj&pOBJ%z(NsqSI2ap zEhozLILmCR*lL;s|FP|`jG(ATk)&;!2L@P~Na*K+dAu@vhjPjk+;&7{>G{eqSjIi^ z&EPCNud*zwq#iY@aq`IVsSCMQUh3(?><{!>^c|-fVR$D6T|c{HJ(;71%X!-M$Q6+q znHq%PT&jq5D@F2yT1Tr$f;1DI51e2ZxGuPRl}`Hn0kgad#Ti4Ps|uV8g{sRO}7I+F0X}*s{=7Inzf(P0F#sF z4Goxc&}TJ1ii$LtV)zezXoNXrO{f0m~tQ+*P0{=^pHA3U$iwWHj#sTzD)efW&gV|8C9x7d<24GP>kcSPywC{db{Ln zQ`>RfdE4NL3mMT{+nvBGVWBHBdLBu|M6rK>M7b*s-DJ|`XFMV)TeqR8TMD*8Kv!2a z)UUC`N#!4s8s37xB%^NC*nc0)vRL20>QAArxe1crK-m^#yOiL#4hqf4;CH9V5P@>j z&4}Lhhv=QoxXzo#hYd9G8B|d;@yS)0H)qFkq9)7_-Hk*k%|dK4C|n!ilPQa~8AF4R z@FYn4LH;^Jwf|he7pv8Lv?btdRanWoUeb^rZ(>L zaXjoBIH220^bkV0Kd|<#aF-n%a2*f6+4GKi8O;bGp$U}VyW_Ilx46@$euRu*Qby!H zEe%O_>LVysMX%QPnyJ?E!KjuaWKbyM>f`sEwJW;)5$v{BnN#U$cb=)XNBJ^?Xp!DUE9;>WBJST+)8dd2#o{UBEXOD!y!^ZJ9Ue5iY7vnUYVuA7(NREAIoB`KU{j* z({ZP5mWi2@3r*=N76Y2+88|2mfs1Z|I!_h)h=Pe(2WC9fymRBVck;1UAye4+%o%@W znBQq?c*u0@(DYWu;k|vA<8?KDKO~QA@2&yMRY8`tfY)8|$*21LA~Nr8b86V?`w=}KKk-I+3=6?G#y0?uxE`0H03RjDy`@2Umb4(xn< z-$|}Gv)#i#$MRkf$IwQ2lZ68NCJyjJ*+Tw^MEHTMa=Tl@wbnj1q+iQd)M%yC{5)49 zeSI^?K{DrBscV$>`gca`(=+#SL`eZyh+_Wx8N^@x&qDM!mYU-aOZ^{7X#euLDi?M@ zk|BSW3+vAXP7uIY;7sgps*pglS%~P8Mq%TLm5Y|zp}Qk$w1f&Eq9#Qrpx{9sH9U;M zvZoKB^Uz1NBO1YI~eiYFSyIaN&?lrS4a7q4Oss7J&Z)mm)TBuphw7ya>5S zghe{O6q#9v+aNX4ZzA_-Z`1w_(NpGX@5dcoJW8BU>V+x6!v;Dy@xyrJ6ROw|jyVPg zs5R%IB@0248lEQGBSp77lXJZq){3#88b0>N#WhJ~qk;$zntE4jB%86ct_f7XD_SL* z>8Kgg?k34-;uc-vA+3B#nk6-``tzrbm9WcgCON9I>K(QGgTm^B^6Dwoxtw6bMB;v) z|M9R+$cF3v&gri#v}=vBtewBI(7Z$=1@LW0+;iHIJj<68s0z;D=MMQYpkripHs@aq zt4+}jbal5+RPlS0m0K#L^m_9G{IUI%>F)QGlq9eBL*GCr@nbi`KtIcH2Ki6n&!?nz zbE`HmBp)cf6&2us^AF8y(78!Ivw?jL1t0o~F3(KpW$D|TsltMWMmIHom?T@x!n9TU zKX1mzuk}t`XLwg^n{ok5PB(bX~AKqHnwOMqTx==-n;XV5$?H|jN7^l#@bl;C*~)F z0KN>{@cZ=u`#Esl}f2=3wUz$MVLOb_=fpq+m{?UDPq{x zGwBX%Ac48n6|i2^t-uuiTaZ@7gw6Ipcyg?EoFYs?{Z_(FVGnk$M8%2fO8_G zwzZH~K$fSOTLh_L@XsgFk5u1Elg{~_wk+ByN>DsGS2-4fO&*?5N9!#{Ds)S~R%(UW zhr7R*XF;UOrZ3$RflfqCgzi5(a`Cib%k=q)vNCU9 z-Sm@^nunuIqca#Eszt1`1}jm*e=Cs)*FP)K-*9Skydu7};s36AKum&_+*!ZPju%6(vX-29T415OK`~5^t9OwR&L?$(YZ39mH-~-@i50_FS z4)Tk^)}JAPUo+d zhu(VyQFm{~Uy?F*MtSa+)v9DyKKah!EtC;GnTk4z2_Ku6QE+ha1#Y8KmW5`7yOwWq&q>8%Z zPzxN$fv>*f+n9T3m?ZBoaVkU3H;W}mP0?{$(bG-()wKKB@J)FO&KForOTnN227I(r z@Rm~7W~6wmF8kt{dBDdCt`E{Y+C`F*xdwMl_c$k2DyE~T1&nF1-pe-&t)Dj%T79kC z404>1=LTQQNO?9Mgqs8?=;PJKB$+0sgzQwG7_P$sC~!4>b)t2yT#i_AnXBzwn|UV3 zytJB2M`0gzpHQZJF?e=p04sQkCX?feOyg=0^t_66ANN9@pvS~xx+2Mv4cB+r<{?uY zhr>Vj!EZEAT;FGoyi3Zv*Qo!EP*5>#i5=24FM4E=e`9}xU3cy%sOjtgVGqv)NU3Zy zsUNB}IdaN3p}FzqbW%fGTj=stPhx|bi}3gKS`#M9&5q~x*SP}JtZ zaMPpLhXMB$e+57)Hig@DWek+EbOfkmz=rZ@W@=P4Y{0Uv8vdwdzr@B1_d%o8LaX2eS8f1+7Fbxjqr|b3 zHvjl}^avNos3zpvO9o2`885vwIt=8+bjX?Fitt90Do^=dJlF?K{B4@MLM)Qzvc353 zvuj41^tcZ%j4EAEuh`ztt$w5TI64 zk_qebE!<2$lzfZqxE&LCz($B(4TaP>LLrK-W2%o1FA;4r2ulNp0%edN4dnSOKE5%U z7B8!(D~A9FHHw3-6Z{J%pz{v;KbjTS{xmDHn01FCv#=dYgWKyrlt>4p;R7w~Ntl&W zO2T6(U7%!>&a}SkpT5Pba1O~B3ybMXKPZ$a&)U*Xg1{5n4q43w%de+*StcMO0}m)O zS~INZCv@yRpg8Cn$3ylsy+faR&B_eEcG0L5TxOogI6OnMHhMD&ny1ydRIxCySEs8}R9^|$lv2WHN zHUWCD?H>>Y!HR>zZ9tOXczgr7YYZ+^S^mOznCZNjB772HCg3ayD+26C^w&`7j_;Ft=3UHN~ZOQ3JaFrQ2Ip6XAJG_KR?GIxcocL z0t2;*4NG~`t28^bg*0~!Z~;{>oY7gP8!VD{3`ADht-fwVO~F4`Rtc=sTy|&LkI%b6~3>OxGcDC%gw?pP9a;*Xgf2ljad+?)Mx} zNPdY(Ww&Z|6Bk4ibj)zeFyS?&v&0+6Jb9i8V~~#U@E7slHfZVmJ8=>EEK68}7_TVK zS*jE)^zxx6<-M}GwA&!O8vL*DJcBBZ=(;0-fdRm*X6TXG4;en|nxILvjyy62-QZHb*^XR|pMVBS#bd77 zVUrdG@M*DwP~mHH`21Vh;bO!l3cB#Wgs8QScZ57l?E1|nfcMm&BA_kd=oyV?Ea$Y3e&}ZkxwFmmnk{XKrMYeg$Nx1u{8dczIQMv3Ss^;k$w990- z!0+D7LOBad5V`0&Fcql1mA~V>cLD!Vp z-Q0XIIB3KI9LGor-cTF63h(;hZA*lMjnU)(C4hcpz#Ymoy!UI?^JdnN&|W zWs0f?Lf?+2`rT8pi^|_`RL|#M**W@`v*Yzz>Xj$O$Y#KBIVw!0*Iz+IjAv;SkG@nA z2Yy)JqezoR-y=q|T+f4`g-6FSzWgY9q7GuyUZF`!In$1kp$TF$AYX#C7xc}bKg_p3 zg{L1a4phnu+65aszy|$Nn$2X?{`U$x15^T)G|xNAXo z{i6xIXrUbO`)jbXV-xJ`@CDCi;GF6!YNUTTJDx3#{;E{G1HXxS94Fo!WsEmi8T`RH z)#C?tSU9}H;k-*|xzovw;+_SaJ95D{y2lh+uMBlB#lT4#l4CB$BfHK%c-$un{vg51 z(2wwTzA8Gz-rkx9$OL=hpUUD-xONebh6eix{e;66);kLWoH~^%N!IlW(({+9 znZeY~JlA0vAvl{+jz>%wZUosrZ3dpz)JbLEtMs=ak%{j@^OKxJ{G`c?*IPesH*)p@+^riLcKVXDjX51*q^A^1`T1i{pvjLh<8gQ`4*}{alGj!;r!% zMX7zv+%<-h(F!3wJ)X1S?+$B^P#^Nj2Z=B7C#o^2E~{*gl@LA+E~QKhy!gsx{v2z2 z^nj(ZN|@s|%1{*>-b(mx0ZY|>_bYv9J4n5s&?Roxa-X)4Oki(R5l!yr$)QiZyoBUU z20qh%Z85pkM9j_)sP_uEZvDkxRNpjx7)@or(n*hd37aPfi@f`#Pr&HXc2B=bq%=`h8SX$>4OG4I6Eq@V zS25r6AXliKV>wrrds6#mi={??D}OBKhP z%5LCunR!(PxKjG>3v0!H&i~;28(7Wx2dw_v!kW&+;Z}@Y;Ulv0MLDuR6yDkhM7(&js@jN(I5g{5hyAc z8iC~bkMACijXjogMzx!Yt=N`^E>YG;16c_e*8VQ4OjH4i>4&&RX81Tp zksv#Dd$)u6_}yBZ8wQh6EvLQ7c?ELDQk49?D!t`kE8T+VLEeoH1S&=!bwn1PPyYeB zDm5e5Z@kpkpCwe(c`|s!%v!*W#4`cp*{LG}W3gd$?ubO0&6r zMUNBTYJQ8%$;r9T+)OZHy3BYMQ}pmQ3l;;w_||dsFy4VjR|=z*y8Dm+?!7;RdXqg4 zdO&j+|ExTW|0f%kcHKkqsb)<#eLrXoEiN{4Mcm03!foRScU#=bb30EP(aYhKh26=0Q*a|9y!E`W z;6+A(C@&IF%|>{FqFEH2oDkiZ>`Ygd+7DJ4XNvFkguF#KBC;<;gz}i+bCJUXExQG3 zPMn4S=c|YFmIXJ@mB;15KS{vvbaYrHTw+#d(;c^q1WC8Q2pV|z$&Bk=sm!kF(&81K znG~yoM=4NGR|g0_$NCEjed={MF+fp{#BTTm_S_#FQ5Y#x4ESC9Blj{(<+KxUoli0f z<&#i~s*q+_2h72GI~Q~Oup+tVU(vN`k*|9SQ+peOMc$Ya&>#FD<$*KsMQioYYYESp?x)DBII(j#T7}UPA1p&HA-yjtBu}H? z40%6c%k#no{26fCX-_6OXxg3GhTT*7+F4Z0mF>~dD`zq(G#Pc6ed(#BV7_z0Z(Hzt zFpH{NmKPiTctO2`1$@#bqmOoRF1AI&0Y3h6Qs8Yu zb9!9sVG6T0T9T}fXvT`!(D!2K-z0~Ha%`4|M>D*g=$FO4ma}!0@d~8=ESDugxe8W)a@UFPyvr%J%+l+IP!F}eE+F;VLDid{=424QVkpl@(-?i&c9LBoPVh5|E+iZx9eUWsTuNp)`*lOo+Wh?OAMk% z)9p%#*mo=yx!q!wUMM@rhfJ2kc~Bi0GTggNXl^2nVG|`5C1-s5*-wr#Kilsm(L0mk zO}RobSpfBZCyX-xYr9{&TWjaVTZE$^jKgaM(}e)DX+GE4i)@3M703e8i)+Z<%YxixP6I z;Wwr1;LJGx-P3$f3Led#@Z)E?>XP>q(>Z>*j*YWsa@0<8KOaNieLe3DTKzMcd4#<6 z<`le%$+Jfc$i@B%X54*Zu&(%>uYGba3tPw6J^^LJUib1V+pNPgETE3TtnOOTS$A2(2WPQ20p6V`yxn*skEK?ZWyhz8ccg06!nhp9vjkEVdsv7`pYnw~=w%#HWsIPQGs(?~Zvaz7kje zGL?3m&)BF4%oH%BgJzc0%=w^6b(c@SO-~0;Yw7~q-{m?u~ zcJS2+Q<@VNxLCU5q9h^{N7pIskK8|`h5I0Erm`uuW^~F4h+YXQ{b`ETU)KGL`}`TG z#x6dp)0=O5Lc`u_3q~v6qe9G_=oeLxEA5@^QKFwpwVwMjL6`hD{9f$c= z=5$^-O{^05_37fsF6>j85L>aY^?H90XCf-iUcN|Hg$cPZ;cGSkd!yFiM4S%Aq!7sTL^~G?=(RdVNWw3jGuS{gkHF0 z>{g`U8})%aV<(MGG6*7$t&TfL!oll%hn_1Z!6v>MQ3pr-=-Cb#!m3q~=LhZS+P>Vq zb3>#8+Y7Z~J31)FF268Zj(l$uY9Ekx%(JVn$8*r9^I3|#+=JWVdF?#x=>{k6ybzgO z$U>G!WY>sbMm;<_#;GAczZ3pFF-9DbCgOki>qbMyqls|ShFY{sh$Cp8f_q`H&;d{F zPV`Y4^BXEIlX%1n{$?Sg_@}N8|4Ju!Zi}mqX3=rP5nQw{7pw>ytJtGhoiPjx>sRW} z?GaG4(Vj0CXZ1R?%b0Brdm|7t^@yb7YrX(!UU(~feyX2rn!>N9K``#I5kX$eoM;xY zFVL{;aZz9q`kU2NYwMpy=x;bR=O3K61Vi^t({Vmgosq zX(t`S5fk;$)kW+tEonaEe`Y4Ir2wXuG$!!rH!8OlTB|-Cu^wBMUQdjuuHE? zx$4gD#!qM4q@F9kgq+V18q~--6{!JgR|iFMinNV{93--svgVwBjycZ^R$-OAN08Jh zg6tork7DuwGT6~D41+$}_rJ$BZ4R!pim6kA1}XES2jF1lPtOIEkw3aQ7*1nN{lMD1 z0=G=xfJNvCHca4oRJ4*?ms{osqx$ehvhQChL}}d(|1+2A5J_MJQrqslpWnAG zXs!&?qUKiyboM|FeH-2JTZ5ps@0-YqA@`2w#|xNDL*wF_9$iNo?(NpF&E@LA;HtlL z+(SkPrh179`sIt~kCR(T@i9NCuTm%B{tLjhc3rDGx;rxX1dAr&5OPPO`MaYtlXX2E zl}vjB6yMEP=;T^yXw3aA6ibwl6L)oE*j#C9VbR-8(<07HDbN^9Q75zCNEb ziia$Gb>~iwRijldR1z~56I9f&`8Y3!hUjac!noyO^Vs3zNqRP7J9d>TV{1Sahgy`Tzau-VnDo2D=^&PZ?|k@d7b;f3Cx60?2t;8vlemxr53X_E}UE6}Dgf3Gpq*O_;& zP*BSRQ2HdTBF;UkG5jea&H=`8S@y`GRL3DzEB+gJc}J-dN@CVMO}!tEd;l3ibamrN zP~4&I_N2>*rdMFQNw|=NeVu7J4wFceE;ZuUuY_iXwp{5tq@k-RwCk=@Y=d|Hgu5l{ zfU~At-$UG1_;&-vr;au1B4$T}$>~ohz?S%z(8*)i`eQ84-)Hc$Hu9!V3QnS~%>#g^ zGVBtj0;aFUP)P=LR>s(T;@Mf6XKL!G78+}Y*1x)7vy8q*cO)i?rI$*>(v0AvDzzhJ z{Q8)5a^m?RkO!W2FWx8dl;_jX86jO+Ia%ibng7L-(un`<7wg|2{Je!<b6P040r4>WI;Xopbag)8|43xKdt%Ys zk923fw;hI@wF0Vu8gd>f;Z9@`JnC`HL+K~g55zU>rmf^*G{${ za0CV4dDsYf&4j>a*X2QQMzswmj)=H7+8BDeDPm0+g%0s|Ta2o86Ay-}?fSVs1pDVt z*@sw+=;>ya>l*51XzEtBA;_=k<%#L27`|mP4gj}D-XogP(uUp= zzl_1FxLQR$AEmUKsLWp(31nwq5lE^&*XTj|x#Bgd#tyHnLsshHY|-{+36{eBnk;PG z{}{-bQ;lD8n{H#qQlm@iaKDMtNV0q`%)KA|=Wve|H1!N0 z*7_rCw4?8nWvSqfBr|Q8#=O=^7PO8Vgcuio{jf4FI2(y-JgkmyKGO+&)#Aw zMTMvvwg-%OLwR@RNak&M*5$G)ztV5xoZCwl8}%>*&t8NH*vy+Q5cSmM`j_Y&mZVS9qa2-?r~!~BsrGo5h8B7=k_-C^%-Xa*OCfV?TQ{7o#P_v z#~EkCn)bvxe!5dVk4BZvQKqz{)!y3GB@eY*MlEIp4uDyUKKKp z*j5qA!?H(w&z)6lNG9=tm!+(e&n(_dF>><|uh+fSz**Q5d7R-U#X!F@IAbr_)XyZM z=Q!EDJ+y~Vp}>`-q9-4)VzEmjsE%J*xTyBAC?L|dzSpoYmkVav?4@db0t=&f@=S6e z2QN(0KJW$KKPxkFk{ZkSTI)xdr?a%JWleG9lcp7vR^JV}vH3X8JGbFmDhIIpuJ&-YpuG!o(uvr}7RwOoXyc zKZ7XM&Z&6o(lqo}mld|c;3h{snNq~n_2~tIxX5HVQE=*CXLcZfx6D8{3V|#z$Cuq|Q$r?V4khmMnHXK6Q`z%Sxn7DA zQng=J3!AD*jnAULQQm!x=L}uX%xya@cx=;^h)b1J-)|-!xWkU6!S}Y@7<^GdcqDX_ zFGK<8(I1vZ9RNrFpB`p^7^=T~7^?qmL-aQx_R1U-)Y*qcKs_NcyJpEK8mz7LtI#2fa!3nAWOtg`CcEm&A6ng4RK%&D#8D# zGJ6D6nPHOFA{j=+4iV`a1aKpV13DE&L&hY=R*02CwhO3m3u5&=e@-mDivfuFOiYr$ zXBpeEne@#EuqHD8ir!}e0I^4cdsxKjBKR?8NwhRpi2B{KgJ8sSWxR)5@0UJqIkU$5 zK8I0Es}P*oLro00%^O4jA5mkmJS6dapeh!iIS7;#E`s_um#XD&I|w?)gGPAH$((pV zr6QA%XKBz83lCC~L5Yh6rIPxvB@fd0?zhZns(ZI@XY=v|AqCt&3c1U2XlFn-^XyBc zni9m)sYV!#0zVlQ23@I=86_sws3QhgG%0!qP#wcLnXo8kf0>!J_{m$G0|3Oje*j{Q zxQ${KC-4ib<3;>u)|s^6C>)P#;rV{)jXU7J?eDeO3hjZc_qCb4|K5ry(y!GXcd(1P zT-|f}z4DvJO<5_llh=FOCbkbQg-ec8RP)%M9Qduxj{;S7SZ`!RMADYKD(pD>7@kIX zx!;*W6QYslYVk|?NaudERJ{thNL3FHHHXS6WXX7FLX;Xalr7c$ua_9m5DS}mCJYo7 zt!0Mqfm-lo+vn_~V-bFGo|1w`S;Yx!nEM$#OE5J;F!9Jb|O=^X@i)@IVF}BT>$4*~K zHGH1ik+>iT_Z!1DBG^fbX(?phKv-X5p(PS7(?t1FfdR-p{;{urPX`qM9 zwX^(uA}bqOSe&mkgr1^(u0lV(Q>?dEXw1W)DU}^(giW?wikyPnYHavNyzX}Xcg?JH zXba`2vn4MJloty1ur-tpIMpW~>Go!ffX(b+Y3~|fVYMj#xb(`NqMXWNYv+2uCbo)j zuP%JD+Fx_uhOo%cgUJHjUchRCvJ^HGL94t<&NCLP5e0}>>PA?XFccF%`T3b7eI(6r?uyY4#zBxzN2%snxq2v6Kk97!Q&*83apub%cM9(875GA98- z6!M>gk)iiL3(+6m>MtMOYVLmxMt@rx(GrrG4N0Te^hC{kp#*cQD)z6c>bW(vgMvly zXt_ZJvT#S4QVZZjX&6X1ks)Eiuq_b+t4~PM;MqmPgo zMUNiqmM$=0E`t2_(?90eoi-(?N_7H?r_esr|L@L@TR_Il$lVL*7%w9)nov<8GZ(bG zIpxUni&1V+jUr^gNX8G|2tc5glJA>>vLq$noV@bxS87N8CUps?NK_-M&qnw~if-}* z3JR>^l(=6KJ^}u;7<$Ai?ey$fat}v zXaEo(=S#P{K{_iJum3+{mI})qe&6;2h`P>{{2ejdZY?+KIx@V8&;RV(c?Ue2jx%s!j)@+*zT+vNwj-FF$rzwS zs()>&0hRZjaJ{uPv@T{_6qgOX8FB5}-K$qla_75_Td3<=%5_b_4;(OwHL0}$`@0;U zT~sOBzkNOK>}2oKjHY+Fq~0u6WgE0->3u&(5c#_0hQe?c?ylGn&JUvTYTZQ*U52bx zm0n9E;6+v9Yi~i4!O`gYngow52FLsBGcD03t(iqiPH2F)Q6F>mnh2R_Ea@(-AlcOX zcbbbz;;H=D^_3*{IMZW7f~CEvI7)jk9q2=f$%_5$-7)?=h{bsYoGtO0pEfcsbHym3 zr1lMKNmAWqLZgs(=_pjKl{9phILKP9IPtG4G{}#v&CTnr0&Q{K*59+|1XtwdhdUM~ zA&5_WAYJytH~9yXvxMSWW0)C@20fY(ujKC2T5q!auf8g9iMTQ=&K4t_^BRJdB!#cY zS=$5!ZEtz7?u!0id)n#ET=4%$m=!nX_WU;;GW%!#$Cp2>)n7iW)&HhLe;XR3jZDQ* zNXSr7pcs{PG1!Qp0E_C~)V39yp_qLLE&&dbs?KjiLNRqv7+(nls*oD=1);WfdcT+E zaHM?}4xlo|5DWvRQ%o?%Ir^_H(3`_(fMS$BqlP+(61QJud_{f;}aDjgOw{^)d z46sjb?yqd!GbtoOJ?vKa+v!9?Mb1H&3x7GQ&BoA4{T%>&*c#1Q;OZ-dtLa)~RA<3{ zC~VrpxD2*s>+09}{?-S&jPe=loZD2m;KdOCM?lH+8+{^x533ytEe;iYi2c(R78GF< z%2f_31jvdFJ{Ga(#*3B+uDlEPOdgPkOs<0W^I@L+?s_}A6JWS6O@iBWg`_@sqFWxV zjn|kG9V-D^b}d4BLN6@=Z7G8XY)>xcKhANh!q%!5gH{*<1_bDfbhmM{OI3;By1q zYPnD6;K_P%>mJe0K1BLpJne-Pc2x$wRA6V0m)E=!3{)zwBF(!J#MktqlN!rnqMO^_ zX>>doL^zUoyX2qw^Q09yvlKuGHMux%52mmRT%4`gt!JU8@OZ3qHew=_&UL=+ z&sr7QK;?Ynt;7>E9@#JP;-m$zukf&#)v+%nam?292MmCQU!*Jc8t{HRaXH`fo&c4& z-%XaUrSm(byUyaFf_^#Y@%%gt^rLX8a4A}e|MfSr;@oG**fHrULtGH^%0}Z{RWOpb z<>Vq_0$~c-VjC=N@Z6WxNN^4WelPX?8}kt&C=DJo_Mh1LdxQ_?FXV`MhkPC{eLx!U z-=y?=EQz_hkFHLjsRHU&ZWnH}LBTFEDUGg-I<+t-Y;a-0ic5$_x)*~wQ>^ZotfJxyr!=vL-MdoA*-Dk)mS`@SO^Qim? z!zus=DGV=^;lU?{lH}%o;lZyx)70@$C&0%fzmB0CpNji6Ppzp>=6Dy~pp)Vhdgv*j zkRLEoJTkVcmZ|gfTd8$f)x)ywfHPcToXuM+7oFK*4x3GG(u;RZRAbsbdE$}KaWI1e zphJIH8LguKc^>-1SpDV0Sp9ESMurT)viiJnBn}n>nLvYXYf=|w z#)2$T7g=aAMg2$%J9=0crF%+oI#`@WhSSQ}MVNdBtne!%*yInK^0|WPQ01r7H97qy z!>Q}B4=5w^eip#VxE_o=09nmA^#pvVACQ40!dF*~JoSY;#es~Tl$(j3ih+LSJdr&) z8E`POa6}GAFRaM-LeQVAhpihZ1YoM|3s@l|e%K&klJ+kD1~%KL*r6~X=A`9Uhx%%f zRxp@v6>)5YWU%kn(W?H-cd3|}#GMowU@D7Yu+0SF+b=-i-rPEs6Jq4(FAo8r_b5KI0?o(9rF@qMP1pO~%wa?z?FtG5%LT5Q5M8j}1JkBE z@|hud!M8_4-427TuFL4~v@EOQd?V!ewwq$#E5^&AR{JFYhTBE*o!*HS#E=TUrD0XW zv%_eVtM-^d9^Rp6h?>z79RE4tPMhI*%#Hm>70PmV!fDZB-rr5RT9=6xt!zsHN1D$9 zRN!DKZ)Ffj_>?{Nwt|;EsKZ)mpwxF2RkXqDToa6~;bP1}kK4ARPMy!&23XgmyUfQO z(bGREuo2K6%SWvG!ukV`dpk1n1~Jj6viFzJGAZ`UxmOE`cRq@svv9B_=OTP%3(Hfs z1+qY|>tZBi`6QBtgjZY%C(KV$t|pD|c7Z#K(*_;UIzcDXCQp@XJaBAr_PI_S3AZji(FsUa;XWl&kDflP|^t1REw3Xl!aYyGAJjvX^St}em0 zU7DTW8)gL!?h>8OoBBnB7WGG@+>W5ZBU zg&{Q^PsM%j-4UggWpVAE#aKd0qsgRQq0V7^&rx_u>rc2D=A7?ijRo8Go2R-oMxB^K zyhL9>D$mYG3M3|NZIzDhn$IbBwA;6IE0-2*DdB*qjaM;km2>^~ zI3$#s$msb7fTzkh9+H4q1%5g^g2Ed;1YI z)5^(B7z5yOLG=PrXA4tmR?=$(h1^)OuJW;mhdqa>d61On6tuR5)k^cqdJ^E*5+ZSi zi(H5Iu!k{tka!P;op6gR*=C$ff1I(*crgjx7C$D)jVo6I-etsx3J`7&05qc&;9d5l zQ54=qy80KI@!<`yAv)fBIR`W~-3d26DmZmG;%t82R`J9p09(c~W<+P2PW>Hl}yo8~KbNw*t|z zSgjsNLukJe+&>}G2Fo<2l$BQLqdSj$u9Fn#gJ(GlF7^(mWr^Lw%B}-a)}MJz<^*E- z67W)l#kgQD!#BR5fXMpU;vFSavy*=L?JTDkGDBgJdd-%{GP+&UWiuRMBO}au`^E~i z63Yqj8xTA1pL@?$qhX13`>NN5>Jj|LMK8y*U_mZIw#C$wgjCD+6AUsw3(HpS3@d*k zRxLZUX+?+EL*`1xjpq-ea8~{>VkTe6sgG*mf_PMlDJ)QwXt7`7!C4jq zea+5bT*te0%QE##Os=2*?xEbiEHZ8|UFs+?iw{F_3JO^LN`TURpFY&~P!1WgD-o<14vyA%oco|xMqhJCdePv;1}fi zFpC6?x+_RRFpwFK0X?+BOspy2VSr;95 z+E$!(rSwjx4y8fNtR3WQwv>LpfERn-{Lm5rhSp}Cdkm1G$p2grIp_Sd6#e0<{_^3f z7Whvo0#*YD3%3gg#REh(Vrr!MX>56S`~_hHtpMk{ z7Di@0JWfLw_AaTk_=@7in0Rrycy#j=CX?yBLXBma0||o011y`K*D1t9(Rws z_U{Y+pyr0e@cSWO9dG^*-m>^o&1?hDWTn$urn`Jkb_MX0xw4mq6+8yJBt+5Vb}-|Y z@0g7HjujI&R2HeSBjdAFq|M^(Mj{>U+{mjl0{foP=F2aF;9+sRVq|^_{-M8!i`&Xc1RgrQ_PQ74KR4Ny}E`jeQ-r4k;<&) zo>AbdeCYuHU^qB=B0Ak9SM__D$h*}DjVenQr!ulV0VF)%!gswFd_33kYBlu(UlDNn zezrntJk1G$f_RK-akr`vv%{E3OyTX*pTm=FZ`i%D+J4(2i!VXKbK`c+J}33~DV#C zQ)BSBOV{Ar+*bKKDP-hfH{~<))Q3PoUlQ-)wc>#}e+M2&oQ|@xW5k?_5fi1sCFaHH zpJ8jGpq-bHUgZvmy`sZZC<4Ujj{v?0pj+r4&StEC7^_)7jMe`cz_*biuTLT(>bf`x zL%|BvV?+CdHeQGUqmadk75z0Uj6rl4T|3`Thyd5G6M}QF+pt?S7>NZ|!GR{dXAB-7 zQ=$rc1jt(aW4g2oEAwl9hSN>gJ0yL&!+4U)_;_xcX;qV<7yfc<(98)#;ZaeN6MzzJz8M}7?bM*ePa+|( zFf4Rd3Asa_e>s5ik77E&@{eLZa4mDO^&`&uk^AIB0A-?IQp=LiJe>gUPNYd&pdLsi z)t6v|Gu$XdHBwAPlaQbU_*_fuwpDOAjbK<^+D%$otuogVuF%sa?W&0YsuAkv8rh(_Y(dqR84w}=s4QR!ZeVf54)P-iTJ(&Sj=e_p8`&BMf+30$h z!j~6#zbnPQ@NW7lhbEoN;dGvjv|j?tEzgvet*bZcNF5MUn%(awE9_9sn3zEU&b35t z-*t>dr67rXAMy6P=6SE_qDMukPkmD^*i{pwmq>#!7W`^%HCGRZ@dj zy$VAz*;@E{-zK;uEhtvvGvkbiLz==7IABfW!8!UH=Oce_YSc?(R^Sm$5bf)#oZdbP zvnELfAMP&})EXMSrQJj{nAJ(AG)!?y(#2QSaoGL}e2Kqi$G|w8tZN-`SRlb1J13GP zr(;gawBG!@c1a=ZE}6(YfQ+Ozm~{4(cOF{j#;!zs{pmY4_Rp?Q<)PjqE58=1oJl?( znoUth$9GnwOpenE?quJp?KYW7boPy2Umy09RoOENdAZ|W!X|)4%3`86$7@9A*Cq`P zUqhs^1|uEH%^iA=WstWsvo*ZYhkVLnJ;J`HR@hQ%HZ(|V4{rLtT*`|~PC<`AkbM{R zBH7zLNEGgH+%;EzW;qP;IVQ=@0@a2>5DF1PmQ1N9%fFAwmkl>g5{#L2FF(eJ<@;{B z?>EXzGp8kVV`!sclG}-A9Y6K+&|H*aV$+r6xRv>P{5s9{>$k^I7}Ic;XchQ&P%YHe ztJ1*vk3G@RW;*_VQzGxie^#PDoYkx!&gy?tqQ4LL^b_)E!9>t*utPOh3*Z8(?3ilW zasB;0z?gF~KY+@yNuqhRXvA(GKOlnEsj=*6B1Ao<%GRCL_6M`%8 z{k!4y-~B{@hS#U%7yy%~2T=366Qw#jkb)o>bR36RC}}uZ9ajJ)QNSQv)3^QMCqk-T zygcIUpBJ+%a*n%3F}piKW~s#(eAcASiB7VFFZL@hheo7! z^T(cuX>bKl@cL^g?C(9%^wD1huNN2py5GxfYyj@}!x4h?bA#j+ql~;R5|Fe}?vh-p zcDf61#*H)@;Gz{wL#~8`$_Co?=QrT4eRVd5>#=B6^so9)hMpX%RxNdf9h1;a&E6BM zQ=h>qskU)S)jh;_PoKWtmZBPJB`UsMPZ1Jru*%UL3;@-%@As6r;V~?;cy1(&ap=w} z!DY2~;Ey)ACq_h}`|l2N)YMvGj9T6lWM@12!5{WY({j7|ZT z9kD3!{Xw-r>%Mp?EQxp#eERT|=X#-bfX&zO3Cxo#ueRgGn#*To1rb99l$esl``QE1 zM(|+FmkctT5{b-k-Hd}KIEQF@ZO4%@APTl3kR_rAH>!Iac|sRz+v(H_V@F`LQ>cgC$!YXAwegy6@T z)p@ikr^@YgHNqidG^hdR2&uL#>8;0&AzUYOMTbie9poDPb=MFVn@_UQ{Od&;+l9WL zXepd55Z@&EMdmTnhQ@An{+x$zsc-Pk!WO&h%Ols|@t#kmLvFpm6sR>{<8ZXLJ<#`~ z1>M<2Fk6^VnL7k2u*MdW$K?{q1+w(>I*ez(Q+H6Yc$zLOyWw_8b4}A-l#o{POZ(Sy>*3cogNr~p8BNp z90Xy;++0WoM09(|}B5?{Gdv>{Ap5TP4HRHFo8NAd#~^sc^ws)}u9EVm{!uIdFOhq)K!^V=LK4naHBKHX zU{wT;`r01EU=Sjo3)#(aC%muM?TMi08+5@>ske!=DP}L2NC1VIh@xdF_i(A!jUuhu zPfRxoCKj>hGH|-I_xkr2 z%S@P2IY^@b3QI892JSs;HbU*d=jWzl{4Qf9hnU0AY`x49d22RJ5NFx#{XYDj&fztm zEyQ!M`_Q1=gIT;7yC-3TC91)uDWs`7SrEZJGKEzJ$U$rSE!^7>)0Q-34C7l&ETvOK zQv*H_i&&Y~x@pw8C_DwC^RHFTwz@5p*8Wy4#lKFbu*#AvV#MQ$y6nU>4maM;eHUX0 z&oXwPDv+(yPtub>-<7*V7F%2OYA++#XOsmmtT6^(KdXS)f^!UOBR@cV=9{Kj1KsLE zANPP%B1$Owq_XquS7|da^W{5Qh**6xqC35Rj7*nWnh8ZTqmbXUFENYC0 zHDUn4y!wDI>eFrN%$LNCC6y}(`W&BqO)hlhORT2u&mOxY-vp3YXc8i?e9#$MnNyu$ z9wK+&2YKf~qP>1lE(n3Xj5&!weg%SR|7P)yMF$a0s}y}X%I)g)kd!y41Cf)%fU* z0z-nLZWtvXxxcO0yKvintc3aVp*g)R{3o5_3h+qG`GX`iBmFNcr7SLV6{;*tn53@) zxXaSko;67|zb*<~zj45sIiUo14*|1Jab8bHpMRmxxbB#DOYZ~d&>u06kfDFpp+79v ztREKZf5kk!r4;~|Gr-%d40l;R#t13_!RW;vU0rzYcI67D?l-Y;m@NPIZAxh@)qp^b zFriP_R3VlLO)>*`vLcVfu&52Z7+<@v$PENV{dW;rBQ|XE4Kh#uQlhiAo$urKfYht@ zUv#u!QmzR0{6Sz+GJe`UgHZ%x$l?C-R$+e`$g{xF8sKoP31A>qjC4L?BDzoluXX+)${v279cx*N(o{aWPi_Bt*!)VX}k zc1nV$1<=t9Sg(3e0ItUO7!kaH7fgL7lx`SY1FMM2Do*yUB2=p<{B+rxLps*XpmGG+ z#y)1#Jcn}rCLmNTVN`SJ03&50&2iEvQt2P)NXk+cLAmofx&wkOoph#!y$wpaEJ<1bkgCf?_1i6Q(wj9@ z2(`OW0d-b27V%@c+TM*MBd?atPk_4Vf8FrqHbaU5wnjLuWXr^B%?yJVA2+&G=F^b1 za(vL>yVY)2F7FK(cMiz$Pu;Ma1dZI=d!0_rr1(=CU<9+I?cE0 z5PHP{6wbXL1qK_=J&yx^ovgN(Oc~$X>kySK*&HMzxHn98#Oe^Z{O=*aRqA-)U!okz z@aQ<;eM^=`RQ5-axRvoARZ3Cj>=fJ0dP<2;o?CBgwGn~l$SN{NS|DeZ-DQ7JL*_;B zXbJIF`mwKOSJIgSQIjaR%?rVOjTa+Gay#?8*t))4s8;Jg=4V^$?1 zW}+g!EAU1b_1fXsFK~8qx{Usd^EVzI0@cwspSy3nzsK!h?zZrsavYZV8`s}t4NX^H zn$@!qKGg*PPWZJNSeJr0YHJ@Se90A#H*5_ACUbO`20;C5O)DT60S9z@%F(LF+7lGv zIgyml&!e8rEj;f_`(|Dl#tU5YG*5rF(gI9rUm65I$l13VHD2jm?vPh%|6}Z%F!|h zu=wsQ^qs>^F=QS){zL`Sa(=E6Dh0X^E~2`0MHGLReUd=605ThaI+j%WK`f`Q4NznA z-*4_Ve$N$?RW^rHO7;>lxvf_mQQ~qF+1Gr+1&Lw+4f>1|m>Soc$jX)}}1;gp9vAL%oOo__0+53pybKHA6Ok{?~+5s{3hIqjP zSVF=feV!56Bmg&K4JqkY4CKU=HjY>rILRCB*L5fb13x%8{d#}`MZl#jX+#X@aZ^A9 zid%q0sO}>}lGd4OLmDQ~49R%IGU}=HiiX@q(+}Oh7G&41k*uxSlxS6~@*gu}^VT90 zJ~Pu8Jfs_L5!LC_V~7i~D^Ae4Thq;OunSh^-*AdnZr^YURK{10ccFNBriUFk;va zxQ38$ml2mu0dJbqPZH{NN8dWtQ|BGuIAxoM@Dh`HIyP|fcy~cbWdD7?Zyjp;8<>y! zw~2`1Jr$ntufBT+U$KjRfB?NjNFrCp*Jc3r)LmtF-mYGqb#Asu(l}YQ>#o#L?4F0t z=851bkMl{v{16MYX%aQOCeX6a?Kg_o4;u$_1WTCmh<g;IL>W!N+aCbMMxK_T~BF&nq$~lt|o`Zqv*X4 zo~!OmQ?cZEap0pJ`WgwH#0o6OWWJ`b3R|(+j6k5Z4%*SBjcquM(2ZrZ?dZwiY9@?N z^Zh3f;WX`vq9@{9J>}}`1PzcUyI+~sbQN*iX>F@^5)${Qz4N0k>cg+tezS^%ZU{-C z*?Di+uK4(5Ix<05?A{Tp*?D5Jn|{gKQRI*e*ZoGwQWK)h9o^VSS32?L$N?|YJ+jft z!DzY+pNu5;Mm~JaoP&l%xnI!4@^S8m0|3YvKQCP~XN$@H$pwtaEwD@+fh{o%lR4(yfQ?juJz$xLHPIGb3|AmY*12qqCNFV>b<`J}6gUwoxmRY;)0;83 z^2i?bH&Kw1r^F_1fW>=*lcQIT1FR57rB^Jth{#))ZgqvZ3aDj&2BVe7eD`)SgV_bI zoUgI!XrF?uX+MoMwZIw-FgGhk4{Cc5RZo-gElbbrM>QjoVZTnipX{p>lfLd<-{bqu z1?Mp{w8hZU#lVPS;54NEJGF*;9@o?g0rn(Fz+wTC@6*L#4n0%hdpE# z0=-NMz@Zt}OGL@_RQ=p|JeX~t)+$VcXW@LMiKJ zY;7=Q-*rdhC>%@tfLYIWbld49Vb6tRM1l^sRBwAOSm#UC^pbu8pR)P!6OC)Ii(MG) zeZFak5PZk88XwY(ilKN<)XxyV6x^HNK+UUe7EMeIoiWO08(~_~={l$Gj3r%e;HxB3 zmk4it;Z6#Mn_-wesxaZv<+P3=WM3T^+Z(br@V?pRRfrL;1bMAXz`%gLl`;IBzwx@T zhBk8?cLuXnOh7aC27kl7D=jYFBQiBDx@&s0zKAqGYSWy9esdju&Cfk27I!j%qyDu4 z@Y1aTC!$w%(KWBdVuEUjDREu*t08Hi0ZLwH!JXwaKffOrYl6Rcm0(AyDaixZf+ki3*4sL{NsiU!~# zR0vdhirW72on3QAM9DcwJRKS)2i_(}(8lJABZBsRy-hDwpq>tUQaD_qO63fEY#p=K()S@1JL)Kb+O9AI@r_e;x4uo{2zEtP3ckDL{n-u~j=4 zJHZo-CPcn!(^V?lxzVA4Nl{w_`U?2u@(XZ-NfW080EG_b#MGOeLkPqN#6NaW+_*gfMEQ5o%+vXqS-J?1J6#}vDS$Dr>-%qlwQDg#+ZPfj871f$h~@!Y2PL9n@pl+XVu6lZ_Yv@*S_{qv1hSl}W(r5GLk$ zv{Oey>U48Qw&hV%N2Xa_n|Rc{6nu3YSp{>wP#eh#$v7&aSS~cnWDSrZ9o!+N(PN(p=-uQaYM|8hbW=Jc zn7vZ<8%^yEkWx)T>^oG3)v?M|0~1iW=p+^!t~0123?2<|%$BZ~1?g;7)u#1S!^0|7eG9 z3w;pV3y*cMfi;m3&dlWr_j#N~$db*i$=t!{y8$x(habg*kR{;^lH~z*N=n zNM54B0WVP*`!X$qD6377x+xL)a)6#I$2>o3qLKgOUAuUCg{uRaEMEP=`gP84D zotse-1xH!=nHs|@>nA4sJW^@4w&kG}0;vYK)l&3+!~)0gfu?ryW6F>Hp#NXz2I z?d@;6TWH#+Z+pd$hQ%d2Pir}r-I3WS#Uhzx+}^X8-y6e1G%OxGR;}caH9gMJEV_f5 zDou=ZSm{0yl;Nrg5r0M=Z7zABl$UN>Dk{~Fvx0VP@>GuT@^`K27^#%zljVM<=W(I( z3fib#tJto_m*^Y=S~mL03mvzD{D{dX>lZnu=+8N4=t!g8(Ac%(tnN|lYS9ZH&tjcGmKFCp=|XLhZO8vju` z-N0S~5FRkU|CFP&i+`4*KMdBa9|mjIf639`>*@(de8rHtG~ilp|F#p5t$-DDq z>HlVJTnr)wF!XOj0+CUOU;$eq7~-V-8u{|UL~@!tN%YIu$*_&`kHi_Rp;@YVnSrN< z;n2*Q5jQJfIQmVJ|EOnZ2VTu6Xrbc7&zc4oc|@e&O)!W<9R8`OK+bdojLTAHiDGkV z7w4n)e&~S#_fhw+*6DL{1i^NiYH^hAYU48oW&sQPs?oCeG0wg+m(==|vgzufF6=#5 z3YofLumA^!NjDZfU*D=humGtC;bi@8Cg9Crmd#k#ZhKHY5qiBuXegC=lvm{Ji*4&} z9BI{0L@xmp+{khdKYgpZzyjnhLwO^i(?^}gSSEE+j~yZMmhGXlGs`6^wHX8#C$J4C zr6A2#3}=aC8b`7GgZpp$g0k1E9t!_A=P|MI1M~g&5nxAT9QW4=zr%>m-JRz7Yn=#d z)%bTF77kWeOMy%OGQQ_d1V}H|PGn#kt(@e>9=JB`FPL7T!Cif=#IyURqz`7?u{FHN z4Wm2_elw!-um?P+({}Q|`POYtA9$c%)7lmh(}9{D*HQ@9iPX)fdK0ypKrueyPM_=i z0@B>%&#Wm!$+!vA86Q~#KkL_FOX4!H9p~C7$-)J0ys_Dzmz(t)7!Sl#6!DL?ZlW|` zAbdeRKb^Bf6v$~;!pf2KXUn#qafI@Vv7we~i82EQS&K$zH76pG6?E{<@<~beXUt6F zMJn1=FhGArBIaG@j6FtRjK9UK=PT%xeM=h-x+D4)xMsbc40ge;M>Vl0);X!?J6*gEym8c6L3jmn*^qvO z8jg%~W_h4iXL5y)vTw)669O6)IKq?$3@O_n%26%wlJmAyihqW5c6lH^qz)V+mH4WO zj@V1={hs6s3nXW&&wRT~6ftf7vtC&!M8CphUC9Q@X>+IQ01Rr=NaUBw1uB^LWdpVS z107V-sHPnBcmUB*qT32LTs!WW6rz{BRIWuE@~IQ9Ev3wrX3Vp82Jg!=4I?-2F3V5u zHOv$Nj$fNBM6JnU60IHS_K@C^M$*nBT-u;EJ}iU|<3>?81x;SR<^TWXUr}Ud-8` zfwh2>bN%%sf`lUEwDkeC- zzU$c6y^J3){*5II(io71Jhm?n*(`&-fB*qQ$eAtc7p zRKLIhM^&G?68vBv(qNVi61KW+@bi*p6?^OZN#RK52BjtvhNx9geM_!3;-oEppA5;ii|j)tY!2` zVN2`TP!agu3$k1#h`8letyCmLAg;Nqwkn|>BfPJONYDfomoy|oZfztklJAWOR=Z6@VqFPrwr;z^vnvzB zdP?(|^9jk%ABDR26`ZJfWH}+W1o-kX=6J|i6N$OMqB`7)$o7XFUa~z=Rq0O3v=1Ig zO^4cTXd9yEa^Ajj1ESyhG%#-01c)t<;l#mk6T}%C*Rzuzbl#BJr0^Q9=43*pBwBhc za1$3|^v$P3N=OTd$vbS!uyxPv39I1xgaP7q-p*mat5BQSrJ<4^K4%@A?8)v_YVX+W zQ;q&%Q&7e&EhLm`a=&C9#N(C$0YSs^D^?y!6HdN6NAqdFWa9VnlS1C22V89;M zuFxQbx^zMozJ9uDSi7%K0b&_JQDWg$dK#o5l>$g9Db-EYeprKK<8TXhuwx z@H*%RH6PAU-(Ffp>~U`}pd>SoTWUC8U*6YoFA({ZzNQyy5yy$&SY${fPg6KhE0#*I zPRVPEH0LyTw`?)7zri)SkEvQ2ZFbQShRwJQwBSX}{N0k5OO0oFO z?Jvu4unj@Sa6krdGu9B(Dj`unU&p3kUd3 zHAcO90w}2h;dusVi&p4k#@x~LDglv&K|s?WQr0}E9(nvhcuLi*yo-d$jginQI{f5( zZ$Kp=;Sq@$A-`t2yDwq)OQ|anP-OMfs8~4jOXnbRUw3CyzlOyEi8W?Pihe9iAwXZny==w zyw5<197^jd4X_&;V}rb#NIBaoToCAQ&$GMZpcy1oli8_~to)OUMdRCcwY*OuHbYDC^sLcNo=H`ErYgFDk1M{^_rkqE9)!c3vH{WB@gHwH zL+#yiT=`#Z{5DLzn|c0- z04%mYGB&`f=9{CUa1b{TDDB?A-FL|oQ%yDN#m)?Q72L6^^J@w^vGk}Yi<&}l-sMYw z=^p=+gdqQc(&N(y0R-1jlm{VUl1;QN_JaU2i$&!5R7;~bCdkgs$@hD@$A5704o2=B zPWPOE$EjBU=EQF;S)|#h^QW#DRj|I#cA;Cfmo#v7;5I_u9dyWb`8K9bWnfbap(u=s z2-3dRMk#Ut@cncd*INzv=~P`j-in@wZe zPLnh?8Z~ws+csC&*iPfdwpVQ1R%5IER^Gj@@0{~???2%AbzJkAbBuey57c90A75t$ zfJq8g-^+whBn9<3nXyu^Pb7bsy7T+oms0(>0iU7S{UMXHbqubQWg>J}1cN2jbCkxm(~#?P3#2 zeL=|Cnov`w4&iwC^r_Qv=aJn^zge|BB4235Z15g?n0G6f^OlC&x7`P1r_Mjm3<4?8 zAA9N_UjM2z)hivLBZRD@8JT& zD@4#C^Z^KnDJ*IA@4gFtr=mO7aHUivF{F3iodamXF%`2zupWv1^JWMv{~LNMDy|*? z@OCUaA~ULDG52iIc!x{5UZ+Gr^pLbD3c}_8XEU^}xWL*W0AiwnAVi`6fe_WhgEm8C z4foBOex{L2K#*PDNPK z=VlEO@F%ARNs6YZ-)jzi{gxCCpDnL?JL!d2vpO6huJ|iyV`wk8a zDf^LRI1E|}VI!2B)H@^hs1PT9eseKqb?N~)1&w2xK@=j7c=y2BRW@fNq8|&U_&y#z z_gO0!U%3u^xr~@DXiz-vP{$@{=oTz@84eC`zOt0Qngrj~OGK*$2$x#Ww8TJ51aQ{o zLm)9f$>V&rJp}Y+gs|!|({yj=32G^qlKWZS+dsIk=%Go?*gGhoHkB?%WwvTT9|74J z8xx&L+E-Vugf-|M77tKc5@op_0=q8H&|p6xm@ z8yNYJUKz0x=#QPXXx-e5@*t_<`c2}bTizY3J3xmuK%RC;G^`c*^0$Qt(n<=sW)|o;#cZvhgW!WTdG#aUm+{j+risiL~ z&|<=ZSxh^2Bo9$PU?@k0QeG{u78ji~&Tf6?@~u$IUMZ=_JziL?ekgKYsp!VAKGAsQ zdO%J8dRhxuxql~>KHpT9avTiwkB4Rd){?{FB-5xe2am}^U@OzQzw}0DM2sZ@<;)6s zxwe}*lseyXW)B!s#YDmcK*0v!hci*f?cK*r=>be!dnA7Cj+L?mINzAm_x8wPGab;Y z>aI)Z10BzbN!}}=j^7w)NAg0N_=uvlTG&#Xmexy`)iz}^A{&Qc<@?`Zi~j1n+js6= zbK+|rdotbDbe`cW=}dRKTJ`Q2YZCvibH2BAbkd7oh766)14X=KNz%L^_7eHC;^?|I zG+T7@p6PZ5N`W(@lkj)w!@9%QnpJK2m(IJAFRh(np)EV%rY74%HFoPos5Uq6e3MyS zRO=xx!v}wiNwboJgKLK1rzcVXPTEjTaVfw@c%AGe>keS-W=8cJq|I~nJtW3 z!v!M+U*ScBNQIC^1Dk_B`D;BTf@@pipK{ zgtjj_`E2)vOJt!crrkTKAnI;`)U(AU>29%3a^O3HCIcLKt3Yo*+(!_kkzkh1`3rn* zk3eWx%$lJk8%c>{1mWw|7vGAZ@AX!Cmq)T-?TTPgZ>46@8QgHt75xts01Ru{21O-f zXS)))q7|n?x%28HtMv8ga+IW{?T;S0*JVNvXjCm43K~4Z8Ya*{Od>IL1K=?l5RZS0 zHT>cMYAcKk$U~1-v4HM99ay!+mV<@C8H|=Sjlro5AeKdI(DJuShn+f2xyUF#Bj=wY zUO8@|3jI|VdNBm@54|xOFK7c9JkLlN-x!UzNty;#dYakR4@bx&*?;R1sMPG-ZK2lJ z%vxfjX@O3?iBs}fn4ZVvQ9Y_uUy`M&LO|B}>AeIOkmBIy>Zpt{e^*44N7(_2*< z!OF%>8+UyS^8R~3>bD9;w3{!I`=2ksem=109|xy_KkDza4qz92=IQdtXOV+UR^D~< zkOm(tjZ4qwd~bM6uwoT)3f)?Zn{{{2qOWXavP@%3u)6<>>c-oKlHSG}t@H)`BJG&^ zkz)fI z+>Nt96*{b{SfmNyt~NN7y5mQ~sr*9RLaTrKFk6o_T}V{YjD&7<5`lkWi1pp>Y9O;R?L!P#hWD{{_IXZSk9ot}Hce>s6#p?W8G5_YJ$2+3r`Nw6-VpcGcP(!&B7tf+6%Xmm zPdzZ<;peD%MkKgp-leV&OrO7kXbVKE(D1*?etmMok;1BdS}oldcHl2E@CF)7g>i07 zH$?`Bp-mASMGEDnVI^=@`|;=vTDB~p8r+{A1WUvTskqKg7B4|aw^V!uPAG_OkG7Rm zO=G;{O=FtXiGT%nywK{DMQkJXnj3=tg?5h1MH9&?l#$Ql+g^t3VjbV$O=jmu(NxQ_ zhz6$^7>!qI&v_xc*WGVS3BcxQpK{H?RZ(vK%X(z^{b1C-@ zE(i-7sf^Scv%gRC-k&2r3wBL*7})p9+}s>e+H)NlYgaAl39-0yuFSX=)LV+H2Px1W z>9Xo?|E@rPIH|eboYem-)A66xv~A9*1++iQPtIA)0`~V#_2Iho4ori=NQ}_hXzob^ zR8@2&##N-KAq zzs`KWN)VCKF^EV0#A2WifO`9oX_EIkNR7%yNhgN%Q$Y0(zO09#!~Z4*!SV-(EkcT; zu2KiXO9=D$IQJA;2PLVlyFy*iL96MgYk8pv24l5pBG88nose|d&@rwv$2_!sifMYx z^4KfL95P!)0K!d5Lj$Vu(Z1aeYycZn1Sbw8TGjxh4f=Jqi10CV#gd9cz6 z%j$Y}Zp5fl{V!}}om#R!TT_g3LT(W-O}VF32?;eRC^UVQ&@iKz&3}iL?r$eeIc2N^ zge-!mXUS0$(kP%VOG2N=fk#dCx8qMfoM72flv!itpBi9v9+SvbD10Z-tX=yy4yh=Z z8{IkLn=c!EAs?$8eIE!v^A@=myvREsddN<`2Er<#y1nmw{YjjbJ!MHg=8$ylm~hTo z+HPutR3Aj^3q8LuRswI2Qx%lGk~~M>)n9ZjD=tXPEe~nR%?8Opk8kQUQrWHKDrwzN ziN;q$SbkRS1(mf!{vj`Qgv5QVTh>#K{6{O*T@*t**cXU7SF$LC7@31%owJd3<$=5t zWv>OW@(T9D{a|yuxTa=Ii`h*tO547Qm8s3$mi2iJrT|J!K39cwD2*(;M^Dk;P))5Z`5es&^`$#7gzkEen_+f&;xC-Rpg zy@PyLkN09*r%sFEws|XHnT9^l`-;09H%wzs+F#|a#b z&(h**OcKNtamQT?WJDLN?xWHni;&XB=z3dDrI2n@=l8944jMDhCgY|DM4E=qTW+gK zEV^TLN3!X|+ItH;LX=QpWZ2=d11-K}i9+|AeB`QIg-8K|ChYv6uZ1dWns7DAOs_0> zWss@Ehn)`=?1Nf$*mKbqq}-Q-8q!Z(XapObQSApb0GbkHUf{ft6za7~UM5wdj8VYm@9>uJC>$;)(=5wABjpb{H; z7N(daH>Xi|7~hYkGFKE4wi!*;Rqbw|f;6;4%d0ctj=h(O#_fYj8f0}bHIDt0(PuRi zpA~IzpF(8dSjm)LqXeW^td_=#CiFRB1EO!z(=GAovTtv{ znJV_S!C!x~YV>U_DqT_W)Ime!5P^GS(QkZMCN|cvIndXPmQCM6@-O_yE@?Xm zS8X8<%7c_*5~3a00rkaU41iH)m?CA+qH*VrEi4=8Zo@K)~%3Rp8;z@d2Dpq7uCjcg-1gwZ=joVVq_VtEGNMK@-Eodv0(-VZae zV6T=CGsF28QA|A^TCgo@VQrWTdP8s$;h&2nf?s6p*m6Y`9r!sGj*P+U61znuYU*fm zA;AKe_jDB&gy!qX3ZB%Eq@Xf;n8z=`E?@9B;0bQiU&W@;R${=*ENlSV9v>Fn)@V{+ zESVQ??egQcp{wj!keSnF{k@mVc9vBv7byl3)jDDP^BC+ME1Ym1Ov{b+udO%V;Wl;{ zZg^iD`aFJP{%r%ziibbDy9#w)$y97nGX|yugrVEDMnmIdClqi+6Y&_DA(!Wg8EozO zu#qYx6yp(j6+#F1xPx5|ZTsHHOFK#7o&gXJEOoM`tva~NmW1KSAo=A6T&NCklETeW zgf&9-Ggx*`M+N<7Gvf=S<-YpA2p2^M?=RUx~8hEaAac*~cWndDZ2wCIlxp_ZI~pNjtQRCB#~s{f}$ z2=T9}Xe2MO8hod?777lWHmISl4Z-2e&tJq{jztAWLtnp3DA+G(JPd^rnzN8(7=~49 zz{?7P3ZH}29JYof4tM8g2}}Nr5khz5g%s(C-v2$9O(c8TFiFf$4MLEQc!q|dZzN&yd z+SNuxUmV)HrAbYyc|8?uQTnYHU7>$v0%d zPW>^Nzb!ANtE`!w0LIeGI%R|ez-v|T?jd6z4ux~c5eZ=>e} z^$-(lw+(#*OO-=Ur^n&#)Qx_*E3bf;>E5E3L<9XC>*$W;tl^+0UgOZ2O8j$4q)h>v zcq&n>LH{7T8p3_DL@usd5t(e_=yKx|zob-a&T9#^y|ApZckz9NnjoZLSm8 z;abd!#z<ju^F!wtOAAn2wX=MQiZ|6mNVkn##ktg`34#DR8^-iCn^T-{h@yf93 zt?`*IJiDFqPR4KWY2HW>;sYx7zXzgDs(%-uKOEIuZ;op5{~3t>!ZMz{(~dKUB<<_R zqtLC>ZYdaCPj>^*G*FaoW5yQHvuSQKUZ#B)ZYyD&<5V`Lxs@_rmO5O6%lw2_m`|5a zS~z1)fgTrEW$}EvPFW~N_3{6h82yoX!6CsT6}!a1F2Ew6Xbi!+X0fRUB&6;`$xxoe z;MVxb2_An(fBqmVRCKO9ulNf_sK~-rIqU6XmV%sM@(rvU)r=erY2FzutvI$gF3%4^ z8v+^3jJ||oVXt(fuJI(e$Vmi8?W8zbKMi3?qPaJiwd|%xN^^kU=b^hkP^< zJqzvKzT7)3DR_kvu+RFqQ+@k@qGfm)bp4OfRU#4^v=lF9aaCH-egf>&PaI?~O1kRw zVncvfeE0^P|3{`G`QUZZJ;b@GnDuSAUaN>HMCP}7Fd~_!7mhSe4B?5x$>DV zz7FmzfdEA0^r)&ssudH89j7H&G&bD2X-PVOQMKBt?5B1A-Z)8%J3boKo+uD8{=+y@HC^=`D9d2B@&{D3M!w0%Y2VJ zbQwr+xSFF+!JHssHWQ1t;|SAonpLToKp4_0@%#wA0)lYT&>N2zzH2$<(7igY2xzs@ z%+L1y3HJJtsMV9%RD`)Ti#g3=e`~#z(K$0YUhiS6I@z4JMPJ9ZZA8U`J;6zQX+6Ca zF<$9iPwod;J^9+N>)s7GK2;P)npzh@1(FQ{PK;+?`PKJka!@&n2mIOk-!Mc%k3{^q zkn?y%Y35`6AzTt)6~IwDx_N?s5_8`AL^;=f3NH+2ueJ%ow){Z>cY=(%A7w4yy^Kq! ziKr{5QE7P|Bf0`-Qr|}vT9{N-%*{fsp@7Jq_8#RsDcZ@o*_W&z;lTc}y4cIo$dp=J zaUZpkt|S|F);m(^hx+42+}{_5 zWGE5DwC*XIjuUg6ZD;&!PlO@hOX~N2{e+6L^u#T=>A@St^X021xunJ@s=$nse^`OL zvG>Pl0=t^uU2W7S4C6!Cy+rS9dZ4p-km;4Jbf%P0NhjcZEl!oko+qIe_L*HrmuKuT zlzm344Z*WJf6v2T=U&Z$A|8l3HS8ck`ol!j^Y8o*u0LGWT>r(Z{%a~C)}zgT=!z^R z1d!6bhfYmz7;L^m!`&%nTNLVQCY8+>a+hC^fqC!GMyB8{&5A=5HdAd?R}UWy==!Yp zolj}egk*LzMM47NpBB|p8@Q}222o@n6A;SOk7za+kut`wloCM*3ebS8YouFeexj#K z$+z1*gIJMoMRA^&w^)&dDQ&bIsNj_?w%-kBss$aNyv|w_Hb0plivTzJM-`<3nV9wz zRXKDd`Om!m?q`CpG~YPz&AjLg<*bb&GeLs%vhxwdiLE7aq$K^Blh+vKld1)qJ$(e0 zi86h}?DP~NAEI9#*yDUzi;zoRFT@RlL0Cj0`x(8^%>RPYF_)c1KZ#JkA%JBenMFaI z2J79vrN5mp>y-K^JR&dLHx~Uc!W=Q-hfHSu)bJ`1L_q0SSVbS;wxtCIdWy@*S&l9@ zJ?QOtU;2j4KU_d!+ba*8wF2Q8m$eJSy4lB`OnNG9Q=aDk2E{u2n^vu)`4Ri6p{PNW_(%e}oN^pnNTtIG+Hl*E%cX z{@m3=@uW?#f*RLsPrP2@O1nxIEn}wH70yNeh0U#A7iwkf2DnnG*N;x1o_!vJIu z!RZIrJ6aj#dUb&=D}Z4V?K}ftiO-k_Q2N%jRW04(V?#`k<1XiG_Ja1{s%#C5odD*t zb3p%1b#prt*LBH+V3itKQjIce)6L~E>N5u<6SV=prOR*lv*Vl}hK=4`10Ao8E$KM& z1lsGv94CG=j*7Q}&rIF8NA)3mw=6oJ)j?+8?BKzbG1fQ@2}K-1 zFXP2%9>)al=_|Pgb{oqwOZSf!18#o2Nzqg2!i>~4Q9EAX&+{qpm7kIuBWh9Ox^gQj zpO$qs?*uZT=*Sq>_LN%FA0!ynrvr%_66hLaL-Axg#Qmug6vC3v=(OsC{_ zFwdxsYk6g}u;#=DxsbEZ87`VhwCk?i941Mm$8F%NLPe35;@ShNJQNCkR<7w#jn~8! z*QT=T_)BrB9{(iwQA6+`hv@Fh(02=ApG!HKhT~L5xd+A}c3lnKu3Wm$9`!G)@8xrK z=X6oZ&w0aNv{DC}@gsHVPCVmW^Kbg#^y<^%v2#0*W6`YJtTZ@Um18L*ONAp?(0Sc!Eab_M5VKwpQrAQ^(-Q=4N(==A7 zAe3B>p~TNL3Z|dV1RmZU(^2YT*xY|_KAl-DUlsh`6JUQ(tO!Sgef}JQE448GNK8$f zM+efOKX}!Hg8x1k{b8r(`Y&GfUpnL;H$2M8ITXCzFLD3fk3;l_$Wb#ET0W!}Z2{aC zX$>5TqB)1fxNc_eyXa=ZzAO20M$GD9MIvysMQ#BfnY0>)8U`%;s2PQkPIf3HP+g*h}tE zhih}+8eU_%GgxzVMbvO|)YYAYoZK_`SdkU=scM8m?-o;x+~-~__Fk0|$X$PlRO>?q zDi~|bN-&J(sSVq$Fm03U))8D&lD3WY>S2h(MxbD&*Y)O;%koU;=gIM4;S&;=hM&)( zWtu?&v-NV7KLBvGfZh@$8P*DQ5E%P4@YfuGM-gD47O;mF04+hH;}&s9eh2u<`3}nv z_>OZ+9S_Jxx@FI}1y7Eqwv6G8fRV*Hr)n80U|3Q*_pbaCDX2Y<{CF>f;t#u>$#|IZP>?11xSVeD}Oxfqcz>^19El%72;jwVlMdzfI4m)U%M`$rLj z@tCz9hwKJs5Jx~FeYR?v6N=hS5WcI{1kjRmi7s`Z=t4ptSLSn<|81GN+o=Hz_sB|7 z>rWK_)^&;R=U!maKbeBu^#qJ`h}w$M(_kt_dhcE_ErjkQqlbcz-LB{67_VNq{MFXK z_oy4|)rudsJ(VHMui+ze{~U(I54o{jCq(npEtJnWp9QX576425Xj%FUBeycyyGjt1 zUpBcBn9%);-Nq=IB3*7SRL{FjBsyb~QX#WWTj+i>Lx6GTqOf0} z7T#H~F>?PHP-Q&VA7<+)^qxs=;Hxy?GgipLJ_kz99)kX6JtvysKK$d5Nethapdq~_ zv~&zJUB8z5}2d0vXdPH~Z4089CL2x4`!ej_2<4yj26@5+!f z-u8oc&`Aj-iNMqLGZyMn%;(8xk1;sd?G8w;`&Y6U&grzilcVF!*zn?H^7|jkOFJAU z{pZJ`(hCDExw^9hup$qP)9B7K3z)pded);{6{1Wj0O`%2R>n~f5#(REj9hu?F6Gh(Z{27>U{CyB?Qwi4l*J{BHAI&DVduh>hTw3}s)L z+PH~1kQ)Jh0X||Wp!dyQE}Kf8`u_k%3+=b zkPlfu2ON&rk)j0$Bk2h(sTh8b6|jc~jQSK z%qO+t1lz)r%-sM2tetdQ)6AfC?<<1MR8h7BYd;*`!h$-c1->zO9g^K9mucs3B_0`m zpUXz&^!goKDNwi7`DOgKjTHYTsNQw+4GvqOz&7~yHxqDGy*~HOo?0844A49{jf!3S z)^*p53;BHCO>Q^0t5=C>weqC#lzGss_m$Oc+_VJarwhYG1ATx$y>j@eRwwj&+YM%^ zxNnSG<%<{pIP{gxBCjs{P>9g@8r$WJDfkj?zl!i z)*!$|O`@dU!U#P~8=p+KrlOsmpXlc;!#@KVm)H8!x0Zqq$aKibNi`F(cG~RGY80#Q zW|GWfQd%O1wwFn42UYf09;p+U=-&C19EA)Y+xnb-IDWwC9e6ZZG3?Q6@IB)T^SLrAiX=G!nx$4s9^XJ3R+HKaaI+(+}uNdc_q5Ibk>X z`ji;X*d}d$N#|c;=?9Z1XXm1Y_9OSa){>KlwM$BpY|Jn1}-ZnaYbk zHUM=e=>54I+SajEhyE`pG2({QhUP)Prpkk~Y0X!X!IyxqA3i_@3{NE;UAL2z$s>k0 z@1ip6Ad5O+qvVH1*B#JNleVWVIJn0kGTR(xHyGd*^QCxYPC_n z>hnPvH7sgTJRpUKv!$e!pv63A!h5tAL((O!Uvw;4BRC)JwG9ImzT3-pG}mun;hBC# z_%AHn*#k|rsjGxQ~y!$dNr9z zD5WN{{CNot-z7&M+`XRRzJ;cW8=(b2Q#XS3xebb9x1foS4n2OrFNjA2F1MdOfRNz$ z%uo2ZMC$zrR=osdFmf(3G}Kh1C$`b2fpMG!J+Zl8pWKn&%+x4O`v9<0`Ys_b zjfz7sS$5-8dvia86-W#)GvAYVonMcn!FqBO1EwvlVvYXeMQl12kPh@_ zgzAZa?4|d!dLBi~{Acwd$`*m3H$?UAFf@3~4M5n0-!Y~|P7O)Pcf^U6yFfeJ=5PqP zHhbwWFC%C}#9#LcLc_A8%T_e-UE;G1Y2omCz#v5oOAzp@Ev9Pk~6|yOp72v=?_zG{HfWj8{JzeW_ zBG(g~2jeHA@Mn&TInGPF`As=E!pfH^<0+We045@HjMQ#FeOTs@QmsP__X?9X4$LQO z>kgKL8hDu1@+$k=YCyM3*dvBXBuk8|hDCRANafmcPZ%RkP}~h3wRt53)g5+hvMEWmg1nmrUXnc8dPR+qB2x0~P&6xnI`$ zW;3{L#!eJ@oU4ef*lW6DPvQ}4hUPQEE$@!`A{g$79J!Z0&rp9dC;S&b{-u=zg!y|A8J_*XsR{=-_${bsFZ`=5pN zU;i?9PC^uX2`4{9az6TAgl$fuS6_rsy%^xI=poG{8_j!t`53$i?$XdJi7^Qhk^q1h z3~-Xfq;!mO3CNY#t-vbYAEvQ0>&B0zn?d0F_atC=fy z^Y2Wwyeyi_7ryJJm$^qUclU)S}#9(TGGt$4XFo z+eiw89tHG!#(N{s#^Xq7F9Zd95$lpXphoZ154k3vtt7f^DD=dB4&%*~en%n2S2yV9 z=mp?5uMGYm3+$1K;F%HNR8{vW@wl4-jGjKrhXa>xXYq)KBKgML^B72RyY}Z z+=H}-PPzxH^(ivtDkZ9hJGrJ8446@t-!dCpQx;znkW=oMR!MrKGb2xlwj(Ww$|zj<1xKVNn^o!-L}lCn1Ue->J6^fKO0QD_7mXsdalJ zW=s3_w%mH1Xa}mfm9N@HP&4(yRAx<7wpwm!E|y09Y(v`EV5a38g^WG&Tq|)QgL3C8 z8gD3(K(C_o8TA}Q>fJjedd_6bT}q1G_mpYvDkk0>3*+qOq_NdCTj8q8{#2`pk&L9> zsDnIkhr#{cq4HKvH&D4Hq_d!faQsrIK2RAODwB>{cnaLDo&76*^C|B`L^j@d2M7V% z&Y^ndPz~>+^?b7^M7ViQXXV%)NFwcNqBYJfLTs|3HqJmIbo&YFs8Q@QppMVx3t)0% zIgh=gJz8pGO@FwvrwT(@yaXE8pdT0=^^8nbTv)43J0k>ls1}B{q1xS_VJm!%A|#DJCS1wWU3wjv)^yH ze#ZYLrjqwH{HlyOm%Smhff!+6#T@m+BWG;P;F*f#peGkwUB! zugrstnLyme;qJt_GKqUlQz@M)AYrEaC3p-!_V~(S;(}O4ia$Ba#n=*JH;Ku{MO~6q z-Bcm!c2szs-@!tU73nIrx&|_i`m>Wvk3}0)% zu>QINdUt$)8CCZQ!GSs*k?907c6Dn_-IW!g#qQ*b-gbqwpxN7o zS5T_%MpDh`W!wCG5+g~_w#>^Q?!OHvw7O27RH;uPsyz{*6f{uTd}Uo;g>=8J{_qxY zrIkzgM^65->c6YcA6{zi|Dsd>M}3$RTC|`;0JJ~+@U5y7%4SoXpgk(;gksexAp%qn zyChTL;uAyIuj~f(#AEy$L<4B>dr4zh!a$f{B&SP%sR1ac;#gymZsb^~eX@Vr3Tf?s zGsDrmC5Mp+4P*d~LwF)cEA8fC)wH~1h8O_`lw`j(vJT$HAxKTFe$dI@7q=$gVt^(Z z#D+$yiJe-+(R3oEk{Gm+h83HLF&mA1S*}aVFsWs9_T2`-4); z1_C&ga@eCK5|qU<0|kg~LCXw+cjN{%YXK)H0PY^Zm-j#j3^XPNQmrEqjae~`2zUj1 zIGK8Y@jIXcf6g)#V4?+0HweCT%=w^RY$4^OV;(~{UF2cgO3vdb0R5B45DEKNUa1`_ z85r{x<9?hMbDgi&4|~Xj1qi(m0i5Z;+80VeYY6S?mCSa z-JJw)$?W=tk;0>)PbW*=e_JcMs{Y3I!bDE6*vSQAH-So7{0f@=z~^p5rpP~Nxl)YB z63nw(r+Q_RuPi-(PA>Z=q-V0%-f<>ll|cPHmyOQHHbzTKx@a$`immZT&GQ@ZQl`G0 zRaX3qP_q$T-E`RWkjY1hA4{2#8`&ZPghZP* zUBI_4USZ$EFGY-SeRT3BPtI^DLZef}6~Z`@x?$U#0gD4$MYnX6VtjCfpM6L zc0?$)?{?E>&=H=N@7kU;(0lGn?`E8q{Id`hut1xkh^S1Df7(y4Z~VIw{o$$Re)ClS zuRg`Ul&Er9mC$keh=2uVl*Z+=5R}Z8&J)-YB%%hVyDFN@aLTqBCR8v>{|Y=3q4VIb zaU?mM%(6b)JP+CjMF^`aJA_OdSqYd=BsD|*9d}q1=@JvkZ-t8Sj(>TFIEZSx1|86* zSVgRi-YnH5VqfbIgyJZSB>@y$jA2q}G?$kTzJQV(a>r{a(0Y0%=A$aF#DBhJb~v~Z zL9t8XyKoWB*hD zd8)5Lo@%oh16d&v?!{g-3{g~k!nPjJa@wOvS~AtCO!^!s0XvYoeaVw+EJ4zSit(Bg z^*M)HmJ4D_7B;t*RUajtMO`w5n(RePK_f;)!w3r4XDpV?gGOXd$`=klvIM~70e(W? zV&%`7h69umhW>hoF`ssP>?FpOa*TH?R;mO?oLR2;2B#+GGl@A;Ak5c~rwrs+XA?y_ z!=0zb_wnixRj_`@PQM-nt*5;}knI;y8TOVdvpk*6X@b34th(PXgU{**6bt_A+ioSA z9q({#ROjSKkE$RJ?g8ZlK_58T1-alC^}ce@XTDDkSPL#4y-Z2(`ZQ94>*0gzCfBRt zz!OM1)U$JY6=C#QN1~2)nZRxhfy!z=6Z$4?*$~O$)zrfCESlcde<|#s443+*Yxnr~ zAR=S1y3N3D<%AtrVV0Q4#wW)n;H%6me7d#%#8>hW=}(eyEgvSmhAsu{ zb}+sbNK*L|r^IG1w<89eg^ycG`1+kP!BR}GW>$?2;2nCN2=h&%Hx%088C+wQy(`3t z^IXA4ef;QO#yjRP%!K~_)Bd?;rme`h^Md0VbMbeYy3P&BB^cxGj|~CdzDyaVTSpo} zWp9VFZ++;@g|S=w9vm>68ckOXSecL;a(O?O`l&Wc1h6T6)nI+-CTy9^&;5K0WIY}? zJ^j9FRIGXi!o*k%R3EJ%HObE0UYv`;h1&5hsbQdi52fv=(h)+HjS(oiB0&&kTAb4H zA-CB$p1Mj?cG=FAV2+&m`K{2rYcTeo!N3=Ouf%UKYV&mQ74-O1Bla!a^ zgc5J(T}zCI_HTvtZ1YSPra2RQsIvKR!K@b2b~*>)UuUc7j5*-f$*0u!@}P=_B;9%U z?bOfjLcl$T1H~A8pDqodyLiE(n0{sW%CCho74J%}@PDvcufo zj~o!9j7|lqo&zmjT`0A+Du9LyX#tSPm;?_BI>3pB@4sXbB^s_06Pj!`!^F@Bw--$X zHMS$lBBvqmk=6v0Y7s~Du~Ks{F02Cw3+)eN&dy&ZhMEsX`0t-tv`B=lBDlRlKE~Zh zjnN()d{V>}Ky-W}E;>R1ofvJhwF-jwFMNFq2GEs^Q^v3|MEn4OVYBel(-VSHE)aT!LqAx{UcGR%tNr3!;TOZ$P{re9d5{eru|xq(&Iy#b2_UJ`>Bv6zW=g^Zy&np1Cjfm^lRVRBgG2HOD7dI}XZFQjU0Mzdj2gV@1|0)Cwm1VG>)m zz>IA=ceW-KPc7(IpKd?P@TF~z8Q{;wZpzxZc&^q+)S~dQhuAAOz{1_chMyrWkStjm zHIdlCIWVc~+Fp0U<|bB@h$el7beR3nPl*I2OVClTec*ti@!`aGLxltU8z3isWHG6# zjM?2ZcLa&S0k5;9-UYVkhPAWts-^pbM|kBsm+tUML0&OcuTAq+#r;;4P0Wf2_G|P2 z1zTUW^GG%{c?Fot3flnW@=m+fy$-M!<)}yJauVdQ#@WIak;$%LZRF(fKpLu?+yici zVg~O@21R7y`=$@k^2ekZuJ#;?x&Cq;JZg)egJau_``wQPb+l_-Q%d;S;MwYaY5hZ1 zsp%p+iev7-v z8j3t@WP)_iFZ6Pv7#yTa+>JP*uD;#By z%XG-9iC%i6PUL(0MieN1k&Ld}w5FZ1BuK=O%#ash?=^^G^78Qm@3Ruw>ypj#cyXW@9ns~-14X`?eHxTL)9@&CB5A7*O#`^8!tzR zK0AGJ_uSq$2}ND8XR$p}lWM&<;rTKlI#}ZU9)!e&c-#`yy_8G!=jV(LsY8Q!p059P!B&gp3|b-0`*~L7go;wd4E<*y>d*W;W0rLXYA~CEAT=;Fa>vj#1bDr*DH@U+ zSvQ(%7xGcd(@n$-8j9&(b*aAL&*le#WJ?+Y4~Q|)%Dkg)1fUADDn#5d401KtZ9Tx3 zv;}a@VoVETB2ehwC=BhSnsx});&895I@TRZ(2AMWM(-vSDSIh2S~Mk*wQS@&ib&-| zpBM*#d`!pIn;LfO)#k{mhdv}@gC=X^jK^e=y%#8}YoDes@a%O1}1IuR%S)m7S z)3?n1nm~f*O+pZBf+unU@&0G5RKJT~N+qb=%03QBHBib)kDrrHXz2}T=#djb9gsl5=D3oA0pqT^w7c*?OuSb+O;8d^`}Lg+lsv;`^(Zh^_sMj;i4| zG;}iE!2B0@fL`O(_EtNgUy|ly!FmOXy9T{9ZAlYM*(V)x1J{68d}`__JyJW{md7YB z55%9%{6k}>u=<+w2-(0R?M*Vr3)6Eeh^$>Z`-TU;ixV|$R2NGBOWbxrTZukT^Jz%p?R-Iy@u?tGYS=el0cw$!de;hjEJG(S z9!dJXXZd~JwY&SV5>@ZsHBe491o$29+u2j8WsXz*xXH=n&eGrXArL6vaN>tM zv!dzbqcpW&@Mx}lq3q?eCHomZt#X=9Ms}AuPm>@lwxW_w0W1~sYQDV3TT*&wf}@~Z zz9oE!ax z(fOq#q}S&C4=qBbxJHL1p7I&;cgbe7jI$YJmn)E`o(r<^P_2N_sRoO=BWKIt(9g~9L$c`0~#I1FeiH~6=yNMmr4 zMNNC);UtDsnYYi)3ZzA!!|V3LWBn08dDoK#Cm|~6Flh7UQ26T@RuLElC+Us}Y}X~9 zB+tf&anyNBuE{6a;0deVfnT7hh)602MTDu86&-ntgkSV#Rk_5`F8_<PtTB69sazFLJC$NQ7>2Q&*HZ5LN3iX&l84#I1 zK9ZkdVK=s?DeDflQyyy5#x z<@d-bb!C9COj3<$I<3ZeU8k}75gg~Sl4JJHH$7`|w{q&b_g3t(Np~9p@V33^iAOqU z7XgrKs~((?ou_t9iNg>LpAH_SKhe6a`dCU3O(T6l#GA0mLTdBmx6F@jguDnBq+hke z0QkF*SEwHgUFFGMC%VCSsZ0$*jnm${v?pFGm|j-b>Z}e|)`Tblv;f z{T{-E1z&QNv=ZhJv4xhIGg$HcJ}W-asZxb@T**a%1VPKYbXnJE4hLF5 z{xG__P%lxPCuqug*W1-cwS3EaH%?X%KI!t)0a8MRZS! z@}-={Cq~Le2HtwU#Xelgn9uXGQOb!4N3av;I;DP5UbSgR<;XWr>(|biTrv_}#brCn z5MgjT%2DYd38$RxpRk69WE8_4^n1_5D4JYPI#c+-;m5JBr97@Y;l9Rw`6YtHe&}L*4WK*4@jKva+obSYtD;*M;XOmSfYeEYMXh)nJaEP8A z+15~+DC6(lDJZL8qQp&9m5c`(RT7Nb_0wS~$V}_5&4Pd8jqou)q^j{sMj&K}mKL!{ zTvl(TtdoFI$qe$J4<>Bp=}Pv?kBnOgJIM;wy~omm~lANoxLaIAsn zi_-yG^he6<67rw5=ntNn{e!3e&y*R1{C5{r2!!-ZArR?YI%-gXIpqm!>ev+3NbbUX zZdHF-D1@(RiJ^TEzzUbZVQKp5c{91{$Z@qG$7E#8iBr*5{m#5lCdf>g5CMVz&Z}L=q)WSLt_QB9?`atU!`d=i1e1y-cIK-VQY4o)z^?4|` zcZA&3q}+rB-G1{g7=iTBRSD@1uA{fhrp zpOBuB-8^?a>)0>#vAQzS?HGie3%%o0u4#Z&^nq<>5$@WJL$fK_Do9hA6{^qy+}q47 zJYsNT+;h{zptj~0H0^8oBuzrdZ}*edjroCotX{)t_^_}ZzbV>TeR_Z}e(E~iT0bLa z*-6>D?sB?qcX=69ETCtt)YUsxuLs?>FV=SJCehScf-z3+w@Y}U zZDc1oX=^jW`Jmzq={%CV4W-=1iH-rE&9cfShk+yY!02qO1?rXZ^1Qu1Be_IIyVxo9 ze9dx>w`U_K!e~dvXtSy?8qQ zo>jf2W9$RhdM7TRnj$#GZ@r{r%$xK+%fmP72{N0r2j|{2*DG*o_O-tGeYzDV2LaMZ z2GED5P8aLO@$n{_Vd_b_;!@QJTp_*~U;4H92E5U97V%Rz3ruJ25kD2esRx%}+Q*Uw zLZA#X)-vO^rx{*?C2JXoed1zOJ{$LfgSu^~!3e3L-}rJ11Bf&D!k%k#m$fp zY6ksVd>0;6cDhbBPcfLn?2A-%FcXnY#8q;WD}Pc*Iwp@jhQTM4>F`Cl z*}S4&@h)*^n^Ok%rT^v)y;Pz)bA?&0dV{$Wr8y7My$SrJ`>6G5M*n*_Gg$rnr+{~& zVaEJ9idkIp!E4@UyM}!yPaso^LqN*R$S#rySQcU22d{dlA<0J0yRQ*1=JNxH5|T>7a9`C zHPap)qaE`+7FHj@X71rYXBw!%ICFD#C-}(!v5DAH1u3}ViG!mk;;Dn7Oho}(iV<;hE7V4eLE}_G zw19Hz!N>4Nb7tXC?KtGWUPMK+d z4E)K2gAcHaOoihoa`QgcgWNqj<*K)DIsK(-w!Qi0u?I-C3oOgG7Xc59us7o3N=RE_w`#)@~6HdyS@zUJ`a4P z*&T5w77;g5-TT^z1GyXLN*3W}2`IqbUbb3?Du_9UX*lq&H<9wc-b6n0Rg-K-i|~k@ zHGiMZbT>F6o?i$xvK6vX4tAJT_s!P5)gfQJDIa!TepoQ_OjcUPJM@g-&K$T^H}_`Y zKVL_aBdB#}X>~uQVBzi9rme5e!rx^+X@4E3>(#a*u+(tIRJ+H%>ohecGAOzi6SE0k zc^d?}O|1@CH_;z2LWBic+(Tytyj=83WjjOINWcRn*F6(y;Z!OjSV*IjYc8MH=iZrr zL#oV`?(+B->ZMMX9;7#d?k|L8FfOufppZG^=d?hLKjmOhK==S5R{i*09s9fH^e#kT zFaW&<6Ww|ge_zj2b2+DU+XCp>^8OX_$*;(_P0|UVMzG9u4Wv{%RFH>TajQs$`q75dN+0_uS&1ePzT>C5&}r?ouzIk0x)KS%WTg<|ba zGD=0s#e&@L#tENUSNb{xY40&D7`rW(`sbp8AG$OyDt4)H6Qe{<9qYK~=MVP}Tog&&Y6YU5EuyLP4M( z_M?t7GF*=~3$`7ksYrf|q8%2NY6B)F6AmWIFOsT`ib2Fc;|Efo8FT`py~Eic)HE4` z?f_I{qQZBP4L@`Bo6|Ls^y%8`pC7j~mi=$GXRVG*b?`zeSn9r!YFNYsb$Yym6-Wjg z6z3~t^5NtWKS@NA7`2eGJ_;K91yfQK4e_^^Nu-Kg0xlP#h6eNynQ<^lBk4ct(C7~Q ztm;teld!{}83g8_)L*P69Rg$#Y6J0icwZJLnEz_Z|7&DA2++@np9z@mIPXu33%Sr> zna{-T9NN*VRhJs)oU1VYsH%nrv{VZ_a!bfHPJ;zC8liheJx}b|PufC6hN{+9AZPRB0<_#r7k8b7b@JFW#WGcT5s=TE zZ`g#weMk4r30K9xeSUl=s}R+W<@ae~plZ*%%5Q4wdHg1a%1_Im&V@|&XT>Fo=`M7w z)s+_4A%>mvXc8QWjZ|<+wWs)?F_f)=yT6dwL8CdHcU}T%i7k`@pF-H#&lYmo3T~w6 zcv^2PSYAYE(RZmTz(@&a93{xwZv56kG_3Mu#K3+ULpqtU;)@}fCX83`C2L}|I_a*;b z%^a!sZZ=2e%L3AhgJHiX__2iA&7G!j=fq%Q4*V5E?*)ZS(0M0a@Fg>kxWpTPMM6?oyr^!u7suY z_>x#U8y$=;nLN2;+4JFaqVtlM(8rW-!d?gIAl0ZY!X$5I1#0TTYsu&~9PQ1aR#r6= zn&{n8;@d|Zs;lQDb%~{%P`imO$)+H`m(LO&)+qRN>{uoAv~xBjy2+qP5g+1PC&(_N zgxjm^GRSW6-_NRh$Be#SX%mW7@=0J=!5vw5$tXfpbbZ>R8c7LsCl!Ib3ag8M?`${Y zkjT`ai8ZQ~@HkQH+*?G+gHeqfQo;;Vbf9l-Y)&tLPMDlndW?4_$m((w+TD5VBFOn1 zh=UOM;zYS~^awDEVkj!Y|C<=SmHe|9{Q+3Be*o5hh!O2Z9Ws?1C58c-J1yh%ci>BQ zOm}M{Fc4UhGZFz(hNiJ#F@I)QzXI6pNc~X z4H=2->f*&Vs8pZS`qWJsfBTr&`a_D?0aElGsB|2gv{EW85Sdwh7Wj~0#gUN?mq}l< zATVw&k8|Xj(>-|GFlpm}XI{BziGP;`o1h*U@tK*%u!S_86VT>30AdEkSFPU?5)WNo#Gv_si?LoRpGciR3W^s1zxoAf=nx?z7_w_sL*^^I#e zgTwls$IrWP?Iv3PVt<<@=M5RIH}Gd&(-HkeOug09kssbm?`yz#B>#oDg|YPlom;Qu z8dnl8xL5Jop7cBeQBm_*-NG;ApadBn-bBZmYN<1h9~S-%6ERD7S8_!Al^v!e&0zvh zh4sa5Q^1lJz>gtr)JfH@-MeNa2@aiFb||27Fn)CVtcgft@s|b;K!1 zg2ZT{xn?FO5VdFEer2*kVIS_awl59=OZ}4P*%Z_4Aje9R|6n8K}`B3cpg@`H9 z(k5dhN%&Whsyvd0+?I~jjB1kPh%B(`yo|2s79FSMqc38dw(Hp{JvFyT5JlbGt6UCw zUzcjkrCc+d~w}?1FS;?5(rW8Fed=q$SD|wUW*+bPu-gv&!kBL%H2sS z()TV_f&-B^)l_~=rAs(fvSdGMs7Qbw=vBbVE6SOQj7nW!n*a>+$ zeTJ-cYX($WH6Ndqo`t9I2>v&3@}?rLeJw7)D&jH(SVgu>dlG_fi77rB5POz*conm` z8u(SS$Qqqe<*tU&frU$MNeKsF@JOx|+uG>c+-lRUf|H&fY?I{)fM!~N(2$yqr5i*2M` z&y9!G%E$SYo13RtiMR=do{BuRh z7>E;1U$4Q>B8}Wq=nIx=cyRa%$f1!pZ_3jcfxHXJ?H^O#acj$lt8S|}S`Tj%5lrYr zW1~G%-Bc?kT}H73)w_N%f=!%sRG`xQzvOZbKl#80BD@Tb7i8 ztxAW7M@@h#KycS!q)xzWUcHq8=@TTd)X$>gz7V0y0r{Y|@4zHa`yvycVeQVsE-~#r zfKMLZ(dNbjLf6-3tk>9jOb0wo^45{G^6;CCSJ47Pn$wHj3T^C-a>hkkP4ThVB-t2!z+1fR|)fE+!D{Mfv|^}I2F>oL9wg0s2=|JK{y zBx`_uk-_3Q|IQ2Lg^{>>(uDCKGkLeewFbV{sw7hWLc1VIz&wFt3%Y6ePC-Tu+zHUOKEp1Dy59WekHq;@TO<(o>cCYcDrMP-K z&De|2^|{1PieoV!5CTlI+CvqdP%jRKrROw7AZ<&MIeyv|ExlPP}Us(jk30N7Z(5(5efO_k0wsLOKnVpHUSO;1*HV|Ca0Pt z#;?9W!P`^-hBREsFrZvQ2@&^W_LMY&zP5kU(&n#^P>i%QD z!z`O``iHnJ8sG$0^{)c`0ah6r#bL+%`_ZrcJBkud#jq`smNs781qEm9gX`dfh76it-u=I*lU`tT2{IIQO<07#AHAwb3NT?y|mxF8YVDFShr)v3j1E)?oY6B;-C0SREJ31XRXAc?yOwloUAg%i;(d7X|yr{Yts>T-n?_?&Y9k*3z$XqgOHj% z!}d*w2lDV%NIA@G*VMp{GsNyU)%X`Cw=;zS1F?RVlPOlE_Fw|Nti6VYmPiwK)#n)x z5NNVsLqi^dn|i(o+z_GSjckD?88o(g*uIO;UO|7gty81i(!4TB=jf zRrEN38)LGf^#*x3zcw<$sVw@gT%g%NEQ5iz_TMw^o6AJe>DnGNJs=*(G703!H?hOj^;cwtu9ah~uc%($e| z$%+8vMf4RuyPVi9gY?4F1S-A*A0x6fv1VqqaM{`i!yx2XbB5=bC|4=;3&9<@5dxoX z#j&zr$S0$X(E<>d%u_;1V-tDzSEc4F8|>d6T9Fea53o4VHtC|Bq#7Kmw=?tYLvy{7cPqeRX0K;CpUyRXo zB}N(G3CM(ZSPYhx>%@h6)mk20VLqCQ6>sx48J`Xu`tC zFX&ATecU-O$C7?t$_r)1`(7xxT@-TVX?=th#&==}rSXJ(K#1b{DUA&A4Xz zBMod4k%uGBRMsVhBK)LVIpNo4!tQgatPv(o9VZ5%uwbeN`tAYqqOsY~GyMY;G~zEh zhe!+Z__b2*<#ofbhQsSmBUw!GN9eB|yd6;|_G>$s&y3;10tOqi9t0Z`Uoi_+`>O7x#p5eS^fKP%B6lr_f(W&LlL z{D0-|uVAo+-K`X+A!@@;ZH9$J%?R(WLa+!%4daFq{8;E~YKMj3BD8gYCH*j>h{gTH zWy6sT1{W4-3G!uUsE~%`lO{?|laMyU$d~_1`jvcmoDdt;h&g;5TJY?z;d@deo6cfJ z7G-4IoDAe|IQUpuN5_vJTOKh{Q7F!U;ro!Nv?Z=6(_X;JD^2_a7+7sc9Js)+iwvZZ zMnk)JN@yA*W;)S;#vG-4-vlA;0B(XVGM!Gvy!H3%bhy~XFflT~C7&Zl06*xVyp|t_ zL?1#Fr$wmLRlGuA2=|6QP?p)ORG?en24T@Uthlr^<5B)E;xhj&vDj!EOVVu+;F5n;lX3NGHi~FM9ed)*@6qW(3^hW?G7JjftZhC{`RmNuaFd4s&f49pzxm(X zB5RZzfLoNQz(#Sr`*F(Gt;r)_IwUxzg@?`b%~;!-or$IcGe>;mrs+%B(%$zqeBR!- zx-)T6MKqM1_0rHRMe9CbW+FK|{}J#qNyz%S(a<)!KlW(b)UK%A)nTI0U5in=$;XuD z2g#b&l5#g=6gxC=<&oKlfu`{3Zq{wuEMCJZt0k!ktVsBM@R-{SLo-A^j#1jr+UktS zPJeu~6!gPr+>5bkAL!y!*zxGB37iF}wE5(h&5|KJpD#}vioX|h7c7}u?7Lg=pUs-r zn)zIyy61{pEq1x1YJ0i@eLWx`gFM?yZT2_fj$iZ@tSK=HgWC7$QnrBJgVG8~f3WX_ z6e<7mgcq|PT7PV(!VLAe_2Onp_TL_iRSLJttZ7)$9~fkSHuYujy3^lBr^VGhTg<}p zhs`+dx{D?3Et~p29EVv?s3CsdlMw8h(9eYSQQ(W8JEN5ZNrC68*Xt_J&4G5Aj^Ab$d6BI5 zTsqixfcxeSv7FyzkkApx^xfgb^Eg*b&}KGN@8M|ftkEBoHOF|RI-v`$aA(E{S~pV9 zE+l;J$dG=@n~BaiL(v{)8!Q*}9A^cuSBDiKjV^_B!L2~XyY7m8)$ss!LBPm>GfEK% zP&|fK^eY&4Iu-mOAf8G`-`Zxbf39cHT}Fm`g@H44Haid~X=OB&kR7?ADgd-7{6CVfAV^dHtVMsY)*K(KHP8PhUlHYJjIoB+;Rja968(DY z1P9O{D5NoboA-zOqQgNjkmx~#2Lc1=+DaMW9`nC!^Px$Ajqi>tG9Dnx-_h5#tDDPX zITNsMpg>M5hqyZ7-z~5CYaK3Lw|nwU-n*Z<=d5>5dNKs#4GhN!-tm!O1j`c{{35h= zfvU~AI~ki)q9``m8!)B#A@92;&_`{yaQ~HEPu}Fr!89O2eqKkcyGp{835XZE*YF?cE`D|MXBp!v)N0Y<| zf^Sl_SSWc$tP~3^+i|nG3D%smMXpOXEUel3GXPX5*JW{Q5#nRWBPoESZJ57=85u*< zzeJHCZ;Yz%ioXvAR9_ioQy+D6Oj0l!J&aRB&Z!Yo|EGE%XG9HgT+I~!LYDADM)*Y< zdYHvENn0Sv@1>&{+%TVI71uuD8wv8w?E1!|UD#mxUTp|>;uy2S?PuR>!iAt6rXT02*Gr;xN3Q>Qc)H8C`;J)HH})fLmgTpLO* zbH51e(0JM2LKUHG5R>hUDOfA`9I6(G6hT8hZ@gvlKtPlt3PvAn1sGZAI}Uq;UWRDq z%6z-Q%C75kwYTL23Us;JpRT?A*sINW8kR*IPdnIPWMx6~$;}xDeu8WDPbPWaSbcFz zBeJ}m6SUh+yX|f|@pFz)8L%=3Igg4dogT5dkf542hZyLYnT^5D+37D5-X7xS1Je|J z#(DbWNqlp61KcZ`0DQH?Bs@OD#INP*e>8z>dcv-N(8j z?fFzT6JR}O8OI5A-tIfEh2GT_IbK5*Q82zQ>h)`E@fkir|I67Z?5CEnz;w)_h$vWg zc2D%{)g?K*8n)DR^e-{s``oS1Kd>L5M~rB@EudgcoT>dydWf0N6}Cr_@i@KJee&m{ zNVi_*$fW1>b31fdY$tv&@@@GTxPca}alIz{cH)U0c5Rr!H0#$^o7#xU^Tn){SZ5oa z4NR#s1c}&X+K+=)v$YPw+R;`&FKBGLs%`mbSIR8MlE*$)Nwk#pCQNdY@>R5k6_Pu0 z6rSFy4PwZ(dR6yL!##fL9TuSFdQRPlhmTQ%XrIx@w$(rE=$_1E(PpRT{^?^oiHvu; z@etjX7|b!!o`@cxh7|cJqm`ghkBWkm#I>*CRyZnVDgD2>U%#m{E4 zPQDLQI~oT|N@sI<$@GAI#R|lXRe%uvXC(*-y2d{X(I2Qa#|LWtZaYTe%>sTqaDBGGe#Od|nm@e}ZE zzy{H?_?DLZ>1$B%*iO4KN_RH1|FbWtQ#3UrW7zMxDL^F%|NNVzr}R?3AtR#MPjFyS zL_HE9S`{atL9wma0z43>1q3YM9<^WO*_}9{>1)*@T+pU%G!3|B-kjUgwmVV6Hz2^@W#YqNBK0J&|~Ky9kD~_3Y{ThfZX3+zFOpcbpoQoN6yZrPy&qm z9RbO+W*%q>yG2Po=iVc#kuKy5W=r-J}c0gq{%m@cRIDF7)dZ8u)R%9^WU zV7++>Iqw7%6WM$e6Y1)~Ja#{Xs+jyvp5kmBNak2_RiDoL;R%Yoj|F13r08<@{1_TH zVou-N2-32&Y{pc+1Z?v;$7h+s5k&)i)G_ERJI>fvKT)$kgg(8oW5F{ej?K96yX0h# z(tKM}W%UF9?ya@UAtJl{!`$hz`8Qdl8oUBWJju^rxzvtV*C4TrahvbgEB%haKh0VB zgErtb5?*v=z|Gf#C9lS~*j=~R$$TN5&y^XcpE8w%SppA50RNiutJSCOT1l3{34T$Y zx6K8u4IW=O79oTGO)I!yLkjm`(dFmpI1jR5@%XEwE}FnPzt7A-G#(W}o3BpS7i<_( zRY={k%fK$Gg#Py7fUVj?qqik0EDJjKhtg35h?X~Ac@$o#!u6`-E$=vB!Ff^H!qHWPIRc?5JK|5lHU2jTiP20~m}+HL~5epTXz?fKN*48`|vhyF*6E z!JBRV%+0?VL7oYCa6#7`$X9vENC+JfPa}bct}mKmIF&EmU|ncZlWlV@dd_0^64x-x zn9lcXGYEV>-Nk{obYedMU3b^Zsi_qXfDF|l-6gu5EOI*WRx?3*Dk#_6w$RiLH>qm1 zruLDPHAAnk^>a~0&;NK-JjrD2c}_=;c~zD*m@Fl%Wv?3Bj+lbL`$eg>kE0pox@uwb zMRBE90QKd|X)oWVeBjKs@*tm{#Je$r$vyWPi+c8ELKEsae#)&?`chPXPfleZC27rP z8tZZ0v#`Q;>*w8Uwu`PR=}T=E`WSAnxhLsF=$JKqE}zmHd|EE#m!!pCk*Gz5^_d=# zb|j_~WC!MGyhzcIS8Nm8anb@NqER47&?SmY^=2DXRV#vlp$XWX?gmr;)fj6w`R(oi>qJO&+i;*I>V!#< zKGKDM4tyDA+7TIlkBBA+tG=i}_o9~Tu3Sg_3O>D~gq4-?$!RdwW+#*!ph#!ZqzHl? z!D{T#o6aVpnXURce^ZXO>CSoT#c8)HRt^`ej#{PUoU33#u7-Jz4S)o`AYkMklPR2j zFo>L_53wQ0*rD&$qwmV950rw)t0v+gHZ3T*GRQ)@1R2?sc zE*zj^T4i6bOML@WMNIYOHL2X5vUqmo*MVQW^gUjlE%~`Q-yUIffQ`a#a8#_hcC^#C z9>4h_3qEW@7V8{A-qhu(ct{bYTP=)W$D)92&%lnNwlDS2m5}m%o`?D z(9u~O01}H=sFr#FQc+o!l%091l!mpxbz?p^fkcYAEKtjE*$S z&Vc*oOb+JFweRLFMC51ZJGIvoN|X%V&C7BFA$%ZuX^zMmLC+EgAKA&aYadSJkblD_uD!w^gWF1hI>T(gArVogX z#pU;?eb^Iz;yRl%P?cQM4uNjW6;m*q0Q~zN!=7bxF=-4pWncS}{%L|V-<8-3=?<`} z=>1PNoy-XIbh?}r<_=_tXIIZ5reZz%B=V~#N+gF}+zKw&8mR2nC)*|t>$xjuF0;R9 z_Z3cnbEX?IKqQT3+Szt9!cb~i8`p+AC4<-Hq^uu$Lo{?>w>!U;5LiT7D4S=;`bj?f zaL<`ErHsn({S<7oDLY6!++Bp1EF-xQtgQ3pQpUesvjj1Lb1rCZC#K~Mv-q}bXhxN+ zXo^ba5W6<@amx=?O8HQt{{)Lb2%P>|iT;4CIX+D=-sf&ss)%h z(#J5cVKe1NePS0YN*~toB#g4can*4EG&agk@BoI+?ira8g|woiLy-_k$prEC^rIq? zCQT-RMM9W~sY$t5g>aD5Yne8>k&8k?rKJ_&0CrJ~blQ@{V7(DH1w?3EZwJ%X4Y5>I z+-U;BaD}i=LOUUoJ}|RL*mYkTnvDg116-}_HQJ<3HItRzMS4`+qIj54dNR{Wq6~ge z2ZkZ?=b(J`!P+Q3BPTnM@ zGwbZeLtElRX9 zQ2g|{hLUzW2rGJ!oeGelB>@~(b!PExI+g*w!J5B}>y)m) z+d+o4^zc(Uo`O?M8Yriu9Q>sK>q4F1h4#f}d|PI6AUm!zRDy-!Q`Q3acvjhZKN+QV zOV>lFRKrmBt})KLie zf$P4*i3bCyvyAJKT^-;H3pp95qtJ^q-7fDZPcAELmpGU9B0qK+e3RL8h|SFXs)P)v z1?Dx4UkexLR<5^K;_);@qpII86zz#FT}J9z`nHL#2sHQ^ zw7G>9Hd$pInBnhEqG8|G-NhLn22mlhN3IJb(xf zbL#1W)ZIGvl_F1b;QVp4(Kkgh%yunN@jhIqj<}7OFMVD7WriCi=NWxhYYvN-2p~QEmV|l$2&t1o@KgRhSC{_18mb#r@~FpWyiT+r%tn zwB2=VhgU2pK0g>3bkn3sf{aHmL-`Vhnf-eV%y7eD_?%U=Rps*9m(RwUG!xVy5w#=K zA;V`y_-ZXL$?V%WLvyq;#5+vLp3U|I65`sM?n16q>)I*nzuy(`NzgsM9hx~ZjT~jY z)Vy=a<*~o$L@n1*D7J8oo%~)iQA}7F-jw4bL)RQL4BYaw9Xja{Kjq)G8oThm z8u`JX?ArYh=yVhi5H$aUf$(UHUs>P>5TnTd^ovM=|5=RwfUY?{pliPW^@}{EXFkNp z-AU$05=;G#s^o-3NWe!z-tSLeJ0HL@c6=o?rG%Q>q2&Z8wG&>X{7%Ip9N5~qh z4Y2)ce!EOuPPW>ZP(K0w;L9)&=Iy(`&uHZLj$QjZE7xN@Y?!1)49o+=2dseAMY4}q z5jM%d)}U_^QvMP$LH+^`={;iDrPDj$RisZ08mPU*xnxQL+IGi#T5BE~BY-fSfki4x zX}m4rjH0nBxjXSUNPOtn&nPK+eaz6COkXzbIrJZi^a~N7 zavaFoAW*+e&CiyF^OjdX8^j%OqHkW;&mQi=ikh9nLZn}g3RtiK%%WAgnL$0t_O6wS zNL-WuiRO#zZZLK1?(#Ko=hH_{kBHDuPIb8{Jin|m)Ua5egQ&c+G5<)#(`#p(VEWOe z2Qo2@*tyg*U6CtEUIiHna(j{OAXlU7sN?V}7;!7sIve!2`^8>RaHNbTE}1wj_UxgS zc>5ODW;3wAQbktR#wv7}Yt!$H)XnP$r-8}G=)@j&dk5CXNsO9{DxF z3cbyiTIH@0oD;<*&y{nhK%zUZRc+5N?7>y?mVzn)B@^<)tE`a6>-3S`^20#Q1nCvF zy2x%g6%LumClJ+pD_1k_fk0K1`DY(OH4_8ZV-W0U)=?x#qa z@%pVEVLB#OMGMY60FW_ZN!-Ph%g1WOPFN5_2Zzr1G)q_V4lha+&PfzbKU{9|U^exn?rTt!G`CFuMxHn2pC`G9z>Xne`oY85A`|00{5fg_x2D(gnH=GSb`Y8#bo)l z!W4*&`SIcy?^O^8N3T8GP4k|{_!!q9cO@T$~5~=EYE=8M8 z)#GwPkFRyr9h^(J1|_a`kGm==bm+F;COsv~{*o^3Yg4Pg<&1a1+6cOKCGpF=SPxws z6Fx!Xh}Whu62d?U&^lm~$^laJpZO0E%74y(aQp#Wb9?~T|Cayw`;3Od z3g`dbNtuJiT5mkU*tHMEk(?uTOdQ6txzCGyc33X zBbLc3_%sM@KB7RKyQy&LuVB!PuRw72k^XoRm$K|Gi@Cdv!_eju`O7ehi&PrSN6N=! zq7ISau>YFW9U_2pHlfU=R3aK`dBYpc`+X`N2VbTX|C1_AYkWZxEApW+uJWfcLZR`kth>mW*M!F1A1YK~2FCjI1u ziwc}DPE!#le36IRqACH|8+VyiaPq02)IoBSDwV1XXo8`D^v5_Rf@0%HnLwFs`X`8c z<>TvU50`$!|4GD7V?NL~zCQ9baFV8ql)JvN%KK(!d7(z>GZV-SGS7ecHdTDEsa^JMxdXrG#7=!2QOJmoeE2lgm> zATW4C=$RbF`zrjIt4vH%qmO&i+8tE?Zz%4=Nld#FpyPbV6C|kr}uy^e$ z@PzZheG6w7fumAO#lcqZIM@76h7mBK(##Ea_SR0S`VX>o>D+_+yv`iB8(j?%&W^w+{>J-Mcq#>8i38coaKw53aSEX(6p@$Fe3l z4}$5cO-04Ex(8J}RNZrYQ2i^@!70RS=nZ5C3Ozd=-`oH>NTd02;&F2p_BKktzNQK! zQM1*_g)WMxDZzEdwYuh)ai)5SlZ7|c`RTd&%Q@s61`8eRAM^>!sHxz#2B}%AsL;i9ux394mTgp+`iy z;^<~X1X5(g#+AXq22sMnIGdR4^z>wZP>o>Wp3LifAV$yR_wMWWS7)yd=MGQ{Vj!Ae zC(?fYKpUVR%Zso;{kuN}lLfO$z8d|YDOff{LmBz2#c^Sw!=@_V%TrHic0!RL@u~!i z7Sd#!nEx198qDuF1Hn(Hp<7%XsDu%60hnL2j;uA8E`Qu^|E8zrk-pL$v|i4*<+rF7 znm}bz?wI-ju->(W6&G}_8Vzct^rvQasvl*>Ds;_9pUWp|j--w3fB9Ixz>`i%!UBzo z2=C)Ue?blUfdQm+Byz(ftkz3e@foFyhMb#8K&_I3+Z>qxd>-Z1A5&ijHx~nW?h^Vq zI;glXs13SL6c*@dA<~S8Xamf1lBgKqkK*6n_9lwe+hbsx7Qyj~(dvwcIAd?KREd%w1OR zKfd`uGqcHsig*9wAF8R{v+_V)88*mb(E8@jpn`9I5kJY_WE;@lor`<*89}-DJuA46 z3s60rhbw;@QLb&q18>m=pG-c430 zkbHz(jOLLR5W;IU>Th!*2eHM;bTbZ*fha=|!i)W~4+#$(m)Md^F+}FKvbXLLyb9Q? z7~s1R*M@D5f=R#h#?5sb2{e6h$AoJYN6g+678+jlK3X1jX8hFDeWNz+-D3EgOyyCf zzvlCt5caRW66gpE`PLVDi)@{q@JsR*-GhL_tB}a7RIi#FowZ<( zYJsesPB#`=${!;(#@BqSt^?FAMf*3Qns#MH)@4%45%=N{xI${OY6RTdKJ$Et=a#eQ zrxxoGEU^%WVDL=r$K3Vjekp;;_d4i5IqU7-bi?W2AXn`#(ZQ|R4^gVp2(W#V93i@g zZaY&p(flmu$#06v^J{F}dRQ#vNLgEMKu1bxKJxiOHs1h2kH1+*aR-dH4ImL9U?332 z;{W|hLos%-(6v)i(KV9Nl@}J(WnyIfFFyg)h#L$@90JGWUucXy1N*;+Jy%A~2Go5J>gTa22Qh!y6u?K~ z9U$d|L?y5%9#=-*3r5{5hmMtihIQtDm@&wcyMU5oMg0UAJ%in(M%Pzo*Kf_Za0L9P zpR^4Jb?)HULRonJ@c3v}m`xJ;okug9Rf|#ZkOuB*g9fs6bwDq!&9f-F_v`7CLq84M z%R@5!yQAZqtI!ij?1o?Jdz`+gGRfQsInJKhy1T?z27)LE)yp*?m9MuQ9l!C%gR+Ad(9n-YJm9^%_&+R9QqRpmRMnbd! zMdm5L7TFlNaX~@zg47uW<#ntj1tag@##3UOg4YaoE^KTsFva)) z{?w*x>lFAs-g@g$xx3${_ox3tuE@e>I-815J7L}#BIMG91;3(}XJu0(`1I$B$lKUc zVrQrR%AT=RqV^j31YflNcwO*}1~k7u#K;Ai+*NrzMu~7o=9CG*hgwIl^udrnYyK`W zLvj2a4>MLjqVm0Lk<6_;>M6@D`+6)+=0h#1(G#r2r}K%zxnK~Br6ZU&;->tf;z0tF zyCqRH2`)FWOhqj!_;qNn3u8uJdhpcr zjau};ce$aa$~>=n`qPBXOt#1sd%w#`mIC}|=9TT<$G+;JI@+7Arjw{)65l5+vIp$8 zVJcKupVrKAtA7u-2bs85Q1Fz(vTLV_u4ZQsJcT!jG|!}2n7D~%f;a=V_4}HhoCk93 zS0kpMg!JH<;L~b32_a@PYF@Ytz3{mNE6T{Zx2P?~l{O$_v$N8^E^C4L0w=%9A@C=0 z-1`#h{Iuf27acYNm0HAsj*Qjn;&7tPSl9c;+H(G~s4nnE$>Fn;`f%Ksdb7&k`{DVKu(W` zjfP19diU|ni3Xlj(;F@=I;ytwacxfN-gBjE{rgOrS;s|L(6n2nvEU91xK1?vifll9G}T zl@ufd>5@i3LL?-myE~;*8hOvb`&MtZ=Xo!$-(Rrj+Uq;9KYPv0J~L}1@|^6V?tTxA zUFD*|_99n)%aAD(pFWX`@L4lcWm&(C_ohir?0W$TO)g2zC=tz6gwGj^D&AI7$6x6F z*%o_U`6jNC7pJ6~2C9G98zr4*bYZ!xB#kPdcdK$TO6Q`ui)kgQ;KfB^wDtjlo1Uu_ z`0)&+>AQ(^hRkUiNmj0lfv4b=j>Z23Eh3oO2CsBX#8LOBU!;mzCYpY%xJTH0P~N_} zSZCwBP&H2aG*m~fUh@MA*V+7H?&sk;^b^HrxtP-R>0h^&>N(LhELl`XV&5TsSgG-- z!KZn;M$TQU&Z8<=-O$=Omi#RIafHz-Uir=H%6Ai6X8}GkC#0v~Q-~Iw-#+~uYOX)% z@6FBBj|6W!`95^a&QfesTCecX7Nna6WMxZp1XH~NH3Vbo*qkwt9euAS`=K{4IGlw%byjN+#abb5PqXj zQ}azMX=b#^QI+>b_bplQLPr@-i$-aSbXV{~M_&nbv)aXtH2HM$*J3)^sMLL3Rv|Nd zPpEDbgYXhosoxiUp6SnG!qF6ti*}U2k8o4zx{VU}oS}3D?>-QtevIhmSjHx@+X*jUTODF-H`|ZITSpU<`>I%{`lHy_3M z>co`JvYEt%!YZ4~ldbUjwEl!=hY!CnttH&viN9rtfSaVx(_~vaSwb9qgf!)1WTSgXSH3! zglva-NIi-lrCfpII%=7 zGQHiMP=3!hlQ|FBJC06WC!>o@ z%~#_J8rf0O-ynG~4m6xZ65gL%AcTElH87=XNnt$S;5k~`ht2Zd$z)_iox z8<&7F)z%9G$D50vuxk=SF_*D&I{fkHmupkgH@G)Zc2h#G*_5~HuX$NFquFz>R~#5^ zb}?xSxRvE_)8}J5gz9{A%MyUe`97$3e51F)H+H3&%LXr7bUJBjQIFlDATY}ab?$u_ zyk$ZqPIm?*)-^9uQF2%LV;&7yYf7wb)J??u{S$N+TyS68pEEiz-Q2bwV?yJxft@~3 z5c9r>uOn2wu{K_Vax^8kf>}EPKb@*AsEBBF<_um0qnPYbf&Xq?-1h+;X($saQkBX# zEq5;%@R1C1)N8vwpuTvm_&(I?WHHI`cJ#VVl(W-~8WLuv@5c&dGN=i?p{N;tWL%?u zjH{18GhEi@@4qp^m(ZTfsO+I7BXwlo)Fe{Cj9cRjiH5~zAd@26f@^DVR+*oQLi=vsxxtNK}=fH&Lf({+6offG6~+qywGkNLheYL zrkAHa`(kEFpwqj=FwYX^uGFr@c+b=nx8zRu-8XT>qd}QUUyPix0y8r*RD%m1A9Ko@ zlcptcx8|2m!AE%}?|FXQGVMOrQ~Vr6@+VjHK<};%^nudTN6I>P4zdtZ@hBOPqP4H0Cyf zJ67-WN;3xgx@R?fwy`;zAn|1(v$UE8$XDzHkD3WbN0uTCq$MJaY#2QF8F^gkvkw@TA$$hGVO8PdLyh6>kYg`5N*JRv1Zx z2*xAwroOD4q1+gqz_W4~bQmHg3`raPerC(%HG7-0<0+DJB=@8)yOod%qCR@-BRMqi zNoab{5hJmu%#33raH#zJ(t__dXCsQ8*C>*+tRh(1*`=~1Qq$b;gz@43EMg{w8ld(0 zAv{diGWI#@ZHDdJ3{kj=sCO9paHEZ}qlsbcjx|&1x&2i){5fJ3)@5Dgq%=t7G_q)_ z^U!1JnM!W2)lxQ#xr%kOU~LU(PWQQDbr83u@}wpP)RzGZ(}?-)|yh1KOu%P zTKw&!R1S2_2A=norl^MF=zcY%*pyj)AvhhP#12m!C5Q271*_LbHgmDmT5W~abLDu0 zLp@||wbl83{m(;n7S%$6wsdjadQ(tf@4Q~v2Z28uv>nQsl(7X-O7g63X$Ej^zrB}F z*xYNn%5m8K?qd(q@)EB7*Osp#GN=7!tH|NfaD}Dx@BlskGLwTu? zZ=ksxQ|e_j->UnFd(4*eriB{ry4_m)3*!&>gc9e`dCU${ll{WR?!J21lNeDOpV!2M z%`aF~dPJ6-Jo#WtHqn)E!_A7NTz4oCt8((F?al!C#$-hItO;kbxk=rS4P`)RRGZWb z2PB0Pzaf5?QZ$7(Vx{_;y-)o^T!yFOPss3Fb?zhv+)^Rf(cW^#B!BDtiCgge>E#JT zd5D&fsoLIaoWgY9?|iJp4PPgfrV$)L+2~%zeAs5l&ZFq$iSH!?tE78|Y$B1<-}jM6 zlcW3IpHxs;H@=;Yd$?1;f5TtpmAAZ%)$-+$cF$&V5Ck(wyLs&y(`7CX&tBKz#tiCrELrzJLf53)pH;VRAa-d6C z;i6c>GgW!7gmr75H_T5IbraAB4N{Y9HiZ@L-K)@)3=tSS&&&_$>`sxwLs>#BQ8@SU zG};y6Q=w5x)pWV3a?l>fkLfNLVEW}n#OAfv2adxJXb%E*8|=rUy7U@myT08}zU8bi zrReIR^@Q|pd9CsdUc}_jD`rUC5$5HIvOf` zr=u{NGtszP81TqOTxUlTYhXgEizKH@8xp-p2dzjS?21CK&eMcO|A#AL2fCtvVqO31 ziZ17AOj`j7IJd43*twy6p-=Q9O7uV_Q0VpPas2`(gkoN|3dgD9L!nQRmw`(~A`y&| z4j+ookbgyg0C_-2g0mnqj z!a?8MWu$mPbavN3?#RR4{Vy$TmrG^96E#ZJL2ON$c}ptQO!ucdPT-LHvl!HDmQPi* z!m$J;SeeM64t(VIr7V`Xoy!y~NpMc!}@c&(zCu~A-7UFR<=^Y1Y9T5skw-uM#eOq@7bI?bk0@P_=qGZ&C?xu(DO7piV z-~pa5Ic`_Gw*>dC>;7LBsa`t<+kVQPwcXL|Q#?X89rU>1 zbhkhrDyG|!%;oY`7f>d(&BD`7i=lcR!W|H@t9DwVTRH=}H}L)`V~gQhRCp3SMp^OR z!k745#>X>99UBThp+}5#=Ga-w^ z8F_*}=r3%-R@>}zPLjDYa8BE2NvZFzgsYq;nb z{g{ilkOp*T1M2~^2HTnvUhq5;s}LgFQmpr^+GL~~LDxD*{>Etm>hftAXc((v*04YD zOE2Sl*Mj$1M)-aD;Lsrh(PGt6V($+nEHI3WUPojmI1x=xf9gzaB5J0;7Lzo!3_I_F zsd=yg)7McpE?pS+lzmLZdtrw`B3I321ub6SzDdMIwf@a?&4g#iCj}IIxqRAF5&|cp zobpAzxap6o#k?c6!r!B4xI6q-da$o5v{(+)>-N)n@>iLkp`agc!|80&Y zZuURC5eLv4L6%>G7d`&tjXV?vAagXhHLFISr;Xdq0>LePFC-{kyXDurNXDHonYhDHyB82T4vyq>tL$UN!O-kI=8KFUwn zu=M|Wm!PkIJgXr6+*u;5ATfnc7`!7S{N=!s9A)!8V+l&*%zk*5Fq)gvUj&>+P>CrT zkF+D5zMVTX+GU}3H`&gbzH^5!lQ(;~67rBvrm$3Tng$1%vV2ej233(#t0vz>q@Xz^ zwe-Fic+b9jtr~gHDuUF!!t=2s55rVtc7XxK7v{dP3S5G*8L+9LJlJoAahB{+_L}^& zD*O@g{ImK|UvdZx#IdG!-^Wh0q+!TF5heTVz%uK`XwZZ(D~gHztrEU>@cJyiwN8HQ z*ZbBw=Lo$aEB+UW`C@B~*M-D~h>VB8=Q2)-n1#Rb$PD$B`Sf5qyNuMdwrJM-$EJ{( zXDTy$-V&f&1Uu{w0af5lA$q+>qm#MZjIx7ukEUwhHLZ~ly{~<|QkjQvi#Pn-NQ+z} z7GD*0HMhPX2(R%8AG%e!#^+mpigw*+McLu9^#}ZG!SgPia7hhMF8ZHpVL$eut$CCU z$6r2{_w<&a&pNe@YC)iDiu=ObDPgg??CZKr$_WUL{MR_Gsu6}FIV1VEPGCAV#u+@S zk?X~Z;tpM@;dN!VzjJ<^Bu=OxR*vv?^|Ndce6G4^p)Wqg5rEV$0NZJ=U} z!t>}FPl5BUS)eA&&6m5T=;GVgA`7O;wBbB9YZlTZuwZNbg$`QEa5y^g$D{YrhzlWd%GmI{#1^O}{X2_ZBKlWs4rmOFGl*Z(sh0Kcs4-*3oOFHJ zj!Yr7qcS9EH@m6RiBj0&@ExQ!ALd!idwZiSGiI-7;=&@|TA44g@GG`|jDo9;RM-|s zEpT}$?YhO5O~am=hj7NBPLWKh?Q_zY0FxNBVE%VFMw+kdc7&|>qPeY586WientA6l zpL+GvMrUqfb{L};b==>_M-DD#h#j_`+J{fPS8G9?WN2s+md(GArNW>c`k|wcrD;zL z)3zBiBtKz~Kk|No;h)@*^uhmdN1Q-+^v@dX{|t_{-sjrrKcEtVb3=H;h>arU$GEKP zfYZAWfgptt-JrT80y37qNj*sKF9z68`;lA&?}RwGC| z*mE7`ub#@5@txR6`wgSr$)JHmF^b12B1J_hqPJXlg5Zq(-V+zE7kj6#Pg}ZHCPetG z?7l#*i{&>DtsAL>1|sv}d}FQ^{;TGg*w1gNkcTVW&Y=Z+CF;&ss~AFYixP47QaW}r zI#dVW|Q#RLD!y86G7wP)3=AMlIsDq3KB#zt}~`#O5}XbmmCm&B^DvopM5N zt@HN9D&9^Mc&SmEGvQN(bzVOi@IfGh@n12N9J>ct&J;d97;inpR8AV-<_9f%gN&KB znRi?duC16-o79tVi%*iRjdxnaZqVn`pE#53$>SVGPDpD^*QDEh)h4edA_2u7sTmqI zR8U8#QgC*IG?rCxpQ#soFFC;WMi{5rc;XrJoNj7+yxwV6gCx|R$kUD2oaj!Q8ku_Z z+j^mKvaIL+Qo$V`7ri~>&?5(xq_=7&WB1$^21lcATT!!%o|A^@_X{TWu8xpd87s~k zcG9<)B1dCYdA80Be?}l?qcpUdC-rKg`apmldg`uyZ%O~uWg+s@JERfK(KWjaF2s)x zXrHP`#F#XwMePbsayDw481wm>)`4JWsRD zLbfSCBDpivdfO&lw@GtS?XcyMmc8$^kIb1G6=Ru=Q#<_|9<>8v0dsDxx(8T!_DR7< z7P{v*SAtV=zaQk{Y#lx|9F4ujQj7i~o3P~5&2xkoRU;Hz2Soa-6LWf_&N#6&W-j~d zK?tT!iYM>1wSDbDw!~H8NWm9x@3p-?^?B|-(>q*37^`BxZDhemyF23j#11cZY*W+x z2rJh5y#B@kTOCHJhO3hfvT3#1beuPVU<>OZ&UmS8&uov|gSK>{h1sWJI-5+-7&FCe zw{i@^_d2fI=RBj}x9AzDVuLp(eDHGb*dER}aadV?520t4j8FCWInfwf&TdXZr@+#5 z`1}V`3`Wp&zwLI6@VJJJk)#_}>&6xmxn%*Iq-ecn*b}3Q1hn zn>Vm7Jg(Oa$G_ob2!8rOCh`bPk)-raSQ4X>CybKcOMcqGyxBgx%!&;}$MBncQIn&t zSkwxf=Jy`?s?A$-hI!9+zul{SvY)RDc1M0!=V}T8|HB=DfbIyg3Y+8S=m`DCXQQNO zxTX*aG2-Opz^BE@!6B~`KPuiV;3|S=^;a-vMsDbAYB$P;(@PE#%5DtmIPY}$b_s^CPz0Jx>qT;3?Uz|Pp#(I=vO7K#n zW`UqRhev8vGB`Krr6XEX8&g>I1ncfn=DhIxy6?Fp)n<09Sw**VMtYLv-3c+ z$KKTqeJ+Wz^uS)pAK)W1c0poYds&#T=?C3>E>=p(MS{7cB(;wvVh%ybwW%)mQ!Hg`n1E95+(r z(zoM4bz9ec@Nw0bzwNKWh0TR8U-YyE*Ra-8#Z<70A3u=RD&;yF&IsY@hRx#kR%vL1 z**qY1E4jC$f5-jFctIIn!i{ck){k^}52f*{RIqBc+c@o82;v`Zf5{o#to#V`eV(73 zZ;}OW1+M1F=USYoNsnEzk((6zHE%}UN65q1gd|ohl~Y%$#H-PRF$H)szF0BIBHuA^ zRd;m5up(>jrSb!DRqCu1yqWW9PYK6El%*-+mNfjRK!}m3xVp_`Xi;a|LE756;lI&W znb^##J;KdgcrGx7R@l#o;@stl?YfisBtHqgF4Xy2&XX-6yGBEK$!#?hQYZLBFMO0p zw2WbGD@rbEs?qK7TPPowXFuZ;QS_}{^DOqn^hZ`%cB&>sVu9a!VZN9}QS6lWfiO{^ zxuGIRcKB$uWpn4o`=W)lPnwV;-FusRyyA*l z3^}H;8M05d^$fC4cI3mf_-%HW$9Njqd5;lJlg3Q7MUZ{VXSd3xzn=KsIarUW;m4|0 z$#368G@JS2t@rk5EGT&=GW zzvIA~;q%tQE5&|awrC!u`MSMsolf;p8TBx7#mB1Q;iDfGr< zkF=z(zuNF@+$U~ocgUYz_nSb3i4AY-ws> z|iG`UtI3qZ5 zh!OmcBGN*P5XpZUAzO-F<^fJX@Pgcj#Pv%Y+4SH0M9}_SDgOCxTG zIQqg*BaDBIr1fOv|8oI0{Bd%Mz@;G{#1LEUry6q1 z(*LUGwSNl>X<@MK)oZZ%k1&BEm*#>HbEes!`C|Xa9BdCr01NnB&7a-!r@*iLz)$5r z`Tw{En?JiW|1E#6wV&p{vV+|IpZxzx01NyW9sE{*K8K$Izw&3hlK+ouu=$T=%)jL? z`0c0pulymm|0n-{62JoSmlcq?Y(Pm!1B&_n6uACx16mr`*%?4uKu=WtkBMNRx0gZ+ zmqM}-A!)LoLIhWYAWF*4#!!;MVt~ggU-?t)XSIHmN>m+?02YY8EX}V^QZOpu(6;{s zvHdl|V)<9%4@qE=t6$k+H2(CJofRnZGYKs6`f5pZ{`7H-4Jh(6=}*-$IQv6&E+Nsg zws8Gbou5fyk*Ld(NL@Z5amW)gef3iW@82f`US#E(D!_VGfb~xTu8mLy*scmd z)~5W3l>A#2Jb!j{B3JKc2PA+6ez@G<1bq9TmVo1`05~c$(ES7|Ko#J;DgZf^2jIV6 z3_}$FT@?U<1%5dG->MJ>p7Z?kqFue83y=U705oFcJX8Vhs{-6$fgc=*U1BW^!8+FB zrvT1xSpQf(4NL(`{BSqFNhIt*mjDEtWdW~|{HGefNu+o{mjFbGWP$K_bxR6NCb%+C z0&lYbg1fOmhy+w5Cj`0#AS@FLJ6PgJhxA)T3JIZ003xZdK&ZSL915o74Ri@W2m}@g zmsgLhgQ>U+T>`LinFT^7pe?Ekp-TWZ9I|lzsUr1Y;GjJbz$PIU2%T4VV8b+hfhxfY zh^EfU43@YWQ39q-1-b-)PF4t=fVSwGg)RZ0lNCZIpd$Uh21-|7DpmlUtPnZ@Z|d;R zd4vc+0zfA#giZh#6JF3O0-%!>LMNaUv+&R*0CciK=mfl}i!Y%|0O(|e&#8f?f&$oos*dov<*!`tqx2u>t60gV6b7Ci1Hku!z6!0zfAlgwCr$LSb>2p-TYhWP{Lo^`XKN+Ci59(8&g&6VRNbhtMSe zbh1I{1T-fF^gfjxKqotdPJjdrGSpJA1L$Oj&<~HuT!3ytmjKYo4x#g^%Yo&|gDwG}lO00mk4e>U6%hcZ zLTd{Eo$L@gubxl>D+2vxX9v*9{wLoFD=7uN6aYHeA#?(oQx^Km&HT0no$6Bz_2GC0Zppz3q=hcA{ z?3-=q5&$|mA#?(sNRk6|2>_j(5IO;+NIQWp0icr;LMNa(v!6hf00HO(LFfdOA|DmH z1b|KugiZk9#n6ZGAOM{p2%UiO#RupwI|x802tp^I6R1joUJ(GDAPAiiFbFU(NWb-| zwZA^eUG?A~0G*&e`pyREFFOc8C+Ls9vy~ruMF4byAanvAYDW`v2>_iS2%Ui5tXCYm z1b|KugigR%Yj7B<1Q&o#u0Q(DF;(ai06MuKbOO4fscGmE06MuKbOHdMH-Rnzppy$i zCjju}E$9*eI=LWp0wmU<597H2baFxH1iT|V(0g_+0G(VAIsxwYFV7zbO8~sq2`Tip z0MNhFkff4y4=Eb`;={#Kp8US$6#k-uIV3l{mm zFKB~-!O(>aS!fb2f3*<+|7rv05)bjEh$=D`j!qcLP7Wpp)+P>;Hm0`V!$X`6t=uTA zENm=IjKO~#oxls?@G)Q#Xu#oa2DK(_$<*=rc@D;&Z;Uz5QOl0KO0gbmlzcOSsUm4X z%o8eUPNM$pgL7Yc=lW(aU*~!-9~Q|iZNO2_4lK$WqvZEMnfVdo0ZDX!KU2j>E=g% z$9|zree0~Zcm3t&m*=BwuD%bHqTmA)LP6alc(k3KmQGZPgQPH`_5xQl98T}!Q;TlR z9PQ=IO@-8fMQ-^?>+I2xG;88)j}*2oP1VUAD!=R@3Ts&Pm+T38*b{!56RCVFBC`eW z@m7d#mghW+ARZL<9KDuJk0c=FEexf-UUW&2Vmx=FFTA!FrH-j!k1F`jWjRC(t)I4^e{aTW`% z6Qr`&EA@r$*tZVoY2kgvvn;RD#7e8n6LBY2lP;_{9c;t64wLw8kinF&1E)Z|6vKtzizCx;77Kyl) zA%yKD6TD<|En4}|noq0s5v*5IUGKZa{lSi;JDn7)i0di5BYAtTGCaO%jiM2CIpmXc zIHB}MC_WHiRb3_e(fiD1nx`vZD6SGyBDq6zqnAfrip+OY!LU5TD!G2YWGW9p%YBw|!M z1tJ0FOj-jNsUJy;>Ba|nF{qo8=O`Z4i4%CF*H5mXB-dN>mg3RNNyMCABX2;SL~_1> z{l-!>S!-caoTSYjMDijCzi<0`ke6IWC$3_xXUghB7a^kN?d<>+>3$dFme90d_iHQ9 zoF_uv=PP!av1XN>9(kr}82GN{JW!Er=-=ymhFs$LwM3IqF@G{u`AeyPWU*7E36k$> zU52yd>kc*7?nqNR8TeG%<&e{jJ=0MKL_1nUr{l?`aE1UU(eOn4bmZMvsC}hdqQabV zRU61B1U~wDG<6ks1!54)+0ogtU$PsGr{GU+wg+g+6yG0sq@b#*VQnp_7u=+5#%w(Q zfg`~ZEsKg(2PZDn)MQn>N3-(r)b3JR0FF9iDv|5EVf}g6y!(Wf!uQC6j3#0~M{uBN zUhGrPZIIbEP_Dh)iEX}t8lv6kuBfO)MJUPR8aWbF}u6QCUunheWj3J^+?2~ z86nT%!pClFG<8oyUw`H&6WpRV41;1`vT$zA-*0psdMAd?(#$&jm=U?8wic(PHVgB# zKXk3{SuN@LeUK&gr|BS_3B5O?W}C6+STeWE>DI4}R`ko}9h74~azddN4u>6E;1Wpp zEfg^2+VCa)+-sL3rBG4OH_B4AW-y|LrY(Ik=Ox8UWYI2y|-X0rE zUU!|XFMcO1?sP25&-K7rg8yv4IBreNC)qKMcuD@Fed)cst7wiZ5pi7PCIZTm4cu}@ zi$jNe2V~=4XSttO?C0RC!I`nVLb*_+I=L76Aw%O$T{)6sh9HmaOchp#sBh&_QeY)D zbIb$Wj`l~`!hICVyf?@@u?&;=ERgJ5?F57td%5hmsQcerA-S8>V-$_eS9HHQ1QF_e zK75|5g?nU~Dja4!Th3Okadc|v#Ii$vjceV<$E@M&L%WZi59SS4wP&}-s$l80y@Z)v zAn(A+JBQm}SgE-wB$&bjvqrEM;2x)wH@I87r7wtQ=5`NRk|8r{cby59N@gpdI?ES^BpK!N)l`u3_Y6O4O*TKsMgw4IZJ1@rml(OWL1J_4DW=85(+mDhhbDw=4wcu z3R;tV0r3;fYWF+qvU1O7kMBA-Qq@d-_L6t4wuj|OpXFt0JAKF7n}y?e`c1#q%HeB7 zq5509UJi8}fiKsXg@)%<8MClCTOA~CDf?7SC4Wk47`%nKj0pSPiJ+pTIsM_y+B<FGd>^yIN*O5H~-IXq3`xYXnc+&lg^N>P(a##ez^nky1r-iPCn&f_28bQQ3&J>C*V`)A{b-w|xk=EgOa zr)j8fPbZdq#a5o*mpgO77qilU|MqQtj&8JW3Ve%w9=(bD(n+smTeLX zS1o)bhb~v_j|@``kJY*mU`yvBi>VqDiAL3?9P4Ab@Q<+RQOEIp^MILggGs)t7@oAWIZklS?n_$x$V^TfSsK>uBQQ8NtC0 z+wh@xsHjo;Ax$U6i^wQhg9$P=4pvkSGumL>t)`NpZo%}hd#gwL4 zyRgAwCOkM)OadY&C0dV@s9vQQl(HFES<*_QHBolf;Yz7665c#${l0Uw+4GdVPzW2huFXiKz@NbL-_oQ7$4|Rk;&^30NmD4%AH0eSd&a(*3Nkz`= zXsy!gi8!r$d8?|-L5kmNcVy(KIP%W7;vMB{Z@HWkCOb{xU_J_-P6_J0Pig+7`M`a? z+J&q2bcVs=&BGS;HTl*WCwZ^y&N=~6lh_t$JxSZSBity5)CwH6Z5JcHn1{wOhQc!V z_v^d}H!XrdwCi}bMYr(LN|H&jjNg3UZw6&j2osW=!#K}ke6{WD5*R?|Pd)^nte2w_ zmgUBH-oEKRJ<>~;m05^rvbH6jd!3kurnsdw&c0b;y8uO(>}cU&*IgR-vD~$c-Yl!0 zVz?&ub<3ScxCC_hXGxxKLUYvbro30<0>E~C7v2efe4!E6N*fYRs zon`)}iZ6o>t6Xch)M@t|FN)5R_nZ`TjD8B^0NB{r; literal 0 HcmV?d00001 diff --git a/data/vjets-ewk/2023-08-11/ZJetsCorr_collection_ewk.root b/data/vjets-ewk/2023-08-11/ZJetsCorr_collection_ewk.root new file mode 100644 index 0000000000000000000000000000000000000000..1010d48f992507345fd14cd42ddf27f90e5057f3 GIT binary patch literal 164242 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

L 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%0AhJ9D9wA;=V{FAJ2# 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 A-2eap literal 0 HcmV?d00001 diff --git a/include/nano/helpers/MuonCorrection.h b/include/nano/helpers/MuonCorrection.h new file mode 100644 index 0000000..cc95ea5 --- /dev/null +++ b/include/nano/helpers/MuonCorrection.h @@ -0,0 +1,37 @@ +#pragma once + +#include "nano/core/Collection.h" +#include "nano/producers/HeavyFlavBaseProducer.h" + +#include +#include +#include + +namespace correction { +class CorrectionSet; +} + +namespace nano { + +struct MuonSFResult { + float nominal = 1.0f; + float stat_up = 1.0f; + float stat_down = 1.0f; + float syst_up = 1.0f; + float syst_down = 1.0f; +}; + +class MuonCorrection { +public: + explicit MuonCorrection(const ProducerConfig &config); + + void correct(Event &event, std::vector &muons) const; + MuonSFResult scale_factor(const std::vector &muons, const std::string &correction_key, + float minimum_pt) const; + +private: + std::shared_ptr scale_smearing_; + std::shared_ptr scale_factors_; +}; + +} // namespace nano diff --git a/include/nano/helpers/NloEWWeightProducer.h b/include/nano/helpers/NloEWWeightProducer.h new file mode 100644 index 0000000..64bdc3b --- /dev/null +++ b/include/nano/helpers/NloEWWeightProducer.h @@ -0,0 +1,30 @@ +#pragma once + +#include "nano/core/Event.h" +#include "nano/core/OutputModel.h" +#include "nano/producers/HeavyFlavBaseProducer.h" + +#include +#include + +class TH1; + +namespace nano { + +class NloEWWeightProducer { +public: + explicit NloEWWeightProducer(const ProducerConfig &config); + ~NloEWWeightProducer(); + + void begin_file(OutputModel &out) const; + void fill(Event &event, OutputModel &out) const; + +private: + enum class Boson { None, W, Z }; + + Boson boson_ = Boson::None; + std::unique_ptr histogram_; + std::array, 3> uncertainty_histograms_; +}; + +} // namespace nano diff --git a/include/nano/producers/HeavyFlavBaseProducer.h b/include/nano/producers/HeavyFlavBaseProducer.h index a9f57b7..0a4089b 100644 --- a/include/nano/producers/HeavyFlavBaseProducer.h +++ b/include/nano/producers/HeavyFlavBaseProducer.h @@ -15,6 +15,7 @@ namespace nano { class JetMETCorrector; +class NloEWWeightProducer; class PuWeightProducer; class TopPtWeightProducer; class FatjetGenMatching; @@ -44,11 +45,28 @@ struct PuEraConfig { std::string correction_key; }; +struct MuonEraConfig { + std::string payload_subdir; + std::string version = "latest"; + std::string scale_smearing_file = "muon_scalesmearing.json.gz"; + std::string sf_file = "muon_Z.json.gz"; +}; + struct JetVetoMapEraConfig { std::string payload_subdir; std::string correction_key; }; +struct NloEWConfig { + std::string payload_dir; + std::string w_file; + std::string z_file; + std::string w_histogram; + std::string z_histogram; + std::vector w_uncertainty_histograms; + std::vector z_uncertainty_histograms; +}; + struct BTagConfig { std::string branch; float loose = 0.0f; @@ -86,6 +104,9 @@ struct ProducerConfig { std::unordered_map jme_eras; std::string pu_payload_dir; std::unordered_map pu_eras; + std::string muon_payload_dir; + std::unordered_map muon_eras; + NloEWConfig nlo_ew; bool jet_veto_map_enabled = false; std::string jet_veto_map_payload_dir; std::string jet_veto_map_type = "jetvetomap"; @@ -113,8 +134,11 @@ class HeavyFlavBaseProducer { void select_leptons(Event &event) const; void apply_jme_and_select_jets(Event &event, const JmeEventResult &jme_result, JmeVariation variation) const; void load_gen_history(Event &event, std::vector &fatjets) const; + float get_lhe_v_pt(Event &event) const; + float get_gen_v_pt(Event &event) const; void fill_base_event_info(Event &event, JmeVariation variation); void fill_fatjet_info(Event &event, const std::vector &fatjets); + void fill_leading_fatjet_info(Event &event, const std::vector &fatjets); ProducerConfig config_; float jet_cone_size_ = 0.8f; @@ -122,6 +146,7 @@ class HeavyFlavBaseProducer { std::string subjet_name_ = "SubJet"; std::string genfatjet_name_ = "GenJetAK8"; std::unique_ptr jme_corrector_; + std::unique_ptr nlo_ew_weight_producer_; std::unique_ptr pu_weight_producer_; std::unique_ptr top_pt_weight_producer_; std::unique_ptr fatjet_gen_matching_; diff --git a/include/nano/producers/HeavyFlavZbbSampleProducer.h b/include/nano/producers/HeavyFlavZbbSampleProducer.h new file mode 100644 index 0000000..eff60a5 --- /dev/null +++ b/include/nano/producers/HeavyFlavZbbSampleProducer.h @@ -0,0 +1,20 @@ +#pragma once + +#include "nano/producers/HeavyFlavBaseProducer.h" + +namespace nano { + +class HeavyFlavZbbSampleProducer : public HeavyFlavBaseProducer { +public: + explicit HeavyFlavZbbSampleProducer(ProducerConfig config); + + void begin_file() override; + bool analyze(Event &event) override; + bool analyze_common(Event &event) override; + bool analyze_variation(Event &event, const JmeEventResult &jme_result, JmeVariation variation) override; + +private: + bool require_sv_cut_ = true; +}; + +} // namespace nano diff --git a/include/nano/producers/HeavyFlavZmmSampleProducer.h b/include/nano/producers/HeavyFlavZmmSampleProducer.h new file mode 100644 index 0000000..b7132b6 --- /dev/null +++ b/include/nano/producers/HeavyFlavZmmSampleProducer.h @@ -0,0 +1,21 @@ +#pragma once + +#include "nano/helpers/MuonCorrection.h" +#include "nano/producers/HeavyFlavBaseProducer.h" + +namespace nano { + +class HeavyFlavZmmSampleProducer : public HeavyFlavBaseProducer { +public: + explicit HeavyFlavZmmSampleProducer(ProducerConfig config); + + void begin_file() override; + bool analyze(Event &event) override; + bool analyze_common(Event &event) override; + bool analyze_variation(Event &event, const JmeEventResult &jme_result, JmeVariation variation) override; + +private: + MuonCorrection muon_correction_; +}; + +} // namespace nano diff --git a/src/helpers/MuonCorrection.cpp b/src/helpers/MuonCorrection.cpp new file mode 100644 index 0000000..97f5167 --- /dev/null +++ b/src/helpers/MuonCorrection.cpp @@ -0,0 +1,178 @@ +#include "nano/helpers/MuonCorrection.h" + +#include +#include + +#include +#include +#include +#include +#include +#include + +namespace nano { + +namespace { + +std::shared_ptr correction_set(const std::string &path) { + static std::unordered_map> cache; + auto &entry = cache[path]; + if (!entry) { + entry = std::shared_ptr(correction::CorrectionSet::from_file(path).release()); + } + return entry; +} + +double crystal_ball_cdf(double x, double mean, double sigma, double alpha, double n) { + constexpr double pi = 3.14159265358979323846; + const auto abs_alpha = std::abs(alpha); + const auto sqrt_pi_over_two = std::sqrt(pi / 2.0); + const auto sqrt_two = std::sqrt(2.0); + const auto exponential = std::exp(-0.5 * abs_alpha * abs_alpha); + const auto c1 = n / abs_alpha / (n - 1.0) * exponential; + const auto d1 = 2.0 * sqrt_pi_over_two * std::erf(abs_alpha / sqrt_two); + const auto norm = 1.0 / sigma / (d1 + 2.0 * c1); + const auto norm_sigma = norm * sigma; + const auto norm_c1 = norm_sigma * c1; + const auto f = 1.0 - abs_alpha * abs_alpha / n; + const auto g = sigma * n / abs_alpha; + const auto c = (d1 + 2.0 * c1) / c1; + const auto d = (d1 + 2.0 * c1) / 2.0; + const auto delta = (x - mean) / sigma; + + if (delta < -abs_alpha) { + const auto base = f - sigma * delta / g; + return base > 0.0 ? norm_c1 / std::pow(base, n - 1.0) : norm_c1; + } + if (delta > abs_alpha) { + const auto base = f + sigma * delta / g; + return base > 0.0 ? norm_c1 * (c - std::pow(base, 1.0 - n)) : norm_c1 * c; + } + return norm_sigma * (d - sqrt_pi_over_two * std::erf(-delta / sqrt_two)); +} + +double crystal_ball_inverse(double u, double mean, double sigma, double alpha, double n) { + constexpr double pi = 3.14159265358979323846; + const auto abs_alpha = std::abs(alpha); + const auto sqrt_pi_over_two = std::sqrt(pi / 2.0); + const auto sqrt_two = std::sqrt(2.0); + const auto exponential = std::exp(-0.5 * abs_alpha * abs_alpha); + const auto c1 = n / abs_alpha / (n - 1.0) * exponential; + const auto d1 = 2.0 * sqrt_pi_over_two * std::erf(abs_alpha / sqrt_two); + const auto norm = 1.0 / sigma / (d1 + 2.0 * c1); + const auto norm_sigma = norm * sigma; + const auto norm_c1 = norm_sigma * c1; + const auto f = 1.0 - abs_alpha * abs_alpha / n; + const auto g = sigma * n / abs_alpha; + const auto c = (d1 + 2.0 * c1) / c1; + const auto d = (d1 + 2.0 * c1) / 2.0; + const auto k = 1.0 / (n - 1.0); + const auto cdf_low = crystal_ball_cdf(mean - abs_alpha * sigma, mean, sigma, abs_alpha, n); + const auto cdf_high = crystal_ball_cdf(mean + abs_alpha * sigma, mean, sigma, abs_alpha, n); + u = std::clamp(u, std::numeric_limits::epsilon(), 1.0 - std::numeric_limits::epsilon()); + + if (u < cdf_low) { + return mean + g * (f - std::pow(norm_c1 / u, k)); + } + if (u > cdf_high) { + return mean - g * (f - std::pow(c - u / norm_c1, -k)); + } + return mean - sqrt_two * sigma * boost::math::erf_inv((d - u / norm_sigma) / sqrt_pi_over_two); +} + +float evaluate_sf(const correction::Correction::Ref &corr, const ObjectView &muon, const std::string &variation, + float minimum_pt) { + if (muon.eta() < -2.4f || muon.eta() >= 2.4f || muon.pt() < minimum_pt) { + return 1.0f; + } + return static_cast(corr->evaluate({static_cast(muon.eta()), static_cast(muon.pt()), variation})); +} + +} // namespace + +MuonCorrection::MuonCorrection(const ProducerConfig &config) { + const auto key = config.era + "_NanoAOD" + config.nano_version; + const auto it = config.muon_eras.find(key); + if (it == config.muon_eras.end()) { + throw std::runtime_error("Missing muon correction campaign: " + key); + } + const auto root = config.muon_payload_dir + "/" + it->second.payload_subdir + "/" + it->second.version; + scale_smearing_ = correction_set(root + "/" + it->second.scale_smearing_file); + scale_factors_ = correction_set(root + "/" + it->second.sf_file); +} + +void MuonCorrection::correct(Event &event, std::vector &muons) const { + const auto suffix = event.is_mc() ? "mc" : "data"; + const auto a = scale_smearing_->at("a_" + std::string(suffix)); + const auto m = scale_smearing_->at("m_" + std::string(suffix)); + const auto random = scale_smearing_->at("RandomSmearing"); + const auto cb = scale_smearing_->at("cb_params"); + const auto poly = scale_smearing_->at("poly_params"); + const auto k_data = scale_smearing_->at("k_data"); + const auto k_mc = scale_smearing_->at("k_mc"); + + for (auto &muon : muons) { + const auto old_pt = muon.pt(); + const auto eta = static_cast(muon.eta()); + const auto phi = static_cast(muon.phi()); + const auto charge = static_cast(muon.get("charge")); + const auto a_value = a->evaluate({eta, phi, std::string("nom")}); + const auto m_value = m->evaluate({eta, phi, std::string("nom")}); + const auto denominator = m_value / old_pt + charge * a_value; + auto corrected_pt = denominator != 0.0 ? 1.0 / denominator : static_cast(old_pt); + if (corrected_pt < 0.0) { + corrected_pt = old_pt; + } + + if (event.is_mc()) { + const auto abs_eta = std::abs(eta); + const auto layers = static_cast(muon.get("nTrackerLayers")); + const auto event_number = static_cast(event.scalar("event") & 0x7fffffffULL); + const auto uniform = random->evaluate( + {event_number, static_cast(event.scalar("luminosityBlock")), phi}); + const auto mean = cb->evaluate({abs_eta, layers, 0}); + const auto sigma = cb->evaluate({abs_eta, layers, 1}); + const auto n = cb->evaluate({abs_eta, layers, 2}); + const auto alpha = cb->evaluate({abs_eta, layers, 3}); + const auto random_cb = crystal_ball_inverse(uniform, mean, sigma, alpha, n); + const auto p0 = poly->evaluate({abs_eta, layers, 0}); + const auto p1 = poly->evaluate({abs_eta, layers, 1}); + const auto p2 = poly->evaluate({abs_eta, layers, 2}); + const auto sigma_pt = std::max(0.0, p0 + p1 * corrected_pt + p2 * corrected_pt * corrected_pt); + const auto kd = k_data->evaluate({abs_eta, std::string("nom")}); + const auto km = k_mc->evaluate({abs_eta, std::string("nom")}); + const auto extra_k = km < kd ? std::sqrt(kd * kd - km * km) : 0.0; + corrected_pt *= 1.0 + extra_k * sigma_pt * random_cb; + } + + const auto ratio = old_pt > 0.0f ? corrected_pt / old_pt : 1.0; + if (!std::isfinite(corrected_pt) || ratio > 2.0 || ratio < 0.1 || (corrected_pt > 200.0 && old_pt <= 200.0f)) { + corrected_pt = old_pt; + } + muon.set("pt", static_cast(corrected_pt)); + muon.set("p4", ObjectView::LorentzVector(corrected_pt, muon.eta(), muon.phi(), muon.mass())); + } +} + +MuonSFResult MuonCorrection::scale_factor(const std::vector &muons, const std::string &correction_key, + float minimum_pt) const { + const auto corr = scale_factors_->at(correction_key); + float nominal = 1.0f; + float stat_up = 1.0f; + float stat_down = 1.0f; + float syst_up = 1.0f; + float syst_down = 1.0f; + for (const auto &muon : muons) { + const auto nominal_value = evaluate_sf(corr, muon, "nominal", minimum_pt); + const auto stat_value = evaluate_sf(corr, muon, "stat", minimum_pt); + const auto stat_delta = std::abs(stat_value); + nominal *= nominal_value; + stat_up *= nominal_value + stat_delta; + stat_down *= nominal_value - stat_delta; + syst_up *= evaluate_sf(corr, muon, "systup", minimum_pt); + syst_down *= evaluate_sf(corr, muon, "systdown", minimum_pt); + } + return {nominal, stat_up, stat_down, syst_up, syst_down}; +} + +} // namespace nano diff --git a/src/helpers/NloEWWeightProducer.cpp b/src/helpers/NloEWWeightProducer.cpp new file mode 100644 index 0000000..ef26e73 --- /dev/null +++ b/src/helpers/NloEWWeightProducer.cpp @@ -0,0 +1,117 @@ +#include "nano/helpers/NloEWWeightProducer.h" + +#include "nano/core/Collection.h" + +#include +#include + +#include +#include +#include +#include +#include + +namespace nano { + +namespace { + +bool starts_with(const std::string &value, const std::string &prefix) { + return value.rfind(prefix, 0) == 0; +} + +std::unique_ptr load_histogram(const std::string &path, const std::string &name) { + std::unique_ptr file(TFile::Open(path.c_str(), "READ")); + if (!file || file->IsZombie()) { + throw std::runtime_error("Failed to open NLO EW payload: " + path); + } + const auto source = dynamic_cast(file->Get(name.c_str())); + if (!source) { + throw std::runtime_error("Missing NLO EW histogram " + name + " in " + path); + } + auto histogram = std::unique_ptr(dynamic_cast(source->Clone())); + if (!histogram) { + throw std::runtime_error("Failed to clone NLO EW histogram " + name + " from " + path); + } + histogram->SetDirectory(nullptr); + return histogram; +} + +std::array, 3> load_uncertainty_histograms( + const std::string &path, const std::vector &names) { + if (names.size() != 3U) { + throw std::runtime_error("NLO EW correction requires exactly three uncertainty histograms"); + } + std::array, 3> histograms; + for (std::size_t index = 0; index < histograms.size(); ++index) { + histograms[index] = load_histogram(path, names[index]); + } + return histograms; +} + +} // namespace + +NloEWWeightProducer::NloEWWeightProducer(const ProducerConfig &config) { + const auto sample_it = config.channel_options.strings.find("sample_name"); + const auto sample = sample_it == config.channel_options.strings.end() ? std::string{} : sample_it->second; + if (starts_with(sample, "Wto") || starts_with(sample, "WJetsTo")) { + boson_ = Boson::W; + const auto path = config.nlo_ew.payload_dir + "/" + config.nlo_ew.w_file; + histogram_ = load_histogram(path, config.nlo_ew.w_histogram); + uncertainty_histograms_ = load_uncertainty_histograms(path, config.nlo_ew.w_uncertainty_histograms); + } else if (starts_with(sample, "Zto") || starts_with(sample, "ZJetsTo") || starts_with(sample, "DYto") || + starts_with(sample, "DYJetsTo")) { + boson_ = Boson::Z; + const auto path = config.nlo_ew.payload_dir + "/" + config.nlo_ew.z_file; + histogram_ = load_histogram(path, config.nlo_ew.z_histogram); + uncertainty_histograms_ = load_uncertainty_histograms(path, config.nlo_ew.z_uncertainty_histograms); + } +} + +NloEWWeightProducer::~NloEWWeightProducer() = default; + +void NloEWWeightProducer::begin_file(OutputModel &out) const { + out.branch("nlo_ew_weight", 1.0f); + out.branch("nlo_ew_weight_up", 1.0f); + out.branch("nlo_ew_weight_down", 1.0f); +} + +void NloEWWeightProducer::fill(Event &event, OutputModel &out) const { + if (!event.is_mc() || boson_ == Boson::None) { + return; + } + + float fallback_pt = -1.0f; + float last_copy_pt = -1.0f; + for (const auto &particle : event.collection("GenPart").objects()) { + const auto pdg_id = particle.get("pdgId"); + if ((boson_ == Boson::W && std::abs(pdg_id) != 24) || (boson_ == Boson::Z && pdg_id != 23)) { + continue; + } + fallback_pt = std::max(fallback_pt, particle.pt()); + if ((particle.get("statusFlags") & (1 << 13)) != 0) { + last_copy_pt = std::max(last_copy_pt, particle.pt()); + } + } + + const auto pt = last_copy_pt >= 0.0f ? last_copy_pt : fallback_pt; + if (pt < 100.0f) { + return; + } + + const auto xmax = static_cast(histogram_->GetXaxis()->GetXmax()); + const auto lookup_pt = pt == xmax ? std::nextafter(pt, 0.0f) : pt; + const auto bin = histogram_->GetXaxis()->FindFixBin(lookup_pt); + const auto kappa = static_cast(histogram_->GetBinContent(bin)); + const auto nominal = 1.0f + kappa; + float uncertainty2 = 0.0f; + for (const auto &histogram : uncertainty_histograms_) { + const auto delta = static_cast(histogram->GetBinContent(bin)); + uncertainty2 += delta * delta; + } + const auto uncertainty = std::sqrt(uncertainty2); + out.fill("nlo_ew_weight", nominal); + out.fill("nlo_ew_weight_up", nominal + uncertainty); + out.fill("nlo_ew_weight_down", nominal - uncertainty); +} + +} // namespace nano diff --git a/src/producers/HeavyFlavBaseProducer.cpp b/src/producers/HeavyFlavBaseProducer.cpp index 67d62a9..a228ded 100644 --- a/src/producers/HeavyFlavBaseProducer.cpp +++ b/src/producers/HeavyFlavBaseProducer.cpp @@ -4,6 +4,7 @@ #include "nano/core/Helpers.h" #include "nano/helpers/FatjetGenMatching.h" #include "nano/helpers/JetMETCorrector.h" +#include "nano/helpers/NloEWWeightProducer.h" #include "nano/helpers/PuWeightProducer.h" #include "nano/helpers/TopPtWeightProducer.h" @@ -75,6 +76,7 @@ void prepare_raw_kinematics(Event &event, std::string_view object_name) { HeavyFlavBaseProducer::HeavyFlavBaseProducer(ProducerConfig config) : config_(std::move(config)) { jme_corrector_ = std::make_unique(config_); + nlo_ew_weight_producer_ = std::make_unique(config_); pu_weight_producer_ = std::make_unique(config_); top_pt_weight_producer_ = std::make_unique(config_.era); fatjet_gen_matching_ = std::make_unique(); @@ -106,14 +108,16 @@ void HeavyFlavBaseProducer::begin_file() { out_.branch("metphi", 0.0f); out_.branch("jetVetoFlag", std::int32_t{-99}); out_.branch("genWeight", 1.0f); + out_.branch("LHE_Vpt", -1.0f); if (config_.include_lhe_weights) { out_.branch("LHEScaleWeight", std::vector{}); } pu_weight_producer_->begin_file(out_); + nlo_ew_weight_producer_->begin_file(out_); top_pt_weight_producer_->begin_file(out_); out_.branch("fj_1_is_qualified", false); - for (const auto *name : {"fj_1_pt", "fj_1_eta", "fj_1_phi", "fj_1_mass", "fj_1_rawpt", "fj_1_sdmass", + for (const auto *name : {"fj_1_pt", "fj_1_eta", "fj_1_phi", "fj_1_mass", "fj_1_rawpt", "fj_1_parTmass", "fj_1_sdmass", "fj_1_sdmass_uncorrected", "fj_1_tau1", "fj_1_tau2", "fj_1_tau3", "fj_1_tau4", "fj_1_deltaR_sj12", "fj_1_sj1_pt", "fj_1_sj1_eta", "fj_1_sj1_phi", @@ -139,6 +143,18 @@ void HeavyFlavBaseProducer::begin_file() { "fj_1_dr_T_b", "fj_1_dr_T_Wq_max","fj_1_dr_T_Wq_min", "fj_1_T_pt"}) { out_.branch(name, 0.0f); } + + if (config_.channel == "zbb") { + std::vector> second_fatjet_branches; + for (const auto &[name, value] : out_.defaults()) { + if (name.rfind("fj_1_", 0) == 0) { + second_fatjet_branches.emplace_back("fj_2_" + name.substr(5), value); + } + } + for (auto &[name, value] : second_fatjet_branches) { + out_.branch(std::move(name), std::move(value)); + } + } } // Build the explicit input schema from the runtime card. nano_run has already @@ -271,6 +287,57 @@ void HeavyFlavBaseProducer::load_gen_history(Event &event, std::vectorprocess(event, fatjets); } +float HeavyFlavBaseProducer::get_lhe_v_pt(Event &event) const { + if (!event.is_mc()) { + return -1.0f; + } + + const auto sample_it = config_.channel_options.strings.find("sample_name"); + const auto sample = sample_it == config_.channel_options.strings.end() ? std::string{} : sample_it->second; + const auto starts_with = [&](const std::string &prefix) { return sample.rfind(prefix, 0) == 0; }; + const auto is_dy = starts_with("DYto") || starts_with("DYJetsTo"); + const auto is_w = starts_with("Wto") || starts_with("WJetsTo"); + const auto is_z = starts_with("Zto") || starts_with("ZJetsTo"); + if (!is_dy && !is_w && !is_z) { + return -1.0f; + } + if (is_dy && event.has_physical_branch("LHE_Vpt")) { + return event.scalar("LHE_Vpt"); + } + + const auto target_pdg_id = is_w ? 24 : 23; + float lhe_v_pt = -1.0f; + for (const auto &particle : event.collection("LHEPart").objects()) { + const auto pdg_id = std::abs(particle.get("pdgId")); + if (pdg_id == target_pdg_id) { + lhe_v_pt = std::max(lhe_v_pt, particle.pt()); + } + } + if (lhe_v_pt < 0.0f && event.has_physical_branch("LHE_Vpt")) { + lhe_v_pt = event.scalar("LHE_Vpt"); + } + return lhe_v_pt; +} + +float HeavyFlavBaseProducer::get_gen_v_pt(Event &event) const { + if (!event.is_mc()) { + return -1.0f; + } + float fallback = -1.0f; + float hard_process = -1.0f; + for (const auto &particle : event.collection("GenPart").objects()) { + const auto pdg_id = std::abs(particle.get("pdgId")); + if (pdg_id != 23 && pdg_id != 24) { + continue; + } + fallback = std::max(fallback, particle.pt()); + if ((particle.get("statusFlags") & (1 << 13)) != 0) { + hard_process = std::max(hard_process, particle.pt()); + } + } + return hard_process >= 0.0f ? hard_process : fallback; +} + // Reset and fill event-level output shared by all heavy-flavour channels: // identifiers, era/lumi labels, MET filters, L1 prefiring, lepton count, HT, // corrected MET, generator weight, optional LHE weights, PU weights, and top-pt @@ -309,12 +376,14 @@ void HeavyFlavBaseProducer::fill_base_event_info(Event &event, JmeVariation vari out_.fill("metphi", event.get("met_phi")); out_.fill("jetVetoFlag", event.has("jetVetoFlag") ? event.get("jetVetoFlag") : std::int32_t{-99}); out_.fill("genWeight", event.is_mc() ? event.scalar("genWeight") : 1.0f); + out_.fill("LHE_Vpt", get_lhe_v_pt(event)); if (config_.include_lhe_weights) { out_.fill("LHEScaleWeight", variation == JmeVariation::Nominal && event.has_physical_branch("LHEScaleWeight") ? event.vector("LHEScaleWeight") : std::vector{}); } pu_weight_producer_->fill(event, out_); + nlo_ew_weight_producer_->fill(event, out_); top_pt_weight_producer_->fill(event, out_); } @@ -323,6 +392,36 @@ void HeavyFlavBaseProducer::fill_base_event_info(Event &event, JmeVariation vari // stored_tagger_names, and gen-matching branches use attributes attached by // load_gen_history(). void HeavyFlavBaseProducer::fill_fatjet_info(Event &event, const std::vector &fatjets) { + if (config_.channel != "zbb") { + fill_leading_fatjet_info(event, fatjets); + return; + } + + if (!fatjets.empty() && fatjets[0].get("is_qualified")) { + fill_leading_fatjet_info(event, {fatjets[0]}); + } + if (fatjets.size() < 2U || !fatjets[1].get("is_qualified")) { + return; + } + + std::unordered_map leading_values; + for (const auto &[name, value] : out_.values()) { + if (name.rfind("fj_1_", 0) == 0) { + leading_values.emplace(name, value); + } + } + fill_leading_fatjet_info(event, {fatjets[1]}); + for (const auto &[name, value] : out_.values()) { + if (name.rfind("fj_1_", 0) == 0) { + out_.fill("fj_2_" + name.substr(5), value); + } + } + for (auto &[name, value] : leading_values) { + out_.fill(name, std::move(value)); + } +} + +void HeavyFlavBaseProducer::fill_leading_fatjet_info(Event &event, const std::vector &fatjets) { if (fatjets.empty()) { return; } @@ -335,6 +434,8 @@ void HeavyFlavBaseProducer::fill_fatjet_info(Event &event, const std::vector("msoftdrop")); out_.fill("fj_1_sdmass_uncorrected", safe_object_float(fj, "msoftdrop_uncorrected", 0.0f)); out_.fill("fj_1_tau1", safe_object_float(fj, "tau1", 0.0f)); diff --git a/src/producers/HeavyFlavZbbSampleProducer.cpp b/src/producers/HeavyFlavZbbSampleProducer.cpp new file mode 100644 index 0000000..a699c1f --- /dev/null +++ b/src/producers/HeavyFlavZbbSampleProducer.cpp @@ -0,0 +1,92 @@ +#include "nano/producers/HeavyFlavZbbSampleProducer.h" + +#include "nano/core/Collection.h" +#include "nano/core/Helpers.h" + +#include +#include + +namespace nano { + +namespace { + +bool bool_option(const ProducerConfig &config, const std::string &key, bool fallback) { + const auto it = config.channel_options.bools.find(key); + return it == config.channel_options.bools.end() ? fallback : it->second; +} + +} // namespace + +/* + * Channel summary: zbb + * + * Purpose + * - Select a boosted dijet phase space used for hadronic Z and heavy-flavour + * tagging studies. + * + * Event selection implemented in this producer + * - Require two corrected AK8 jets with pt > 450/200 GeV. + * - Require the two leading AK8 jets to satisfy |DeltaPhi| > pi/2. + * - Require at least two secondary vertices when require_sv_cut is enabled. + * - Qualify a probe jet only when both linked subjets are present. + * - Require at least one of the two leading probe jets to be qualified. + */ + +HeavyFlavZbbSampleProducer::HeavyFlavZbbSampleProducer(ProducerConfig config) + : HeavyFlavBaseProducer([&config] { + config.channel = "zbb"; + return config; + }()), + require_sv_cut_(bool_option(config_, "require_sv_cut", true)) {} + +void HeavyFlavZbbSampleProducer::begin_file() { + HeavyFlavBaseProducer::begin_file(); + out_.branch("passHTTrig", false); + out_.branch("genVpt", -1.0f); +} + +bool HeavyFlavZbbSampleProducer::analyze_common(Event &event) { + prepare_common_objects(event); + return true; +} + +bool HeavyFlavZbbSampleProducer::analyze_variation(Event &event, const JmeEventResult &jme_result, JmeVariation variation) { + apply_jme_and_select_jets(event, jme_result, variation); + auto jets = event.get>("fatjets"); + constexpr float pi = 3.14159265358979323846f; + if (jets.size() < 2U || jets[0].pt() < 450.0f || jets[1].pt() < 200.0f || + std::abs(delta_phi(jets[0], jets[1])) < 0.5f * pi) { + return false; + } + jets.resize(2); + + if (require_sv_cut_ && event.collection("SV").size() < 2U) { + return false; + } + + bool has_qualified_jet = false; + for (auto &jet : jets) { + const auto qualified = jet.extra>("subjets").size() == 2U; + jet.set("is_qualified", qualified); + has_qualified_jet = has_qualified_jet || qualified; + } + if (!has_qualified_jet) { + return false; + } + + fill_base_event_info(event, variation); + fill_fatjet_info(event, jets); + out_.fill("passHTTrig", safe_bool(event, "HLT_AK8PFJet380_SoftDropMass30")); + out_.fill("genVpt", get_gen_v_pt(event)); + return true; +} + +bool HeavyFlavZbbSampleProducer::analyze(Event &event) { + if (!analyze_common(event)) { + return false; + } + const auto jme_result = compute_jme_result(event); + return analyze_variation(event, jme_result, JmeVariation::Nominal); +} + +} // namespace nano diff --git a/src/producers/HeavyFlavZmmSampleProducer.cpp b/src/producers/HeavyFlavZmmSampleProducer.cpp new file mode 100644 index 0000000..09df930 --- /dev/null +++ b/src/producers/HeavyFlavZmmSampleProducer.cpp @@ -0,0 +1,155 @@ +#include "nano/producers/HeavyFlavZmmSampleProducer.h" + +#include "nano/core/Collection.h" +#include "nano/core/Helpers.h" + +#include +#include + +namespace nano { + +namespace { + +void book_sf(OutputModel &out, const std::string &name) { + out.branch(name, 1.0f); + out.branch(name + "_stat_up", 1.0f); + out.branch(name + "_stat_down", 1.0f); + out.branch(name + "_syst_up", 1.0f); + out.branch(name + "_syst_down", 1.0f); +} + +void fill_sf(OutputModel &out, const std::string &name, const MuonSFResult &sf) { + out.fill(name, sf.nominal); + out.fill(name + "_stat_up", sf.stat_up); + out.fill(name + "_stat_down", sf.stat_down); + out.fill(name + "_syst_up", sf.syst_up); + out.fill(name + "_syst_down", sf.syst_down); +} + +} // namespace + +/* + * Channel summary: zmm + * + * Purpose + * - Select boosted Z->mumu events for a clean recoil-jet control sample. + * + * Event selection implemented in this producer + * - Apply the configured muon scale correction and MC resolution smearing. + * - Require exactly two isolated opposite-sign muons with pt > 60/30 GeV. + * - Require dimuon pt > 450 GeV and 70 < mass < 110 GeV. + * - Require a corrected AK8 jet separated from both muons by DeltaR > 0.8. + * - Keep only the leading separated AK8 jet for output. + */ + +HeavyFlavZmmSampleProducer::HeavyFlavZmmSampleProducer(ProducerConfig config) + : HeavyFlavBaseProducer([&config] { + config.channel = "zmm"; + return config; + }()), + muon_correction_(config_) {} + +void HeavyFlavZmmSampleProducer::begin_file() { + HeavyFlavBaseProducer::begin_file(); + out_.branch("passMuTrig", false); + out_.branch("leptonicZ_pt", 0.0f); + out_.branch("leptonicZ_mass", 0.0f); + out_.branch("genVpt", -1.0f); + for (int index = 0; index < 2; ++index) { + const auto prefix = "muon" + std::to_string(index) + "_"; + out_.branch(prefix + "pt", 0.0f); + out_.branch(prefix + "eta", 0.0f); + out_.branch(prefix + "phi", 0.0f); + out_.branch(prefix + "mass", 0.0f); + out_.branch(prefix + "miniIso", 0.0f); + } + for (const auto *name : {"muonHLTSF", "muonIDSF", "muonISOSF", "muonIDISOSF"}) { + book_sf(out_, name); + } +} + +bool HeavyFlavZmmSampleProducer::analyze_common(Event &event) { + auto muons = event.collection("Muon").objects(); + muon_correction_.correct(event, muons); + + std::vector selected; + for (auto &muon : muons) { + const auto passes_id = (muon.pt() > 15.0f && muon.get("looseId")) || + (muon.pt() > 30.0f && muon.get("highPtId") != 0); + if (passes_id && std::abs(muon.eta()) < 2.4f && muon.get("pfIsoId") > 1) { + selected.push_back(muon); + } + } + if (selected.size() != 2U) { + return false; + } + std::sort(selected.begin(), selected.end(), [](const auto &a, const auto &b) { return a.pt() > b.pt(); }); + if (selected[0].pt() < 60.0f || selected[1].pt() < 30.0f || + selected[0].get("charge") * selected[1].get("charge") > 0) { + return false; + } + + const auto z = selected[0].p4() + selected[1].p4(); + if (z.Pt() < 450.0 || z.M() < 70.0 || z.M() > 110.0) { + return false; + } + event.set("muons", selected); + event.set("leptonicZ", z); + prepare_common_objects(event); + return true; +} + +bool HeavyFlavZmmSampleProducer::analyze_variation(Event &event, const JmeEventResult &jme_result, JmeVariation variation) { + apply_jme_and_select_jets(event, jme_result, variation); + const auto &muons = event.get>("muons"); + std::vector probe_jets; + for (const auto &jet : event.get>("fatjets")) { + if (delta_r(jet, muons[0]) > 0.8f && delta_r(jet, muons[1]) > 0.8f) { + probe_jets.push_back(jet); + } + } + if (probe_jets.empty()) { + return false; + } + probe_jets.resize(1); + + fill_base_event_info(event, variation); + fill_fatjet_info(event, probe_jets); + out_.fill("passMuTrig", pass_trigger(event, config_.required_triggers)); + const auto &z = event.get("leptonicZ"); + out_.fill("leptonicZ_pt", static_cast(z.Pt())); + out_.fill("leptonicZ_mass", static_cast(z.M())); + out_.fill("genVpt", get_gen_v_pt(event)); + for (std::size_t index = 0; index < muons.size(); ++index) { + const auto prefix = "muon" + std::to_string(index) + "_"; + out_.fill(prefix + "pt", muons[index].pt()); + out_.fill(prefix + "eta", muons[index].eta()); + out_.fill(prefix + "phi", muons[index].phi()); + out_.fill(prefix + "mass", muons[index].mass()); + out_.fill(prefix + "miniIso", muons[index].get("miniPFRelIso_all")); + } + + if (event.is_mc()) { + const auto hlt = muon_correction_.scale_factor( + muons, "NUM_Mu50_or_CascadeMu100_or_HighPtTkMu100_DEN_CutBasedIdTrkHighPt_and_TkIsoLoose", 52.0f); + const auto id = muon_correction_.scale_factor(muons, "NUM_HighPtID_DEN_TrackerMuons", 10.0f); + const auto iso = muon_correction_.scale_factor(muons, "NUM_LooseRelTkIso_DEN_HighPtID", 10.0f); + fill_sf(out_, "muonHLTSF", hlt); + fill_sf(out_, "muonIDSF", id); + fill_sf(out_, "muonISOSF", iso); + fill_sf(out_, "muonIDISOSF", + {id.nominal * iso.nominal, id.stat_up * iso.stat_up, id.stat_down * iso.stat_down, + id.syst_up * iso.syst_up, id.syst_down * iso.syst_down}); + } + return true; +} + +bool HeavyFlavZmmSampleProducer::analyze(Event &event) { + if (!analyze_common(event)) { + return false; + } + const auto jme_result = compute_jme_result(event); + return analyze_variation(event, jme_result, JmeVariation::Nominal); +} + +} // namespace nano From c4f370362648f8d53d52be4e8c2e699701f3a70a Mon Sep 17 00:00:00 2001 From: Congqiao Li Date: Sun, 2 Aug 2026 02:29:51 +0800 Subject: [PATCH 2/9] Update 2024 and 2025 JME payloads - Update 2024 JEC and JER tags to the latest Summer24 payload versions. - Switch 2025 JME corrections to the Summer24 campaign and matching JEC/JER tags. - Validate the full 2024 muon input with both the 2024 and 2025 era configurations. --- configs/base.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/configs/base.yaml b/configs/base.yaml index c055b93..ead2db6 100644 --- a/configs/base.yaml +++ b/configs/base.yaml @@ -355,16 +355,16 @@ jec: jec_tag_data: inherit jer_tag_mc: inherit 2025_NanoAODv15: - payload_subdir: Run3-25Prompt-Winter25-NanoAODv15 + payload_subdir: Run3-25Prompt-Summer24-NanoAODv15 jet_jerc_file: jet_jerc.json.gz fatjet_jerc_file: fatJet_jerc.json.gz met_xy_corr_era: "" jes_uncertainties: [Total] jet: algo: AK4PFPuppi - jec_tag_mc: Winter25Prompt25_V3_MC - jec_tag_data: Winter25Prompt25_V3_DATA - jer_tag_mc: Summer24Prompt25_JRV1_MC + jec_tag_mc: Summer24Prompt25_V3_MC + jec_tag_data: Summer24Prompt25_V3_DATA + jer_tag_mc: Summer24Prompt25_JRV2_MC fatjet: algo: AK8PFPuppi jec_tag_mc: inherit From ac38c726271541388b5f1b2360f53773a83d4d45 Mon Sep 17 00:00:00 2001 From: Congqiao Li Date: Sun, 2 Aug 2026 05:50:32 +0800 Subject: [PATCH 3/9] Add QCD heavy-flavour channel - implement two-fatjet QCD selection with channel-owned SV matching and optional SV detail output - generalize base fatjet branch definition and filling for channel-specific output counts - add QCD runtime cards with reduced tagger lists across supported NanoAOD versions - add validated Run 2 NanoAOD v9 QCD MC and data sample cards - validate the final 2024 card with 305 processed events, 9 accepted events, and stable output values --- CMakeLists.txt | 1 + README.md | 1 + app/nano_run.cpp | 8 +- configs/base.yaml | 3 + configs/common/nano_branches_v15.yaml | 3 + configs/common/nano_branches_v9.yaml | 3 + configs/run/qcd_2016APV_v15.yaml | 47 +++ configs/run/qcd_2016APV_v9.yaml | 39 ++ configs/run/qcd_2016_v15.yaml | 47 +++ configs/run/qcd_2016_v9.yaml | 39 ++ configs/run/qcd_2017_v15.yaml | 47 +++ configs/run/qcd_2017_v9.yaml | 39 ++ configs/run/qcd_2018_v15.yaml | 47 +++ configs/run/qcd_2018_v9.yaml | 39 ++ configs/run/qcd_2022EE_v12.yaml | 35 ++ configs/run/qcd_2022_v12.yaml | 35 ++ configs/run/qcd_2023BPix_v12.yaml | 35 ++ configs/run/qcd_2023_v12.yaml | 35 ++ configs/run/qcd_2024_v15.yaml | 47 +++ configs/run/qcd_2025_v15.yaml | 47 +++ configs/samples/qcd_2016APV_v9_DATA.yaml | 7 + configs/samples/qcd_2016APV_v9_MC.yaml | 27 ++ configs/samples/qcd_2016_v9_DATA.yaml | 5 + configs/samples/qcd_2016_v9_MC.yaml | 31 ++ configs/samples/qcd_2017_v9_DATA.yaml | 7 + configs/samples/qcd_2017_v9_MC.yaml | 28 ++ configs/samples/qcd_2018_v9_DATA.yaml | 6 + configs/samples/qcd_2018_v9_MC.yaml | 28 ++ docs/framework-structure.md | 1 + .../nano/producers/HeavyFlavBaseProducer.h | 5 +- .../producers/HeavyFlavQCDSampleProducer.h | 33 ++ .../producers/HeavyFlavZbbSampleProducer.h | 3 + src/producers/HeavyFlavBaseProducer.cpp | 240 ++++++------ src/producers/HeavyFlavMinimalProducer.cpp | 2 +- src/producers/HeavyFlavMuonSampleProducer.cpp | 2 +- src/producers/HeavyFlavQCDSampleProducer.cpp | 346 ++++++++++++++++++ src/producers/HeavyFlavZbbSampleProducer.cpp | 3 +- src/producers/HeavyFlavZmmSampleProducer.cpp | 2 +- 38 files changed, 1232 insertions(+), 141 deletions(-) create mode 100644 configs/run/qcd_2016APV_v15.yaml create mode 100644 configs/run/qcd_2016APV_v9.yaml create mode 100644 configs/run/qcd_2016_v15.yaml create mode 100644 configs/run/qcd_2016_v9.yaml create mode 100644 configs/run/qcd_2017_v15.yaml create mode 100644 configs/run/qcd_2017_v9.yaml create mode 100644 configs/run/qcd_2018_v15.yaml create mode 100644 configs/run/qcd_2018_v9.yaml create mode 100644 configs/run/qcd_2022EE_v12.yaml create mode 100644 configs/run/qcd_2022_v12.yaml create mode 100644 configs/run/qcd_2023BPix_v12.yaml create mode 100644 configs/run/qcd_2023_v12.yaml create mode 100644 configs/run/qcd_2024_v15.yaml create mode 100644 configs/run/qcd_2025_v15.yaml create mode 100644 configs/samples/qcd_2016APV_v9_DATA.yaml create mode 100644 configs/samples/qcd_2016APV_v9_MC.yaml create mode 100644 configs/samples/qcd_2016_v9_DATA.yaml create mode 100644 configs/samples/qcd_2016_v9_MC.yaml create mode 100644 configs/samples/qcd_2017_v9_DATA.yaml create mode 100644 configs/samples/qcd_2017_v9_MC.yaml create mode 100644 configs/samples/qcd_2018_v9_DATA.yaml create mode 100644 configs/samples/qcd_2018_v9_MC.yaml create mode 100644 include/nano/producers/HeavyFlavQCDSampleProducer.h create mode 100644 src/producers/HeavyFlavQCDSampleProducer.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 47243cc..187e624 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -32,6 +32,7 @@ add_library(nanoaodtools_cpp src/producers/HeavyFlavBaseProducer.cpp src/producers/HeavyFlavMinimalProducer.cpp src/producers/HeavyFlavMuonSampleProducer.cpp + src/producers/HeavyFlavQCDSampleProducer.cpp src/producers/HeavyFlavZbbSampleProducer.cpp src/producers/HeavyFlavZmmSampleProducer.cpp ) diff --git a/README.md b/README.md index 58572c0..06f16d9 100644 --- a/README.md +++ b/README.md @@ -66,6 +66,7 @@ The implemented channels are: - `muon`: a heavy-flavour muon control region targeting semileptonic ttbar-like phase space, enriched in boosted top/W jets. - `minimal`: a lightweight boosted-AK8 stream that runs the shared lepton cleaning, JME, and fatjet preparation, then keeps the leading cleaned AK8 jet above the configured `channels.minimal.leading_fatjet_pt_min` threshold. +- `qcd`: a dijet control stream that retains both leading cleaned AK8 jets and requires at least one qualified fatjet (soft-drop mass requirement), with secondary-vertex matching enabled by default. - `zbb`: a 2024 NanoAOD v15 boosted dijet control region with two AK8 probes and an optional secondary-vertex requirement. - `zmm`: a 2024 NanoAOD v15 boosted `Z -> mumu` recoil control region with muon scale/smearing and efficiency scale factors. diff --git a/app/nano_run.cpp b/app/nano_run.cpp index 6683289..5eb344d 100644 --- a/app/nano_run.cpp +++ b/app/nano_run.cpp @@ -3,6 +3,7 @@ #include "nano/io/RootOutputFile.h" #include "nano/producers/HeavyFlavMinimalProducer.h" #include "nano/producers/HeavyFlavMuonSampleProducer.h" +#include "nano/producers/HeavyFlavQCDSampleProducer.h" #include "nano/producers/HeavyFlavZbbSampleProducer.h" #include "nano/producers/HeavyFlavZmmSampleProducer.h" @@ -114,7 +115,7 @@ CliOptions parse_args(int argc, char **argv) { } if (opts.input_files.empty() || opts.output_file.empty() || opts.config_file.empty()) { - throw std::runtime_error("Usage: nano_run --input-files --output-file --config [--channel muon|minimal|zbb|zmm] [--num-events -1] [--run-data] [--variations nominal,jes_up,...] [--set key=value]. If omitted, --variations defaults to nominal."); + throw std::runtime_error("Usage: nano_run --input-files --output-file --config [--channel muon|minimal|qcd|zbb|zmm] [--num-events -1] [--run-data] [--variations nominal,jes_up,...] [--set key=value]. If omitted, --variations defaults to nominal."); } return opts; } @@ -205,6 +206,8 @@ nano::ProducerConfig make_config(const YAML::Node &settings, const std::string & if (config.read_branches.empty()) { throw std::runtime_error("Missing or empty read_branches list in config"); } + const auto additional_read_branches = nano::runtime::yaml_string_list(settings, "additional_read_branches"); + config.read_branches.insert(config.read_branches.end(), additional_read_branches.begin(), additional_read_branches.end()); if (settings["output"] && settings["output"]["include_lhe_weights"]) { config.include_lhe_weights = settings["output"]["include_lhe_weights"].as(); } @@ -378,6 +381,9 @@ std::unique_ptr make_producer(const nano::ProducerC if (config.channel == "minimal") { return std::make_unique(config); } + if (config.channel == "qcd") { + return std::make_unique(config); + } throw std::runtime_error("Unsupported channel: " + config.channel); } diff --git a/configs/base.yaml b/configs/base.yaml index ead2db6..4ee9e4f 100644 --- a/configs/base.yaml +++ b/configs/base.yaml @@ -19,6 +19,9 @@ channels: minimal: leading_fatjet_pt_min: 400.0 + qcd: + apply_sv_criteria: true + fill_sv: true # Output-level optional branches. Keep large vector branches disabled by # default and enable them in a channel card or with `--set` when needed. diff --git a/configs/common/nano_branches_v15.yaml b/configs/common/nano_branches_v15.yaml index e2e0782..109dab3 100644 --- a/configs/common/nano_branches_v15.yaml +++ b/configs/common/nano_branches_v15.yaml @@ -2542,6 +2542,9 @@ nano_branches: "HLT_PFHT1050": type: "bool" root_type: "Bool_t" + "HLT_PFHT900": + type: "bool" + root_type: "Bool_t" "HLT_PFHT180": type: "bool" root_type: "Bool_t" diff --git a/configs/common/nano_branches_v9.yaml b/configs/common/nano_branches_v9.yaml index f173b9c..fb27951 100644 --- a/configs/common/nano_branches_v9.yaml +++ b/configs/common/nano_branches_v9.yaml @@ -2099,6 +2099,9 @@ nano_branches: "HLT_PFHT1050": type: "bool" root_type: "Bool_t" + "HLT_PFHT900": + type: "bool" + root_type: "Bool_t" "HLT_PFHT180": type: "bool" root_type: "Bool_t" diff --git a/configs/run/qcd_2016APV_v15.yaml b/configs/run/qcd_2016APV_v15.yaml new file mode 100644 index 0000000..aab002a --- /dev/null +++ b/configs/run/qcd_2016APV_v15.yaml @@ -0,0 +1,47 @@ +# QCD channel runtime card for 2016APV NanoAOD v15. +extends: + - ../base.yaml + - ../common/nano_branches_v15.yaml + - ../common/read_branches_v15_run2.yaml + +era: "2016APV" +nano_version: "v15" +preselection: nFatJet>1 + +# Use a reduced tagger list tailored to the QCD channel. +stored_tagger_names: + - globalParT3_QCD + - globalParT3_Xbb + - globalParT3_Xcc + - globalParT3_Xcs + - globalParT3_Xqq + - globalParT3_massCorrGeneric + - globalParT3_massCorrX2p + - particleNetLegacy_QCD + - particleNetLegacy_Xbb + - particleNetLegacy_Xcc + - particleNetLegacy_Xqq + - particleNetLegacy_mass + - particleNetWithMass_HbbvsQCD + - particleNetWithMass_HccvsQCD + - particleNetWithMass_QCD + - particleNet_QCD + - particleNet_XbbVsQCD + - particleNet_XccVsQCD + - particleNet_massCorr + +additional_read_branches: + - SV_pt + - SV_eta + - SV_phi + - SV_mass + - SV_ntracks + - SV_dxy + - SV_dxySig + - SV_dlen + - SV_dlenSig + - SV_chi2 + - SV_pAngle + +required_triggers: + - HLT_PFHT900 diff --git a/configs/run/qcd_2016APV_v9.yaml b/configs/run/qcd_2016APV_v9.yaml new file mode 100644 index 0000000..2e87779 --- /dev/null +++ b/configs/run/qcd_2016APV_v9.yaml @@ -0,0 +1,39 @@ +# QCD channel runtime card for 2016APV NanoAOD v9. +extends: + - ../base.yaml + - ../common/nano_branches_v9.yaml + - ../common/read_branches_v9.yaml + +era: "2016APV" +nano_version: "v9" +preselection: nFatJet>1 + +# Use a reduced tagger list tailored to the QCD channel. +stored_tagger_names: + - deepTagMD_HbbvsQCD + - deepTagMD_ZHbbvsQCD + - deepTagMD_ZHccvsQCD + - particleNetMD_QCD + - particleNetMD_Xbb + - particleNetMD_Xcc + - particleNetMD_Xqq + - particleNet_HbbvsQCD + - particleNet_HccvsQCD + - particleNet_QCD + - particleNet_mass + +additional_read_branches: + - SV_pt + - SV_eta + - SV_phi + - SV_mass + - SV_ntracks + - SV_dxy + - SV_dxySig + - SV_dlen + - SV_dlenSig + - SV_chi2 + - SV_pAngle + +required_triggers: + - HLT_PFHT900 diff --git a/configs/run/qcd_2016_v15.yaml b/configs/run/qcd_2016_v15.yaml new file mode 100644 index 0000000..cea7f51 --- /dev/null +++ b/configs/run/qcd_2016_v15.yaml @@ -0,0 +1,47 @@ +# QCD channel runtime card for 2016 NanoAOD v15. +extends: + - ../base.yaml + - ../common/nano_branches_v15.yaml + - ../common/read_branches_v15_run2.yaml + +era: "2016" +nano_version: "v15" +preselection: nFatJet>1 + +# Use a reduced tagger list tailored to the QCD channel. +stored_tagger_names: + - globalParT3_QCD + - globalParT3_Xbb + - globalParT3_Xcc + - globalParT3_Xcs + - globalParT3_Xqq + - globalParT3_massCorrGeneric + - globalParT3_massCorrX2p + - particleNetLegacy_QCD + - particleNetLegacy_Xbb + - particleNetLegacy_Xcc + - particleNetLegacy_Xqq + - particleNetLegacy_mass + - particleNetWithMass_HbbvsQCD + - particleNetWithMass_HccvsQCD + - particleNetWithMass_QCD + - particleNet_QCD + - particleNet_XbbVsQCD + - particleNet_XccVsQCD + - particleNet_massCorr + +additional_read_branches: + - SV_pt + - SV_eta + - SV_phi + - SV_mass + - SV_ntracks + - SV_dxy + - SV_dxySig + - SV_dlen + - SV_dlenSig + - SV_chi2 + - SV_pAngle + +required_triggers: + - HLT_PFHT900 diff --git a/configs/run/qcd_2016_v9.yaml b/configs/run/qcd_2016_v9.yaml new file mode 100644 index 0000000..83dad53 --- /dev/null +++ b/configs/run/qcd_2016_v9.yaml @@ -0,0 +1,39 @@ +# QCD channel runtime card for 2016 NanoAOD v9. +extends: + - ../base.yaml + - ../common/nano_branches_v9.yaml + - ../common/read_branches_v9.yaml + +era: "2016" +nano_version: "v9" +preselection: nFatJet>1 + +# Use a reduced tagger list tailored to the QCD channel. +stored_tagger_names: + - deepTagMD_HbbvsQCD + - deepTagMD_ZHbbvsQCD + - deepTagMD_ZHccvsQCD + - particleNetMD_QCD + - particleNetMD_Xbb + - particleNetMD_Xcc + - particleNetMD_Xqq + - particleNet_HbbvsQCD + - particleNet_HccvsQCD + - particleNet_QCD + - particleNet_mass + +additional_read_branches: + - SV_pt + - SV_eta + - SV_phi + - SV_mass + - SV_ntracks + - SV_dxy + - SV_dxySig + - SV_dlen + - SV_dlenSig + - SV_chi2 + - SV_pAngle + +required_triggers: + - HLT_PFHT900 diff --git a/configs/run/qcd_2017_v15.yaml b/configs/run/qcd_2017_v15.yaml new file mode 100644 index 0000000..a532b6b --- /dev/null +++ b/configs/run/qcd_2017_v15.yaml @@ -0,0 +1,47 @@ +# QCD channel runtime card for 2017 NanoAOD v15. +extends: + - ../base.yaml + - ../common/nano_branches_v15.yaml + - ../common/read_branches_v15_run2.yaml + +era: "2017" +nano_version: "v15" +preselection: nFatJet>1 + +# Use a reduced tagger list tailored to the QCD channel. +stored_tagger_names: + - globalParT3_QCD + - globalParT3_Xbb + - globalParT3_Xcc + - globalParT3_Xcs + - globalParT3_Xqq + - globalParT3_massCorrGeneric + - globalParT3_massCorrX2p + - particleNetLegacy_QCD + - particleNetLegacy_Xbb + - particleNetLegacy_Xcc + - particleNetLegacy_Xqq + - particleNetLegacy_mass + - particleNetWithMass_HbbvsQCD + - particleNetWithMass_HccvsQCD + - particleNetWithMass_QCD + - particleNet_QCD + - particleNet_XbbVsQCD + - particleNet_XccVsQCD + - particleNet_massCorr + +additional_read_branches: + - SV_pt + - SV_eta + - SV_phi + - SV_mass + - SV_ntracks + - SV_dxy + - SV_dxySig + - SV_dlen + - SV_dlenSig + - SV_chi2 + - SV_pAngle + +required_triggers: + - HLT_PFHT1050 diff --git a/configs/run/qcd_2017_v9.yaml b/configs/run/qcd_2017_v9.yaml new file mode 100644 index 0000000..f3242f7 --- /dev/null +++ b/configs/run/qcd_2017_v9.yaml @@ -0,0 +1,39 @@ +# QCD channel runtime card for 2017 NanoAOD v9. +extends: + - ../base.yaml + - ../common/nano_branches_v9.yaml + - ../common/read_branches_v9.yaml + +era: "2017" +nano_version: "v9" +preselection: nFatJet>1 + +# Use a reduced tagger list tailored to the QCD channel. +stored_tagger_names: + - deepTagMD_HbbvsQCD + - deepTagMD_ZHbbvsQCD + - deepTagMD_ZHccvsQCD + - particleNetMD_QCD + - particleNetMD_Xbb + - particleNetMD_Xcc + - particleNetMD_Xqq + - particleNet_HbbvsQCD + - particleNet_HccvsQCD + - particleNet_QCD + - particleNet_mass + +additional_read_branches: + - SV_pt + - SV_eta + - SV_phi + - SV_mass + - SV_ntracks + - SV_dxy + - SV_dxySig + - SV_dlen + - SV_dlenSig + - SV_chi2 + - SV_pAngle + +required_triggers: + - HLT_PFHT1050 diff --git a/configs/run/qcd_2018_v15.yaml b/configs/run/qcd_2018_v15.yaml new file mode 100644 index 0000000..6bd29a7 --- /dev/null +++ b/configs/run/qcd_2018_v15.yaml @@ -0,0 +1,47 @@ +# QCD channel runtime card for 2018 NanoAOD v15. +extends: + - ../base.yaml + - ../common/nano_branches_v15.yaml + - ../common/read_branches_v15_run2.yaml + +era: "2018" +nano_version: "v15" +preselection: nFatJet>1 + +# Use a reduced tagger list tailored to the QCD channel. +stored_tagger_names: + - globalParT3_QCD + - globalParT3_Xbb + - globalParT3_Xcc + - globalParT3_Xcs + - globalParT3_Xqq + - globalParT3_massCorrGeneric + - globalParT3_massCorrX2p + - particleNetLegacy_QCD + - particleNetLegacy_Xbb + - particleNetLegacy_Xcc + - particleNetLegacy_Xqq + - particleNetLegacy_mass + - particleNetWithMass_HbbvsQCD + - particleNetWithMass_HccvsQCD + - particleNetWithMass_QCD + - particleNet_QCD + - particleNet_XbbVsQCD + - particleNet_XccVsQCD + - particleNet_massCorr + +additional_read_branches: + - SV_pt + - SV_eta + - SV_phi + - SV_mass + - SV_ntracks + - SV_dxy + - SV_dxySig + - SV_dlen + - SV_dlenSig + - SV_chi2 + - SV_pAngle + +required_triggers: + - HLT_PFHT1050 diff --git a/configs/run/qcd_2018_v9.yaml b/configs/run/qcd_2018_v9.yaml new file mode 100644 index 0000000..10f201b --- /dev/null +++ b/configs/run/qcd_2018_v9.yaml @@ -0,0 +1,39 @@ +# QCD channel runtime card for 2018 NanoAOD v9. +extends: + - ../base.yaml + - ../common/nano_branches_v9.yaml + - ../common/read_branches_v9.yaml + +era: "2018" +nano_version: "v9" +preselection: nFatJet>1 + +# Use a reduced tagger list tailored to the QCD channel. +stored_tagger_names: + - deepTagMD_HbbvsQCD + - deepTagMD_ZHbbvsQCD + - deepTagMD_ZHccvsQCD + - particleNetMD_QCD + - particleNetMD_Xbb + - particleNetMD_Xcc + - particleNetMD_Xqq + - particleNet_HbbvsQCD + - particleNet_HccvsQCD + - particleNet_QCD + - particleNet_mass + +additional_read_branches: + - SV_pt + - SV_eta + - SV_phi + - SV_mass + - SV_ntracks + - SV_dxy + - SV_dxySig + - SV_dlen + - SV_dlenSig + - SV_chi2 + - SV_pAngle + +required_triggers: + - HLT_PFHT1050 diff --git a/configs/run/qcd_2022EE_v12.yaml b/configs/run/qcd_2022EE_v12.yaml new file mode 100644 index 0000000..5acf6c7 --- /dev/null +++ b/configs/run/qcd_2022EE_v12.yaml @@ -0,0 +1,35 @@ +# QCD channel runtime card for 2022EE NanoAOD v12. +extends: + - ../base.yaml + - ../common/nano_branches_v12.yaml + - ../common/read_branches_v12.yaml + +era: "2022EE" +nano_version: "v12" +preselection: nFatJet>1 + +# Use a reduced tagger list tailored to the QCD channel. +stored_tagger_names: + - particleNetWithMass_HbbvsQCD + - particleNetWithMass_HccvsQCD + - particleNetWithMass_QCD + - particleNet_QCD + - particleNet_XbbVsQCD + - particleNet_XccVsQCD + - particleNet_massCorr + +additional_read_branches: + - SV_pt + - SV_eta + - SV_phi + - SV_mass + - SV_ntracks + - SV_dxy + - SV_dxySig + - SV_dlen + - SV_dlenSig + - SV_chi2 + - SV_pAngle + +required_triggers: + - HLT_PFHT1050 diff --git a/configs/run/qcd_2022_v12.yaml b/configs/run/qcd_2022_v12.yaml new file mode 100644 index 0000000..559f22f --- /dev/null +++ b/configs/run/qcd_2022_v12.yaml @@ -0,0 +1,35 @@ +# QCD channel runtime card for 2022 NanoAOD v12. +extends: + - ../base.yaml + - ../common/nano_branches_v12.yaml + - ../common/read_branches_v12.yaml + +era: "2022" +nano_version: "v12" +preselection: nFatJet>1 + +# Use a reduced tagger list tailored to the QCD channel. +stored_tagger_names: + - particleNetWithMass_HbbvsQCD + - particleNetWithMass_HccvsQCD + - particleNetWithMass_QCD + - particleNet_QCD + - particleNet_XbbVsQCD + - particleNet_XccVsQCD + - particleNet_massCorr + +additional_read_branches: + - SV_pt + - SV_eta + - SV_phi + - SV_mass + - SV_ntracks + - SV_dxy + - SV_dxySig + - SV_dlen + - SV_dlenSig + - SV_chi2 + - SV_pAngle + +required_triggers: + - HLT_PFHT1050 diff --git a/configs/run/qcd_2023BPix_v12.yaml b/configs/run/qcd_2023BPix_v12.yaml new file mode 100644 index 0000000..c1e2eb1 --- /dev/null +++ b/configs/run/qcd_2023BPix_v12.yaml @@ -0,0 +1,35 @@ +# QCD channel runtime card for 2023BPix NanoAOD v12. +extends: + - ../base.yaml + - ../common/nano_branches_v12.yaml + - ../common/read_branches_v12.yaml + +era: "2023BPix" +nano_version: "v12" +preselection: nFatJet>1 + +# Use a reduced tagger list tailored to the QCD channel. +stored_tagger_names: + - particleNetWithMass_HbbvsQCD + - particleNetWithMass_HccvsQCD + - particleNetWithMass_QCD + - particleNet_QCD + - particleNet_XbbVsQCD + - particleNet_XccVsQCD + - particleNet_massCorr + +additional_read_branches: + - SV_pt + - SV_eta + - SV_phi + - SV_mass + - SV_ntracks + - SV_dxy + - SV_dxySig + - SV_dlen + - SV_dlenSig + - SV_chi2 + - SV_pAngle + +required_triggers: + - HLT_PFHT1050 diff --git a/configs/run/qcd_2023_v12.yaml b/configs/run/qcd_2023_v12.yaml new file mode 100644 index 0000000..6d549e4 --- /dev/null +++ b/configs/run/qcd_2023_v12.yaml @@ -0,0 +1,35 @@ +# QCD channel runtime card for 2023 NanoAOD v12. +extends: + - ../base.yaml + - ../common/nano_branches_v12.yaml + - ../common/read_branches_v12.yaml + +era: "2023" +nano_version: "v12" +preselection: nFatJet>1 + +# Use a reduced tagger list tailored to the QCD channel. +stored_tagger_names: + - particleNetWithMass_HbbvsQCD + - particleNetWithMass_HccvsQCD + - particleNetWithMass_QCD + - particleNet_QCD + - particleNet_XbbVsQCD + - particleNet_XccVsQCD + - particleNet_massCorr + +additional_read_branches: + - SV_pt + - SV_eta + - SV_phi + - SV_mass + - SV_ntracks + - SV_dxy + - SV_dxySig + - SV_dlen + - SV_dlenSig + - SV_chi2 + - SV_pAngle + +required_triggers: + - HLT_PFHT1050 diff --git a/configs/run/qcd_2024_v15.yaml b/configs/run/qcd_2024_v15.yaml new file mode 100644 index 0000000..ac55ce9 --- /dev/null +++ b/configs/run/qcd_2024_v15.yaml @@ -0,0 +1,47 @@ +# QCD channel runtime card for 2024 NanoAOD v15. +extends: + - ../base.yaml + - ../common/nano_branches_v15.yaml + - ../common/read_branches_v15.yaml + +era: "2024" +nano_version: "v15" +preselection: nFatJet>1 + +# Use a reduced tagger list tailored to the QCD channel. +stored_tagger_names: + - globalParT3_QCD + - globalParT3_Xbb + - globalParT3_Xcc + - globalParT3_Xcs + - globalParT3_Xqq + - globalParT3_massCorrGeneric + - globalParT3_massCorrX2p + - particleNetLegacy_QCD + - particleNetLegacy_Xbb + - particleNetLegacy_Xcc + - particleNetLegacy_Xqq + - particleNetLegacy_mass + - particleNetWithMass_HbbvsQCD + - particleNetWithMass_HccvsQCD + - particleNetWithMass_QCD + - particleNet_QCD + - particleNet_XbbVsQCD + - particleNet_XccVsQCD + - particleNet_massCorr + +additional_read_branches: + - SV_pt + - SV_eta + - SV_phi + - SV_mass + - SV_ntracks + - SV_dxy + - SV_dxySig + - SV_dlen + - SV_dlenSig + - SV_chi2 + - SV_pAngle + +required_triggers: + - HLT_PFHT1050 diff --git a/configs/run/qcd_2025_v15.yaml b/configs/run/qcd_2025_v15.yaml new file mode 100644 index 0000000..f9e8cf4 --- /dev/null +++ b/configs/run/qcd_2025_v15.yaml @@ -0,0 +1,47 @@ +# QCD channel runtime card for 2025 NanoAOD v15. +extends: + - ../base.yaml + - ../common/nano_branches_v15.yaml + - ../common/read_branches_v15.yaml + +era: "2025" +nano_version: "v15" +preselection: nFatJet>1 + +# Use a reduced tagger list tailored to the QCD channel. +stored_tagger_names: + - globalParT3_QCD + - globalParT3_Xbb + - globalParT3_Xcc + - globalParT3_Xcs + - globalParT3_Xqq + - globalParT3_massCorrGeneric + - globalParT3_massCorrX2p + - particleNetLegacy_QCD + - particleNetLegacy_Xbb + - particleNetLegacy_Xcc + - particleNetLegacy_Xqq + - particleNetLegacy_mass + - particleNetWithMass_HbbvsQCD + - particleNetWithMass_HccvsQCD + - particleNetWithMass_QCD + - particleNet_QCD + - particleNet_XbbVsQCD + - particleNet_XccVsQCD + - particleNet_massCorr + +additional_read_branches: + - SV_pt + - SV_eta + - SV_phi + - SV_mass + - SV_ntracks + - SV_dxy + - SV_dxySig + - SV_dlen + - SV_dlenSig + - SV_chi2 + - SV_pAngle + +required_triggers: + - HLT_PFHT1050 diff --git a/configs/samples/qcd_2016APV_v9_DATA.yaml b/configs/samples/qcd_2016APV_v9_DATA.yaml new file mode 100644 index 0000000..7da061a --- /dev/null +++ b/configs/samples/qcd_2016APV_v9_DATA.yaml @@ -0,0 +1,7 @@ +# DATA samples +jetht: +- [/JetHT/Run2016B-ver2_HIPM_UL2016_MiniAODv2_NanoAODv9-v2/NANOAOD, +/JetHT/Run2016C-HIPM_UL2016_MiniAODv2_NanoAODv9-v2/NANOAOD, +/JetHT/Run2016D-HIPM_UL2016_MiniAODv2_NanoAODv9-v2/NANOAOD, +/JetHT/Run2016E-HIPM_UL2016_MiniAODv2_NanoAODv9-v2/NANOAOD, +/JetHT/Run2016F-HIPM_UL2016_MiniAODv2_NanoAODv9-v2/NANOAOD] diff --git a/configs/samples/qcd_2016APV_v9_MC.yaml b/configs/samples/qcd_2016APV_v9_MC.yaml new file mode 100644 index 0000000..e85ce0b --- /dev/null +++ b/configs/samples/qcd_2016APV_v9_MC.yaml @@ -0,0 +1,27 @@ +# MC samples +qcd-mg: + - /QCD_HT200to300_TuneCP5_PSWeights_13TeV-madgraph-pythia8/RunIISummer20UL16NanoAODAPVv9-106X_mcRun2_asymptotic_preVFP_v11-v1/NANOAODSIM + - /QCD_HT300to500_TuneCP5_PSWeights_13TeV-madgraph-pythia8/RunIISummer20UL16NanoAODAPVv9-106X_mcRun2_asymptotic_preVFP_v11-v1/NANOAODSIM + - /QCD_HT500to700_TuneCP5_PSWeights_13TeV-madgraph-pythia8/RunIISummer20UL16NanoAODAPVv9-106X_mcRun2_asymptotic_preVFP_v11-v1/NANOAODSIM + - /QCD_HT700to1000_TuneCP5_PSWeights_13TeV-madgraph-pythia8/RunIISummer20UL16NanoAODAPVv9-106X_mcRun2_asymptotic_preVFP_v11-v1/NANOAODSIM + - /QCD_HT1000to1500_TuneCP5_PSWeights_13TeV-madgraph-pythia8/RunIISummer20UL16NanoAODAPVv9-106X_mcRun2_asymptotic_preVFP_v11-v1/NANOAODSIM + - /QCD_HT1500to2000_TuneCP5_PSWeights_13TeV-madgraph-pythia8/RunIISummer20UL16NanoAODAPVv9-106X_mcRun2_asymptotic_preVFP_v11-v1/NANOAODSIM + - /QCD_HT2000toInf_TuneCP5_PSWeights_13TeV-madgraph-pythia8/RunIISummer20UL16NanoAODAPVv9-106X_mcRun2_asymptotic_preVFP_v11-v1/NANOAODSIM + +# qcd-herwig: +# - /QCD_Pt-15to7000_TuneCH3_Flat_13TeV_herwig7/RunIISummer19UL16NanoAODAPVv2-106X_mcRun2_asymptotic_preVFP_v9-v1/NANOAODSIM + +top: + - /TTToHadronic_TuneCP5_13TeV-powheg-pythia8/RunIISummer20UL16NanoAODAPVv9-106X_mcRun2_asymptotic_preVFP_v11-v1/NANOAODSIM + - /ST_tW_top_5f_NoFullyHadronicDecays_TuneCP5_13TeV-powheg-pythia8/RunIISummer20UL16NanoAODAPVv9-106X_mcRun2_asymptotic_preVFP_v11-v1/NANOAODSIM + - /ST_tW_antitop_5f_NoFullyHadronicDecays_TuneCP5_13TeV-powheg-pythia8/RunIISummer20UL16NanoAODAPVv9-106X_mcRun2_asymptotic_preVFP_v11-v1/NANOAODSIM + - /ST_t-channel_top_4f_InclusiveDecays_TuneCP5_13TeV-powheg-madspin-pythia8/RunIISummer20UL16NanoAODAPVv9-106X_mcRun2_asymptotic_preVFP_v11-v1/NANOAODSIM + - /ST_t-channel_antitop_4f_InclusiveDecays_TuneCP5_13TeV-powheg-madspin-pythia8/RunIISummer20UL16NanoAODAPVv9-106X_mcRun2_asymptotic_preVFP_v11-v1/NANOAODSIM + +v-qq: + - /WJetsToQQ_HT-400to600_TuneCP5_13TeV-madgraphMLM-pythia8/RunIISummer20UL16NanoAODAPVv9-106X_mcRun2_asymptotic_preVFP_v11-v2/NANOAODSIM + - /WJetsToQQ_HT-600to800_TuneCP5_13TeV-madgraphMLM-pythia8/RunIISummer20UL16NanoAODAPVv9-106X_mcRun2_asymptotic_preVFP_v11-v2/NANOAODSIM + - /WJetsToQQ_HT-800toInf_TuneCP5_13TeV-madgraphMLM-pythia8/RunIISummer20UL16NanoAODAPVv9-106X_mcRun2_asymptotic_preVFP_v11-v2/NANOAODSIM + - /ZJetsToQQ_HT-400to600_TuneCP5_13TeV-madgraphMLM-pythia8/RunIISummer20UL16NanoAODAPVv9-106X_mcRun2_asymptotic_preVFP_v11-v2/NANOAODSIM + - /ZJetsToQQ_HT-600to800_TuneCP5_13TeV-madgraphMLM-pythia8/RunIISummer20UL16NanoAODAPVv9-106X_mcRun2_asymptotic_preVFP_v11-v2/NANOAODSIM + - /ZJetsToQQ_HT-800toInf_TuneCP5_13TeV-madgraphMLM-pythia8/RunIISummer20UL16NanoAODAPVv9-106X_mcRun2_asymptotic_preVFP_v11-v2/NANOAODSIM diff --git a/configs/samples/qcd_2016_v9_DATA.yaml b/configs/samples/qcd_2016_v9_DATA.yaml new file mode 100644 index 0000000..a2fb44f --- /dev/null +++ b/configs/samples/qcd_2016_v9_DATA.yaml @@ -0,0 +1,5 @@ +# DATA samples +jetht: +- [/JetHT/Run2016F-UL2016_MiniAODv2_NanoAODv9-v1/NANOAOD, +/JetHT/Run2016G-UL2016_MiniAODv2_NanoAODv9-v1/NANOAOD, +/JetHT/Run2016H-UL2016_MiniAODv2_NanoAODv9-v1/NANOAOD] diff --git a/configs/samples/qcd_2016_v9_MC.yaml b/configs/samples/qcd_2016_v9_MC.yaml new file mode 100644 index 0000000..1fba120 --- /dev/null +++ b/configs/samples/qcd_2016_v9_MC.yaml @@ -0,0 +1,31 @@ +# MC samples +qcd-mg: + - /QCD_HT200to300_TuneCP5_PSWeights_13TeV-madgraph-pythia8/RunIISummer20UL16NanoAODv9-106X_mcRun2_asymptotic_v17-v1/NANOAODSIM + - /QCD_HT300to500_TuneCP5_PSWeights_13TeV-madgraph-pythia8/RunIISummer20UL16NanoAODv9-106X_mcRun2_asymptotic_v17-v1/NANOAODSIM + - /QCD_HT500to700_TuneCP5_PSWeights_13TeV-madgraph-pythia8/RunIISummer20UL16NanoAODv9-106X_mcRun2_asymptotic_v17-v1/NANOAODSIM + - /QCD_HT700to1000_TuneCP5_PSWeights_13TeV-madgraph-pythia8/RunIISummer20UL16NanoAODv9-106X_mcRun2_asymptotic_v17-v1/NANOAODSIM + - /QCD_HT1000to1500_TuneCP5_PSWeights_13TeV-madgraph-pythia8/RunIISummer20UL16NanoAODv9-106X_mcRun2_asymptotic_v17-v1/NANOAODSIM + - /QCD_HT1500to2000_TuneCP5_PSWeights_13TeV-madgraph-pythia8/RunIISummer20UL16NanoAODv9-106X_mcRun2_asymptotic_v17-v1/NANOAODSIM + - /QCD_HT2000toInf_TuneCP5_PSWeights_13TeV-madgraph-pythia8/RunIISummer20UL16NanoAODv9-106X_mcRun2_asymptotic_v17-v1/NANOAODSIM + +# qcd-herwig: +# - /QCD_Pt-15to7000_TuneCH3_Flat_13TeV_herwig7/RunIISummer19UL16NanoAODv2-106X_mcRun2_asymptotic_v15-v1/NANOAODSIM + +top: + - /TTToHadronic_TuneCP5_13TeV-powheg-pythia8/RunIISummer20UL16NanoAODv9-106X_mcRun2_asymptotic_v17-v1/NANOAODSIM + - /ST_tW_top_5f_NoFullyHadronicDecays_TuneCP5_13TeV-powheg-pythia8/RunIISummer20UL16NanoAODv9-106X_mcRun2_asymptotic_v17-v1/NANOAODSIM + - /ST_tW_antitop_5f_NoFullyHadronicDecays_TuneCP5_13TeV-powheg-pythia8/RunIISummer20UL16NanoAODv9-106X_mcRun2_asymptotic_v17-v1/NANOAODSIM + - /ST_t-channel_top_4f_InclusiveDecays_TuneCP5_13TeV-powheg-madspin-pythia8/RunIISummer20UL16NanoAODv9-106X_mcRun2_asymptotic_v17-v1/NANOAODSIM + - /ST_t-channel_antitop_4f_InclusiveDecays_TuneCP5_13TeV-powheg-madspin-pythia8/RunIISummer20UL16NanoAODv9-106X_mcRun2_asymptotic_v17-v1/NANOAODSIM + +v-qq: + - /WJetsToQQ_HT-400to600_TuneCP5_13TeV-madgraphMLM-pythia8/RunIISummer20UL16NanoAODv9-106X_mcRun2_asymptotic_v17-v2/NANOAODSIM + - /WJetsToQQ_HT-600to800_TuneCP5_13TeV-madgraphMLM-pythia8/RunIISummer20UL16NanoAODv9-106X_mcRun2_asymptotic_v17-v2/NANOAODSIM + - /WJetsToQQ_HT-800toInf_TuneCP5_13TeV-madgraphMLM-pythia8/RunIISummer20UL16NanoAODv9-106X_mcRun2_asymptotic_v17-v2/NANOAODSIM + - /ZJetsToQQ_HT-400to600_TuneCP5_13TeV-madgraphMLM-pythia8/RunIISummer20UL16NanoAODv9-106X_mcRun2_asymptotic_v17-v2/NANOAODSIM + - /ZJetsToQQ_HT-600to800_TuneCP5_13TeV-madgraphMLM-pythia8/RunIISummer20UL16NanoAODv9-106X_mcRun2_asymptotic_v17-v2/NANOAODSIM + - /ZJetsToQQ_HT-800toInf_TuneCP5_13TeV-madgraphMLM-pythia8/RunIISummer20UL16NanoAODv9-106X_mcRun2_asymptotic_v17-v2/NANOAODSIM + +## ext2 +# v-qq: +# - ZJetsToQQ_HT-400to600_TuneCP5_13TeV-madgraphMLM-pythia8 diff --git a/configs/samples/qcd_2017_v9_DATA.yaml b/configs/samples/qcd_2017_v9_DATA.yaml new file mode 100644 index 0000000..6471d77 --- /dev/null +++ b/configs/samples/qcd_2017_v9_DATA.yaml @@ -0,0 +1,7 @@ +# DATA samples +jetht: +- [/JetHT/Run2017B-UL2017_MiniAODv2_NanoAODv9-v1/NANOAOD, +/JetHT/Run2017C-UL2017_MiniAODv2_NanoAODv9-v1/NANOAOD, +/JetHT/Run2017D-UL2017_MiniAODv2_NanoAODv9-v1/NANOAOD, +/JetHT/Run2017E-UL2017_MiniAODv2_NanoAODv9-v1/NANOAOD, +/JetHT/Run2017F-UL2017_MiniAODv2_NanoAODv9-v1/NANOAOD] diff --git a/configs/samples/qcd_2017_v9_MC.yaml b/configs/samples/qcd_2017_v9_MC.yaml new file mode 100644 index 0000000..9c4d57c --- /dev/null +++ b/configs/samples/qcd_2017_v9_MC.yaml @@ -0,0 +1,28 @@ +# MC samples +qcd-mg: + - /QCD_HT200to300_TuneCP5_PSWeights_13TeV-madgraph-pythia8/RunIISummer20UL17NanoAODv9-106X_mc2017_realistic_v9-v1/NANOAODSIM + - /QCD_HT300to500_TuneCP5_PSWeights_13TeV-madgraph-pythia8/RunIISummer20UL17NanoAODv9-106X_mc2017_realistic_v9-v1/NANOAODSIM + - /QCD_HT500to700_TuneCP5_PSWeights_13TeV-madgraph-pythia8/RunIISummer20UL17NanoAODv9-106X_mc2017_realistic_v9-v1/NANOAODSIM + - /QCD_HT700to1000_TuneCP5_PSWeights_13TeV-madgraph-pythia8/RunIISummer20UL17NanoAODv9-106X_mc2017_realistic_v9-v1/NANOAODSIM + - /QCD_HT1000to1500_TuneCP5_PSWeights_13TeV-madgraph-pythia8/RunIISummer20UL17NanoAODv9-106X_mc2017_realistic_v9-v1/NANOAODSIM + - /QCD_HT1500to2000_TuneCP5_PSWeights_13TeV-madgraph-pythia8/RunIISummer20UL17NanoAODv9-106X_mc2017_realistic_v9-v1/NANOAODSIM + - /QCD_HT2000toInf_TuneCP5_PSWeights_13TeV-madgraph-pythia8/RunIISummer20UL17NanoAODv9-106X_mc2017_realistic_v9-v1/NANOAODSIM + +# qcd-herwig: +# # still uses 19UL Nano +# - /QCD_Pt-15to7000_TuneCH3_Flat_13TeV_herwig7/RunIISummer19UL17NanoAODv2-106X_mc2017_realistic_v8-v1/NANOAODSIM + +top: + - /TTToHadronic_TuneCP5_13TeV-powheg-pythia8/RunIISummer20UL17NanoAODv9-106X_mc2017_realistic_v9-v1/NANOAODSIM + - /ST_tW_top_5f_NoFullyHadronicDecays_TuneCP5_13TeV-powheg-pythia8/RunIISummer20UL17NanoAODv9-106X_mc2017_realistic_v9-v1/NANOAODSIM + - /ST_tW_antitop_5f_NoFullyHadronicDecays_TuneCP5_13TeV-powheg-pythia8/RunIISummer20UL17NanoAODv9-106X_mc2017_realistic_v9-v1/NANOAODSIM + - /ST_t-channel_top_4f_InclusiveDecays_TuneCP5_13TeV-powheg-madspin-pythia8/RunIISummer20UL17NanoAODv9-106X_mc2017_realistic_v9-v1/NANOAODSIM + - /ST_t-channel_antitop_4f_InclusiveDecays_TuneCP5_13TeV-powheg-madspin-pythia8/RunIISummer20UL17NanoAODv9-106X_mc2017_realistic_v9-v1/NANOAODSIM + +v-qq: + - /WJetsToQQ_HT-400to600_TuneCP5_13TeV-madgraphMLM-pythia8/RunIISummer20UL17NanoAODv9-106X_mc2017_realistic_v9-v2/NANOAODSIM + - /WJetsToQQ_HT-600to800_TuneCP5_13TeV-madgraphMLM-pythia8/RunIISummer20UL17NanoAODv9-106X_mc2017_realistic_v9-v2/NANOAODSIM + - /WJetsToQQ_HT-800toInf_TuneCP5_13TeV-madgraphMLM-pythia8/RunIISummer20UL17NanoAODv9-106X_mc2017_realistic_v9-v2/NANOAODSIM + - /ZJetsToQQ_HT-400to600_TuneCP5_13TeV-madgraphMLM-pythia8/RunIISummer20UL17NanoAODv9-106X_mc2017_realistic_v9-v2/NANOAODSIM + - /ZJetsToQQ_HT-600to800_TuneCP5_13TeV-madgraphMLM-pythia8/RunIISummer20UL17NanoAODv9-106X_mc2017_realistic_v9-v2/NANOAODSIM + - /ZJetsToQQ_HT-800toInf_TuneCP5_13TeV-madgraphMLM-pythia8/RunIISummer20UL17NanoAODv9-106X_mc2017_realistic_v9-v2/NANOAODSIM diff --git a/configs/samples/qcd_2018_v9_DATA.yaml b/configs/samples/qcd_2018_v9_DATA.yaml new file mode 100644 index 0000000..50f859b --- /dev/null +++ b/configs/samples/qcd_2018_v9_DATA.yaml @@ -0,0 +1,6 @@ +# DATA samples +jetht: +- [/JetHT/Run2018A-UL2018_MiniAODv2_NanoAODv9_GT36-v1/NANOAOD, +/JetHT/Run2018B-UL2018_MiniAODv2_NanoAODv9_GT36-v1/NANOAOD, +/JetHT/Run2018C-UL2018_MiniAODv2_NanoAODv9_GT36-v1/NANOAOD, +/JetHT/Run2018D-UL2018_MiniAODv2_NanoAODv9_GT36-v1/NANOAOD] diff --git a/configs/samples/qcd_2018_v9_MC.yaml b/configs/samples/qcd_2018_v9_MC.yaml new file mode 100644 index 0000000..004a032 --- /dev/null +++ b/configs/samples/qcd_2018_v9_MC.yaml @@ -0,0 +1,28 @@ +# MC samples +qcd-mg: + - /QCD_HT200to300_TuneCP5_PSWeights_13TeV-madgraph-pythia8/RunIISummer20UL18NanoAODv9-106X_upgrade2018_realistic_v16_L1v1-v1/NANOAODSIM + - /QCD_HT300to500_TuneCP5_PSWeights_13TeV-madgraph-pythia8/RunIISummer20UL18NanoAODv9-106X_upgrade2018_realistic_v16_L1v1-v1/NANOAODSIM + - /QCD_HT500to700_TuneCP5_PSWeights_13TeV-madgraph-pythia8/RunIISummer20UL18NanoAODv9-106X_upgrade2018_realistic_v16_L1v1-v1/NANOAODSIM + - /QCD_HT700to1000_TuneCP5_PSWeights_13TeV-madgraph-pythia8/RunIISummer20UL18NanoAODv9-106X_upgrade2018_realistic_v16_L1v1-v2/NANOAODSIM + - /QCD_HT1000to1500_TuneCP5_PSWeights_13TeV-madgraph-pythia8/RunIISummer20UL18NanoAODv9-106X_upgrade2018_realistic_v16_L1v1-v1/NANOAODSIM + - /QCD_HT1500to2000_TuneCP5_PSWeights_13TeV-madgraph-pythia8/RunIISummer20UL18NanoAODv9-106X_upgrade2018_realistic_v16_L1v1-v1/NANOAODSIM + - /QCD_HT2000toInf_TuneCP5_PSWeights_13TeV-madgraph-pythia8/RunIISummer20UL18NanoAODv9-106X_upgrade2018_realistic_v16_L1v1-v1/NANOAODSIM + +# qcd-herwig: +# # still uses 19UL Nano +# - /QCD_Pt-15to7000_TuneCH3_Flat_13TeV_herwig7/RunIISummer19UL18NanoAODv2-106X_upgrade2018_realistic_v15_L1v1-v1/NANOAODSIM + +top: + - /TTToHadronic_TuneCP5_13TeV-powheg-pythia8/RunIISummer20UL18NanoAODv9-106X_upgrade2018_realistic_v16_L1v1-v1/NANOAODSIM + - /ST_tW_top_5f_NoFullyHadronicDecays_TuneCP5_13TeV-powheg-pythia8/RunIISummer20UL18NanoAODv9-106X_upgrade2018_realistic_v16_L1v1-v1/NANOAODSIM + - /ST_tW_antitop_5f_NoFullyHadronicDecays_TuneCP5_13TeV-powheg-pythia8/RunIISummer20UL18NanoAODv9-106X_upgrade2018_realistic_v16_L1v1-v1/NANOAODSIM + - /ST_t-channel_top_4f_InclusiveDecays_TuneCP5_13TeV-powheg-madspin-pythia8/RunIISummer20UL18NanoAODv9-106X_upgrade2018_realistic_v16_L1v1-v1/NANOAODSIM + - /ST_t-channel_antitop_4f_InclusiveDecays_TuneCP5_13TeV-powheg-madspin-pythia8/RunIISummer20UL18NanoAODv9-106X_upgrade2018_realistic_v16_L1v1-v1/NANOAODSIM + +v-qq: + - /WJetsToQQ_HT-400to600_TuneCP5_13TeV-madgraphMLM-pythia8/RunIISummer20UL18NanoAODv9-106X_upgrade2018_realistic_v16_L1v1-v2/NANOAODSIM + - /WJetsToQQ_HT-600to800_TuneCP5_13TeV-madgraphMLM-pythia8/RunIISummer20UL18NanoAODv9-106X_upgrade2018_realistic_v16_L1v1-v2/NANOAODSIM + - /WJetsToQQ_HT-800toInf_TuneCP5_13TeV-madgraphMLM-pythia8/RunIISummer20UL18NanoAODv9-106X_upgrade2018_realistic_v16_L1v1-v2/NANOAODSIM + - /ZJetsToQQ_HT-400to600_TuneCP5_13TeV-madgraphMLM-pythia8/RunIISummer20UL18NanoAODv9-106X_upgrade2018_realistic_v16_L1v1-v2/NANOAODSIM + - /ZJetsToQQ_HT-600to800_TuneCP5_13TeV-madgraphMLM-pythia8/RunIISummer20UL18NanoAODv9-106X_upgrade2018_realistic_v16_L1v1-v2/NANOAODSIM + - /ZJetsToQQ_HT-800toInf_TuneCP5_13TeV-madgraphMLM-pythia8/RunIISummer20UL18NanoAODv9-106X_upgrade2018_realistic_v16_L1v1-v2/NANOAODSIM diff --git a/docs/framework-structure.md b/docs/framework-structure.md index 7361d27..101a157 100644 --- a/docs/framework-structure.md +++ b/docs/framework-structure.md @@ -35,6 +35,7 @@ - `src/producers/HeavyFlavMuonSampleProducer.cpp`: muon-channel event selection and channel-specific output branches. - `src/producers/HeavyFlavMinimalProducer.cpp`: minimal-channel leading-cleaned-AK8 selection and fatjet-only output. +- `src/producers/HeavyFlavQCDSampleProducer.cpp`: QCD dijet selection, secondary-vertex matching, two-fatjet output, and optional channel-owned SV detail filling through `channels.qcd.fill_sv`. - `src/producers/HeavyFlavBaseProducer.cpp`: shared lepton selection, jet/MET correction hookup, output branch filling, and fatjet-level shared content. ## Python reference diff --git a/include/nano/producers/HeavyFlavBaseProducer.h b/include/nano/producers/HeavyFlavBaseProducer.h index 0a4089b..a53c851 100644 --- a/include/nano/producers/HeavyFlavBaseProducer.h +++ b/include/nano/producers/HeavyFlavBaseProducer.h @@ -6,6 +6,7 @@ #include "nano/helpers/JmeEventResult.h" #include "nano/helpers/JmeVariation.h" +#include #include #include #include @@ -130,6 +131,7 @@ class HeavyFlavBaseProducer { static std::vector default_schema(const ProducerConfig &config); protected: + virtual std::size_t output_fatjet_count() const { return 1U; } void prepare_common_objects(Event &event) const; void select_leptons(Event &event) const; void apply_jme_and_select_jets(Event &event, const JmeEventResult &jme_result, JmeVariation variation) const; @@ -137,8 +139,7 @@ class HeavyFlavBaseProducer { float get_lhe_v_pt(Event &event) const; float get_gen_v_pt(Event &event) const; void fill_base_event_info(Event &event, JmeVariation variation); - void fill_fatjet_info(Event &event, const std::vector &fatjets); - void fill_leading_fatjet_info(Event &event, const std::vector &fatjets); + void fill_fatjet_info(Event &event, const std::vector &fatjets, std::size_t fatjet_index); ProducerConfig config_; float jet_cone_size_ = 0.8f; diff --git a/include/nano/producers/HeavyFlavQCDSampleProducer.h b/include/nano/producers/HeavyFlavQCDSampleProducer.h new file mode 100644 index 0000000..3d1ceb2 --- /dev/null +++ b/include/nano/producers/HeavyFlavQCDSampleProducer.h @@ -0,0 +1,33 @@ +#pragma once + +#include "nano/producers/HeavyFlavBaseProducer.h" + +namespace nano { + +class HeavyFlavQCDSampleProducer : public HeavyFlavBaseProducer { +public: + explicit HeavyFlavQCDSampleProducer(ProducerConfig config); + + void begin_file() override; + bool analyze(Event &event) override; + bool analyze_common(Event &event) override; + bool analyze_variation(Event &event, const JmeEventResult &jme_result, + JmeVariation variation) override; + +protected: + std::size_t output_fatjet_count() const override { return 2U; } + +private: + void select_secondary_vertices(Event &event) const; + void match_secondary_vertices( + std::vector &fatjets, + const std::vector &secondary_vertices) const; + void define_fatjet_sv_branches(std::size_t fatjet_index); + void fill_fatjet_sv_info(const std::vector &fatjets, + std::size_t fatjet_index); + + bool apply_sv_criteria_ = true; + bool fill_sv_ = true; +}; + +} // namespace nano diff --git a/include/nano/producers/HeavyFlavZbbSampleProducer.h b/include/nano/producers/HeavyFlavZbbSampleProducer.h index eff60a5..c103994 100644 --- a/include/nano/producers/HeavyFlavZbbSampleProducer.h +++ b/include/nano/producers/HeavyFlavZbbSampleProducer.h @@ -13,6 +13,9 @@ class HeavyFlavZbbSampleProducer : public HeavyFlavBaseProducer { bool analyze_common(Event &event) override; bool analyze_variation(Event &event, const JmeEventResult &jme_result, JmeVariation variation) override; +protected: + std::size_t output_fatjet_count() const override { return 2U; } + private: bool require_sv_cut_ = true; }; diff --git a/src/producers/HeavyFlavBaseProducer.cpp b/src/producers/HeavyFlavBaseProducer.cpp index a228ded..1859107 100644 --- a/src/producers/HeavyFlavBaseProducer.cpp +++ b/src/producers/HeavyFlavBaseProducer.cpp @@ -9,7 +9,6 @@ #include "nano/helpers/TopPtWeightProducer.h" #include -#include #include #include #include @@ -61,6 +60,10 @@ LorentzVector p4_from_raw_values(const ObjectView &obj) { return ObjectView::LorentzVector(raw_pt, obj.eta(), obj.phi(), raw_mass); } +std::string fatjet_branch_name(std::size_t fatjet_index, std::string_view variable) { + return "fj_" + std::to_string(fatjet_index + 1U) + "_" + std::string(variable); +} + void prepare_raw_kinematics(Event &event, std::string_view object_name) { auto objects = event.collection(object_name).objects(); for (auto &obj : objects) { @@ -116,45 +119,36 @@ void HeavyFlavBaseProducer::begin_file() { nlo_ew_weight_producer_->begin_file(out_); top_pt_weight_producer_->begin_file(out_); - out_.branch("fj_1_is_qualified", false); - for (const auto *name : {"fj_1_pt", "fj_1_eta", "fj_1_phi", "fj_1_mass", "fj_1_rawpt", "fj_1_parTmass", "fj_1_sdmass", - "fj_1_sdmass_uncorrected", - "fj_1_tau1", "fj_1_tau2", "fj_1_tau3", - "fj_1_tau4", "fj_1_deltaR_sj12", "fj_1_sj1_pt", "fj_1_sj1_eta", "fj_1_sj1_phi", - "fj_1_sj1_mass", "fj_1_sj1_rawpt", "fj_1_sj1_btagdeepcsv", "fj_1_sj2_pt", "fj_1_sj2_eta", - "fj_1_sj2_phi", "fj_1_sj2_mass", "fj_1_sj2_rawpt", "fj_1_sj2_btagdeepcsv"}) { - out_.branch(name, 0.0f); - } - for (const auto &tagger : config_.tagger_names) { - out_.branch("fj_1_" + tagger, -99.0f); - } - - for (const auto *name : {"fj_1_genfj_nbhadrons", "fj_1_genfj_nchadrons", "fj_1_genfj_partonflavour", - "fj_1_nbhadrons", "fj_1_nchadrons", "fj_1_partonflavour", - "fj_1_sj1_nbhadrons", "fj_1_sj1_nchadrons", "fj_1_sj1_partonflavour", - "fj_1_sj2_nbhadrons", "fj_1_sj2_nchadrons", "fj_1_sj2_partonflavour", - "fj_1_H_decay", "fj_1_Z_decay", "fj_1_W_decay", - "fj_1_T_Wq_max_pdgId", "fj_1_T_Wq_min_pdgId"}) { - out_.branch(name, std::int32_t{0}); - } + constexpr std::string_view fatjet_float_variables[]{ + "pt", "eta", "phi", "mass", "rawpt", "parTmass", "sdmass", "sdmass_uncorrected", + "tau1", "tau2", "tau3", "tau4", "deltaR_sj12", "sj1_pt", "sj1_eta", "sj1_phi", + "sj1_mass", "sj1_rawpt", "sj1_btagdeepcsv", "sj2_pt", "sj2_eta", "sj2_phi", "sj2_mass", + "sj2_rawpt", "sj2_btagdeepcsv", "dr_H", "dr_H_daus", "H_pt", "dr_Z", "dr_Z_daus", "Z_pt", + "dr_W", "dr_W_daus", "W_pt", "dr_T", "dr_T_b", "dr_T_Wq_max", "dr_T_Wq_min", "T_pt", + }; + constexpr std::string_view fatjet_int_variables[]{ + "genfj_nbhadrons", "genfj_nchadrons", "genfj_partonflavour", "nbhadrons", "nchadrons", "partonflavour", + "sj1_nbhadrons", "sj1_nchadrons", "sj1_partonflavour", "sj2_nbhadrons", "sj2_nchadrons", + "sj2_partonflavour", "H_decay", "Z_decay", "W_decay", "T_Wq_max_pdgId", "T_Wq_min_pdgId", + }; - for (const auto *name : {"fj_1_dr_H", "fj_1_dr_H_daus", "fj_1_H_pt", "fj_1_dr_Z", "fj_1_dr_Z_daus", - "fj_1_Z_pt", "fj_1_dr_W", "fj_1_dr_W_daus", "fj_1_W_pt", "fj_1_dr_T", - "fj_1_dr_T_b", "fj_1_dr_T_Wq_max","fj_1_dr_T_Wq_min", "fj_1_T_pt"}) { - out_.branch(name, 0.0f); + const auto num_output_fatjets = output_fatjet_count(); + if (num_output_fatjets == 0U) { + throw std::logic_error("HeavyFlavBaseProducer requires at least one output fatjet slot"); } - - if (config_.channel == "zbb") { - std::vector> second_fatjet_branches; - for (const auto &[name, value] : out_.defaults()) { - if (name.rfind("fj_1_", 0) == 0) { - second_fatjet_branches.emplace_back("fj_2_" + name.substr(5), value); - } + for (std::size_t fatjet_index = 0; fatjet_index < num_output_fatjets; ++fatjet_index) { + out_.branch(fatjet_branch_name(fatjet_index, "is_qualified"), false); + for (const auto variable : fatjet_float_variables) { + out_.branch(fatjet_branch_name(fatjet_index, variable), 0.0f); + } + for (const auto &tagger : config_.tagger_names) { + out_.branch(fatjet_branch_name(fatjet_index, tagger), -99.0f); } - for (auto &[name, value] : second_fatjet_branches) { - out_.branch(std::move(name), std::move(value)); + for (const auto variable : fatjet_int_variables) { + out_.branch(fatjet_branch_name(fatjet_index, variable), std::int32_t{0}); } } + } // Build the explicit input schema from the runtime card. nano_run has already @@ -387,125 +381,103 @@ void HeavyFlavBaseProducer::fill_base_event_info(Event &event, JmeVariation vari top_pt_weight_producer_->fill(event, out_); } -// Fill the leading selected fatjet block. Values come from the JME-corrected -// fatjet and its linked corrected subjets; tagger branches are driven by +// Fill one selected fatjet slot. Values come from the JME-corrected fatjet and +// its linked corrected subjets; tagger branches are driven by // stored_tagger_names, and gen-matching branches use attributes attached by // load_gen_history(). -void HeavyFlavBaseProducer::fill_fatjet_info(Event &event, const std::vector &fatjets) { - if (config_.channel != "zbb") { - fill_leading_fatjet_info(event, fatjets); - return; - } - - if (!fatjets.empty() && fatjets[0].get("is_qualified")) { - fill_leading_fatjet_info(event, {fatjets[0]}); - } - if (fatjets.size() < 2U || !fatjets[1].get("is_qualified")) { - return; - } - - std::unordered_map leading_values; - for (const auto &[name, value] : out_.values()) { - if (name.rfind("fj_1_", 0) == 0) { - leading_values.emplace(name, value); - } - } - fill_leading_fatjet_info(event, {fatjets[1]}); - for (const auto &[name, value] : out_.values()) { - if (name.rfind("fj_1_", 0) == 0) { - out_.fill("fj_2_" + name.substr(5), value); - } - } - for (auto &[name, value] : leading_values) { - out_.fill(name, std::move(value)); +void HeavyFlavBaseProducer::fill_fatjet_info(Event &event, const std::vector &fatjets, + std::size_t fatjet_index) { + if (fatjet_index >= output_fatjet_count()) { + throw std::out_of_range("Fatjet output index exceeds the configured number of slots"); } -} - -void HeavyFlavBaseProducer::fill_leading_fatjet_info(Event &event, const std::vector &fatjets) { - if (fatjets.empty()) { + if (fatjet_index >= fatjets.size() || !fatjets[fatjet_index].get("is_qualified")) { return; } - const auto &fj = fatjets.front(); + const auto &fj = fatjets[fatjet_index]; + const auto prefix = fatjet_branch_name(fatjet_index, ""); + const auto fill = [this, &prefix](std::string_view variable, const auto &value) { + out_.fill(prefix + std::string(variable), value); + }; const auto subjets = fj.extra>("subjets"); - out_.fill("fj_1_is_qualified", fj.get("is_qualified")); - out_.fill("fj_1_pt", fj.pt()); - out_.fill("fj_1_eta", fj.eta()); - out_.fill("fj_1_phi", fj.phi()); - out_.fill("fj_1_mass", fj.mass()); - out_.fill("fj_1_rawpt", safe_object_float(fj, "rawPt", -1.0f)); - out_.fill("fj_1_parTmass", safe_object_float(fj, "rawMass", 0.0f) * - safe_object_float(fj, "globalParT3_massCorrX2p", 0.0f)); - out_.fill("fj_1_sdmass", fj.get("msoftdrop")); - out_.fill("fj_1_sdmass_uncorrected", safe_object_float(fj, "msoftdrop_uncorrected", 0.0f)); - out_.fill("fj_1_tau1", safe_object_float(fj, "tau1", 0.0f)); - out_.fill("fj_1_tau2", safe_object_float(fj, "tau2", 0.0f)); - out_.fill("fj_1_tau3", safe_object_float(fj, "tau3", 0.0f)); - out_.fill("fj_1_tau4", safe_object_float(fj, "tau4", 0.0f)); + fill("is_qualified", fj.get("is_qualified")); + fill("pt", fj.pt()); + fill("eta", fj.eta()); + fill("phi", fj.phi()); + fill("mass", fj.mass()); + fill("rawpt", safe_object_float(fj, "rawPt", -1.0f)); + fill("parTmass", safe_object_float(fj, "rawMass", 0.0f) * + safe_object_float(fj, "globalParT3_massCorrX2p", 0.0f)); + fill("sdmass", fj.get("msoftdrop")); + fill("sdmass_uncorrected", safe_object_float(fj, "msoftdrop_uncorrected", 0.0f)); + fill("tau1", safe_object_float(fj, "tau1", 0.0f)); + fill("tau2", safe_object_float(fj, "tau2", 0.0f)); + fill("tau3", safe_object_float(fj, "tau3", 0.0f)); + fill("tau4", safe_object_float(fj, "tau4", 0.0f)); for (const auto &tagger : config_.tagger_names) { - out_.fill("fj_1_" + tagger, safe_object_float(fj, tagger, -99.0f)); + fill(tagger, safe_object_float(fj, tagger, -99.0f)); } if (!subjets.empty()) { - out_.fill("fj_1_sj1_pt", subjets[0].pt()); - out_.fill("fj_1_sj1_eta", subjets[0].eta()); - out_.fill("fj_1_sj1_phi", subjets[0].phi()); - out_.fill("fj_1_sj1_mass", subjets[0].mass()); - out_.fill("fj_1_sj1_rawpt", safe_object_float(subjets[0], "rawPt", -1.0f)); - out_.fill("fj_1_sj1_btagdeepcsv", safe_object_float(subjets[0], "btagDeepB", -1.0f)); - out_.fill("fj_1_sj1_nbhadrons", safe_object_int(subjets[0], "nBHadrons", -1)); - out_.fill("fj_1_sj1_nchadrons", safe_object_int(subjets[0], "nCHadrons", -1)); - out_.fill("fj_1_sj1_partonflavour", safe_object_int(subjets[0], "partonFlavour", -1)); + fill("sj1_pt", subjets[0].pt()); + fill("sj1_eta", subjets[0].eta()); + fill("sj1_phi", subjets[0].phi()); + fill("sj1_mass", subjets[0].mass()); + fill("sj1_rawpt", safe_object_float(subjets[0], "rawPt", -1.0f)); + fill("sj1_btagdeepcsv", safe_object_float(subjets[0], "btagDeepB", -1.0f)); + fill("sj1_nbhadrons", safe_object_int(subjets[0], "nBHadrons", -1)); + fill("sj1_nchadrons", safe_object_int(subjets[0], "nCHadrons", -1)); + fill("sj1_partonflavour", safe_object_int(subjets[0], "partonFlavour", -1)); } if (subjets.size() > 1U) { - out_.fill("fj_1_deltaR_sj12", delta_r(subjets[0], subjets[1])); - out_.fill("fj_1_sj2_pt", subjets[1].pt()); - out_.fill("fj_1_sj2_eta", subjets[1].eta()); - out_.fill("fj_1_sj2_phi", subjets[1].phi()); - out_.fill("fj_1_sj2_mass", subjets[1].mass()); - out_.fill("fj_1_sj2_rawpt", safe_object_float(subjets[1], "rawPt", -1.0f)); - out_.fill("fj_1_sj2_btagdeepcsv", safe_object_float(subjets[1], "btagDeepB", -1.0f)); - out_.fill("fj_1_sj2_nbhadrons", safe_object_int(subjets[1], "nBHadrons", -1)); - out_.fill("fj_1_sj2_nchadrons", safe_object_int(subjets[1], "nCHadrons", -1)); - out_.fill("fj_1_sj2_partonflavour", safe_object_int(subjets[1], "partonFlavour", -1)); + fill("deltaR_sj12", delta_r(subjets[0], subjets[1])); + fill("sj2_pt", subjets[1].pt()); + fill("sj2_eta", subjets[1].eta()); + fill("sj2_phi", subjets[1].phi()); + fill("sj2_mass", subjets[1].mass()); + fill("sj2_rawpt", safe_object_float(subjets[1], "rawPt", -1.0f)); + fill("sj2_btagdeepcsv", safe_object_float(subjets[1], "btagDeepB", -1.0f)); + fill("sj2_nbhadrons", safe_object_int(subjets[1], "nBHadrons", -1)); + fill("sj2_nchadrons", safe_object_int(subjets[1], "nCHadrons", -1)); + fill("sj2_partonflavour", safe_object_int(subjets[1], "partonFlavour", -1)); } else { - out_.fill("fj_1_deltaR_sj12", 99.0f); + fill("deltaR_sj12", 99.0f); } const auto gen_fatjets = event.collection(genfatjet_name_).objects(); const auto gen_idx = safe_object_int(fj, "genJetAK8Idx", -1); if (gen_idx >= 0 && static_cast(gen_idx) < gen_fatjets.size()) { const auto &gen_fj = gen_fatjets[static_cast(gen_idx)]; - out_.fill("fj_1_genfj_nbhadrons", safe_object_int(gen_fj, "nBHadrons", -1)); - out_.fill("fj_1_genfj_nchadrons", safe_object_int(gen_fj, "nCHadrons", -1)); - out_.fill("fj_1_genfj_partonflavour", safe_object_int(gen_fj, "partonFlavour", -1)); + fill("genfj_nbhadrons", safe_object_int(gen_fj, "nBHadrons", -1)); + fill("genfj_nchadrons", safe_object_int(gen_fj, "nCHadrons", -1)); + fill("genfj_partonflavour", safe_object_int(gen_fj, "partonFlavour", -1)); } else { - out_.fill("fj_1_genfj_nbhadrons", std::int32_t{-1}); - out_.fill("fj_1_genfj_nchadrons", std::int32_t{-1}); - out_.fill("fj_1_genfj_partonflavour", std::int32_t{-1}); - } - - out_.fill("fj_1_nbhadrons", safe_object_int(fj, "nBHadrons", -1)); - out_.fill("fj_1_nchadrons", safe_object_int(fj, "nCHadrons", -1)); - out_.fill("fj_1_partonflavour", safe_object_int(fj, "partonFlavour", -1)); - out_.fill("fj_1_dr_H", safe_object_float(fj, "dr_H", 99.0f)); - out_.fill("fj_1_dr_H_daus", safe_object_float(fj, "dr_H_daus", 99.0f)); - out_.fill("fj_1_H_pt", safe_object_float(fj, "H_pt", -1.0f)); - out_.fill("fj_1_H_decay", safe_object_int(fj, "H_decay", 0)); - out_.fill("fj_1_dr_Z", safe_object_float(fj, "dr_Z", 99.0f)); - out_.fill("fj_1_dr_Z_daus", safe_object_float(fj, "dr_Z_daus", 99.0f)); - out_.fill("fj_1_Z_pt", safe_object_float(fj, "Z_pt", -1.0f)); - out_.fill("fj_1_Z_decay", safe_object_int(fj, "Z_decay", 0)); - out_.fill("fj_1_dr_W", safe_object_float(fj, "dr_W", 99.0f)); - out_.fill("fj_1_dr_W_daus", safe_object_float(fj, "dr_W_daus", 99.0f)); - out_.fill("fj_1_W_pt", safe_object_float(fj, "W_pt", -1.0f)); - out_.fill("fj_1_W_decay", safe_object_int(fj, "W_decay", 0)); - out_.fill("fj_1_dr_T", safe_object_float(fj, "dr_T", 99.0f)); - out_.fill("fj_1_dr_T_b", safe_object_float(fj, "dr_T_b", 99.0f)); - out_.fill("fj_1_dr_T_Wq_max", safe_object_float(fj, "dr_T_Wq_max", 99.0f)); - out_.fill("fj_1_dr_T_Wq_min", safe_object_float(fj, "dr_T_Wq_min", 99.0f)); - out_.fill("fj_1_T_Wq_max_pdgId", safe_object_int(fj, "T_Wq_max_pdgId", 0)); - out_.fill("fj_1_T_Wq_min_pdgId", safe_object_int(fj, "T_Wq_min_pdgId", 0)); - out_.fill("fj_1_T_pt", safe_object_float(fj, "T_pt", -1.0f)); + fill("genfj_nbhadrons", std::int32_t{-1}); + fill("genfj_nchadrons", std::int32_t{-1}); + fill("genfj_partonflavour", std::int32_t{-1}); + } + + fill("nbhadrons", safe_object_int(fj, "nBHadrons", -1)); + fill("nchadrons", safe_object_int(fj, "nCHadrons", -1)); + fill("partonflavour", safe_object_int(fj, "partonFlavour", -1)); + fill("dr_H", safe_object_float(fj, "dr_H", 99.0f)); + fill("dr_H_daus", safe_object_float(fj, "dr_H_daus", 99.0f)); + fill("H_pt", safe_object_float(fj, "H_pt", -1.0f)); + fill("H_decay", safe_object_int(fj, "H_decay", 0)); + fill("dr_Z", safe_object_float(fj, "dr_Z", 99.0f)); + fill("dr_Z_daus", safe_object_float(fj, "dr_Z_daus", 99.0f)); + fill("Z_pt", safe_object_float(fj, "Z_pt", -1.0f)); + fill("Z_decay", safe_object_int(fj, "Z_decay", 0)); + fill("dr_W", safe_object_float(fj, "dr_W", 99.0f)); + fill("dr_W_daus", safe_object_float(fj, "dr_W_daus", 99.0f)); + fill("W_pt", safe_object_float(fj, "W_pt", -1.0f)); + fill("W_decay", safe_object_int(fj, "W_decay", 0)); + fill("dr_T", safe_object_float(fj, "dr_T", 99.0f)); + fill("dr_T_b", safe_object_float(fj, "dr_T_b", 99.0f)); + fill("dr_T_Wq_max", safe_object_float(fj, "dr_T_Wq_max", 99.0f)); + fill("dr_T_Wq_min", safe_object_float(fj, "dr_T_Wq_min", 99.0f)); + fill("T_Wq_max_pdgId", safe_object_int(fj, "T_Wq_max_pdgId", 0)); + fill("T_Wq_min_pdgId", safe_object_int(fj, "T_Wq_min_pdgId", 0)); + fill("T_pt", safe_object_float(fj, "T_pt", -1.0f)); } } // namespace nano diff --git a/src/producers/HeavyFlavMinimalProducer.cpp b/src/producers/HeavyFlavMinimalProducer.cpp index fc537e5..9f8f9e0 100644 --- a/src/producers/HeavyFlavMinimalProducer.cpp +++ b/src/producers/HeavyFlavMinimalProducer.cpp @@ -64,7 +64,7 @@ bool HeavyFlavMinimalProducer::analyze_variation(Event &event, const JmeEventRes } fill_base_event_info(event, variation); - fill_fatjet_info(event, std::vector{leading_fatjet}); + fill_fatjet_info(event, std::vector{leading_fatjet}, 0U); return true; } diff --git a/src/producers/HeavyFlavMuonSampleProducer.cpp b/src/producers/HeavyFlavMuonSampleProducer.cpp index 8f0c071..59f21f2 100644 --- a/src/producers/HeavyFlavMuonSampleProducer.cpp +++ b/src/producers/HeavyFlavMuonSampleProducer.cpp @@ -116,7 +116,7 @@ bool HeavyFlavMuonSampleProducer::analyze_variation(Event &event, const JmeEvent probe_jets.erase(probe_jets.begin() + 1, probe_jets.end()); fill_base_event_info(event, variation); - fill_fatjet_info(event, probe_jets); + fill_fatjet_info(event, probe_jets, 0U); out_.fill("passMuTrig", pass_trigger(event, config_.required_triggers)); out_.fill("muon_pt", mu.pt()); diff --git a/src/producers/HeavyFlavQCDSampleProducer.cpp b/src/producers/HeavyFlavQCDSampleProducer.cpp new file mode 100644 index 0000000..bc56031 --- /dev/null +++ b/src/producers/HeavyFlavQCDSampleProducer.cpp @@ -0,0 +1,346 @@ +#include "nano/producers/HeavyFlavQCDSampleProducer.h" + +#include "nano/core/Collection.h" +#include "nano/core/Helpers.h" + +#include +#include +#include +#include + +namespace nano { + +namespace { + +bool get_channel_bool(const ProducerConfig &config, const std::string &key) { + // Resolve a required boolean from the active channel configuration and fail + // early when the runtime card does not provide it. + const auto it = config.channel_options.bools.find(key); + if (it == config.channel_options.bools.end()) { + throw std::runtime_error("Missing boolean channel option channels." + + config.channel + "." + key); + } + return it->second; +} + +std::string fatjet_sv_branch_name(std::size_t fatjet_index, + std::string_view variable) { + // Convert the zero-based output slot and a logical variable name into the + // flat-tree convention, for example slot 0 + "nsv" becomes "fj_1_nsv". + return "fj_" + std::to_string(fatjet_index + 1U) + "_" + + std::string(variable); +} + +float corrected_sv_mass(const ObjectView &sv) { + // Compute the pAngle-based corrected SV mass used by the NanoHRTTools + // reference and store it later as an SV-level derived attribute. + const auto projected_momentum = + static_cast(polar_p4(sv).P()) * std::sin(sv.get("pAngle")); + const auto mass = sv.mass(); + return std::sqrt(mass * mass + projected_momentum * projected_momentum) + + projected_momentum; +} + +} // namespace + +/* + * Channel summary: qcd + * + * Purpose + * - Select a dijet phase space dominated by multijet production. + * - Retain both leading boosted AK8 jets for heavy-flavour tagger studies. + * - Require displaced-vertex content in the probe jets by default. + * + * Event selection implemented in this producer + * - Build loose leptons and use the shared AK4/AK8 lepton cleaning. + * - Apply the shared AK4/AK8/SubJet JME corrections and MET propagation. + * - Require at least two selected AK8 fatjets and keep the leading two in + * corrected-pt order. + * - Mark a fatjet qualified when 50 < msoftdrop < 200 GeV. + * - When channels.qcd.apply_sv_criteria is enabled, reject events with fewer + * than two secondary vertices. Fatjet qualification then additionally requires + * every linked subjet to have at least one matched SV; in the usual two- + * subjet case, both sj1 and sj2 must satisfy this matching requirement. + * - Require at least one of the two leading fatjets to be qualified. + * - When channels.qcd.fill_sv is enabled, store matched-SV counts, track sums, + * leading-SV properties, and corrected SV masses for both fatjet slots. + */ + +HeavyFlavQCDSampleProducer::HeavyFlavQCDSampleProducer(ProducerConfig config) + : HeavyFlavBaseProducer([&config] { + config.channel = "qcd"; + return config; + }()), + apply_sv_criteria_(get_channel_bool(config_, "apply_sv_criteria")), + fill_sv_(get_channel_bool(config_, "fill_sv")) {} + +void HeavyFlavQCDSampleProducer::begin_file() { + HeavyFlavBaseProducer::begin_file(); + out_.branch("passHTTrig", false); + if (fill_sv_) { + define_fatjet_sv_branches(0U); + define_fatjet_sv_branches(1U); + } +} + +void HeavyFlavQCDSampleProducer::select_secondary_vertices(Event &event) const { + // Build the pt-ordered SV collection used throughout the event and attach + // the corrected mass to each SV when detailed SV output is enabled. + auto secondary_vertices = event.collection("SV").objects(); + if (fill_sv_) { + for (auto &sv : secondary_vertices) { + sv.set("masscor", corrected_sv_mass(sv)); + } + } + std::sort( + secondary_vertices.begin(), secondary_vertices.end(), + [](const auto &lhs, const auto &rhs) { return lhs.pt() > rhs.pt(); }); + event.set("secondary_vertices", std::move(secondary_vertices)); +} + +void HeavyFlavQCDSampleProducer::match_secondary_vertices( + std::vector &fatjets, + const std::vector &secondary_vertices) const { + // Match the ordered SVs to each fatjet and its linked subjets, then attach + // the match lists and derived counts directly to the corresponding objects. + for (auto &fatjet : fatjets) { + std::vector matched_vertices; + std::int32_t ntracks = 0; + std::int32_t ntracks_sv12 = 0; + std::int32_t nsv_ptgt25 = 0; + std::int32_t nsv_ptgt50 = 0; + for (const auto &sv : secondary_vertices) { + if (delta_r(sv, fatjet) < jet_cone_size_) { + matched_vertices.push_back(sv); + if (fill_sv_) { + const auto sv_ntracks = sv.get("ntracks"); + ntracks += sv_ntracks; + if (matched_vertices.size() <= 2U) { + ntracks_sv12 += sv_ntracks; + } + nsv_ptgt25 += sv.pt() > 25.0f ? 1 : 0; + nsv_ptgt50 += sv.pt() > 50.0f ? 1 : 0; + } + } + } + // Define the matched SV list (sv_list) for the fatjet. + fatjet.set("sv_list", std::move(matched_vertices)); + if (fill_sv_) { + const auto &fatjet_vertices = + fatjet.extra>("sv_list"); + fatjet.set("nsv", static_cast(fatjet_vertices.size())); + fatjet.set("nsv_ptgt25", nsv_ptgt25); + fatjet.set("nsv_ptgt50", nsv_ptgt50); + fatjet.set("ntracks", ntracks); + fatjet.set("ntracks_sv12", ntracks_sv12); + } + + auto subjets = fatjet.extra>("subjets"); + const auto match_radius = + subjets.size() == 2U + ? std::min(0.4f, 0.5f * delta_r(subjets[0], subjets[1])) + : 0.4f; + for (auto &subjet : subjets) { + std::vector subjet_vertices; + std::int32_t subjet_ntracks = 0; + for (const auto &sv : secondary_vertices) { + if (delta_r(sv, subjet) < match_radius) { + subjet_vertices.push_back(sv); + if (fill_sv_) { + subjet_ntracks += sv.get("ntracks"); + } + } + } + // For each subjet, define the matched SV list (sv_list) as well. + subjet.set("sv_list", std::move(subjet_vertices)); + if (fill_sv_) { + const auto &matched_subjet_vertices = + subjet.extra>("sv_list"); + subjet.set("nsv", + static_cast(matched_subjet_vertices.size())); + subjet.set("ntracks", subjet_ntracks); + } + } + fatjet.set("subjets", subjets); + + float sj12_masscor_dxysig = 0.0f; + if (fill_sv_ && subjets.size() >= 2U) { + const auto &sj1_vertices = + subjets[0].extra>("sv_list"); + const auto &sj2_vertices = + subjets[1].extra>("sv_list"); + if (!sj1_vertices.empty() && !sj2_vertices.empty()) { + const auto &sj1_sv = sj1_vertices.front(); + const auto &sj2_sv = sj2_vertices.front(); + const auto &selected_sv = + sj1_sv.get("dxySig") > sj2_sv.get("dxySig") ? sj1_sv + : sj2_sv; + sj12_masscor_dxysig = selected_sv.get("masscor"); + } + } + if (fill_sv_) { + fatjet.set("sj12_masscor_dxysig", sj12_masscor_dxysig); + } + } +} + +void HeavyFlavQCDSampleProducer::define_fatjet_sv_branches( + std::size_t fatjet_index) { + // Keep logical variable names separate from the output slot so the same + // schema can be generated consistently for fj_1 and fj_2. + constexpr std::string_view fatjet_int_variables[]{ + "nsv", "nsv_ptgt25", "nsv_ptgt50", "ntracks", "ntracks_sv12", + }; + constexpr std::string_view subjet_int_variables[]{ + "ntracks", + "nsv", + "sv1_ntracks", + }; + constexpr std::string_view subjet_float_variables[]{ + "sv1_pt", "sv1_mass", "sv1_masscor", "sv1_dxy", "sv1_dxysig", + "sv1_dlen", "sv1_dlensig", "sv1_chi2ndof", "sv1_pangle", + }; + + // Define fatjet-level branches such as fj_1_nsv, fj_1_ntracks_sv12, and the + // corresponding fj_2 branches. + for (const auto variable : fatjet_int_variables) { + out_.branch(fatjet_sv_branch_name(fatjet_index, variable), std::int32_t{0}); + } + + // Define both subjet blocks, for example fj_1_sj1_ntracks, + // fj_1_sj2_sv1_masscor, fj_2_sj1_nsv, and fj_2_sj2_sv1_pangle. + for (std::size_t subjet_index = 0; subjet_index < 2U; ++subjet_index) { + const auto subjet_prefix = "sj" + std::to_string(subjet_index + 1U) + "_"; + for (const auto variable : subjet_int_variables) { + out_.branch(fatjet_sv_branch_name(fatjet_index, + subjet_prefix + std::string(variable)), + std::int32_t{0}); + } + for (const auto variable : subjet_float_variables) { + out_.branch(fatjet_sv_branch_name(fatjet_index, + subjet_prefix + std::string(variable)), + 0.0f); + } + } + // Define the combined leading-SV branch, for example + // fj_1_sj12_masscor_dxysig or fj_2_sj12_masscor_dxysig. + out_.branch(fatjet_sv_branch_name(fatjet_index, "sj12_masscor_dxysig"), 0.0f); +} + +void HeavyFlavQCDSampleProducer::fill_fatjet_sv_info( + const std::vector &fatjets, std::size_t fatjet_index) { + // Fill the QCD-only SV block for one qualified fatjet slot directly from + // derived attributes attached during secondary-vertex matching. + if (fatjet_index >= fatjets.size() || + !fatjets[fatjet_index].get("is_qualified")) { + return; + } + + const auto &fatjet = fatjets[fatjet_index]; + const auto fill = [this, fatjet_index](std::string_view variable, + const auto &value) { + out_.fill(fatjet_sv_branch_name(fatjet_index, variable), value); + }; + fill("nsv", fatjet.get("nsv")); + fill("nsv_ptgt25", fatjet.get("nsv_ptgt25")); + fill("nsv_ptgt50", fatjet.get("nsv_ptgt50")); + fill("ntracks", fatjet.get("ntracks")); + fill("ntracks_sv12", fatjet.get("ntracks_sv12")); + + const auto &subjets = fatjet.extra>("subjets"); + const auto num_output_subjets = std::min(2U, subjets.size()); + for (std::size_t subjet_index = 0; subjet_index < num_output_subjets; + ++subjet_index) { + const auto prefix = "sj" + std::to_string(subjet_index + 1U) + "_"; + const auto &subjet = subjets[subjet_index]; + fill(prefix + "ntracks", subjet.get("ntracks")); + fill(prefix + "nsv", subjet.get("nsv")); + const auto &matched_vertices = + subjet.extra>("sv_list"); + if (matched_vertices.empty()) { + continue; + } + + const auto &sv = matched_vertices.front(); + fill(prefix + "sv1_pt", sv.pt()); + fill(prefix + "sv1_mass", sv.mass()); + fill(prefix + "sv1_masscor", sv.get("masscor")); + fill(prefix + "sv1_ntracks", sv.get("ntracks")); + fill(prefix + "sv1_dxy", sv.get("dxy")); + fill(prefix + "sv1_dxysig", sv.get("dxySig")); + fill(prefix + "sv1_dlen", sv.get("dlen")); + fill(prefix + "sv1_dlensig", sv.get("dlenSig")); + fill(prefix + "sv1_chi2ndof", sv.get("chi2")); + fill(prefix + "sv1_pangle", sv.get("pAngle")); + } + fill("sj12_masscor_dxysig", fatjet.get("sj12_masscor_dxysig")); +} + +bool HeavyFlavQCDSampleProducer::analyze_common(Event &event) { + prepare_common_objects(event); + select_secondary_vertices(event); + return true; +} + +bool HeavyFlavQCDSampleProducer::analyze_variation( + Event &event, const JmeEventResult &jme_result, JmeVariation variation) { + apply_jme_and_select_jets(event, jme_result, variation); + + auto probe_jets = event.get>("fatjets"); + if (probe_jets.size() < 2U) { + return false; + } + probe_jets.resize(2U); + + const auto &secondary_vertices = + event.get>("secondary_vertices"); + if (apply_sv_criteria_ && secondary_vertices.size() < 2U) { + return false; + } + match_secondary_vertices(probe_jets, secondary_vertices); + + // Require at least one linked subjet and an SV match for every linked subjet. + const auto pass_sv_requirement = [](const ObjectView &fatjet) { + const auto &subjets = fatjet.extra>("subjets"); + return !subjets.empty() && + std::all_of( + subjets.begin(), subjets.end(), [](const ObjectView &subjet) { + return !subjet.extra>("sv_list") + .empty(); + }); + }; + bool has_qualified_fatjet = false; + for (auto &fatjet : probe_jets) { + const auto softdrop_mass = fatjet.get("msoftdrop"); + const auto pass_sv = !apply_sv_criteria_ || pass_sv_requirement(fatjet); + const auto is_qualified = + softdrop_mass > 50.0f && softdrop_mass < 200.0f && pass_sv; + fatjet.set("is_qualified", is_qualified); + has_qualified_fatjet = has_qualified_fatjet || is_qualified; + } + if (!has_qualified_fatjet) { + return false; + } + + // Reset and fill the shared event output, the two common fatjet blocks, the + // optional QCD SV blocks, and the channel trigger decision. + fill_base_event_info(event, variation); + fill_fatjet_info(event, probe_jets, 0U); + fill_fatjet_info(event, probe_jets, 1U); + if (fill_sv_) { + fill_fatjet_sv_info(probe_jets, 0U); + fill_fatjet_sv_info(probe_jets, 1U); + } + out_.fill("passHTTrig", pass_trigger(event, config_.required_triggers)); + return true; +} + +bool HeavyFlavQCDSampleProducer::analyze(Event &event) { + if (!analyze_common(event)) { + return false; + } + const auto jme_result = compute_jme_result(event); + return analyze_variation(event, jme_result, JmeVariation::Nominal); +} + +} // namespace nano diff --git a/src/producers/HeavyFlavZbbSampleProducer.cpp b/src/producers/HeavyFlavZbbSampleProducer.cpp index a699c1f..1aa6d3e 100644 --- a/src/producers/HeavyFlavZbbSampleProducer.cpp +++ b/src/producers/HeavyFlavZbbSampleProducer.cpp @@ -75,7 +75,8 @@ bool HeavyFlavZbbSampleProducer::analyze_variation(Event &event, const JmeEventR } fill_base_event_info(event, variation); - fill_fatjet_info(event, jets); + fill_fatjet_info(event, jets, 0U); + fill_fatjet_info(event, jets, 1U); out_.fill("passHTTrig", safe_bool(event, "HLT_AK8PFJet380_SoftDropMass30")); out_.fill("genVpt", get_gen_v_pt(event)); return true; diff --git a/src/producers/HeavyFlavZmmSampleProducer.cpp b/src/producers/HeavyFlavZmmSampleProducer.cpp index 09df930..3c5964a 100644 --- a/src/producers/HeavyFlavZmmSampleProducer.cpp +++ b/src/producers/HeavyFlavZmmSampleProducer.cpp @@ -114,7 +114,7 @@ bool HeavyFlavZmmSampleProducer::analyze_variation(Event &event, const JmeEventR probe_jets.resize(1); fill_base_event_info(event, variation); - fill_fatjet_info(event, probe_jets); + fill_fatjet_info(event, probe_jets, 0U); out_.fill("passMuTrig", pass_trigger(event, config_.required_triggers)); const auto &z = event.get("leptonicZ"); out_.fill("leptonicZ_pt", static_cast(z.Pt())); From c13872ccde298090dd5582b41ba98268f700e0a6 Mon Sep 17 00:00:00 2001 From: Congqiao Li Date: Sun, 2 Aug 2026 06:15:22 +0800 Subject: [PATCH 4/9] Refine QCD channel description - clarify the QCD control-region selection and its role in X->bb/cc calibration studies --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 06f16d9..0a3c557 100644 --- a/README.md +++ b/README.md @@ -66,7 +66,7 @@ The implemented channels are: - `muon`: a heavy-flavour muon control region targeting semileptonic ttbar-like phase space, enriched in boosted top/W jets. - `minimal`: a lightweight boosted-AK8 stream that runs the shared lepton cleaning, JME, and fatjet preparation, then keeps the leading cleaned AK8 jet above the configured `channels.minimal.leading_fatjet_pt_min` threshold. -- `qcd`: a dijet control stream that retains both leading cleaned AK8 jets and requires at least one qualified fatjet (soft-drop mass requirement), with secondary-vertex matching enabled by default. +- `qcd`: a dijet control region that retains the two leading cleaned AK8 jets and requires at least one qualified fatjet satisfying the soft-drop mass selection, with secondary-vertex matching enabled by default. The region is enriched in heavy-flavor QCD jets and provides gluon-enriched proxy samples for X->bb/cc calibration studies, including sfBDT-based methods. - `zbb`: a 2024 NanoAOD v15 boosted dijet control region with two AK8 probes and an optional secondary-vertex requirement. - `zmm`: a 2024 NanoAOD v15 boosted `Z -> mumu` recoil control region with muon scale/smearing and efficiency scale factors. From 51613d7ed51dda428b981ecbae1d9707ed25831e Mon Sep 17 00:00:00 2001 From: Congqiao Li Date: Wed, 5 Aug 2026 00:07:38 +0800 Subject: [PATCH 5/9] Publish nano_merge outputs incrementally - Move each completed merge into the final output directory immediately to limit temporary disk usage. - Preserve resume behavior for final outputs, completed temporary outputs, and chunked partial merges. - Remove per-group partial files after publication and consolidate duplicated group-processing logic. - Validate with the standard CMake build plus normal, variation, resume, and 201-input chunked merge tests. --- README.md | 2 +- app/nano_merge.cpp | 259 +++++++++++++++++++++++++++------------------ 2 files changed, 155 insertions(+), 106 deletions(-) diff --git a/README.md b/README.md index 0a3c557..f4fc4c9 100644 --- a/README.md +++ b/README.md @@ -196,7 +196,7 @@ variations found under `pieces/` are merged. Pass the base output directory, not the `pieces/` subdirectory. `nano_merge` reads input pieces from `/pieces/`. -It first writes merged ROOT files to a temporary directory, then copies all merged outputs back under `/`. +It writes merged ROOT files to a temporary directory and copies each one under `/` as soon as its merge completes. ## Adding Channels diff --git a/app/nano_merge.cpp b/app/nano_merge.cpp index de92a1b..5533bdb 100644 --- a/app/nano_merge.cpp +++ b/app/nano_merge.cpp @@ -24,12 +24,9 @@ namespace fs = std::filesystem; namespace { constexpr std::array kAllowedVariations = { - std::string_view{"nominal"}, - std::string_view{"jes_up"}, - std::string_view{"jes_down"}, - std::string_view{"jer_up"}, - std::string_view{"jer_down"}, - std::string_view{"met_up"}, + std::string_view{"nominal"}, std::string_view{"jes_up"}, + std::string_view{"jes_down"}, std::string_view{"jer_up"}, + std::string_view{"jer_down"}, std::string_view{"met_up"}, std::string_view{"met_down"}, }; @@ -37,9 +34,12 @@ constexpr std::size_t kHaddChunkSize = 200; constexpr std::string_view kUsage = "Usage: nano_merge [--variations ] [--resume-from ]\n" - " : base Condor output directory; piece files are read from /pieces\n" + " : base Condor output directory; piece files are read from " + "/pieces\n" " --variations: comma-separated variation list; omitted means all variations\n" - " --resume-from: reuse a previous nano_merge temporary directory and skip groups whose temporary output already exists"; + " --resume-from: reuse a previous nano_merge temporary directory; " + "completed groups already in the final or temporary " + "directory are skipped or published"; std::string shell_quote(const fs::path &path) { std::string s = path.string(); @@ -55,23 +55,22 @@ std::string shell_quote(const fs::path &path) { return out; } -std::set allowed_variations() { - return {std::begin(kAllowedVariations), std::end(kAllowedVariations)}; +fs::path temporary_base() { + const char *tmp = std::getenv("TMPDIR"); + return tmp != nullptr && tmp[0] != '\0' ? fs::path(tmp) : fs::path("/tmp"); } fs::path make_output_root() { - const char *tmp = std::getenv("TMPDIR"); - fs::path base = tmp != nullptr && tmp[0] != '\0' ? fs::path(tmp) : fs::path("/tmp"); auto now = std::chrono::system_clock::now().time_since_epoch(); - const auto seconds = std::chrono::duration_cast(now).count(); - return base / ("nano_merge_" + std::to_string(::getpid()) + "_" + std::to_string(seconds)); + const auto seconds = + std::chrono::duration_cast(now).count(); + return temporary_base() / ("nano_merge_" + std::to_string(::getpid()) + + "_" + std::to_string(seconds)); } bool is_safe_resume_dir(const fs::path &path) { - const char *tmp = std::getenv("TMPDIR"); - const fs::path temp_base = tmp != nullptr && tmp[0] != '\0' ? fs::path(tmp) : fs::path("/tmp"); std::error_code error; - const auto canonical_base = fs::weakly_canonical(temp_base, error); + const auto canonical_base = fs::weakly_canonical(temporary_base(), error); if (error) { return false; } @@ -134,7 +133,9 @@ CliOptions parse_args(int argc, char **argv) { std::stringstream values(value); std::string variation; while (std::getline(values, variation, ',')) { - if (variation.empty() || allowed_variations().count(variation) == 0) { + if (variation.empty() || + std::find(kAllowedVariations.begin(), kAllowedVariations.end(), + variation) == kAllowedVariations.end()) { throw std::runtime_error("Unknown variation in --variations: " + variation); } options.variations.insert(variation); @@ -151,12 +152,7 @@ CliOptions parse_args(int argc, char **argv) { return options; } -struct HaddInput { - int index = 0; - fs::path path; -}; - -using HaddInputGroup = std::vector; +using HaddInputGroup = std::vector; std::string describe_system_status(int status) { std::ostringstream out; @@ -172,8 +168,8 @@ std::string describe_system_status(int status) { void run_hadd(const HaddInputGroup &files, const fs::path &output) { std::vector quoted; quoted.reserve(files.size()); - for (const auto &item : files) { - quoted.push_back(shell_quote(item.path)); + for (const auto &file : files) { + quoted.push_back(shell_quote(file)); } std::string cmd = "hadd -f " + shell_quote(output); @@ -184,7 +180,8 @@ void run_hadd(const HaddInputGroup &files, const fs::path &output) { const int status = std::system(cmd.c_str()); if (status != 0) { - throw std::runtime_error("hadd failed for " + output.string() + " (" + describe_system_status(status) + ")"); + throw std::runtime_error("hadd failed for " + output.string() + " (" + + describe_system_status(status) + ")"); } } @@ -192,7 +189,7 @@ HaddInputGroup to_hadd_inputs(const FileGroup &files) { HaddInputGroup out; out.reserve(files.size()); for (const auto &file : files) { - out.push_back({file.index, file.path}); + out.push_back(file.path); } return out; } @@ -202,37 +199,89 @@ fs::path partial_output_path(const fs::path &output, std::size_t batch_index) { return partial_dir / ("part_" + std::to_string(batch_index) + ".root"); } -void run_chunked_hadd(const FileGroup &files, const fs::path &output, bool resume_mode) { +fs::path partial_output_dir(const fs::path &output) { + return output.parent_path() / ".partials" / output.stem(); +} + +fs::path group_output_path(const std::string &nickname, + const std::string &variation, const fs::path &root) { + return variation.empty() + ? root / (nickname + ".root") + : root / variation / (nickname + "_" + variation + ".root"); +} + +void remove_group_temporary_files(const fs::path &temporary_output) { + fs::remove(temporary_output); + const auto partial_dir = partial_output_dir(temporary_output); + fs::remove_all(partial_dir); + std::error_code error; + fs::remove(partial_dir.parent_path(), + error); // Removes .partials only when it is empty. +} + +void publish_output(const fs::path &temporary_output, + const fs::path &final_output) { + fs::create_directories(final_output.parent_path()); + + std::error_code rename_error; + fs::rename(temporary_output, final_output, rename_error); + if (rename_error) { + // TMPDIR and the final output are commonly on different filesystems. Copy + // to a staging name first so an interrupted copy is never mistaken for a + // completed output by --resume-from. + auto staging = final_output; + staging += ".nano_merge_" + std::to_string(::getpid()) + ".tmp"; + try { + fs::copy_file(temporary_output, staging, + fs::copy_options::overwrite_existing); + fs::rename(staging, final_output); + fs::remove(temporary_output); + } catch (...) { + std::error_code cleanup_error; + fs::remove(staging, cleanup_error); + throw; + } + } + + remove_group_temporary_files(temporary_output); + std::cout << "[step] Published completed output: " << final_output << "\n"; +} + +void run_chunked_hadd(const FileGroup &files, const fs::path &output, + bool resume_mode) { if (files.size() <= kHaddChunkSize) { run_hadd(to_hadd_inputs(files), output); return; } const auto batches = (files.size() + kHaddChunkSize - 1U) / kHaddChunkSize; - std::cout << "[step] Splitting hadd into " << batches << " partial batches of up to " << kHaddChunkSize << " files\n"; + std::cout << "[step] Splitting hadd into " << batches + << " partial batches of up to " << kHaddChunkSize << " files\n"; HaddInputGroup partials; partials.reserve(batches); for (std::size_t batch = 0; batch < batches; ++batch) { const auto begin = batch * kHaddChunkSize; const auto end = std::min(files.size(), begin + kHaddChunkSize); const auto partial = partial_output_path(output, batch); - partials.push_back({static_cast(batch), partial}); + partials.push_back(partial); if (resume_mode && fs::exists(partial)) { - std::cout << "[step] Reusing existing partial output: " << partial << "\n"; + std::cout << "[step] Reusing existing partial output: " << partial + << "\n"; continue; } fs::create_directories(partial.parent_path()); HaddInputGroup chunk; chunk.reserve(end - begin); for (std::size_t idx = begin; idx < end; ++idx) { - chunk.push_back({files[idx].index, files[idx].path}); + chunk.push_back(files[idx].path); } run_hadd(chunk, partial); } run_hadd(partials, output); } -bool merge_or_copy(const FileGroup &files, const fs::path &output, bool resume_mode) { +bool merge_or_copy(const FileGroup &files, const fs::path &output, + bool resume_mode) { if (files.empty()) { return false; } @@ -251,40 +300,63 @@ bool merge_or_copy(const FileGroup &files, const fs::path &output, bool resume_m return true; } -bool merge_group(const std::string &nickname, const std::string &variation, const FileGroup &files, const fs::path &output_root, +bool merge_group(const std::string &nickname, const std::string &variation, + const FileGroup &files, const fs::path &output_root, bool resume_mode) { auto sorted_files = files; - std::sort(sorted_files.begin(), sorted_files.end(), [](const PieceEntry &a, const PieceEntry &b) { return a.index < b.index; }); - const auto output = variation.empty() ? output_root / (nickname + ".root") : output_root / variation / (nickname + "_" + variation + ".root"); + std::sort(sorted_files.begin(), sorted_files.end(), + [](const PieceEntry &a, const PieceEntry &b) { + return a.index < b.index; + }); + const auto output = group_output_path(nickname, variation, output_root); std::cout << "[step] Merging " << sorted_files.size() << " files for " - << (variation.empty() ? (nickname + " (nominal)") : (nickname + ", variation=" + variation)) << "\n" + << (variation.empty() ? (nickname + " (nominal)") + : (nickname + ", variation=" + variation)) + << "\n" << " output: " << output << "\n"; return merge_or_copy(sorted_files, output, resume_mode); } -void copy_tree_contents(const fs::path &from, const fs::path &to) { - fs::create_directories(to); - for (auto it = fs::recursive_directory_iterator(from); it != fs::recursive_directory_iterator(); ++it) { - const auto &entry = *it; - if (entry.is_directory() && entry.path().filename() == ".partials") { - it.disable_recursion_pending(); - continue; - } - const auto relative = fs::relative(entry.path(), from); - const auto target = to / relative; - if (entry.is_directory()) { - fs::create_directories(target); - continue; - } - if (!entry.is_regular_file()) { - continue; - } - fs::create_directories(target.parent_path()); - fs::copy_file(entry.path(), target, fs::copy_options::overwrite_existing); +struct MergeStats { + std::size_t merged = 0; + std::size_t copied = 0; + std::size_t skipped = 0; + std::size_t outputs = 0; +}; + +void process_group(const std::string &nickname, const std::string &variation, + const FileGroup &files, const fs::path &temporary_root, + const fs::path &output_dir, bool resume_mode, + MergeStats &stats) { + if (files.empty()) { + return; + } + + ++stats.outputs; + const auto temporary_output = + group_output_path(nickname, variation, temporary_root); + const auto final_output = group_output_path(nickname, variation, output_dir); + if (resume_mode && fs::exists(final_output)) { + std::cout << "[step] Reusing existing final output: " << final_output + << "\n"; + remove_group_temporary_files(temporary_output); + ++stats.skipped; + return; + } + + const bool did_write = + merge_group(nickname, variation, files, temporary_root, resume_mode); + publish_output(temporary_output, final_output); + if (!did_write) { + ++stats.skipped; + } else if (files.size() == 1) { + ++stats.copied; + } else { + ++stats.merged; } } -} // namespace +} // namespace int main(int argc, char **argv) { try { @@ -296,14 +368,15 @@ int main(int argc, char **argv) { return 1; } const bool resume_mode = !cli.resume_dir.empty(); - if (resume_mode && (!fs::exists(cli.resume_dir) || !fs::is_directory(cli.resume_dir))) { - std::cerr << "Resume directory must exist and be a directory: " << cli.resume_dir << "\n"; + if (resume_mode && + (!fs::exists(cli.resume_dir) || !fs::is_directory(cli.resume_dir))) { + std::cerr << "Resume directory must exist and be a directory: " + << cli.resume_dir << "\n"; return 1; } if (resume_mode && !is_safe_resume_dir(cli.resume_dir)) { std::cerr << "Resume directory must be a nano_merge_* directory under " - << (std::getenv("TMPDIR") != nullptr && std::getenv("TMPDIR")[0] != '\0' ? std::getenv("TMPDIR") : "/tmp") << ": " - << cli.resume_dir << "\n"; + << temporary_base() << ": " << cli.resume_dir << "\n"; return 1; } @@ -313,7 +386,6 @@ int main(int argc, char **argv) { return 1; } - const std::set allowed = allowed_variations(); const auto selected = [&cli](const std::string &variation) { return !cli.filter_variations || cli.variations.count(variation) != 0; }; @@ -343,7 +415,8 @@ int main(int argc, char **argv) { const std::string nickname = match[1].str(); const int idx = std::stoi(match[2].str()); const std::string variation = match[3].str(); - if (allowed.count(variation) == 0) { + if (std::find(kAllowedVariations.begin(), kAllowedVariations.end(), + variation) == kAllowedVariations.end()) { std::cerr << "Skipping unknown variation: " << filename << "\n"; continue; } @@ -372,67 +445,43 @@ int main(int argc, char **argv) { return 1; } - const fs::path output_root = resume_mode ? cli.resume_dir : make_output_root(); + const fs::path output_root = + resume_mode ? cli.resume_dir : make_output_root(); fs::create_directories(output_root); if (resume_mode) { - std::cout << "Resuming with temporary output dir: " << output_root << "\n"; + std::cout << "Resuming with temporary output dir: " << output_root + << "\n"; } else { std::cout << "Created output dir: " << output_root << "\n"; } - std::size_t merged_count = 0; - std::size_t copied_count = 0; - std::size_t skipped_count = 0; - std::size_t written_files = 0; + MergeStats stats; for (const auto &[nickname, files] : no_variation) { - if (files.empty()) { - continue; - } - ++written_files; - const bool did_write = merge_group(nickname, "", files, output_root, resume_mode); - if (!did_write) { - ++skipped_count; - } else if (files.size() == 1) { - ++copied_count; - } else { - ++merged_count; - } + process_group(nickname, "", files, output_root, output_dir, resume_mode, + stats); } for (const auto &[variation, per_nick] : by_variation) { std::cout << "Preparing variation: " << variation << "\n"; for (const auto &[nickname, files] : per_nick) { - if (files.empty()) { - continue; - } - ++written_files; - const bool did_write = merge_group(nickname, variation, files, output_root, resume_mode); - if (!did_write) { - ++skipped_count; - } else if (files.size() == 1) { - ++copied_count; - } else { - ++merged_count; - } + process_group(nickname, variation, files, output_root, output_dir, + resume_mode, stats); } } std::cout << "Summary:\n"; std::cout << " input files: " << total_root << "\n"; - std::cout << " merged groups: " << merged_count << "\n"; - std::cout << " copied singleton groups: " << copied_count << "\n"; - std::cout << " skipped existing groups: " << skipped_count << "\n"; - std::cout << " output files written: " << written_files << "\n"; - std::cout << "All outputs written under: " << output_root << "\n"; - std::cout << "[step] Copying merged outputs from temporary dir to final output dir\n" - << " from: " << output_root << "\n" - << " to: " << output_dir << "\n"; - copy_tree_contents(output_root, output_dir); - std::cout << "Final merged outputs copied under: " << output_dir << "\n"; + std::cout << " merged groups: " << stats.merged << "\n"; + std::cout << " copied singleton groups: " << stats.copied << "\n"; + std::cout << " skipped existing groups: " << stats.skipped << "\n"; + std::cout << " output files written: " << stats.outputs << "\n"; + std::cout << "All completed outputs published under: " << output_dir + << "\n"; std::error_code cleanup_error; fs::remove_all(output_root, cleanup_error); if (cleanup_error) { - std::cerr << "Warning: failed to remove temporary output dir " << output_root << ": " << cleanup_error.message() << "\n"; + std::cerr << "Warning: failed to remove temporary output dir " + << output_root << ": " << cleanup_error.message() << "\n"; } else { std::cout << "Removed temporary output dir: " << output_root << "\n"; } From d92597edeede9ff586549cddaa9da8c2cbbcdeb4 Mon Sep 17 00:00:00 2001 From: JackmanHe Date: Fri, 24 Jul 2026 15:33:22 +0200 Subject: [PATCH 6/9] New zmm zbb channel --- app/nano_merge.cpp | 3 ++- src/producers/HeavyFlavBaseProducer.cpp | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/nano_merge.cpp b/app/nano_merge.cpp index 5533bdb..0ec7560 100644 --- a/app/nano_merge.cpp +++ b/app/nano_merge.cpp @@ -36,7 +36,8 @@ constexpr std::string_view kUsage = "Usage: nano_merge [--variations ] [--resume-from ]\n" " : base Condor output directory; piece files are read from " "/pieces\n" - " --variations: comma-separated variation list; omitted means all variations\n" + " --variations: comma-separated variation list; omitted means all " + "variations\n" " --resume-from: reuse a previous nano_merge temporary directory; " "completed groups already in the final or temporary " "directory are skipped or published"; diff --git a/src/producers/HeavyFlavBaseProducer.cpp b/src/producers/HeavyFlavBaseProducer.cpp index 1859107..153907f 100644 --- a/src/producers/HeavyFlavBaseProducer.cpp +++ b/src/producers/HeavyFlavBaseProducer.cpp @@ -407,7 +407,7 @@ void HeavyFlavBaseProducer::fill_fatjet_info(Event &event, const std::vector("msoftdrop")); fill("sdmass_uncorrected", safe_object_float(fj, "msoftdrop_uncorrected", 0.0f)); fill("tau1", safe_object_float(fj, "tau1", 0.0f)); From 8d12f178b0fefb3e76176d6bc2967709becbfee7 Mon Sep 17 00:00:00 2001 From: JackmanHe Date: Sat, 8 Aug 2026 11:23:41 +0200 Subject: [PATCH 7/9] Adapt heavy-flavour outputs to upstream channels --- external/CMSJMECalculators | 2 +- src/producers/HeavyFlavBaseProducer.cpp | 10 +++---- src/producers/HeavyFlavZbbSampleProducer.cpp | 28 +++++++------------- src/producers/HeavyFlavZmmSampleProducer.cpp | 2 ++ 4 files changed, 17 insertions(+), 25 deletions(-) diff --git a/external/CMSJMECalculators b/external/CMSJMECalculators index f31313d..a6075cb 160000 --- a/external/CMSJMECalculators +++ b/external/CMSJMECalculators @@ -1 +1 @@ -Subproject commit f31313d87bc917b0e6a2114b08a83a408bf8608c +Subproject commit a6075cbb8022120084e7ee03e63ff20a6e3c3fd1 diff --git a/src/producers/HeavyFlavBaseProducer.cpp b/src/producers/HeavyFlavBaseProducer.cpp index 153907f..bfa4a7f 100644 --- a/src/producers/HeavyFlavBaseProducer.cpp +++ b/src/producers/HeavyFlavBaseProducer.cpp @@ -111,7 +111,6 @@ void HeavyFlavBaseProducer::begin_file() { out_.branch("metphi", 0.0f); out_.branch("jetVetoFlag", std::int32_t{-99}); out_.branch("genWeight", 1.0f); - out_.branch("LHE_Vpt", -1.0f); if (config_.include_lhe_weights) { out_.branch("LHEScaleWeight", std::vector{}); } @@ -120,7 +119,8 @@ void HeavyFlavBaseProducer::begin_file() { top_pt_weight_producer_->begin_file(out_); constexpr std::string_view fatjet_float_variables[]{ - "pt", "eta", "phi", "mass", "rawpt", "parTmass", "sdmass", "sdmass_uncorrected", + "pt", "eta", "phi", "mass", "rawpt", "gptmass_x2p", "gptmass_generic", "sdmass", + "sdmass_uncorrected", "tau1", "tau2", "tau3", "tau4", "deltaR_sj12", "sj1_pt", "sj1_eta", "sj1_phi", "sj1_mass", "sj1_rawpt", "sj1_btagdeepcsv", "sj2_pt", "sj2_eta", "sj2_phi", "sj2_mass", "sj2_rawpt", "sj2_btagdeepcsv", "dr_H", "dr_H_daus", "H_pt", "dr_Z", "dr_Z_daus", "Z_pt", @@ -370,7 +370,6 @@ void HeavyFlavBaseProducer::fill_base_event_info(Event &event, JmeVariation vari out_.fill("metphi", event.get("met_phi")); out_.fill("jetVetoFlag", event.has("jetVetoFlag") ? event.get("jetVetoFlag") : std::int32_t{-99}); out_.fill("genWeight", event.is_mc() ? event.scalar("genWeight") : 1.0f); - out_.fill("LHE_Vpt", get_lhe_v_pt(event)); if (config_.include_lhe_weights) { out_.fill("LHEScaleWeight", variation == JmeVariation::Nominal && event.has_physical_branch("LHEScaleWeight") ? event.vector("LHEScaleWeight") @@ -406,8 +405,9 @@ void HeavyFlavBaseProducer::fill_fatjet_info(Event &event, const std::vector("msoftdrop")); fill("sdmass_uncorrected", safe_object_float(fj, "msoftdrop_uncorrected", 0.0f)); fill("tau1", safe_object_float(fj, "tau1", 0.0f)); diff --git a/src/producers/HeavyFlavZbbSampleProducer.cpp b/src/producers/HeavyFlavZbbSampleProducer.cpp index 1aa6d3e..cd219a2 100644 --- a/src/producers/HeavyFlavZbbSampleProducer.cpp +++ b/src/producers/HeavyFlavZbbSampleProducer.cpp @@ -28,8 +28,6 @@ bool bool_option(const ProducerConfig &config, const std::string &key, bool fall * - Require two corrected AK8 jets with pt > 450/200 GeV. * - Require the two leading AK8 jets to satisfy |DeltaPhi| > pi/2. * - Require at least two secondary vertices when require_sv_cut is enabled. - * - Qualify a probe jet only when both linked subjets are present. - * - Require at least one of the two leading probe jets to be qualified. */ HeavyFlavZbbSampleProducer::HeavyFlavZbbSampleProducer(ProducerConfig config) @@ -42,6 +40,7 @@ HeavyFlavZbbSampleProducer::HeavyFlavZbbSampleProducer(ProducerConfig config) void HeavyFlavZbbSampleProducer::begin_file() { HeavyFlavBaseProducer::begin_file(); out_.branch("passHTTrig", false); + out_.branch("lheVpt", -1.0f); out_.branch("genVpt", -1.0f); } @@ -52,32 +51,23 @@ bool HeavyFlavZbbSampleProducer::analyze_common(Event &event) { bool HeavyFlavZbbSampleProducer::analyze_variation(Event &event, const JmeEventResult &jme_result, JmeVariation variation) { apply_jme_and_select_jets(event, jme_result, variation); - auto jets = event.get>("fatjets"); + auto fatjets = event.get>("fatjets"); constexpr float pi = 3.14159265358979323846f; - if (jets.size() < 2U || jets[0].pt() < 450.0f || jets[1].pt() < 200.0f || - std::abs(delta_phi(jets[0], jets[1])) < 0.5f * pi) { + if (fatjets.size() < 2U || fatjets[0].pt() < 450.0f || fatjets[1].pt() < 200.0f || + std::abs(delta_phi(fatjets[0], fatjets[1])) < 0.5f * pi) { return false; } - jets.resize(2); + fatjets.resize(2); if (require_sv_cut_ && event.collection("SV").size() < 2U) { return false; } - bool has_qualified_jet = false; - for (auto &jet : jets) { - const auto qualified = jet.extra>("subjets").size() == 2U; - jet.set("is_qualified", qualified); - has_qualified_jet = has_qualified_jet || qualified; - } - if (!has_qualified_jet) { - return false; - } - fill_base_event_info(event, variation); - fill_fatjet_info(event, jets, 0U); - fill_fatjet_info(event, jets, 1U); - out_.fill("passHTTrig", safe_bool(event, "HLT_AK8PFJet380_SoftDropMass30")); + fill_fatjet_info(event, fatjets, 0U); + fill_fatjet_info(event, fatjets, 1U); + out_.fill("passHTTrig", pass_trigger(event, config_.required_triggers)); + out_.fill("lheVpt", get_lhe_v_pt(event)); out_.fill("genVpt", get_gen_v_pt(event)); return true; } diff --git a/src/producers/HeavyFlavZmmSampleProducer.cpp b/src/producers/HeavyFlavZmmSampleProducer.cpp index 3c5964a..73c48f1 100644 --- a/src/producers/HeavyFlavZmmSampleProducer.cpp +++ b/src/producers/HeavyFlavZmmSampleProducer.cpp @@ -54,6 +54,7 @@ void HeavyFlavZmmSampleProducer::begin_file() { out_.branch("passMuTrig", false); out_.branch("leptonicZ_pt", 0.0f); out_.branch("leptonicZ_mass", 0.0f); + out_.branch("lheVpt", -1.0f); out_.branch("genVpt", -1.0f); for (int index = 0; index < 2; ++index) { const auto prefix = "muon" + std::to_string(index) + "_"; @@ -119,6 +120,7 @@ bool HeavyFlavZmmSampleProducer::analyze_variation(Event &event, const JmeEventR const auto &z = event.get("leptonicZ"); out_.fill("leptonicZ_pt", static_cast(z.Pt())); out_.fill("leptonicZ_mass", static_cast(z.M())); + out_.fill("lheVpt", get_lhe_v_pt(event)); out_.fill("genVpt", get_gen_v_pt(event)); for (std::size_t index = 0; index < muons.size(); ++index) { const auto prefix = "muon" + std::to_string(index) + "_"; From fca0c33c27a99ac5aabb4a9bfc6fe37dd3de4080 Mon Sep 17 00:00:00 2001 From: JackmanHe Date: Tue, 18 Aug 2026 13:10:13 +0200 Subject: [PATCH 8/9] Add 2024 Higgs NanoAOD samples --- configs/samples/zbb_2024_v15_MC.yaml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/configs/samples/zbb_2024_v15_MC.yaml b/configs/samples/zbb_2024_v15_MC.yaml index 1617147..d2033b3 100644 --- a/configs/samples/zbb_2024_v15_MC.yaml +++ b/configs/samples/zbb_2024_v15_MC.yaml @@ -24,3 +24,11 @@ vv-qq: - /WWto4Q-1Jets-4FS_TuneCP5_13p6TeV_amcatnloFXFX-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM - /WZto4Q-1Jets-4FS_TuneCP5_13p6TeV_amcatnloFXFX-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM - /ZZto4Q-1Jets_TuneCP5_13p6TeV_amcatnloFXFX-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM + +higgs: +- /GluGluH-Hto2B_Bin-PT-200_Par-M-125_TuneCP5_13p6TeV_powhegMINLO-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM +- /VBFH-Hto2B_Par-M-125_TuneCP5_13p6TeV_powheg-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2_ext1-v2/NANOAODSIM +- /WminusH-Wto2Q-Hto2B_Par-M-125_TuneCP5_13p6TeV_powhegMINLO-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM +- /WplusH-Wto2Q-Hto2B_Par-M-125_TuneCP5_13p6TeV_powhegMINLO-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM +- /ZH-Zto2Q-Hto2B_Par-M-125_TuneCP5_13p6TeV_powhegMINLO-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM +- /GluGluZH-Zto2Q-Hto2B_Par-M-125_TuneCP5_13p6TeV_powheg-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM From ae34b4a64dd80a89b4fedf5375b696a765341408 Mon Sep 17 00:00:00 2001 From: JackmanHe Date: Fri, 21 Aug 2026 16:05:35 +0200 Subject: [PATCH 9/9] Complete 2024 zbb and zmm channel support Add muon variations, correctionlib V+jets weights, LHE metadata preservation, and focused validation coverage. Lower the inclusive dimuon and leading zbb fatjet thresholds to 400 GeV and document both workflows. --- CMakeLists.txt | 22 ++ README.md | 47 ++-- app/nano_make_condor.cpp | 17 +- app/nano_merge.cpp | 4 +- app/nano_run.cpp | 87 +++++--- configs/base.yaml | 21 +- configs/run/zbb_2024_v15.yaml | 8 +- configs/run/zmm_2024_v15.yaml | 7 + configs/samples/xsec_2024.conf | 18 +- configs/samples/zbb_2024_v15_MC.yaml | 6 + configs/samples/zmm_2024_v15_MC.yaml | 2 +- data/muon-smearing/stdflat.json.gz | Bin 0 -> 306 bytes .../WJetsCorr_collection_ewk.json.gz | Bin 0 -> 1397 bytes .../ZJetsCorr_collection_ewk.json.gz | Bin 0 -> 1393 bytes data/vjets-ewk/convert_root_to_json.py | 81 +++++++ include/nano/helpers/JmeVariation.h | 5 + include/nano/helpers/MuonCorrection.h | 10 +- include/nano/helpers/NloEWWeightProducer.h | 10 +- include/nano/io/RootOutputFile.h | 1 + .../nano/producers/HeavyFlavBaseProducer.h | 8 +- .../producers/HeavyFlavZmmSampleProducer.h | 1 + src/helpers/JetMETCorrector.cpp | 4 + src/helpers/JmeVariation.cpp | 27 ++- src/helpers/MuonCorrection.cpp | 199 +++++++---------- src/helpers/NloEWWeightProducer.cpp | 85 +++----- src/io/RootOutputFile.cpp | 11 + src/producers/HeavyFlavBaseProducer.cpp | 7 +- src/producers/HeavyFlavZbbSampleProducer.cpp | 6 +- src/producers/HeavyFlavZmmSampleProducer.cpp | 32 ++- templates/condor/process.sh.in | 5 + tests/README.md | 24 +- tests/condor_sample_name_test.py | 20 ++ tests/muon_external_equivalence.cpp | 205 ++++++++++++++++++ tests/muon_validation_test.py | 40 ++-- tests/vjets_ewk_json_test.py | 80 +++++++ 35 files changed, 835 insertions(+), 265 deletions(-) create mode 100644 data/muon-smearing/stdflat.json.gz create mode 100644 data/vjets-ewk/2023-08-11/WJetsCorr_collection_ewk.json.gz create mode 100644 data/vjets-ewk/2023-08-11/ZJetsCorr_collection_ewk.json.gz create mode 100644 data/vjets-ewk/convert_root_to_json.py create mode 100644 tests/condor_sample_name_test.py create mode 100644 tests/muon_external_equivalence.cpp create mode 100644 tests/vjets_ewk_json_test.py diff --git a/CMakeLists.txt b/CMakeLists.txt index 187e624..dd4746f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -54,3 +54,25 @@ add_test( COMMAND ${Python3_EXECUTABLE} ${CMAKE_SOURCE_DIR}/tests/muon_validation_test.py --source-dir ${CMAKE_SOURCE_DIR} --build-dir ${CMAKE_BINARY_DIR} --group muon --max-input-events 5000 ) set_tests_properties(muon_validation PROPERTIES TIMEOUT 7200 LABELS "muon;reference;systematics") + +add_executable(muon_external_equivalence tests/muon_external_equivalence.cpp) +target_link_libraries(muon_external_equivalence PRIVATE CMSJMECalculators) +add_test( + NAME muon_external_equivalence + COMMAND muon_external_equivalence + /cvmfs/cms-griddata.cern.ch/cat/metadata/MUO/Run3-24CDEReprocessingFGHIPrompt-Summer24-NanoAODv15/latest/muon_scalesmearing.json.gz + ${CMAKE_SOURCE_DIR}/data/muon-smearing/stdflat.json.gz +) +set_tests_properties(muon_external_equivalence PROPERTIES LABELS "muon;unit;systematics") + +add_test( + NAME vjets_ewk_json + COMMAND ${Python3_EXECUTABLE} ${CMAKE_SOURCE_DIR}/tests/vjets_ewk_json_test.py --source-dir ${CMAKE_SOURCE_DIR} +) +set_tests_properties(vjets_ewk_json PROPERTIES LABELS "vjets;correctionlib;reference") + +add_test( + NAME condor_sample_name + COMMAND ${Python3_EXECUTABLE} ${CMAKE_SOURCE_DIR}/tests/condor_sample_name_test.py --source-dir ${CMAKE_SOURCE_DIR} +) +set_tests_properties(condor_sample_name PROPERTIES LABELS "condor;runtime") diff --git a/README.md b/README.md index f4fc4c9..62649e3 100644 --- a/README.md +++ b/README.md @@ -67,8 +67,8 @@ The implemented channels are: - `muon`: a heavy-flavour muon control region targeting semileptonic ttbar-like phase space, enriched in boosted top/W jets. - `minimal`: a lightweight boosted-AK8 stream that runs the shared lepton cleaning, JME, and fatjet preparation, then keeps the leading cleaned AK8 jet above the configured `channels.minimal.leading_fatjet_pt_min` threshold. - `qcd`: a dijet control region that retains the two leading cleaned AK8 jets and requires at least one qualified fatjet satisfying the soft-drop mass selection, with secondary-vertex matching enabled by default. The region is enriched in heavy-flavor QCD jets and provides gluon-enriched proxy samples for X->bb/cc calibration studies, including sfBDT-based methods. -- `zbb`: a 2024 NanoAOD v15 boosted dijet control region with two AK8 probes and an optional secondary-vertex requirement. -- `zmm`: a 2024 NanoAOD v15 boosted `Z -> mumu` recoil control region with muon scale/smearing and efficiency scale factors. +- `zbb`: a 2024 NanoAOD v15 boosted dijet control region requiring two corrected AK8 jets with leading/subleading pT >= 400/200 GeV and |DeltaPhi| >= pi/2. It stores both probe jets and can require at least two secondary vertices. +- `zmm`: a 2024 NanoAOD v15 boosted `Z -> mumu` recoil control region requiring exactly two isolated opposite-sign muons with pT >= 60/30 GeV, dimuon pT >= 400 GeV, and 70 <= m(mumu) <= 110 GeV. It stores the leading corrected AK8 jet separated from both muons and provides muon scale/smearing variations and efficiency scale factors. Main files: @@ -117,24 +117,33 @@ build/nano_run \ --config configs/run/zmm_2024_v15.yaml \ --channel zmm \ --num-events 5000 + +build/nano_run \ + --input-files input.root \ + --output-file zbb_2024.root \ + --config configs/run/zbb_2024_v15.yaml \ + --channel zbb \ + --num-events 5000 ``` Their muon payloads are resolved by campaign from `/cvmfs/cms-griddata.cern.ch/cat/metadata/MUO`. The 2024 card follows the campaign's `latest` directory by default; override `muon_corrections.campaigns.2024_NanoAODv15.version` to pin a dated release. - -For an end-to-end environment, build, run, and output check, use: - -```bash -scripts/run_2024_z_channel.sh zmm mc -scripts/run_2024_z_channel.sh zbb mc -``` - -The script accepts an optional input ROOT file, output directory, event limit, -and variation list. Run `scripts/run_2024_z_channel.sh --help` for the complete -argument order. When the input is omitted, it resolves one representative -2024 NanoAOD v15 file with DAS. +Scale and resolution corrections are applied with the vendored +`MuonVariationsCalculator`. Its deterministic smearing input hashes +`(pt, eta, phi, event seed)`, whereas the official payload's +`RandomSmearing` correction hashes `(event, luminosityBlock, phi)`. Both are +uniform deterministic random sources, but their event-by-event MC smearing +values are intentionally not identical. + +The W/Z NLO electroweak weights use the correctionlib payloads under +`data/vjets-ewk/2023-08-11`. The original ROOT files remain in that directory +as validation references; production reads only the `.json.gz` files. The zbb +and zmm cards preserve the input `LHEScaleWeight` and `LHEPdfWeight` vectors, +including their metadata, for later theory-uncertainty studies. Their NLO EW +outputs include symmetric 50% correction uncertainties. Other channels can +enable the same LHE preservation with `output.include_lhe_weights=true`. `--input-files` accepts one file or a comma-separated list. Local paths, `root://...` paths, and `/store/...` paths are supported. @@ -145,10 +154,16 @@ Useful options: ```bash --tree-name Events --set output.include_lhe_weights=true ---variations nominal,jes_up,jes_down +--variations nominal,muon_scale_up,muon_scale_down,muon_smear_up,muon_smear_down ``` -`--variations` takes a comma-separated list and writes one ROOT file per requested variation. Supported JME names currently include `nominal`, `jes_up`, `jes_down`, `jer_up`, `jer_down`, `met_up`, and `met_down`. +`--variations` takes a comma-separated list and writes one ROOT file per +requested variation. Supported names are `nominal`, `jes_up`, `jes_down`, +`jer_up`, `jer_down`, `met_up`, `met_down`, `muon_scale_up`, +`muon_scale_down`, `muon_smear_up`, and `muon_smear_down`. Muon variations +are available only for zmm MC and rerun the full dimuon selection, so their +event counts may differ. A muon variation uses nominal JME, and a JME +variation uses nominal muons. ## Run Validation diff --git a/app/nano_make_condor.cpp b/app/nano_make_condor.cpp index e588cea..ff2df50 100644 --- a/app/nano_make_condor.cpp +++ b/app/nano_make_condor.cpp @@ -1,4 +1,5 @@ #include "runtime_common.h" +#include "nano/helpers/JmeVariation.h" #include #include @@ -72,7 +73,7 @@ CliOptions parse_args(int argc, char **argv) { } } if (opts.input_yaml.empty() || opts.job_dir.empty() || opts.output_dir.empty() || opts.config_file.empty()) { - throw std::runtime_error("Usage: nano_make_condor --input-yaml --job-dir --output-dir

--config [--nfiles-per-job 1] [--variations nominal,jes_up,...]. If omitted, --variations defaults to nominal."); + throw std::runtime_error("Usage: nano_make_condor --input-yaml --job-dir --output-dir --config [--nfiles-per-job 1] [--variations nominal,jes_up,...,muon_smear_down]. If omitted, --variations defaults to nominal."); } return opts; } @@ -86,7 +87,18 @@ void validate_data_variations(const CliOptions &cli) { if (!cli.run_data || variations == "nominal") { return; } - throw std::runtime_error("--run-data does not support JME variations. If --variations is used with --run-data, it must be the single value 'nominal'; otherwise omit --variations."); + throw std::runtime_error("--run-data does not support systematic variations. Use only 'nominal'."); +} + +void validate_variation_scope(const CliOptions &cli) { + if (cli.channel == "zmm") { + return; + } + for (const auto variation : nano::parse_jme_variation_list(normalized_variations_arg(cli))) { + if (nano::is_muon_variation(variation)) { + throw std::runtime_error("Muon scale/smear variations are supported only for the zmm MC channel"); + } + } } std::string write_merged_config(const fs::path &path, const YAML::Node &settings) { @@ -226,6 +238,7 @@ int main(int argc, char **argv) { try { const auto cli = parse_args(argc, argv); validate_data_variations(cli); + validate_variation_scope(cli); auto settings = nano::runtime::load_config_with_extends(cli.config_file); for (const auto &[key, value] : cli.overrides) { nano::runtime::apply_override(settings, key, value); diff --git a/app/nano_merge.cpp b/app/nano_merge.cpp index 0ec7560..d6d3529 100644 --- a/app/nano_merge.cpp +++ b/app/nano_merge.cpp @@ -27,7 +27,9 @@ constexpr std::array kAllowedVariations = { std::string_view{"nominal"}, std::string_view{"jes_up"}, std::string_view{"jes_down"}, std::string_view{"jer_up"}, std::string_view{"jer_down"}, std::string_view{"met_up"}, - std::string_view{"met_down"}, + std::string_view{"met_down"}, std::string_view{"muon_scale_up"}, + std::string_view{"muon_scale_down"}, std::string_view{"muon_smear_up"}, + std::string_view{"muon_smear_down"}, }; constexpr std::size_t kHaddChunkSize = 200; diff --git a/app/nano_run.cpp b/app/nano_run.cpp index 5eb344d..7c29daf 100644 --- a/app/nano_run.cpp +++ b/app/nano_run.cpp @@ -10,6 +10,7 @@ #include "runtime_common.h" #include +#include #include #include #include @@ -24,6 +25,8 @@ namespace fs = std::filesystem; namespace { +constexpr std::array kLheWeightBranches = {"LHEScaleWeight", "LHEPdfWeight"}; + bool parse_double_strict(const std::string &text, double &value) { char *end = nullptr; errno = 0; @@ -115,7 +118,7 @@ CliOptions parse_args(int argc, char **argv) { } if (opts.input_files.empty() || opts.output_file.empty() || opts.config_file.empty()) { - throw std::runtime_error("Usage: nano_run --input-files --output-file --config [--channel muon|minimal|qcd|zbb|zmm] [--num-events -1] [--run-data] [--variations nominal,jes_up,...] [--set key=value]. If omitted, --variations defaults to nominal."); + throw std::runtime_error("Usage: nano_run --input-files --output-file --config [--channel muon|minimal|qcd|zbb|zmm] [--num-events -1] [--run-data] [--variations nominal,jes_up,...,muon_smear_down] [--set key=value]. If omitted, --variations defaults to nominal."); } return opts; } @@ -129,7 +132,18 @@ void validate_data_variations(const CliOptions &cli) { if (!cli.run_data || variations == "nominal") { return; } - throw std::runtime_error("--run-data does not support JME variations. If --variations is used with --run-data, it must be the single value 'nominal'; otherwise omit --variations."); + throw std::runtime_error("--run-data does not support systematic variations. Use only 'nominal'."); +} + +void validate_variation_scope(const CliOptions &cli, const std::vector &variations) { + if (cli.channel == "zmm") { + return; + } + for (const auto variation : variations) { + if (nano::is_muon_variation(variation)) { + throw std::runtime_error("Muon scale/smear variations are supported only for the zmm MC channel"); + } + } } nano::ProducerConfig make_config(const YAML::Node &settings, const std::string &channel) { @@ -215,18 +229,20 @@ nano::ProducerConfig make_config(const YAML::Node &settings, const std::string & // read_branches safety checks: // - Runtime cards should explicitly list every physical NanoAOD branch the // channel reads. - // - required_triggers, stored_tagger_names, and optional LHEScaleWeight can - // imply extra physical branches; auto-add them for backward compatibility, - // but warn so the card can be made explicit. - // - If LHEScaleWeight is listed while output.include_lhe_weights is disabled, + // - required_triggers, stored_tagger_names, and optional LHE weight vectors can + // imply extra physical branches; auto-add them for backward compatibility. + // - If an LHE weight vector is listed while output.include_lhe_weights is disabled, // remove it so a stale read_branches entry does not silently read an unused // large vector branch. if (!config.include_lhe_weights) { - const auto old_size = config.read_branches.size(); - config.read_branches.erase(std::remove(config.read_branches.begin(), config.read_branches.end(), "LHEScaleWeight"), - config.read_branches.end()); - if (config.read_branches.size() != old_size) { - std::cerr << "Warning: removing LHEScaleWeight from read_branches because output.include_lhe_weights is false.\n"; + for (const auto branch_name : kLheWeightBranches) { + const auto old_size = config.read_branches.size(); + config.read_branches.erase(std::remove(config.read_branches.begin(), config.read_branches.end(), branch_name), + config.read_branches.end()); + if (config.read_branches.size() != old_size) { + std::cerr << "Warning: removing " << branch_name + << " from read_branches because output.include_lhe_weights is false.\n"; + } } } if (!settings["stored_tagger_names"]) { @@ -250,10 +266,12 @@ nano::ProducerConfig make_config(const YAML::Node &settings, const std::string & config.read_branches.push_back(branch_name); } } - if (config.include_lhe_weights && seen.insert("LHEScaleWeight").second) { - std::cerr << "Warning: adding missing branch LHEScaleWeight to read_branches because output.include_lhe_weights is true. " - "Please list it explicitly in read_branches.\n"; - config.read_branches.push_back("LHEScaleWeight"); + if (config.include_lhe_weights) { + for (const auto branch_name : kLheWeightBranches) { + if (seen.insert(std::string(branch_name)).second) { + config.read_branches.emplace_back(branch_name); + } + } } for (const auto &branch_name : config.read_branches) { if (config.nano_branch_types.count(branch_name) != 0U) { @@ -323,6 +341,8 @@ nano::ProducerConfig make_config(const YAML::Node &settings, const std::string & if (settings["muon_corrections"]) { const auto node = settings["muon_corrections"]; config.muon_payload_dir = node["payload_dir"].as(); + config.muon_smearing_file = node["smearing_file"].as(); + config.muon_smearing_tool = node["smearing_tool"] ? node["smearing_tool"].as() : "stdflat"; for (const auto &item : node["campaigns"]) { config.muon_eras[item.first.as()] = { item.second["payload_subdir"].as(), @@ -334,21 +354,12 @@ nano::ProducerConfig make_config(const YAML::Node &settings, const std::string & } if (settings["nlo_ew"]) { const auto node = settings["nlo_ew"]; - const auto uncertainty_histograms = [](const YAML::Node &histograms) { - std::vector names; - for (const auto &histogram : histograms) { - names.push_back(histogram.as()); - } - return names; - }; config.nlo_ew = { node["payload_dir"].as(), node["w_file"].as(), node["z_file"].as(), - node["w_histogram"].as(), - node["z_histogram"].as(), - uncertainty_histograms(node["w_uncertainty_histograms"]), - uncertainty_histograms(node["z_uncertainty_histograms"]), + node["w_correction"].as(), + node["z_correction"].as(), }; } if (settings["jet_veto_map"]) { @@ -415,8 +426,23 @@ std::vector process_one_file_variations(const std::string &input_fi if (!tree) { throw std::runtime_error("Missing tree " + cli.tree_name + " in " + input_file); } + if (!tree->GetBranch("genWeight")) { + for (const auto variation : variations) { + if (nano::is_muon_variation(variation)) { + throw std::runtime_error("Muon scale/smear variations are supported only for the zmm MC channel"); + } + } + } const auto config = make_config(settings, cli.channel); + if (config.include_lhe_weights && tree->GetBranch("genWeight")) { + for (const auto branch_name : kLheWeightBranches) { + if (!tree->GetBranch(std::string(branch_name).c_str())) { + std::cerr << "Warning: MC input is missing optional " << branch_name + << "; the output vector will be empty.\n"; + } + } + } const auto lumi_mask = cli.run_data ? std::make_unique(nano::runtime::LumiMask::from_file(data_lumi_mask_path(settings, config))) : nullptr; auto producer_base = make_producer(config); @@ -439,6 +465,14 @@ std::vector process_one_file_variations(const std::string &input_fi } auto output = std::make_unique(path); output->book_events(producer->output()); + if (config.include_lhe_weights) { + for (const auto branch_name : kLheWeightBranches) { + const auto *input_branch = tree->GetBranch(std::string(branch_name).c_str()); + if (input_branch) { + output->set_branch_title(branch_name, input_branch->GetTitle()); + } + } + } outputs.push_back({variation, std::move(path), std::move(output), 0U}); } @@ -490,6 +524,7 @@ int main(int argc, char **argv) { } const auto variations = nano::parse_jme_variation_list(normalized_variations_arg(cli)); + validate_variation_scope(cli, variations); if (inputs.size() == 1U) { process_one_file_variations(inputs.front(), cli.output_file, cli, settings, variations); return 0; diff --git a/configs/base.yaml b/configs/base.yaml index 4ee9e4f..a6baad9 100644 --- a/configs/base.yaml +++ b/configs/base.yaml @@ -26,10 +26,10 @@ channels: # Output-level optional branches. Keep large vector branches disabled by # default and enable them in a channel card or with `--set` when needed. output: - # Copy the input `LHEScaleWeight` vector into nominal output. This is useful - # for MC validation or scale-envelope studies. If enabled for data or an input - # without the branch, the output branch is present and filled with an empty - # vector. + # Copy the input `LHEScaleWeight` and `LHEPdfWeight` vectors into nominal + # output. This is useful for MC validation or theory-uncertainty studies. If + # enabled for data or an input without the branch, the output branch is + # present and filled with an empty vector. include_lhe_weights: false # Certified luminosity masks used when `nano_run --run-data` is enabled. @@ -448,6 +448,9 @@ pu: # explicit so a runtime card can pin a dated payload for reproducibility. muon_corrections: payload_dir: /cvmfs/cms-griddata.cern.ch/cat/metadata/MUO + # CMSJMECalculators expects a deterministic four-input stdflat correction. + smearing_file: data/muon-smearing/stdflat.json.gz + smearing_tool: stdflat campaigns: 2024_NanoAODv15: payload_subdir: Run3-24CDEReprocessingFGHIPrompt-Summer24-NanoAODv15 @@ -458,12 +461,10 @@ muon_corrections: # NLO electroweak corrections for W/Z+jets and DY samples. nlo_ew: payload_dir: data/vjets-ewk/2023-08-11 - w_file: WJetsCorr_collection_ewk.root - z_file: ZJetsCorr_collection_ewk.root - w_histogram: evj_pTV_kappa_EW - z_histogram: eej_pTV_kappa_EW - w_uncertainty_histograms: [evj_pTV_d1kappa_EW, evj_pTV_d2kappa_EW, evj_pTV_d3kappa_EW] - z_uncertainty_histograms: [eej_pTV_d1kappa_EW, eej_pTV_d2kappa_EW, eej_pTV_d3kappa_EW] + w_file: WJetsCorr_collection_ewk.json.gz + z_file: ZJetsCorr_collection_ewk.json.gz + w_correction: evj_pTV_EW + z_correction: eej_pTV_EW # Numeric year label written to the output `year` branch. The mapping follows # the historical Python producer convention, where split eras such as 2022EE diff --git a/configs/run/zbb_2024_v15.yaml b/configs/run/zbb_2024_v15.yaml index b0e2a06..89ca79a 100644 --- a/configs/run/zbb_2024_v15.yaml +++ b/configs/run/zbb_2024_v15.yaml @@ -13,7 +13,13 @@ preselection: Sum$(abs(FatJet_eta)<2.4)>1 required_triggers: - HLT_AK8PFJet380_SoftDropMass30 - - HLT_AK8PFJet500 + +output: + include_lhe_weights: true + +additional_read_branches: + - LHEScaleWeight + - LHEPdfWeight channels: zbb: diff --git a/configs/run/zmm_2024_v15.yaml b/configs/run/zmm_2024_v15.yaml index 50ec812..b4d9f5f 100644 --- a/configs/run/zmm_2024_v15.yaml +++ b/configs/run/zmm_2024_v15.yaml @@ -14,3 +14,10 @@ preselection: Sum$(Muon_pt>50 && abs(Muon_eta)<2.4 && Muon_highPtId)>0 && Sum$(M required_triggers: - HLT_Mu50 - HLT_TkMu50 + +output: + include_lhe_weights: true + +additional_read_branches: + - LHEScaleWeight + - LHEPdfWeight diff --git a/configs/samples/xsec_2024.conf b/configs/samples/xsec_2024.conf index 17bfaac..bd00288 100644 --- a/configs/samples/xsec_2024.conf +++ b/configs/samples/xsec_2024.conf @@ -1,7 +1,16 @@ # Cross sections in pb for the 2024 zbb and zmm samples. # Values are ported from NanoHRTTools samples_nanov15/xsec_2024.conf. -419.7 /TTto4Q_TuneCP5_13p6TeV_powheg-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM +419.7 /TTto4Q_TuneCP5_13p6TeV_powheg-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM # 923.6 * 0.6741^2 + +# 13.6 TeV inclusive single-top values times BR(W->qq)=0.6741. +99.2275 /TBbarQto2Q-t-channel-4FS_TuneCP5_13p6TeV_powheg-madspin-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM +59.5433 /TbarBQto2Q-t-channel-4FS_TuneCP5_13p6TeV_powheg-madspin-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM +4.53534 /TBbarto2Q-s-channel_TuneCP5_13p6TeV_powheg-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM +2.85549 /TbarBto2Q-s-channel_TuneCP5_13p6TeV_powheg-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM +# The 79.07 pb tW total is split equally; both W bosons decay hadronically. +17.9651 /TWminusto4Q_TuneCP5_13p6TeV_powheg-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM +17.9651 /TbarWplusto4Q_TuneCP5_13p6TeV_powheg-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM 1961000 /QCD-4Jets_Bin-HT-200to400_TuneCP5_13p6TeV_madgraphMLM-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM 96690 /QCD-4Jets_Bin-HT-400to600_TuneCP5_13p6TeV_madgraphMLM-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM @@ -23,6 +32,13 @@ 24.75 /WZto4Q-1Jets-4FS_TuneCP5_13p6TeV_amcatnloFXFX-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM 7.807 /ZZto4Q-1Jets_TuneCP5_13p6TeV_amcatnloFXFX-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM +0.5248 /GluGluH-Hto2B_Bin-PT-200_Par-M-125_TuneCP5_13p6TeV_powhegMINLO-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM +4.180 /VBFH-Hto2B_Par-M-125_TuneCP5_13p6TeV_powheg-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2_ext1-v2/NANOAODSIM +0.3917 /WminusH-Wto2Q-Hto2B_Par-M-125_TuneCP5_13p6TeV_powhegMINLO-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM +0.6226 /WplusH-Wto2Q-Hto2B_Par-M-125_TuneCP5_13p6TeV_powhegMINLO-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM +0.5958 /ZH-Zto2Q-Hto2B_Par-M-125_TuneCP5_13p6TeV_powhegMINLO-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM +0.04776 /GluGluZH-Zto2Q-Hto2B_Par-M-125_TuneCP5_13p6TeV_powheg-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM + 10.77 /DYto2L-2Jets_Bin-MLL-50-PTLL-200_TuneCP5_13p6TeV_amcatnloFXFX-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v1/NANOAODSIM 0.5921 /DYto2L-2Jets_Bin-MLL-50-PTLL-400_TuneCP5_13p6TeV_amcatnloFXFX-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM 0.08097 /DYto2L-2Jets_Bin-MLL-50-PTLL-600_TuneCP5_13p6TeV_amcatnloFXFX-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v3/NANOAODSIM diff --git a/configs/samples/zbb_2024_v15_MC.yaml b/configs/samples/zbb_2024_v15_MC.yaml index d2033b3..4f4d79c 100644 --- a/configs/samples/zbb_2024_v15_MC.yaml +++ b/configs/samples/zbb_2024_v15_MC.yaml @@ -11,6 +11,12 @@ qcd-mg: top: - /TTto4Q_TuneCP5_13p6TeV_powheg-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM +- /TBbarQto2Q-t-channel-4FS_TuneCP5_13p6TeV_powheg-madspin-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM +- /TbarBQto2Q-t-channel-4FS_TuneCP5_13p6TeV_powheg-madspin-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM +- /TBbarto2Q-s-channel_TuneCP5_13p6TeV_powheg-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM +- /TbarBto2Q-s-channel_TuneCP5_13p6TeV_powheg-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM +- /TWminusto4Q_TuneCP5_13p6TeV_powheg-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM +- /TbarWplusto4Q_TuneCP5_13p6TeV_powheg-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM v-qq: - /Wto2Q-2Jets_Bin-PTQQ-200_TuneCP5_13p6TeV_amcatnloFXFX-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM diff --git a/configs/samples/zmm_2024_v15_MC.yaml b/configs/samples/zmm_2024_v15_MC.yaml index e7503c5..3f3bfaf 100644 --- a/configs/samples/zmm_2024_v15_MC.yaml +++ b/configs/samples/zmm_2024_v15_MC.yaml @@ -9,7 +9,7 @@ top: - /TWminusto2L2Nu_TuneCP5_13p6TeV_powheg-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM - /TbarWplusto2L2Nu_TuneCP5_13p6TeV_powheg-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM -v-lep: +vv: - /WWto2L2Nu_TuneCP5_13p6TeV_powheg-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM - /WZto2L2Q_TuneCP5_13p6TeV_powheg-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM - /ZZto2L2Q_TuneCP5_13p6TeV_powheg-pythia8/RunIII2024Summer24NanoAODv15-150X_mcRun3_2024_realistic_v2-v2/NANOAODSIM diff --git a/data/muon-smearing/stdflat.json.gz b/data/muon-smearing/stdflat.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..38126c10a086a6960c88b32f9a2f384c7b51fdae GIT binary patch literal 306 zcmV-20nPp&iwFP!000001C5eBYr`-QhIjvpLvxmP%$jy7WGbDC35s>DMXe7`QlJF? z_nu_g?k8js_|>bs=e_f_0T7`Z(8$vTDQIWK9`1KpRv0?cKF*qWz=&kD)gkH*lGVK< z10=0-2DJ4l0xNJhK0h5F4|43%D5IkQCOHeipd@YIL@C`lBJ6VIz@=YV0=SlwFRe6~ z8-}QQE>T{TiyuHQ-w|vwXCxS87*Ih^ES1jh+HyK(4!}mh3)%<)QEi2{1tNa<@a3!wr4 E0Fi5s!T-@%fA15it>YrM<`@{(k{XKS zNbixFr{QK^mhomi&eM6g`txZx?AQHp^@RCp9jDdiK8}yW)iBMc|C}Rm+2lq>|i2Wi4tUI3Qpq7Yj6V#*}g?mM626%I1M3D2p$P$RYcza-m>;IjJPJ zz?>81zljq2fSRF7(- zdT<-H=g^brS@bk|9`@rt$z8B7;GUS9u$!=(NVp_{A8g6{+xgRQ)ux8ybaxLL40kK& zG0lf@eY^uhhIhwlI!+&k&!4v!8Xf5C45D3@SW6yX0lc(J6$dV+=nh9i%Kb?wIjcfR zP=Ib6yeYh^DkNk|+yQ+-vngp;qz3gTwV7$@>mz7K%}Sv_Vq33p2I5FnQ{t{Bio&Ke zItLOq;F!XhxTdbe1m;S1B{#luHHAW>sJINYC3dkW;9N{*5g^yixkwR@CXsWF?lK0! zX}C$uB&BBrlqjjsqozdl=>&#R@Sqt=s6Jl`_&_F8NPxH{1LmMeMH8c@678KRQ>w{) zFu;;LE6$96n-!oec}}2zM8qb>kgJG`St}wo5%ncfu~}{8%kew6z9F~x>)dk8<|q`X z12}^#wRFs804DV(sU2W+aE8*5ogG%8=32M|3w*?pcQlKn+R?0>Yxe})04*K@B*WXg zITN_lK@PN`H#*AU4~%zYE7IvMHKO@-o5UHN#LohQI}wv_PhsWXBSwx@LVfZ~=9 zf-1VLi4~0S0)Uc0oqlNgvC|(VBwVe@Z%8BgI*rgr zG^4IrA4oeu6zJ_8B9*N9(k@Vm*&oOb%?cRm3d*;nE(1orzi@LU`Jzxl>6d3E$J7;E z{c`RyaDh%^itZAMdyp^slQJrKC$V5Rk)A6`pgng5*EN++90JvYBe|iv=5lFJxGjpy zjJr^;251%NY;KMkfwy-S1FCdkG+sT&*n5@WTGnM;wAk5!c8LuM?nY62@a8VFg2rx- zPA;WqgTer`=SwwU?F|j>k1s71Ew~xFT(Fg~-@+NRs^m9j*tag(ujDu{zpDnjM_w-2 zXs^<5(ittg>UWm?Zd(jFuwVDX)gzuy>o~3U?A`bru2je=0HokTH^T8_k0i`$am5XC}L zq*TZaVrB89NK>g|@hC~={xsD@-8O3$Pm~HWlP)Hbo(U<1xw zPEkq^2S66-c}N16)SpK%_~J7b$)LG)ofv@j-i}H{SPzv-$Y>ZQ7gDWmjuJ+y)MQ{s za&}P!bTHqPz(=&GCf1swKV?zL=7BQ@^ok}5nB%9HsOS$C3|%7DV4EW7j8c6g*HSh&Esp$e?pw(XxH|Et2=Tyy?uV*i2PX%2gKw-Z0@LhI8*??esAyLvF#zt>!`s-|kLk_q2LL8g zO3oyJU)gO_BcYQj|#y9kBu+TYU~7rdDd@S`ifkVFLMdw z1Q#4qn+9nIP)YF7P^4zjt=i{H!gtATlh6||vF0TM-o8b6yoqnw?DeSS+1a82#EQ zl*IcACKPKo$f;!Q4BVX!nkj^ zZIo7zZx_J-&#PCTjNb2;)fuiT3N9sT2o_YFloW^Cp&dcVt`COO%bbdcB=W%nI zPuP8bYDw)+AWshkylSf;~wV;0|GPI;E2Wp<4XZ6d^zi!4`6l$42jQe+=mkoUkJJ<2B zd9%!?%^yFF>-l@UzP_1nZ{6m4{P1qK%yT>a`R1?jw7-4|#vlIy{Jx>}Ee`+yB($ww literal 0 HcmV?d00001 diff --git a/data/vjets-ewk/convert_root_to_json.py b/data/vjets-ewk/convert_root_to_json.py new file mode 100644 index 0000000..b97fb68 --- /dev/null +++ b/data/vjets-ewk/convert_root_to_json.py @@ -0,0 +1,81 @@ +#!/usr/bin/env python3 + +import gzip +import json +from pathlib import Path + +import ROOT + + +PAYLOADS = ( + ("WJetsCorr_collection_ewk.root", "WJetsCorr_collection_ewk.json.gz", "evj_pTV_EW", "evj"), + ("ZJetsCorr_collection_ewk.root", "ZJetsCorr_collection_ewk.json.gz", "eej_pTV_EW", "eej"), +) + + +def binning(histogram): + axis = histogram.GetXaxis() + return { + "nodetype": "binning", + "input": "pt", + "edges": [axis.GetBinLowEdge(index) for index in range(1, histogram.GetNbinsX() + 2)], + "content": [histogram.GetBinContent(index) for index in range(1, histogram.GetNbinsX() + 1)], + "flow": 0.0, + } + + +def convert(directory, root_name, json_name, correction_name, prefix): + source = ROOT.TFile.Open(str(directory / root_name), "READ") + if not source or source.IsZombie(): + raise RuntimeError(f"Cannot open {root_name}") + + names = { + "nominal": f"{prefix}_pTV_kappa_EW", + "d1": f"{prefix}_pTV_d1kappa_EW", + "d2": f"{prefix}_pTV_d2kappa_EW", + "d3": f"{prefix}_pTV_d3kappa_EW", + } + histograms = {key: source.Get(name) for key, name in names.items()} + if any(not histogram for histogram in histograms.values()): + raise RuntimeError(f"Missing EWK histogram in {root_name}") + + reference_edges = binning(histograms["nominal"])["edges"] + if any(binning(histogram)["edges"] != reference_edges for histogram in histograms.values()): + raise RuntimeError(f"Inconsistent binning in {root_name}") + + payload = { + "schema_version": 2, + "description": f"NLO electroweak correction converted from {root_name}", + "corrections": [ + { + "name": correction_name, + "description": "Boson pT correction and uncertainty components", + "version": 1, + "inputs": [ + {"name": "pt", "type": "real", "description": "Generator boson transverse momentum"}, + {"name": "variation", "type": "string", "description": "nominal, d1, d2, or d3"}, + ], + "output": {"name": "value", "type": "real"}, + "data": { + "nodetype": "category", + "input": "variation", + "content": [ + {"key": key, "value": binning(histogram)} for key, histogram in histograms.items() + ], + }, + } + ], + } + encoded = json.dumps(payload, separators=(",", ":"), sort_keys=True).encode() + with gzip.GzipFile(filename=str(directory / json_name), mode="wb", mtime=0) as output: + output.write(encoded) + + +def main(): + directory = Path(__file__).resolve().parent / "2023-08-11" + for arguments in PAYLOADS: + convert(directory, *arguments) + + +if __name__ == "__main__": + main() diff --git a/include/nano/helpers/JmeVariation.h b/include/nano/helpers/JmeVariation.h index e8c00e9..dc881a8 100644 --- a/include/nano/helpers/JmeVariation.h +++ b/include/nano/helpers/JmeVariation.h @@ -14,10 +14,15 @@ enum class JmeVariation { JerDown, MetUp, MetDown, + MuonScaleUp, + MuonScaleDown, + MuonSmearUp, + MuonSmearDown, }; std::string_view variation_name(JmeVariation variation); JmeVariation parse_jme_variation(std::string_view name); std::vector parse_jme_variation_list(std::string_view text); +bool is_muon_variation(JmeVariation variation); } // namespace nano diff --git a/include/nano/helpers/MuonCorrection.h b/include/nano/helpers/MuonCorrection.h index cc95ea5..718e140 100644 --- a/include/nano/helpers/MuonCorrection.h +++ b/include/nano/helpers/MuonCorrection.h @@ -1,8 +1,11 @@ #pragma once #include "nano/core/Collection.h" +#include "nano/helpers/JmeVariation.h" #include "nano/producers/HeavyFlavBaseProducer.h" +#include "MuonVariationsCalculator.h" + #include #include #include @@ -25,12 +28,15 @@ class MuonCorrection { public: explicit MuonCorrection(const ProducerConfig &config); - void correct(Event &event, std::vector &muons) const; + MuonVariationsCalculator::result_t produce(Event &event, const std::vector &muons) const; + void apply(const MuonVariationsCalculator::result_t &result, JmeVariation variation, + std::vector &muons) const; MuonSFResult scale_factor(const std::vector &muons, const std::string &correction_key, float minimum_pt) const; private: - std::shared_ptr scale_smearing_; + MuonVariationsCalculator mc_calculator_; + MuonVariationsCalculator data_calculator_; std::shared_ptr scale_factors_; }; diff --git a/include/nano/helpers/NloEWWeightProducer.h b/include/nano/helpers/NloEWWeightProducer.h index 64bdc3b..9344075 100644 --- a/include/nano/helpers/NloEWWeightProducer.h +++ b/include/nano/helpers/NloEWWeightProducer.h @@ -4,10 +4,12 @@ #include "nano/core/OutputModel.h" #include "nano/producers/HeavyFlavBaseProducer.h" -#include #include +#include -class TH1; +namespace correction { +class CorrectionSet; +} namespace nano { @@ -23,8 +25,8 @@ class NloEWWeightProducer { enum class Boson { None, W, Z }; Boson boson_ = Boson::None; - std::unique_ptr histogram_; - std::array, 3> uncertainty_histograms_; + std::shared_ptr corrections_; + std::string correction_key_; }; } // namespace nano diff --git a/include/nano/io/RootOutputFile.h b/include/nano/io/RootOutputFile.h index 4a23f2f..163405a 100644 --- a/include/nano/io/RootOutputFile.h +++ b/include/nano/io/RootOutputFile.h @@ -24,6 +24,7 @@ class RootOutputFile { ~RootOutputFile(); void book_events(const OutputModel &model, std::string_view tree_name = "Events"); + void set_branch_title(std::string_view branch_name, std::string_view title); void fill_event(const OutputModel &model); void write(); diff --git a/include/nano/producers/HeavyFlavBaseProducer.h b/include/nano/producers/HeavyFlavBaseProducer.h index a53c851..9b0a41b 100644 --- a/include/nano/producers/HeavyFlavBaseProducer.h +++ b/include/nano/producers/HeavyFlavBaseProducer.h @@ -62,10 +62,8 @@ struct NloEWConfig { std::string payload_dir; std::string w_file; std::string z_file; - std::string w_histogram; - std::string z_histogram; - std::vector w_uncertainty_histograms; - std::vector z_uncertainty_histograms; + std::string w_correction; + std::string z_correction; }; struct BTagConfig { @@ -106,6 +104,8 @@ struct ProducerConfig { std::string pu_payload_dir; std::unordered_map pu_eras; std::string muon_payload_dir; + std::string muon_smearing_file; + std::string muon_smearing_tool = "stdflat"; std::unordered_map muon_eras; NloEWConfig nlo_ew; bool jet_veto_map_enabled = false; diff --git a/include/nano/producers/HeavyFlavZmmSampleProducer.h b/include/nano/producers/HeavyFlavZmmSampleProducer.h index b7132b6..5dc8ddd 100644 --- a/include/nano/producers/HeavyFlavZmmSampleProducer.h +++ b/include/nano/producers/HeavyFlavZmmSampleProducer.h @@ -15,6 +15,7 @@ class HeavyFlavZmmSampleProducer : public HeavyFlavBaseProducer { bool analyze_variation(Event &event, const JmeEventResult &jme_result, JmeVariation variation) override; private: + bool select_muons(Event &event, JmeVariation variation); MuonCorrection muon_correction_; }; diff --git a/src/helpers/JetMETCorrector.cpp b/src/helpers/JetMETCorrector.cpp index dec1669..34cd06d 100644 --- a/src/helpers/JetMETCorrector.cpp +++ b/src/helpers/JetMETCorrector.cpp @@ -508,6 +508,10 @@ std::size_t JetMETCorrector::variation_index(const std::vector &ava allow_missing = true; break; case JmeVariation::Nominal: + case JmeVariation::MuonScaleUp: + case JmeVariation::MuonScaleDown: + case JmeVariation::MuonSmearUp: + case JmeVariation::MuonSmearDown: index = find_label("nominal"); break; } diff --git a/src/helpers/JmeVariation.cpp b/src/helpers/JmeVariation.cpp index 550393f..7d38b6a 100644 --- a/src/helpers/JmeVariation.cpp +++ b/src/helpers/JmeVariation.cpp @@ -21,6 +21,14 @@ std::string_view variation_name(JmeVariation variation) { return "met_up"; case JmeVariation::MetDown: return "met_down"; + case JmeVariation::MuonScaleUp: + return "muon_scale_up"; + case JmeVariation::MuonScaleDown: + return "muon_scale_down"; + case JmeVariation::MuonSmearUp: + return "muon_smear_up"; + case JmeVariation::MuonSmearDown: + return "muon_smear_down"; } return "nominal"; } @@ -47,7 +55,19 @@ JmeVariation parse_jme_variation(std::string_view name) { if (name == "met_down") { return JmeVariation::MetDown; } - throw std::runtime_error("Unsupported JME variation: " + std::string(name)); + if (name == "muon_scale_up") { + return JmeVariation::MuonScaleUp; + } + if (name == "muon_scale_down") { + return JmeVariation::MuonScaleDown; + } + if (name == "muon_smear_up") { + return JmeVariation::MuonSmearUp; + } + if (name == "muon_smear_down") { + return JmeVariation::MuonSmearDown; + } + throw std::runtime_error("Unsupported variation: " + std::string(name)); } std::vector parse_jme_variation_list(std::string_view text) { @@ -62,4 +82,9 @@ std::vector parse_jme_variation_list(std::string_view text) { return out; } +bool is_muon_variation(JmeVariation variation) { + return variation == JmeVariation::MuonScaleUp || variation == JmeVariation::MuonScaleDown || + variation == JmeVariation::MuonSmearUp || variation == JmeVariation::MuonSmearDown; +} + } // namespace nano diff --git a/src/helpers/MuonCorrection.cpp b/src/helpers/MuonCorrection.cpp index 97f5167..ec15ec4 100644 --- a/src/helpers/MuonCorrection.cpp +++ b/src/helpers/MuonCorrection.cpp @@ -1,12 +1,9 @@ #include "nano/helpers/MuonCorrection.h" #include -#include -#include #include #include -#include #include #include @@ -14,81 +11,46 @@ namespace nano { namespace { -std::shared_ptr correction_set(const std::string &path) { - static std::unordered_map> cache; +std::shared_ptr +correction_set(const std::string &path) { + static std::unordered_map> + cache; auto &entry = cache[path]; if (!entry) { - entry = std::shared_ptr(correction::CorrectionSet::from_file(path).release()); + entry = std::shared_ptr( + correction::CorrectionSet::from_file(path).release()); } return entry; } -double crystal_ball_cdf(double x, double mean, double sigma, double alpha, double n) { - constexpr double pi = 3.14159265358979323846; - const auto abs_alpha = std::abs(alpha); - const auto sqrt_pi_over_two = std::sqrt(pi / 2.0); - const auto sqrt_two = std::sqrt(2.0); - const auto exponential = std::exp(-0.5 * abs_alpha * abs_alpha); - const auto c1 = n / abs_alpha / (n - 1.0) * exponential; - const auto d1 = 2.0 * sqrt_pi_over_two * std::erf(abs_alpha / sqrt_two); - const auto norm = 1.0 / sigma / (d1 + 2.0 * c1); - const auto norm_sigma = norm * sigma; - const auto norm_c1 = norm_sigma * c1; - const auto f = 1.0 - abs_alpha * abs_alpha / n; - const auto g = sigma * n / abs_alpha; - const auto c = (d1 + 2.0 * c1) / c1; - const auto d = (d1 + 2.0 * c1) / 2.0; - const auto delta = (x - mean) / sigma; - - if (delta < -abs_alpha) { - const auto base = f - sigma * delta / g; - return base > 0.0 ? norm_c1 / std::pow(base, n - 1.0) : norm_c1; - } - if (delta > abs_alpha) { - const auto base = f + sigma * delta / g; - return base > 0.0 ? norm_c1 * (c - std::pow(base, 1.0 - n)) : norm_c1 * c; - } - return norm_sigma * (d - sqrt_pi_over_two * std::erf(-delta / sqrt_two)); -} - -double crystal_ball_inverse(double u, double mean, double sigma, double alpha, double n) { - constexpr double pi = 3.14159265358979323846; - const auto abs_alpha = std::abs(alpha); - const auto sqrt_pi_over_two = std::sqrt(pi / 2.0); - const auto sqrt_two = std::sqrt(2.0); - const auto exponential = std::exp(-0.5 * abs_alpha * abs_alpha); - const auto c1 = n / abs_alpha / (n - 1.0) * exponential; - const auto d1 = 2.0 * sqrt_pi_over_two * std::erf(abs_alpha / sqrt_two); - const auto norm = 1.0 / sigma / (d1 + 2.0 * c1); - const auto norm_sigma = norm * sigma; - const auto norm_c1 = norm_sigma * c1; - const auto f = 1.0 - abs_alpha * abs_alpha / n; - const auto g = sigma * n / abs_alpha; - const auto c = (d1 + 2.0 * c1) / c1; - const auto d = (d1 + 2.0 * c1) / 2.0; - const auto k = 1.0 / (n - 1.0); - const auto cdf_low = crystal_ball_cdf(mean - abs_alpha * sigma, mean, sigma, abs_alpha, n); - const auto cdf_high = crystal_ball_cdf(mean + abs_alpha * sigma, mean, sigma, abs_alpha, n); - u = std::clamp(u, std::numeric_limits::epsilon(), 1.0 - std::numeric_limits::epsilon()); - - if (u < cdf_low) { - return mean + g * (f - std::pow(norm_c1 / u, k)); - } - if (u > cdf_high) { - return mean - g * (f - std::pow(c - u / norm_c1, -k)); - } - return mean - sqrt_two * sigma * boost::math::erf_inv((d - u / norm_sigma) / sqrt_pi_over_two); -} - -float evaluate_sf(const correction::Correction::Ref &corr, const ObjectView &muon, const std::string &variation, +float evaluate_sf(const correction::Correction::Ref &corr, + const ObjectView &muon, const std::string &variation, float minimum_pt) { if (muon.eta() < -2.4f || muon.eta() >= 2.4f || muon.pt() < minimum_pt) { return 1.0f; } - return static_cast(corr->evaluate({static_cast(muon.eta()), static_cast(muon.pt()), variation})); + return static_cast( + corr->evaluate({static_cast(muon.eta()), + static_cast(muon.pt()), variation})); } -} // namespace +std::size_t muon_variation_index(JmeVariation variation) { + switch (variation) { + case JmeVariation::MuonScaleUp: + return 1U; + case JmeVariation::MuonScaleDown: + return 2U; + case JmeVariation::MuonSmearUp: + return 3U; + case JmeVariation::MuonSmearDown: + return 4U; + default: + return 0U; + } +} + +} // namespace MuonCorrection::MuonCorrection(const ProducerConfig &config) { const auto key = config.era + "_NanoAOD" + config.nano_version; @@ -96,65 +58,66 @@ MuonCorrection::MuonCorrection(const ProducerConfig &config) { if (it == config.muon_eras.end()) { throw std::runtime_error("Missing muon correction campaign: " + key); } - const auto root = config.muon_payload_dir + "/" + it->second.payload_subdir + "/" + it->second.version; - scale_smearing_ = correction_set(root + "/" + it->second.scale_smearing_file); + const auto root = config.muon_payload_dir + "/" + it->second.payload_subdir + + "/" + it->second.version; + const auto scale_smearing_file = root + "/" + it->second.scale_smearing_file; + mc_calculator_ = MuonVariationsCalculator::create( + scale_smearing_file, true, true, config.muon_smearing_file, + config.muon_smearing_tool); + data_calculator_ = MuonVariationsCalculator::create(scale_smearing_file, + false, false, "", ""); scale_factors_ = correction_set(root + "/" + it->second.sf_file); } -void MuonCorrection::correct(Event &event, std::vector &muons) const { - const auto suffix = event.is_mc() ? "mc" : "data"; - const auto a = scale_smearing_->at("a_" + std::string(suffix)); - const auto m = scale_smearing_->at("m_" + std::string(suffix)); - const auto random = scale_smearing_->at("RandomSmearing"); - const auto cb = scale_smearing_->at("cb_params"); - const auto poly = scale_smearing_->at("poly_params"); - const auto k_data = scale_smearing_->at("k_data"); - const auto k_mc = scale_smearing_->at("k_mc"); - - for (auto &muon : muons) { - const auto old_pt = muon.pt(); - const auto eta = static_cast(muon.eta()); - const auto phi = static_cast(muon.phi()); - const auto charge = static_cast(muon.get("charge")); - const auto a_value = a->evaluate({eta, phi, std::string("nom")}); - const auto m_value = m->evaluate({eta, phi, std::string("nom")}); - const auto denominator = m_value / old_pt + charge * a_value; - auto corrected_pt = denominator != 0.0 ? 1.0 / denominator : static_cast(old_pt); - if (corrected_pt < 0.0) { - corrected_pt = old_pt; - } +MuonVariationsCalculator::result_t +MuonCorrection::produce(Event &event, + const std::vector &muons) const { + MuonVariationsCalculator::p4compv_t pt; + MuonVariationsCalculator::p4compv_t eta; + MuonVariationsCalculator::p4compv_t phi; + MuonVariationsCalculator::p4compv_int charge; + MuonVariationsCalculator::p4compv_int layers; + pt.reserve(muons.size()); + eta.reserve(muons.size()); + phi.reserve(muons.size()); + charge.reserve(muons.size()); + layers.reserve(muons.size()); + for (const auto &muon : muons) { + pt.push_back(muon.pt()); + eta.push_back(muon.eta()); + phi.push_back(muon.phi()); + charge.push_back(muon.get("charge")); + layers.push_back(muon.get("nTrackerLayers")); + } - if (event.is_mc()) { - const auto abs_eta = std::abs(eta); - const auto layers = static_cast(muon.get("nTrackerLayers")); - const auto event_number = static_cast(event.scalar("event") & 0x7fffffffULL); - const auto uniform = random->evaluate( - {event_number, static_cast(event.scalar("luminosityBlock")), phi}); - const auto mean = cb->evaluate({abs_eta, layers, 0}); - const auto sigma = cb->evaluate({abs_eta, layers, 1}); - const auto n = cb->evaluate({abs_eta, layers, 2}); - const auto alpha = cb->evaluate({abs_eta, layers, 3}); - const auto random_cb = crystal_ball_inverse(uniform, mean, sigma, alpha, n); - const auto p0 = poly->evaluate({abs_eta, layers, 0}); - const auto p1 = poly->evaluate({abs_eta, layers, 1}); - const auto p2 = poly->evaluate({abs_eta, layers, 2}); - const auto sigma_pt = std::max(0.0, p0 + p1 * corrected_pt + p2 * corrected_pt * corrected_pt); - const auto kd = k_data->evaluate({abs_eta, std::string("nom")}); - const auto km = k_mc->evaluate({abs_eta, std::string("nom")}); - const auto extra_k = km < kd ? std::sqrt(kd * kd - km * km) : 0.0; - corrected_pt *= 1.0 + extra_k * sigma_pt * random_cb; - } + const auto seed = + static_cast(event.scalar("event") & 0x7fffffffULL); + return event.is_mc() + ? mc_calculator_.produce(pt, eta, phi, charge, layers, seed) + : data_calculator_.produce(pt, eta, phi, charge, layers, seed); +} - const auto ratio = old_pt > 0.0f ? corrected_pt / old_pt : 1.0; - if (!std::isfinite(corrected_pt) || ratio > 2.0 || ratio < 0.1 || (corrected_pt > 200.0 && old_pt <= 200.0f)) { - corrected_pt = old_pt; - } - muon.set("pt", static_cast(corrected_pt)); - muon.set("p4", ObjectView::LorentzVector(corrected_pt, muon.eta(), muon.phi(), muon.mass())); +void MuonCorrection::apply(const MuonVariationsCalculator::result_t &result, + JmeVariation variation, + std::vector &muons) const { + const auto index = muon_variation_index(variation); + if (index >= result.size()) { + throw std::runtime_error("Requested muon variation is unavailable"); + } + const auto &corrected_pt = result.pt(index); + if (corrected_pt.size() != muons.size()) { + throw std::runtime_error("Muon correction output size mismatch"); + } + for (std::size_t i = 0; i < muons.size(); ++i) { + muons[i].set("pt", corrected_pt[i]); + muons[i].set("p4", + ObjectView::LorentzVector(corrected_pt[i], muons[i].eta(), + muons[i].phi(), muons[i].mass())); } } -MuonSFResult MuonCorrection::scale_factor(const std::vector &muons, const std::string &correction_key, +MuonSFResult MuonCorrection::scale_factor(const std::vector &muons, + const std::string &correction_key, float minimum_pt) const { const auto corr = scale_factors_->at(correction_key); float nominal = 1.0f; @@ -175,4 +138,4 @@ MuonSFResult MuonCorrection::scale_factor(const std::vector &muons, return {nominal, stat_up, stat_down, syst_up, syst_down}; } -} // namespace nano +} // namespace nano diff --git a/src/helpers/NloEWWeightProducer.cpp b/src/helpers/NloEWWeightProducer.cpp index ef26e73..040051c 100644 --- a/src/helpers/NloEWWeightProducer.cpp +++ b/src/helpers/NloEWWeightProducer.cpp @@ -2,13 +2,11 @@ #include "nano/core/Collection.h" -#include -#include +#include #include #include #include -#include #include namespace nano { @@ -19,51 +17,30 @@ bool starts_with(const std::string &value, const std::string &prefix) { return value.rfind(prefix, 0) == 0; } -std::unique_ptr load_histogram(const std::string &path, const std::string &name) { - std::unique_ptr file(TFile::Open(path.c_str(), "READ")); - if (!file || file->IsZombie()) { - throw std::runtime_error("Failed to open NLO EW payload: " + path); - } - const auto source = dynamic_cast(file->Get(name.c_str())); - if (!source) { - throw std::runtime_error("Missing NLO EW histogram " + name + " in " + path); - } - auto histogram = std::unique_ptr(dynamic_cast(source->Clone())); - if (!histogram) { - throw std::runtime_error("Failed to clone NLO EW histogram " + name + " from " + path); - } - histogram->SetDirectory(nullptr); - return histogram; -} - -std::array, 3> load_uncertainty_histograms( - const std::string &path, const std::vector &names) { - if (names.size() != 3U) { - throw std::runtime_error("NLO EW correction requires exactly three uncertainty histograms"); - } - std::array, 3> histograms; - for (std::size_t index = 0; index < histograms.size(); ++index) { - histograms[index] = load_histogram(path, names[index]); - } - return histograms; +std::shared_ptr +load_corrections(const std::string &path) { + return std::shared_ptr( + correction::CorrectionSet::from_file(path).release()); } -} // namespace +} // namespace NloEWWeightProducer::NloEWWeightProducer(const ProducerConfig &config) { const auto sample_it = config.channel_options.strings.find("sample_name"); - const auto sample = sample_it == config.channel_options.strings.end() ? std::string{} : sample_it->second; + const auto sample = sample_it == config.channel_options.strings.end() + ? std::string{} + : sample_it->second; if (starts_with(sample, "Wto") || starts_with(sample, "WJetsTo")) { boson_ = Boson::W; - const auto path = config.nlo_ew.payload_dir + "/" + config.nlo_ew.w_file; - histogram_ = load_histogram(path, config.nlo_ew.w_histogram); - uncertainty_histograms_ = load_uncertainty_histograms(path, config.nlo_ew.w_uncertainty_histograms); - } else if (starts_with(sample, "Zto") || starts_with(sample, "ZJetsTo") || starts_with(sample, "DYto") || - starts_with(sample, "DYJetsTo")) { + corrections_ = load_corrections(config.nlo_ew.payload_dir + "/" + + config.nlo_ew.w_file); + correction_key_ = config.nlo_ew.w_correction; + } else if (starts_with(sample, "Zto") || starts_with(sample, "ZJetsTo") || + starts_with(sample, "DYto") || starts_with(sample, "DYJetsTo")) { boson_ = Boson::Z; - const auto path = config.nlo_ew.payload_dir + "/" + config.nlo_ew.z_file; - histogram_ = load_histogram(path, config.nlo_ew.z_histogram); - uncertainty_histograms_ = load_uncertainty_histograms(path, config.nlo_ew.z_uncertainty_histograms); + corrections_ = load_corrections(config.nlo_ew.payload_dir + "/" + + config.nlo_ew.z_file); + correction_key_ = config.nlo_ew.z_correction; } } @@ -84,7 +61,8 @@ void NloEWWeightProducer::fill(Event &event, OutputModel &out) const { float last_copy_pt = -1.0f; for (const auto &particle : event.collection("GenPart").objects()) { const auto pdg_id = particle.get("pdgId"); - if ((boson_ == Boson::W && std::abs(pdg_id) != 24) || (boson_ == Boson::Z && pdg_id != 23)) { + if ((boson_ == Boson::W && std::abs(pdg_id) != 24) || + (boson_ == Boson::Z && pdg_id != 23)) { continue; } fallback_pt = std::max(fallback_pt, particle.pt()); @@ -98,20 +76,21 @@ void NloEWWeightProducer::fill(Event &event, OutputModel &out) const { return; } - const auto xmax = static_cast(histogram_->GetXaxis()->GetXmax()); - const auto lookup_pt = pt == xmax ? std::nextafter(pt, 0.0f) : pt; - const auto bin = histogram_->GetXaxis()->FindFixBin(lookup_pt); - const auto kappa = static_cast(histogram_->GetBinContent(bin)); - const auto nominal = 1.0f + kappa; - float uncertainty2 = 0.0f; - for (const auto &histogram : uncertainty_histograms_) { - const auto delta = static_cast(histogram->GetBinContent(bin)); - uncertainty2 += delta * delta; - } - const auto uncertainty = std::sqrt(uncertainty2); + // Preserve the legacy ROOT lookup, where x == xmax belongs to the final bin. + constexpr float maximum_pt = 6500.0f; + const auto lookup_pt = pt == maximum_pt + ? std::nextafter(static_cast(pt), 0.0) + : static_cast(pt); + const auto correction = corrections_->at(correction_key_); + const auto evaluate = [&](const char *variation) { + return static_cast( + correction->evaluate({lookup_pt, std::string(variation)})); + }; + const auto nominal = 1.0f + evaluate("nominal"); + const auto uncertainty = 0.5f * std::abs(nominal - 1.0f); out.fill("nlo_ew_weight", nominal); out.fill("nlo_ew_weight_up", nominal + uncertainty); out.fill("nlo_ew_weight_down", nominal - uncertainty); } -} // namespace nano +} // namespace nano diff --git a/src/io/RootOutputFile.cpp b/src/io/RootOutputFile.cpp index bda4e39..30f0f0d 100644 --- a/src/io/RootOutputFile.cpp +++ b/src/io/RootOutputFile.cpp @@ -49,6 +49,17 @@ void RootOutputFile::book_events(const OutputModel &model, std::string_view tree } } +void RootOutputFile::set_branch_title(std::string_view branch_name, std::string_view title) { + if (!events_tree_) { + throw std::runtime_error("Events tree has not been booked"); + } + auto *branch = events_tree_->GetBranch(std::string(branch_name).c_str()); + if (!branch) { + throw std::runtime_error("Cannot set title for missing output branch: " + std::string(branch_name)); + } + branch->SetTitle(std::string(title).c_str()); +} + void RootOutputFile::fill_event(const OutputModel &model) { if (!events_tree_) { throw std::runtime_error("Events tree has not been booked"); diff --git a/src/producers/HeavyFlavBaseProducer.cpp b/src/producers/HeavyFlavBaseProducer.cpp index bfa4a7f..56f201d 100644 --- a/src/producers/HeavyFlavBaseProducer.cpp +++ b/src/producers/HeavyFlavBaseProducer.cpp @@ -113,6 +113,7 @@ void HeavyFlavBaseProducer::begin_file() { out_.branch("genWeight", 1.0f); if (config_.include_lhe_weights) { out_.branch("LHEScaleWeight", std::vector{}); + out_.branch("LHEPdfWeight", std::vector{}); } pu_weight_producer_->begin_file(out_); nlo_ew_weight_producer_->begin_file(out_); @@ -371,9 +372,13 @@ void HeavyFlavBaseProducer::fill_base_event_info(Event &event, JmeVariation vari out_.fill("jetVetoFlag", event.has("jetVetoFlag") ? event.get("jetVetoFlag") : std::int32_t{-99}); out_.fill("genWeight", event.is_mc() ? event.scalar("genWeight") : 1.0f); if (config_.include_lhe_weights) { - out_.fill("LHEScaleWeight", variation == JmeVariation::Nominal && event.has_physical_branch("LHEScaleWeight") + const auto nominal = variation == JmeVariation::Nominal; + out_.fill("LHEScaleWeight", nominal && event.has_physical_branch("LHEScaleWeight") ? event.vector("LHEScaleWeight") : std::vector{}); + out_.fill("LHEPdfWeight", nominal && event.has_physical_branch("LHEPdfWeight") + ? event.vector("LHEPdfWeight") + : std::vector{}); } pu_weight_producer_->fill(event, out_); nlo_ew_weight_producer_->fill(event, out_); diff --git a/src/producers/HeavyFlavZbbSampleProducer.cpp b/src/producers/HeavyFlavZbbSampleProducer.cpp index cd219a2..2add4a0 100644 --- a/src/producers/HeavyFlavZbbSampleProducer.cpp +++ b/src/producers/HeavyFlavZbbSampleProducer.cpp @@ -25,8 +25,8 @@ bool bool_option(const ProducerConfig &config, const std::string &key, bool fall * tagging studies. * * Event selection implemented in this producer - * - Require two corrected AK8 jets with pt > 450/200 GeV. - * - Require the two leading AK8 jets to satisfy |DeltaPhi| > pi/2. + * - Require two corrected AK8 jets with pt >= 400/200 GeV. + * - Require the two leading AK8 jets to satisfy |DeltaPhi| >= pi/2. * - Require at least two secondary vertices when require_sv_cut is enabled. */ @@ -53,7 +53,7 @@ bool HeavyFlavZbbSampleProducer::analyze_variation(Event &event, const JmeEventR apply_jme_and_select_jets(event, jme_result, variation); auto fatjets = event.get>("fatjets"); constexpr float pi = 3.14159265358979323846f; - if (fatjets.size() < 2U || fatjets[0].pt() < 450.0f || fatjets[1].pt() < 200.0f || + if (fatjets.size() < 2U || fatjets[0].pt() < 400.0f || fatjets[1].pt() < 200.0f || std::abs(delta_phi(fatjets[0], fatjets[1])) < 0.5f * pi) { return false; } diff --git a/src/producers/HeavyFlavZmmSampleProducer.cpp b/src/producers/HeavyFlavZmmSampleProducer.cpp index 73c48f1..7c2ec9b 100644 --- a/src/producers/HeavyFlavZmmSampleProducer.cpp +++ b/src/producers/HeavyFlavZmmSampleProducer.cpp @@ -36,8 +36,8 @@ void fill_sf(OutputModel &out, const std::string &name, const MuonSFResult &sf) * * Event selection implemented in this producer * - Apply the configured muon scale correction and MC resolution smearing. - * - Require exactly two isolated opposite-sign muons with pt > 60/30 GeV. - * - Require dimuon pt > 450 GeV and 70 < mass < 110 GeV. + * - Require exactly two isolated opposite-sign muons with pt >= 60/30 GeV. + * - Require dimuon pt >= 400 GeV and 70 <= mass <= 110 GeV. * - Require a corrected AK8 jet separated from both muons by DeltaR > 0.8. * - Keep only the leading separated AK8 jet for output. */ @@ -71,8 +71,28 @@ void HeavyFlavZmmSampleProducer::begin_file() { bool HeavyFlavZmmSampleProducer::analyze_common(Event &event) { auto muons = event.collection("Muon").objects(); - muon_correction_.correct(event, muons); + auto variations = muon_correction_.produce(event, muons); + event.set("muon_variations", std::move(variations)); + muon_correction_.apply(event.get("muon_variations"), JmeVariation::Nominal, muons); + prepare_common_objects(event); + + const auto candidates = {JmeVariation::Nominal, JmeVariation::MuonScaleUp, JmeVariation::MuonScaleDown, + JmeVariation::MuonSmearUp, JmeVariation::MuonSmearDown}; + bool passes_any_variation = false; + for (const auto variation : candidates) { + if (!event.is_mc() && variation != JmeVariation::Nominal) { + continue; + } + passes_any_variation = select_muons(event, variation) || passes_any_variation; + } + muons = event.collection("Muon").objects(); + muon_correction_.apply(event.get("muon_variations"), JmeVariation::Nominal, muons); + return passes_any_variation; +} +bool HeavyFlavZmmSampleProducer::select_muons(Event &event, JmeVariation variation) { + auto muons = event.collection("Muon").objects(); + muon_correction_.apply(event.get("muon_variations"), variation, muons); std::vector selected; for (auto &muon : muons) { const auto passes_id = (muon.pt() > 15.0f && muon.get("looseId")) || @@ -91,16 +111,18 @@ bool HeavyFlavZmmSampleProducer::analyze_common(Event &event) { } const auto z = selected[0].p4() + selected[1].p4(); - if (z.Pt() < 450.0 || z.M() < 70.0 || z.M() > 110.0) { + if (z.Pt() < 400.0 || z.M() < 70.0 || z.M() > 110.0) { return false; } event.set("muons", selected); event.set("leptonicZ", z); - prepare_common_objects(event); return true; } bool HeavyFlavZmmSampleProducer::analyze_variation(Event &event, const JmeEventResult &jme_result, JmeVariation variation) { + if (!select_muons(event, variation)) { + return false; + } apply_jme_and_select_jets(event, jme_result, variation); const auto &muons = event.get>("muons"); std::vector probe_jets; diff --git a/templates/condor/process.sh.in b/templates/condor/process.sh.in index 7b257ab..f013268 100644 --- a/templates/condor/process.sh.in +++ b/templates/condor/process.sh.in @@ -45,8 +45,12 @@ with open("job_manifest.json") as handle: jobs = {int(job["index"]): job for job in json.load(handle)["jobs"]} job = jobs[job_index] +sample_name = job.get("nickname") +if not isinstance(sample_name, str) or not sample_name.strip(): + raise RuntimeError("Missing sample nickname for job %d" % job_index) print("FINAL_OUTPUT=" + shlex.quote(job["output_file"])) print("INPUTS=" + shlex.quote(",".join(job["inputs"]))) +print("SAMPLE_NAME=" + shlex.quote(sample_name)) PY )" @@ -87,6 +91,7 @@ run_one_input() { --num-events "${NUM_EVENTS}" --channel "${CHANNEL}" --config "${CONFIG}" + --set "channels.${CHANNEL}.sample_name=${SAMPLE_NAME}" ) cmd+=(--variations "${VARIATIONS}") diff --git a/tests/README.md b/tests/README.md index 38597d9..bd88160 100644 --- a/tests/README.md +++ b/tests/README.md @@ -41,10 +41,32 @@ What it is meant to check: - Required output branches are present. - Event selection and key scalar/vector branch values remain compatible with the stored references. - JME variation output naming and propagation remain stable for the monitored branches. -- LHE weight copying is checked for the 2016APV MC case with `output.include_lhe_weights=true`. +- LHE scale/PDF weight copying and branch-title preservation are checked for the 2016APV MC case with `output.include_lhe_weights=true`. Some correction-dependent branches are intentionally excluded from strict value comparisons when the C++ implementation uses newer correctionlib/CMSJMECalculators behavior than the old reference production. They are still monitored for presence and reported where relevant. +## Correction equivalence tests + +Two fast CTest targets cover the correction migrations: + +```bash +ctest --test-dir build -R 'muon_external_equivalence|vjets_ewk_json' --output-on-failure +``` + +- `muon_external_equivalence` compares the old scale/smear formulas with + `MuonVariationsCalculator` for data nominal and all five MC outputs while + holding the four-input random correction and seed fixed. +- `vjets_ewk_json` compares every W/Z EWK bin and the nominal/up/down weights + between the retained ROOT references and the production correctionlib JSON + payloads, including the 100 and 6500 GeV boundaries and overflow. + +Regenerate the V+jets payloads after intentionally updating the ROOT +references with: + +```bash +python3 data/vjets-ewk/convert_root_to_json.py +``` + ## JME bundle I/O debug diagnostic This is a manual diagnostic for the JME correction inputs and outputs. It is controlled by the environment variable: diff --git a/tests/condor_sample_name_test.py b/tests/condor_sample_name_test.py new file mode 100644 index 0000000..0dccbe5 --- /dev/null +++ b/tests/condor_sample_name_test.py @@ -0,0 +1,20 @@ +import argparse +import subprocess +from pathlib import Path + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("--source-dir", required=True) + args = parser.parse_args() + + template = Path(args.source_dir) / "templates" / "condor" / "process.sh.in" + text = template.read_text() + assert 'sample_name = job.get("nickname")' in text + assert 'print("SAMPLE_NAME=" + shlex.quote(sample_name))' in text + assert '--set "channels.${CHANNEL}.sample_name=${SAMPLE_NAME}"' in text + subprocess.run(["bash", "-n", str(template)], check=True) + + +if __name__ == "__main__": + main() diff --git a/tests/muon_external_equivalence.cpp b/tests/muon_external_equivalence.cpp new file mode 100644 index 0000000..6038f83 --- /dev/null +++ b/tests/muon_external_equivalence.cpp @@ -0,0 +1,205 @@ +#include "MuonVariationsCalculator.h" + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +namespace { + +struct CrystalBall { + double mean; + double sigma; + double alpha; + double n; + + double inverse(double u) const { + constexpr double pi = 3.14159265358979323846; + const auto abs_alpha = std::abs(alpha); + const auto sqrt_pi_over_two = std::sqrt(pi / 2.0); + const auto sqrt_two = std::sqrt(2.0); + const auto exponential = std::exp(-0.5 * abs_alpha * abs_alpha); + const auto c1 = n / abs_alpha / (n - 1.0) * exponential; + const auto d1 = 2.0 * sqrt_pi_over_two * std::erf(abs_alpha / sqrt_two); + const auto norm = 1.0 / sigma / (d1 + 2.0 * c1); + const auto norm_sigma = norm * sigma; + const auto norm_c1 = norm_sigma * c1; + const auto f = 1.0 - abs_alpha * abs_alpha / n; + const auto g = sigma * n / abs_alpha; + const auto c = (d1 + 2.0 * c1) / c1; + const auto d = (d1 + 2.0 * c1) / 2.0; + const auto k = 1.0 / (n - 1.0); + const auto cdf = [&](double x) { + const auto delta = (x - mean) / sigma; + if (delta < -abs_alpha) { + return norm_c1 / std::pow(f - sigma * delta / g, n - 1.0); + } + if (delta > abs_alpha) { + return norm_c1 * (c - std::pow(f + sigma * delta / g, 1.0 - n)); + } + return norm_sigma * (d - sqrt_pi_over_two * std::erf(-delta / sqrt_two)); + }; + if (u < cdf(mean - abs_alpha * sigma)) { + return mean + g * (f - std::pow(norm_c1 / u, k)); + } + if (u > cdf(mean + abs_alpha * sigma)) { + return mean - g * (f - std::pow(c - u / norm_c1, -k)); + } + return mean - + sqrt_two * sigma * + boost::math::erf_inv((d - u / norm_sigma) / sqrt_pi_over_two); + } +}; + +double extra_k(double data, double mc) { + return data * data > mc * mc ? std::sqrt(data * data - mc * mc) : 0.0; +} + +std::vector> +legacy(const std::string &muon_file, const std::string &random_file, + const MuonVariationsCalculator::p4compv_t &pts, + const MuonVariationsCalculator::p4compv_t &etas, + const MuonVariationsCalculator::p4compv_t &phis, + const MuonVariationsCalculator::p4compv_int &charges, + const MuonVariationsCalculator::p4compv_int &layers, int seed, + bool is_mc) { + auto corrections = correction::CorrectionSet::from_file(muon_file); + auto randoms = correction::CorrectionSet::from_file(random_file); + const auto suffix = is_mc ? "mc" : "data"; + const auto a = corrections->at("a_" + std::string(suffix)); + const auto m = corrections->at("m_" + std::string(suffix)); + const auto cb = corrections->at("cb_params"); + const auto poly = corrections->at("poly_params"); + const auto kd = corrections->at("k_data"); + const auto km = corrections->at("k_mc"); + const auto random = randoms->at("stdflat"); + std::vector> out( + is_mc ? 5U : 1U, std::vector(pts.begin(), pts.end())); + + for (std::size_t i = 0; i < pts.size(); ++i) { + const auto scale = + 1.0 / + (m->evaluate({etas[i], phis[i], std::string("nom")}) / pts[i] + + charges[i] * a->evaluate({etas[i], phis[i], std::string("nom")})) / + pts[i]; + const auto scaled_pt = pts[i] * scale; + if (!is_mc) { + out[0][i] = scaled_pt; + continue; + } + + const auto abs_eta = std::abs(etas[i]); + CrystalBall crystal_ball{ + cb->evaluate({abs_eta, static_cast(layers[i]), 0}), + cb->evaluate({abs_eta, static_cast(layers[i]), 1}), + cb->evaluate({abs_eta, static_cast(layers[i]), 3}), + cb->evaluate({abs_eta, static_cast(layers[i]), 2}), + }; + const auto uniform = random->evaluate({pts[i], etas[i], phis[i], seed}); + const auto draw = crystal_ball.inverse(uniform); + const auto standard_deviation = [&](double pt) { + return std::max( + 0.0, + poly->evaluate({abs_eta, static_cast(layers[i]), 0}) + + poly->evaluate({abs_eta, static_cast(layers[i]), 1}) * + pt + + poly->evaluate({abs_eta, static_cast(layers[i]), 2}) * + pt * pt); + }; + const auto nominal_k = extra_k(kd->evaluate({abs_eta, std::string("nom")}), + km->evaluate({abs_eta, std::string("nom")})); + const auto mc_stat = km->evaluate({abs_eta, std::string("stat")}); + const auto smear_up_k = + extra_k(kd->evaluate({abs_eta, std::string("nom")}), + km->evaluate({abs_eta, std::string("nom")}) + mc_stat); + const auto smear_down_k = + extra_k(kd->evaluate({abs_eta, std::string("nom")}), + km->evaluate({abs_eta, std::string("nom")}) - mc_stat); + const auto a_stat = a->evaluate({etas[i], phis[i], std::string("stat")}); + const auto m_stat = m->evaluate({etas[i], phis[i], std::string("stat")}); + const auto rho_stat = + m->evaluate({etas[i], phis[i], std::string("rho_stat")}); + const auto scale_uncertainty = + scaled_pt * scaled_pt * + std::sqrt(m_stat * m_stat / (scaled_pt * scaled_pt) + a_stat * a_stat + + 2.0 * charges[i] * rho_stat * m_stat * a_stat / scaled_pt); + out[0][i] = + scaled_pt * (1.0 + nominal_k * standard_deviation(scaled_pt) * draw); + out[1][i] = + (scaled_pt + scale_uncertainty) * + (1.0 + + nominal_k * standard_deviation(scaled_pt + scale_uncertainty) * draw); + out[2][i] = + (scaled_pt - scale_uncertainty) * + (1.0 + + nominal_k * standard_deviation(scaled_pt - scale_uncertainty) * draw); + out[3][i] = + scaled_pt * (1.0 + smear_up_k * standard_deviation(scaled_pt) * draw); + out[4][i] = + scaled_pt * (1.0 + smear_down_k * standard_deviation(scaled_pt) * draw); + } + return out; +} + +void compare(const MuonVariationsCalculator::result_t &actual, + const std::vector> &expected) { + if (actual.size() != expected.size()) { + throw std::runtime_error("Variation count mismatch"); + } + for (std::size_t variation = 0; variation < expected.size(); ++variation) { + for (std::size_t muon = 0; muon < expected[variation].size(); ++muon) { + const auto observed = static_cast(actual.pt(variation)[muon]); + const auto reference = expected[variation][muon]; + const auto tolerance = std::max(1e-5, 1e-6 * std::abs(reference)); + if (std::abs(observed - reference) > tolerance) { + throw std::runtime_error( + "Muon output mismatch at variation " + std::to_string(variation) + + ", muon " + std::to_string(muon) + ": " + std::to_string(observed) + + " != " + std::to_string(reference)); + } + } + } +} + +} // namespace + +int main(int argc, char **argv) { + if (argc != 3) { + std::cerr << "Usage: muon_external_equivalence " + "\n"; + return 2; + } + try { + const MuonVariationsCalculator::p4compv_t pt{32.0f, 75.0f, 240.0f, 900.0f}; + const MuonVariationsCalculator::p4compv_t eta{-2.1f, -0.4f, 0.8f, 2.2f}; + const MuonVariationsCalculator::p4compv_t phi{-2.7f, -0.2f, 1.3f, 2.8f}; + const MuonVariationsCalculator::p4compv_int charge{-1, 1, -1, 1}; + const MuonVariationsCalculator::p4compv_int layers{9, 12, 15, 18}; + constexpr int seed = 123456789; + + auto mc = MuonVariationsCalculator::create(argv[1], true, true, argv[2], + "stdflat"); + const std::vector expected_labels{ + "nominal", "mesScaleup", "mesScaledown", "mesSmearup", "mesSmeardown"}; + if (mc.available() != expected_labels) { + throw std::runtime_error("Unexpected external variation labels"); + } + compare(mc.produce(pt, eta, phi, charge, layers, seed), + legacy(argv[1], argv[2], pt, eta, phi, charge, layers, seed, true)); + + auto data = MuonVariationsCalculator::create(argv[1], false, false, "", ""); + compare( + data.produce(pt, eta, phi, charge, layers, seed), + legacy(argv[1], argv[2], pt, eta, phi, charge, layers, seed, false)); + } catch (const std::exception &error) { + std::cerr << error.what() << '\n'; + return 1; + } + return 0; +} diff --git a/tests/muon_validation_test.py b/tests/muon_validation_test.py index dd1e991..a64d626 100755 --- a/tests/muon_validation_test.py +++ b/tests/muon_validation_test.py @@ -331,10 +331,16 @@ def compare_lhe_weights(expected, output, max_expected_entries=None, report=None rf, rt = tree(expected) of, ot = tree(output) try: - if "LHEScaleWeight" not in branch_names(ot): - raise AssertionError("output is missing LHEScaleWeight") - if "LHEScaleWeight" not in branch_names(rt): - raise AssertionError(f"expected source is missing LHEScaleWeight: {expected}") + branches = ("LHEScaleWeight", "LHEPdfWeight") + for branch in branches: + if branch not in branch_names(ot): + raise AssertionError(f"output is missing {branch}") + if branch not in branch_names(rt): + raise AssertionError(f"expected source is missing {branch}: {expected}") + input_title = rt.GetBranch(branch).GetTitle() + output_title = ot.GetBranch(branch).GetTitle() + if input_title != output_title: + raise AssertionError(f"{branch} title differs: expected={input_title!r} output={output_title!r}") out_entries = keyed_entries(ot) expected_keys = set(out_entries) ref_entries = {} @@ -348,21 +354,25 @@ def compare_lhe_weights(expected, output, max_expected_entries=None, report=None break missing_keys = sorted(expected_keys - set(ref_entries)) if missing_keys: - raise AssertionError(f"LHEScaleWeight expected source is missing {len(missing_keys)} output event keys") + raise AssertionError(f"LHE weight source is missing {len(missing_keys)} output event keys") common_keys = sorted(expected_keys) - compared_values = 0 + compared_values = {branch: 0 for branch in branches} for key in common_keys: rt.GetEntry(ref_entries[key]) ot.GetEntry(out_entries[key]) - ref_vals = list(getattr(rt, "LHEScaleWeight")) - out_vals = list(getattr(ot, "LHEScaleWeight")) - if len(ref_vals) != len(out_vals): - raise AssertionError(f"LHEScaleWeight length differs for event={key}: expected={len(ref_vals)} output={len(out_vals)}") - for idx, (rv, ov) in enumerate(zip(ref_vals, out_vals)): - compared_values += 1 - if abs(float(ov) - float(rv)) > 1.0e-6 + 1.0e-6 * abs(float(rv)): - raise AssertionError(f"LHEScaleWeight differs for event={key} index={idx}: expected={rv} output={ov}") - line = f"LHEScaleWeight copied from input: common_events={len(common_keys)} values={compared_values}" + for branch in branches: + ref_vals = list(getattr(rt, branch)) + out_vals = list(getattr(ot, branch)) + if len(ref_vals) != len(out_vals): + raise AssertionError(f"{branch} length differs for event={key}: expected={len(ref_vals)} output={len(out_vals)}") + for idx, (rv, ov) in enumerate(zip(ref_vals, out_vals)): + compared_values[branch] += 1 + if abs(float(ov) - float(rv)) > 1.0e-6 + 1.0e-6 * abs(float(rv)): + raise AssertionError(f"{branch} differs for event={key} index={idx}: expected={rv} output={ov}") + line = "LHE weights copied from input: common_events=%d %s" % ( + len(common_keys), + " ".join(f"{branch}={compared_values[branch]}" for branch in branches), + ) if report: report.line(line) else: diff --git a/tests/vjets_ewk_json_test.py b/tests/vjets_ewk_json_test.py new file mode 100644 index 0000000..e15d7e1 --- /dev/null +++ b/tests/vjets_ewk_json_test.py @@ -0,0 +1,80 @@ +#!/usr/bin/env python3 + +import argparse +import math +from pathlib import Path + +import ROOT +from correctionlib import CorrectionSet + + +CASES = ( + ("WJetsCorr_collection_ewk", "evj_pTV_EW", "evj"), + ("ZJetsCorr_collection_ewk", "eej_pTV_EW", "eej"), +) + + +def close(left, right): + return math.isclose(left, right, rel_tol=0.0, abs_tol=1e-12) + + +def check_case(directory, stem, correction_name, prefix): + root_file = ROOT.TFile.Open(str(directory / f"{stem}.root"), "READ") + correction = CorrectionSet.from_file(str(directory / f"{stem}.json.gz"))[correction_name] + names = { + "nominal": f"{prefix}_pTV_kappa_EW", + "d1": f"{prefix}_pTV_d1kappa_EW", + "d2": f"{prefix}_pTV_d2kappa_EW", + "d3": f"{prefix}_pTV_d3kappa_EW", + } + histograms = {variation: root_file.Get(name) for variation, name in names.items()} + + for variation, histogram in histograms.items(): + for index in range(1, histogram.GetNbinsX() + 1): + pt = histogram.GetXaxis().GetBinCenter(index) + expected = histogram.GetBinContent(index) + observed = correction.evaluate(pt, variation) + if not close(expected, observed): + raise AssertionError(f"{stem} {variation} bin {index}: {expected} != {observed}") + + def root_value(histogram, pt): + if pt < 100.0: + return 0.0 + lookup = math.nextafter(pt, 0.0) if pt == 6500.0 else pt + return histogram.GetBinContent(histogram.GetXaxis().FindFixBin(lookup)) + + def json_value(variation, pt): + if pt < 100.0: + return 0.0 + lookup = math.nextafter(pt, 0.0) if pt == 6500.0 else pt + return correction.evaluate(lookup, variation) + + for pt in (99.0, 100.0, 6500.0, math.nextafter(6500.0, math.inf), 7000.0): + root_values = [root_value(histograms[variation], pt) for variation in names] + json_values = [json_value(variation, pt) for variation in names] + if any(not close(left, right) for left, right in zip(root_values, json_values)): + raise AssertionError(f"{stem} boundary pt={pt}: {root_values} != {json_values}") + root_weight = 1.0 + root_values[0] + root_uncertainty = 0.5 * abs(root_values[0]) + json_weight = 1.0 + json_values[0] + json_uncertainty = 0.5 * abs(json_values[0]) + for left, right in ( + (root_weight, json_weight), + (root_weight + root_uncertainty, json_weight + json_uncertainty), + (root_weight - root_uncertainty, json_weight - json_uncertainty), + ): + if not close(left, right): + raise AssertionError(f"{stem} weight pt={pt}: {left} != {right}") + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("--source-dir", type=Path, required=True) + args = parser.parse_args() + directory = args.source_dir / "data/vjets-ewk/2023-08-11" + for case in CASES: + check_case(directory, *case) + + +if __name__ == "__main__": + main()