3 from __future__
import print_function
14 rules = [ line.strip().split()
for line
in open(slim_file_name) ]
15 good_rules = [ rule
for rule
in rules
17 or (len(rule)>0
and rule[0].startswith(
"#"))
18 or (len(rule)>=2
and (rule[0]==
"keep" or rule[0]==
"drop")) ]
19 bad_rules = [ rule
for rule
in rules
if rule
not in good_rules ]
20 good_rules = [ rule
for rule
in good_rules
if len(rule)>=2 ]
21 for rule
in bad_rules:
26 matched_rules = [ rule
for rule
in rules
if fnmatch.fnmatch(branch, rule[1]) ]
27 return len(matched_rules)==0
or matched_rules[-1][0] ==
"keep" 30 input_file_names = [ (f, os.path.getsize(f))
for f
in input_file_names ]
32 input_file_names.sort(key=
lambda f: f[1], reverse=
True)
34 input_file_names = [ f[0]
for f
in input_file_names ]
36 return input_file_names
38 def slimNtuple(slim_file_name, output_file_name, input_file_names, keep_existing, test_mode):
39 print(
" INPUT FILES:",input_file_names,
"\n")
40 print(
" OUTPUT FILE:",output_file_name,
"\n")
41 print(
" RULES FILE:",slim_file_name,
"\n")
43 if keep_existing
and os.path.exists(output_file_name):
44 print(
"Keeping pre-existing "+output_file_name+
"\n")
47 in_tree = ROOT.TChain(
"tree",
"tree")
51 for input_file_name
in input_file_names:
52 in_tree.Add(input_file_name)
54 branch_names = [ branch.GetName()
for branch
in in_tree.GetListOfBranches() ]
56 kept_branches = [ branch
for branch
in branch_names
if passRules(branch, rules) ]
58 dropped_branches = [ branch
for branch
in branch_names
if branch
not in kept_branches ]
59 dropped_branches.sort()
61 print(
"DROPPED BRANCHES:",dropped_branches,
"\n")
62 print(
" KEPT BRANCHES:",kept_branches,
"\n")
65 for branch
in branch_names:
66 if branch
in kept_branches: in_tree.SetBranchStatus(branch,
True)
67 else: in_tree.SetBranchStatus(branch,
False)
70 in_tree.Merge(output_file, 0,
"fast keep")
72 if __name__ ==
"__main__":
73 parser = argparse.ArgumentParser(description=
"Prunes branches from an ntuple",
74 formatter_class=argparse.ArgumentDefaultsHelpFormatter)
75 parser.add_argument(
"-t",
"--test", action=
"store_true",
76 help=
"Run in test mode, quickly diplaying the list of kept and dropped branchs without actually copying the trees.")
77 parser.add_argument(
"-k",
"--keep_existing", action=
"store_true",
78 help=
"Do not overwrite output file if it already exists.")
79 parser.add_argument(
"slim_file",
80 help=
"File containing rules for pruning branches (one rule per line). Rules are are the form \"keep XXX\" or \"drop YYY\". Unix shell-style wildcards (e.g., '*') allow pattern matching. Branches are kept by default if no matching rule is found for the branch. If multiple rules match, the last takes precedence.")
81 parser.add_argument(
"output_file",
82 help=
"File in which to save the slimmed and merged ntuple.")
83 parser.add_argument(
"input_files", nargs=
"+",
84 help=
"Files containing ntuples to be slimmed and merged.")
85 args = parser.parse_args()
87 slimNtuple(args.slim_file, args.output_file, args.input_files, args.keep_existing, args.test)
def passRules(branch, rules)
def getRules(slim_file_name)
def sortInputFilesBySize(input_file_names)
def slimNtuple(slim_file_name, output_file_name, input_file_names, keep_existing, test_mode)