27def convert_tree_to_rntuple(input_file, tree_name, output_file, ntuple_name) -> bool:
28 """
29 Convert a TTree to RNTuple format.
30
31 Args:
32 input_file: Path to input ROOT file containing TTree
33 tree_name: Name of the TTree to convert
34 output_file: Path to output ROOT file for RNTuple
35 ntuple_name: Name for the output RNTuple
36 """
37 print("Converting TTree → RNTuple")
38 print(f" Input: {input_file}:{tree_name}")
39 print(f" Output: {output_file}:{ntuple_name}")
40 print()
41
42 with ROOT.TFile.Open(input_file, "READ") as input_root_file:
43 tree = input_root_file.Get(tree_name)
44 if not tree:
45 print(f"ERROR: Tree '{tree_name}' not found in {input_file}")
46 print("Available trees:")
47 for key in input_root_file.GetListOfKeys():
48 obj = key.ReadObj()
49 if obj.InheritsFrom("TTree"):
50 print(f" - {key.GetName()}")
51 return False
52
53 num_entries = tree.GetEntries()
54 print(f"Found TTree '{tree_name}' with {num_entries} entries")
55 print()
56
57
58 try:
59 importer = ROOT.ROOT.Experimental.RNTupleImporter.Create(input_file, tree_name, output_file)
60
61 if not importer:
62 print("ERROR: Failed to create RNTupleImporter")
63 return False
64
65
66 importer.SetNTupleName(ntuple_name)
67
68
69
70
71
72 print("Starting conversion...")
73 importer.Import()
74
75 print("✓ Conversion complete!")
76 print()
77
78
79 with ROOT.TFile.Open(output_file, "READ"):
80 reader = ROOT.ROOT.RNTupleReader.Open(ntuple_name, output_file)
81 num_rntuple_entries = reader.GetNEntries()
82
83 print("Verification:")
84 print(f" TTree entries: {num_entries}")
85 print(f" RNTuple entries: {num_rntuple_entries}")
86
87 if num_entries == num_rntuple_entries:
88 print(" ✓ Entry count matches")
89 else:
90 print(" ✗ WARNING: Entry count mismatch!")
91
92 return True
93
94 except Exception as e:
95 print(f"ERROR: Exception during conversion: {e}")
96 import traceback
97
98 traceback.print_exc()
99 return False
100
101