Справка по формату конфигурации NextStat
стабильно
NextStat использует блочный текстовый формат конфигурации для описания статистического анализа. Формат совместим с конфигами TRExFitter (общая часть), но при этом является полноценной частью NextStat, а не «прослойкой» ради совместимости.
Быстрый старт
# Режим NTUP: построить workspace из ROOT ntuple (TTree)
nextstat import trex-config --config analysis.config --output workspace.json
# Режим HIST: импортировать существующий экспорт HistFactory
nextstat import trex-config --config analysis.config --output workspace.json
# Один шаг: построить гистограммы и workspace
nextstat build-hists --config analysis.config --out-dir output/
# Полный пайплайн через analysis spec (YAML)
nextstat run --config analysis.yaml
Синтаксис
# Комментарии: '#', '//' или '%' (с учетом кавычек)
Key: Value
Key: "quoted value with # inside"
Region: SR
Variable: mbb
Binning: 0, 50, 100, 200
Sample: signal
Тип: SIGNAL
File: data/signal.root
- Все ключи регистронезависимы (
ReadFrom, readfrom, READFROM эквивалентны) - Значения могут быть в кавычках или без
- Списки задаются в нескольких форматах:
a, b, c / [a, b, c] / a; b; c - Блоки начинаются с
ТипБлока: name и продолжаются до следующего заголовка блока - Блоки могут быть вложенными: Sample внутри Region, Systematic внутри Sample
Режимы
| Режим | Описание |
|---|
| NTUP (по умолчанию) | Построить гистограммы из ROOT ntuple (TTree), затем сконвертировать в pyhf workspace |
| HIST | Импортировать существующий HistFactory XML-экспорт с опциональной фильтрацией |
Глобальные ключи
Ключи верхнего уровня (вне блоков) или внутри блока Job:.
| Ключ | Алиасы | По умолчанию | Описание |
|---|
| ReadFrom | — | NTUP | Режим импорта (NTUP | HIST) |
| TreeName | Tree, NtupleName | "events" | Имя TTree по умолчанию в ROOT-файлах |
| Measurement | — | "meas" | Имя measurement (соответствует pyhf measurement) |
| POI | Poi | "mu" | Параметр интереса (POI) |
| HistoPath | HistPath, ExportDir | — | Директория HistFactory-экспорта (режим HIST) |
| CombinationXml | HistFactoryXml | — | Путь к combination.xml (режим HIST) |
Блок Region
Region: SR
Variable: mbb
Binning: 0, 50, 100, 150, 200, 300
Selection: njet >= 4
| Ключ | Алиасы | Обязательный | Описание |
|---|
| Variable | Var | да | Переменная для гистограммирования. Может включать биннинг inline |
| Binning | BinEdges | да* | Границы бинов. Не нужно, если биннинг задан в Variable |
| Selection | Cut | нет | Выражение отбора (запись проходит, если выражение > 0) |
| Weight | — | нет | Вес на уровне региона (умножается на веса сэмплов) |
| DataFile | — | нет | ROOT-файл с наблюдаемыми данными |
| DataTreeName | DataTree | нет | Имя TTree для файла данных |
Форматы Variable + Binning
# Inline (в строке): равномерный биннинг
Variable: "jet_pt", 10, 0, 100 # 10 бинов от 0 до 100
# Inline (в строке): явные границы
Variable: "jet_pt", 0, 50, 100, 200, 500
# Отдельные ключи:
Variable: jet_pt
Binning: 0, 50, 100, 200, 500
Блок Sample
Sample: ttbar
Тип: BACKGROUND
File: data/ttbar.root
Weight: weight_mc * weight_sf
Regions: SR; CR
NormFactor: mu_ttbar
StatError: true
| Ключ | Алиасы | Обязательный | Описание |
|---|
| Type | — | нет | SIGNAL, BACKGROUND или DATA (если не задано, тип выводится из имени) |
| File | Path, NtupleFile | да (NTUP) | Путь к ROOT-файлу |
| NtupleFiles | — | нет | Альтернатива File; используется первый элемент |
| TreeName | Tree | нет | Переопределение имени TTree для этого сэмпла |
| Weight | MCweight | нет | Выражение веса на уровне сэмпла |
| Selection | Cut | нет | Отбор на уровне сэмпла |
| Regions | — | нет | Список регионов, где участвует сэмпл (по умолчанию: все) |
| NormFactor | — | нет | Имя свободного нормировочного параметра (может повторяться) |
| NormSys | — | нет | Нормировочная систематика: "name lo hi" (может повторяться) |
| StatError | — | нет | Включить побиновые статистические неопределенности (Barlow-Beeston) |
Блок Systematic
Четыре типа: norm, weight, tree, histo.
Общие ключи (для всех типов)
| Ключ | Тип | Описание |
|---|
| Type | enum | norm, weight, tree или histo (если опущено, тип определяется автоматически) |
| Samples | list | Целевые сэмплы (по умолчанию: родительский сэмпл при вложении) |
| Regions | list | Целевые регионы (по умолчанию: все) |
Тип: norm
Systematic: lumi
Тип: norm
Samples: all
Lo: 0.98
Hi: 1.02
| Ключ | Алиасы | Описание |
|---|
| Lo | Down | Множитель для down (например 0.95 = −5%) |
| Hi | Up | Множитель для up (например 1.05 = +5%) |
| OverallUp | — | Альтернатива: up-сдвиг |
| OverallDown | — | Альтернатива: down-сдвиг |
Тип: weight
Systematic: btag
Тип: weight
Samples: ttbar
WeightUp: weight_btag_up
WeightDown: weight_btag_down
Три способа задать веса (в порядке приоритета):
| Способ | Ключи | Пример |
|---|
| Прямые выражения | WeightUp, WeightDown | WeightUp: weight_btag_up |
| Готовые множители | WeightSufUp, WeightSufDown | WeightSufUp: weight_btag_up |
| Сборка по суффиксу | WeightBase + WeightUpSuffix + WeightDownSuffix | WeightBase: weight_btag / WeightUpSuffix: _up |
Тип: tree
Systematic: jer
Тип: tree
Samples: signal
FileUp: data/signal_jer_up.root
FileDown: data/signal_jer_down.root
| Ключ | Алиасы | Описание |
|---|
| FileUp | UpFile, Up | ROOT-файл с up-вариацией |
| FileDown | DownFile, Down | ROOT-файл с down-вариацией |
| TreeName | Tree | Имя TTree в файлах вариаций |
Тип: histo
Systematic: model
Тип: histo
Samples: signal
HistoNameUp: signal_model_up
HistoNameDown: signal_model_down
| Ключ | Алиасы | Описание |
|---|
| HistoNameUp | HistoUp, NameUp | Имя TH1 для up-вариации |
| HistoNameDown | HistoDown, NameDown | Имя TH1 для down-вариации |
| HistoFileUp | HistoPathUp, FileUp | ROOT-файл (по умолчанию: файл сэмпла) |
| HistoFileDown | HistoPathDown, FileDown | ROOT-файл (по умолчанию: файл сэмпла) |
Блок NormFactor
NormFactor: mu_ttbar
Samples: ttbar
Nominal: 1.0
Min: 0.0
Max: 10.0
| Ключ | По умолчанию | Описание |
|---|
| Samples | все MC-сэмплы | Сэмплы, к которым применяется фактор |
| Title | — | Отображаемое имя |
| Nominal | 1.0 | Начальное (номинальное) значение |
| Min | — | Нижняя граница |
| Max | — | Верхняя граница |
| Constant | false | Если true, параметр фиксирован (не фитится) |
Язык выражений
Поля Variable, Selection и Weight используют выражения, которые компилируются в байткод:
| Функция | Синтаксис | Пример |
|---|
| Арифметика | +, -, *, / | pt * 0.001 |
| Сравнение | ==, !=, <, <=, >, >= | njet >= 4 |
| Логика | &&, ||, ! | njet >= 4 && met > 200 |
| Тернарный оператор | cond ? a : b | pt > 100 ? 1.0 : 0.5 |
| Функции | abs, sqrt, log, log10, exp, sin, cos, pow, min, max, atan2 | sqrt(met) |
| Статический индекс | branch[N] | jet_pt[0] |
| Динамический индекс | branch[expr] | jet_pt[njet - 1] |
| Имена веток | идентификаторы, точки | jet_pt, el.pt |
Вложенность и область действия блоков
Region: SR
Variable: mbb
Binning: 0, 50, 100, 200
Sample: signal # переопределение только для этого региона
Weight: weight_mc * 1.1 # меняет вес только в SR
Systematic: jes_sr_only # применяется только к "signal" в "SR"
Тип: norm
Lo: 0.95
Hi: 1.05
Sample: signal # определение верхнего уровня
Тип: SIGNAL
File: data/signal.root
Weight: weight_mc
- Systematic внутри Sample →
Samples по умолчанию берется из родительского Sample - Sample внутри Region → создает регион-специфичное переопределение и объединяется с Sample верхнего уровня
- Systematic внутри Region →
Regions по умолчанию берется из родительского Region
Режим HIST
ReadFrom: HIST
HistoPath: path/to/histfactory_export
# Опционально: фильтровать по выбранным регионам/сэмплам
Region: SR
Region: CR_ttbar
Sample: signal
Sample: ttbar
HistoPath или CombinationXml указывает на экспорт HistFactory- Блоки Region и Sample работают как фильтры: сохраняются только перечисленные элементы
- Ключи Variable, Binning, File и Weight не требуются
- Систематики импортируются из XML, не переопределяются
Отчеты покрытия
# Отчет по неизвестным атрибутам
nextstat import trex-config --config analysis.config \
--output workspace.json \
--coverage-json coverage.json
# Отчет по компиляции выражений
nextstat import trex-config --config analysis.config \
--output workspace.json \
--expr-coverage-json expr_coverage.json
- Отчет покрытия: каждый нераспознанный ключ с номером строки и областью блока
- Отчет по выражениям: скомпилированные выражения, требуемые ветки, ошибки компиляции
Analysis Spec (обертка YAML)
$schema: https://nextstat.ru/schemas/trex/analysis_spec_v0.schema.json
schema_version: trex_analysis_spec_v0
inputs:
mode: trex_config_txt
trex_config_txt:
config_path: analysis.config
base_dir: null
execution:
determinism: { threads: 1, parity: true }
import:
enabled: true
output_json: workspace.json
fit:
enabled: true
output_json: fit.json
profile_scan:
enabled: true
start: 0.0
stop: 5.0
points: 21
output_json: scan.json
nextstat run --config analysis.yaml
nextstat validate --config analysis.yaml # только проверка схемы
Полный пример (NTUP)
ReadFrom: NTUP
TreeName: nominal
Measurement: meas
POI: mu_sig
# ── Regions ──────────────────────────────
Region: SR
Variable: mbb
Binning: 0, 50, 100, 150, 200, 300, 500
Selection: njet >= 4 && nbtag >= 2
Region: CR_ttbar
Variable: mbb
Binning: 0, 100, 200, 500
Selection: njet >= 4 && nbtag == 1
# ── Samples ──────────────────────────────
Sample: data
Тип: DATA
File: data/data.root
Sample: signal
Тип: SIGNAL
File: data/signal.root
Weight: weight_mc * weight_pileup
NormFactor: mu_sig
StatError: true
Sample: ttbar
Тип: BACKGROUND
File: data/ttbar.root
Weight: weight_mc * weight_pileup
Regions: SR; CR_ttbar
NormFactor: mu_ttbar
StatError: true
# ── Systematics ──────────────────────────
Systematic: lumi
Тип: norm
Samples: signal; ttbar
Lo: 0.98
Hi: 1.02
Systematic: jes
Тип: weight
Samples: signal; ttbar
WeightUp: weight_jes_up
WeightDown: weight_jes_down
Systematic: btag
Тип: weight
Samples: signal; ttbar
WeightBase: weight_btag
WeightUpSuffix: _up
WeightDownSuffix: _down
Systematic: ttbar_gen
Тип: tree
Samples: ttbar
FileUp: data/ttbar_gen_up.root
FileDown: data/ttbar_gen_down.root
NormFactor: mu_ttbar
Samples: ttbar
Nominal: 1.0
Min: 0.0
Max: 10.0