Step 2 ntuples with babymaker
babymaker is a part of the pyBabyMaker library. Please refer to the
official document for its command line
usage and internal APIs.
Generating a C++ file with babymaker
The general idea is that babymaker takes:
- A
YAMLfile as configuration, denote ascfg_yml - A C++ "template" that
babymakercan work on, denote ascpp_tmpl - Main ntuple file that you want to work on, denote as
main_ntp - Optionally many friend ntuples that have part of their tree structures
identical to that of the main, denote as
friend_ntp1,friend_ntp2, ...
To generate our final C++ file:
babymaker -i <cfg_yml> -n <main_ntp> -f <friend_ntp1> <friend_ntp2> ... -o <output_cpp> -t <cpp_tmpl>
Next, the following shell snippet should be enough to get generated C++ compiled in this repo:
DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" &> /dev/null && pwd)"
HEADER_DIR=$DIR/../../include
COMPILER=$(root-config --cxx)
CXX_FLAGS=$(root-config --cflags)
LINK_FLAGS=$(root-config --libs)
ADDF_FLAGS="-I${HEADER_DIR}"
cpp_compile() {
${COMPILER} -O2 ${CXX_FLAGS} ${ADDF_FLAGS} -o baby baby.cpp ${LINK_FLAGS}
# -O2 is the optimization level flag
}
cpp_compile # assuming generated C++ file is named 'baby.cpp'
The actual usage of compiled baby depends on your C++ "template".
How does babymaker work, internally?
Internally babymaker really does 2 things (conceptually):
-
Directive generation: Figure out needed branches based on input ntuples and YML file and define output in a way that the branch dependencies are resolved properly.
Internally, a
directiveis generated and passed to the next step. -
C++ generation: The
directivefrom the previous step is passed to a general macro processor, similar tojekyll.Based on the input C++ template, the
directiveis implemented in a C++ output file.