Example: Converting a Text Config to YAML
This example demonstrates how to convert an existing text config to YAML format.
Original Text Config (config.txt)
directory=/home/user/data
saveFile=/home/user/output/results.root
saveDirectory=/home/user/output/
saveTree=Events
threads=-1
antiglobs=output.root,hists.root
globs=root,test
saveConfig=cfg/output.txt
bdtConfig=cfg/bdts.txt
correctionConfig=cfg/corrections.txt
triggerConfig=cfg/triggers.txt
floatConfig=cfg/floats.txt
intConfig=cfg/ints.txt
Equivalent YAML Config (config.yaml)
directory: /home/user/data
saveFile: /home/user/output/results.root
saveDirectory: /home/user/output/
saveTree: Events
threads: "-1"
antiglobs: output.root,hists.root
globs: root,test
saveConfig: cfg/output.yaml
bdtConfig: cfg/bdts.txt
correctionConfig: cfg/corrections.yaml
triggerConfig: cfg/triggers.txt
floatConfig: cfg/floats.txt
intConfig: cfg/ints.txt
Vector Config Example
Text format (output.txt)
jet_pt
jet_eta
jet_phi
muon_pt
muon_eta
electron_pt
YAML format (output.yaml)
- jet_pt
- jet_eta
- jet_phi
- muon_pt
- muon_eta
- electron_pt
Multi-Key Config Example
Text format (corrections.txt)
file=corrections.json name=muonSF type=weight inputVariables=pt,eta
file=corrections.json name=electronSF type=weight inputVariables=pt,eta
file=jec.json name=jetCorrection type=variation inputVariables=pt,eta,phi
YAML format (corrections.yaml)
- file: corrections.json
name: muonSF
type: weight
inputVariables: pt,eta
- file: corrections.json
name: electronSF
type: weight
inputVariables: pt,eta
- file: jec.json
name: jetCorrection
type: variation
inputVariables: pt,eta,phi
Using YAML Configs
From C++
#include <ConfigurationManager.h>
// Auto-detects YAML format from .yaml extension
ConfigurationManager config("config.yaml");
// Use exactly as before
std::string directory = config.get("directory");
int threads = std::stoi(config.get("threads"));
// Parse nested configs
auto corrections = config.parseMultiKeyConfig(
"cfg/corrections.yaml",
{"file", "name", "type", "inputVariables"}
);
auto outputs = config.parseVectorConfig("cfg/output.yaml");
From Python
from submission_backend import read_config, write_config
# Read YAML config
config = read_config("config.yaml")
# Access values
directory = config['directory']
threads = int(config['threads'])
# Modify and write back (preserves YAML format)
config['threads'] = '4'
write_config(config, "config.yaml")
Generate Submission Files
# Using YAML config - output will also be YAML
python core/python/generateSubmissionFilesNANO.py \
-c analysis_config.yaml \
-n my_analysis \
-s 30 \
-x /path/to/x509 \
-e ./build/analyzer
# The generated submit_config.yaml in each job directory
# will also be in YAML format
Benefits of YAML
- More readable: Hierarchical structure is clearer
- Better for complex configs: Easier to see relationships
- Comments: Can add descriptive comments anywhere
- Type preservation: Numbers and strings are properly typed
- Lists and nested structures: Native support for complex data
Conversion Script
You can create a simple script to convert existing configs:
#!/usr/bin/env python3
import sys
from submission_backend import read_config, write_config
if len(sys.argv) != 3:
print("Usage: convert_config.py input.txt output.yaml")
sys.exit(1)
config = read_config(sys.argv[1])
write_config(config, sys.argv[2])
print(f"Converted {sys.argv[1]} to {sys.argv[2]}")
Usage:
python convert_config.py config.txt config.yaml