Source code for uproot_custom.utils

from __future__ import annotations

import re

import uproot.behaviors.TBranch


[docs] def regularize_object_path(object_path: str) -> str: return re.sub(r";[0-9]+", r"", object_path)
_title_has_dims = re.compile(r"^([^\[\]]*)(\[[^\[\]]+\])+") _item_dim_pattern = re.compile(r"\[([1-9][0-9]*)\]") _item_any_pattern = re.compile(r"(\[.*\])")
[docs] def get_dims_from_branch( branch: uproot.behaviors.TBranch.TBranch, ) -> tuple[tuple[int, ...], bool]: leaf = branch.member("fLeaves")[0] title = leaf.member("fTitle") dims, is_jagged = (), False m = _title_has_dims.match(title) if m is not None: dims = tuple(int(x) for x in re.findall(_item_dim_pattern, title)) if dims == () and leaf.member("fLen") > 1: dims = (leaf.member("fLen"),) if any( _item_dim_pattern.match(x) is None for x in re.findall(_item_any_pattern, title) ): is_jagged = True return dims, is_jagged
[docs] def get_top_type_name(type_name: str) -> str: if type_name.endswith("*"): type_name = type_name[:-1].strip() type_name = type_name.replace("std::", "").strip() return type_name.split("<")[0]
[docs] def get_sequence_element_typename(type_name: str) -> str: """ Get the element type name of a vector type. e.g. vector<vector<int>> -> vector<int> """ type_name = type_name.replace("std::", "").replace("< ", "<").replace(" >", ">").strip() lt_idx = -1 gt_idx = -1 stack_level = 0 for i, c in enumerate(type_name): if c == "<": stack_level += 1 if stack_level == 1: lt_idx = i if c == ">": stack_level -= 1 if stack_level == 0: gt_idx = i break if lt_idx == -1 or gt_idx == -1: raise ValueError(f"Invalid sequence type name: {type_name}") if gt_idx != len(type_name) - 1: raise ValueError(f"Invalid sequence type name: {type_name}") return type_name[lt_idx + 1 : gt_idx]
[docs] def get_map_key_val_typenames(type_name: str) -> tuple[str, str]: """ Get the key and value type names of a map type. e.g. map<int, vector<int>> -> (int, vector<int>) """ type_name = type_name.replace("std::", "").replace("< ", "<").replace(" >", ">").strip() lt_idx = -1 gt_idx = -1 split_idx = -1 stack_level = 0 for i, c in enumerate(type_name): if c == "<": stack_level += 1 if stack_level == 1: lt_idx = i if c == "," and stack_level == 1: split_idx = i if c == ">": stack_level -= 1 if stack_level == 0: gt_idx = i break if lt_idx == -1 or gt_idx == -1 or split_idx == -1: raise ValueError(f"Invalid map type name: {type_name}") if gt_idx != len(type_name) - 1: raise ValueError(f"Invalid map type name: {type_name}") key_type = type_name[lt_idx + 1 : split_idx].strip() val_type = type_name[split_idx + 1 : gt_idx].strip() return key_type, val_type