Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
import uproot
import awkward as ak
import numpy as np
import argparse
import sys

def main():
    # Argument parsing
    parser = argparse.ArgumentParser(description="Process a NanoAOD ROOT file.")
    parser.add_argument("filename", help="Path to the NanoAOD ROOT file")
    args = parser.parse_args()

    file_path = args.filename
    tree_name = "Events"

    # Open the ROOT file and load the TTree
    try:
        with uproot.open(file_path) as file:
            tree = file[tree_name]
            print(tree.keys())

            events = tree.arrays(library="ak")
            print("Fields:", "\n\t".join(events[0].fields))
    except Exception as e:
        print(f"Error opening file or reading tree: {e}")
        sys.exit(1)

    # Event loop
    for i, event in enumerate(events):
        print(f"Processing event {i}")
        print("Found {} tracksters".format(event.ntracksters))
        for t_idx in range(event.ntracksters):
            offset = event.tracksters_overtices[t_idx]
            count = event.tracksters_nvertices[t_idx]
            vertices = event.vertices_vertices[offset : offset + count]
            vertex_multiplicity = event.vertices_vertex_mult[offset : offset + count]
            print(
                t_idx,
                list(zip(vertices, vertex_multiplicity)),
                event.tracksters_raw_energy[t_idx],
            )

        print("Exploring connections, scores, and sharedEnergy")
        print("Connections for {} objects".format(event.nSimTS2TSMergeByHits))

        try:  # Offset pattern
            offset = 0
            for obj_idx in range(event.nSimTS2TSMergeByHits - 1):
                next_offset = event.SimTS2TSMergeByHits_oSimTS2TSMergeByHitsLinks[
                    obj_idx + 1
                ]
                elements = event.SimTS2TSMergeByHitsLinks_index[offset:next_offset]
                scores = event.SimTS2TSMergeByHitsLinks_score[offset:next_offset]
                sharedEnergy = event.SimTS2TSMergeByHitsLinks_shardEnergy[
                    offset:next_offset
                ]
                if len(elements) > 0:
                    print("Offset ", obj_idx, elements, scores, sharedEnergy)
                offset = next_offset
        except AttributeError as e:
            print(f"An AttributeError occurred (Offset): {e}")

        try:  # Count pattern
            offset = 0
            for obj_idx in range(event.nSimTS2TSMergeByHits):
                count = event.SimTS2TSMergeByHits_nSimTS2TSMergeByHitsLinks[obj_idx]
                elements = event.SimTS2TSMergeByHitsLinks_index[offset : offset + count]
                scores = event.SimTS2TSMergeByHitsLinks_score[offset : offset + count]
                sharedEnergy = event.SimTS2TSMergeByHitsLinks_sharedEnergy[
                    offset : offset + count
                ]
                if len(elements) > 0:
                    print("Count ", obj_idx, elements, scores, sharedEnergy)
                offset += count
        except AttributeError as e:
            print(f"An AttributeError occurred (Count): {e}")

        try:
            for i in range(event.nSimCl2CPWithFraction):
                print(
                    "SimCl {} is linked to CP {} with fraction {}".format(
                        i,
                        event.SimCl2CPWithFraction_index[i],
                        event.SimCl2CPWithFraction_fraction[i],
                    )
                )
        except AttributeError as e:
            print(f"An AttributeError occurred (SimCl2CPWithFraction): {e}")

if __name__ == "__main__":
    main()