Skip to main content

uproot extension for reading custom classes

Project description

uproot-custom

This is a prototype repository of an extension that allows uproot to read custom classes from ROOT files.

uproot can already read some custom classes directly. However, in some cases, custom classes are too complex for uproot to read, such as when their Streamer methods are overridden or some specific data members are not supported by uproot.

This extension privides a Reader interface and allows you to read such custom classes by providing your own Reader. The Reader interface defines how to read the data members of a class from the binary stream.

Design overview

In ROOT, data are stored in a tree structure. For example, when a custom class is defined as:

class TMySubClass : public TObject {
    int m_index;
    float m_x;
};

class TMyClass : public TObject {
    double m_energy;
    std::vector<MySubClass> m_daughters;
};

The data tree is:

graph TD
    A([TMyClass]) --> B(double m_energy)
    A --> C(std::vector&lt;TMySubClass&gt; m_daughters)
    C --> D([TMySubClass])
    D --> E(int m_index)
    D --> F(float m_x)

To handle the tree-like data structure, Reader is introduced. It consists of Python and C++ parts. The Python part is responsible for generating the information tree, constructing C++ readers, and reconstructing data to awkward array. The C++ part is responsible for reading the data members of the class from the binary stream.

Generate information tree

uproot can read these structure information from the ROOT file, but not in tree format. So the first step is to generate an information tree from the ROOT file. The information tree is a nested structure that contains the data members of the class, including types, names and children if any.

Construct C++ readers

According to the information tree, we can instantiate C++ readers and combine them into a tree structure. The top reader drives its sub-readers to read data recursively. After the reading process, readers obtain the results from their sub-readers recursively, then the top reader returns the final result.

Reconstruct data to awkward array

Since embedding arrays together into awkward array in C++ is not straightforward, we left this task to Python. After the C++ reader returns the result, we can reconstruct the data into awkward array according to the information tree.

Predefined readers

uproot-custom provides some predefined readers for common ROOT classes:

Reader Description
BasicTypeReader Reads basic types like int, float, double, etc.
TObjectReader Skip TObject header when reading classes that inherit from TObject.
TStringReader Reads TString
STLSeqReader Reads std::vector, std::array, etc.
STLMapReader Reads std::map, std::unordered_map, etc.
STLStringReader Reads std::string
TArrayReader Reads TArray types like TArrayI, TArrayF, TArrayD, etc.
ObjectReader Reads custom classes that inherit from TObject.
CArrayReader Reads C-style arrays like int[]
EmptyReader A reader that does nothing. Some branches may not have any data, and the information of the corresponding class will not be stored in the ROOT file. In this case, EmptyReader is used to skip the branch.

Implement your own Reader

Full example

A complete example of how to impolement your own readers is available in the example directory. You can also refer to the Python part and C++ part of predefined readers for implementation details.

Pre-requisites

Make sure you have GCC>13.1/Clang>=16.0.0/MSVC>=19.31, cmake installed on your system.

  1. Create a Python project and install uproot-custom:

    mkdir my_reader
    cd my_reader
    python3 -m venv .venv
    source .venv/bin/activate
    pip install uproot-custom
    
  2. Create a pyproject.toml file in the root directory of your project:

    [build-system]
    requires = ["scikit-build-core>=0.11", "pybind11>=2.10.0", "uproot-custom"]
    build-backend = "scikit_build_core.build"
    
    [project]
    name = "my-reader"
    requires-python = ">=3.9"
    dependencies = ["uproot-custom"]
    version = "0.1.0"
    
    [tool.scikit-build]
    wheel.packages = ["my_reader"]
    build-dir = "build/{wheel_tag}"
    cmake.source-dir = "cpp"
    cmake.build-type = "Debug" # Comment for release builds
    
    [tool.black]
    exclude = "/(build|dist|env|.git|.tox|.eggs|.venv)/"
    line-length = 95
    target-version = ['py39', 'py310', 'py311', 'py312', 'py313']
    

    you can change the name, version, and other fields as you like.

    [!WARNING] If you are releasing the project, specify concrete major and minor versions of uproot-custom to ensure the header files are compatible. For example, use uproot-custom~=1.2 instead of uproot-custom>=1.2 (may not be compatible with future versions).

Reader interface

For a custom Reader, a C++ part and a Python part are both required.

For C++ part, the constructor must inherit from IElementReader, and these methods must be implemented:

  • void read(BinaryBuffer& buffer): Read data from the binary buffer.
  • py::object data() const: Return the data as a Python object. You can return anything defined in pybind11, such as py::tuple, py::list, py::array_t, etc.

For Python part, the class must inherit from uproot_custom.BaseReader and implement the following class methods:

  • gen_tree_config: Generate a configuration dictionary for the reader based on the information tree. It should return a dictionary if you want your reader to be used, otherwise return None.
  • get_cpp_reader: Identify the tree configuration and return the C++ reader instance if it matches, otherwise return None.
  • reconstruct_array: Reconstruct the raw data to an awkward array according to the tree configuration.

Implement the C++ reader

  1. Create a cpp directory in the root directory of your project, and create a my_reader.cc file in it.

  2. In my_reader.cc, include the necessary headers and implement your reader class. For example:

    #include "uproot-custom/uproot-custom.hh"
    using namespace uproot;
    
    class MyReader : public IElementReader {
        public:
            // Must at least receive a name
            MyReader( std::string name )
                : IElementReader(name), m_data( std::make_shared<std::vector<int>>() ) {}
    
            // Implement these methods
            void read( BinaryBuffer& buffer ) {
                // Read data from the buffer
                // Implement your reading logic here
            }
    
            py::object data() const {
                // Return the data as a Python object
                return make_array( m_data );
            }
    
        private:
            const std::string m_name;
            std::shared_ptr<std::vector<int>> m_data; // Example data member
    };
    

    then declare the C++ module in the same file:

    PYBIND11_MODULE( my_reader_cpp, m ) {
        register_reader<MyReader>(m, "MyReader");
    }
    

    if the constructor requires more parameters, register it with the constructor signature (except the name):

    // Constructor signature:
    MyReader( std::string name, bool param1, std::vector<IElementReader> sub_readers )
    
    // Register the reader with the constructor signature:
    PYBIND11_MODULE( my_reader_cpp, m ) {
        register_reader<MyReader, bool, std::vector<IElementReader>>(m, "MyReader");
    }
    

[!IMPORTANT] Use std::shared_ptr for data members in your reader class, as uproot-custom will manage the memory of the data members. This is important to avoid memory leaks and ensure proper cleanup.

  1. Create a CMakeLists.txt file in cpp directory:

    cmake_minimum_required(VERSION 3.20)
    
    if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.27)
        cmake_policy(SET CMP0148 NEW)
    endif()
    
    set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
    set(CMAKE_CXX_STANDARD 20)
    
    project(${SKBUILD_PROJECT_NAME}
        VERSION ${SKBUILD_PROJECT_VERSION}
        LANGUAGES CXX
    )
        
    set(PYBIND11_NEWPYTHON ON)
    find_package(pybind11 REQUIRED)
    find_package(uproot-custom REQUIRED)
    
    pybind11_add_module(my_reader_cpp
        my_reader.cc
        # Add other source files here if needed
    )
    
    target_link_libraries(my_reader_cpp PRIVATE uproot-custom)
    
    if(DEFINED SKBUILD_PROJECT_NAME)
        install(
            TARGETS my_reader_cpp
            LIBRARY DESTINATION ${SKBUILD_PROJECT_NAME}
        )
    endif()
    

Implement the Python reader

  1. Create a my_reader directory in the root directory of your project, and create a __init__.py file in it.

  2. In __init__.py, import the C++ module and implement your Python reader class:

    from . import my_reader_cpp as _cpp
    from uproot_custom import BaseReader
    
    
    class MyReader(BaseReader):
        @classmethod
        def gen_tree_config(
            cls,
            top_type_name: str,
            cls_streamer_info: dict,
            all_streamer_info: dict,
            item_path: str = "",
        ) -> dict | None:
            """
            Identify the node in the information tree,
            return the configuration dictionary if the node is matched,
            otherwise return None.
            """
    
        @classmethod
        def get_cpp_reader(cls, tree_config) -> _cpp.MyReader | None:
            """
            Identify the tree_config,
            if it is matched, return the C++ reader instance,
            otherwise return None.
            """
    
        @classmethod
        def reconstruct_array(cls, raw_data, tree_config):
            """
            Reconstruct the raw data to an `awkward` array according to the tree_config.
            """
    

    ![NOTE] The @classmethod is not necesarry, but when a regular member method is used, you should pass the instance of the class to registered_readers.

Register the reader

Register branch path

The default interpretation uproot_custom.AsCustom needs to know which branch to read with custom readers. You can export the branch path with:

import uproot
from uproot_custom import regularize_object_path

f = uproot.open("my_file.root")
branch = f["path/to/my_branch"]

print(regularize_object_path(branch.object_path))

This will print the regularized object path like /my_tree:my_branch. Then you can add it to the AsCustom.target_branches set:

from uproot_custom import AsCustom

AsCustom.target_branches.add("your-branch-path")

Register the reader

To let uproot_custom.AsCustom know your reader, you need to register it:

from uproot_custom import registered_readers
from my_reader import MyReader

registered_readers.add(MyReader)

Then you can use uproot to read the custom class as usual.

[!TIP] It is recommended to do the registration in your project __init__.py, so that you can use your custom reader as long as you import your project.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

uproot_custom-1.2.0.tar.gz (70.6 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

uproot_custom-1.2.0-cp313-cp313-win_amd64.whl (135.6 kB view details)

Uploaded CPython 3.13Windows x86-64

uproot_custom-1.2.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (165.5 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

uproot_custom-1.2.0-cp313-cp313-macosx_11_0_arm64.whl (136.5 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

uproot_custom-1.2.0-cp312-cp312-win_amd64.whl (135.6 kB view details)

Uploaded CPython 3.12Windows x86-64

uproot_custom-1.2.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (165.3 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

uproot_custom-1.2.0-cp312-cp312-macosx_11_0_arm64.whl (136.4 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

uproot_custom-1.2.0-cp311-cp311-win_amd64.whl (134.8 kB view details)

Uploaded CPython 3.11Windows x86-64

uproot_custom-1.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (165.1 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

uproot_custom-1.2.0-cp311-cp311-macosx_11_0_arm64.whl (135.6 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

uproot_custom-1.2.0-cp310-cp310-win_amd64.whl (134.2 kB view details)

Uploaded CPython 3.10Windows x86-64

uproot_custom-1.2.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (164.2 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

uproot_custom-1.2.0-cp310-cp310-macosx_11_0_arm64.whl (134.3 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

uproot_custom-1.2.0-cp39-cp39-win_amd64.whl (133.9 kB view details)

Uploaded CPython 3.9Windows x86-64

uproot_custom-1.2.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (164.2 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

uproot_custom-1.2.0-cp39-cp39-macosx_11_0_arm64.whl (134.4 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

File details

Details for the file uproot_custom-1.2.0.tar.gz.

File metadata

  • Download URL: uproot_custom-1.2.0.tar.gz
  • Upload date:
  • Size: 70.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for uproot_custom-1.2.0.tar.gz
Algorithm Hash digest
SHA256 7e848adf7484972d2f771d831f01e82f5a928c0a81070394d2d75946e44be777
MD5 98c77a4735fc478967e94c5a39bc3ff0
BLAKE2b-256 86c1c896576436733468c68b29bda43886a88c57a0d9ceff37be06ba21805f18

See more details on using hashes here.

Provenance

The following attestation bundles were made for uproot_custom-1.2.0.tar.gz:

Publisher: python-publish.yml on mrzimu/uproot-custom

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file uproot_custom-1.2.0-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for uproot_custom-1.2.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 402d7304ccd8b7d37fc590a385482c26e030d7089b1c06e9aa11fabd10b7c389
MD5 cfec9ece9085f855b6473b85210e654c
BLAKE2b-256 d12ecd7ab5be1391272ea511e1548966837a2926fd5d55b0da86b4a56ab0dff2

See more details on using hashes here.

Provenance

The following attestation bundles were made for uproot_custom-1.2.0-cp313-cp313-win_amd64.whl:

Publisher: python-publish.yml on mrzimu/uproot-custom

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file uproot_custom-1.2.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for uproot_custom-1.2.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 2af5dbf9555a412734e05f06b46a864932f56886936f8e786f96cda3e3fe6887
MD5 5162b52a05100bd17c5a3c844894ee45
BLAKE2b-256 38281455719188676fb9b1aebf89b84e2070872c2d1c9cc6717bf85e0c110069

See more details on using hashes here.

Provenance

The following attestation bundles were made for uproot_custom-1.2.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: python-publish.yml on mrzimu/uproot-custom

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file uproot_custom-1.2.0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for uproot_custom-1.2.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 15212beab2e45392e7cf89e33d110f6da6e460b806fb61ce6727332b27b66f07
MD5 6097126206ff0b84801c81223c907820
BLAKE2b-256 2bb8941ef1b5a93781c4db5187f2c2e1abde754f90d493ec1f3adb90366e9e14

See more details on using hashes here.

Provenance

The following attestation bundles were made for uproot_custom-1.2.0-cp313-cp313-macosx_11_0_arm64.whl:

Publisher: python-publish.yml on mrzimu/uproot-custom

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file uproot_custom-1.2.0-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for uproot_custom-1.2.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 699b36ad08a59b6a8699dafa43cfd376cd2fdeb30190a31263829453d48257ce
MD5 a85d0ad15f9fe8c699a3f9463daf34a3
BLAKE2b-256 a32c9ba685a8aba9375d8aa1e6090a23a5e90e72fdf24e4c327d8312b9359516

See more details on using hashes here.

Provenance

The following attestation bundles were made for uproot_custom-1.2.0-cp312-cp312-win_amd64.whl:

Publisher: python-publish.yml on mrzimu/uproot-custom

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file uproot_custom-1.2.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for uproot_custom-1.2.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 1ea70252fb51c3fc120224c1fa4003a084e48492539fd223dadae8d8d1c027cd
MD5 2825175ede98a25c7d4e893473f201cc
BLAKE2b-256 c7b99003a899eda3e11ae9b193959f12ba4976e681a4b766c603c44b2254f8b5

See more details on using hashes here.

Provenance

The following attestation bundles were made for uproot_custom-1.2.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: python-publish.yml on mrzimu/uproot-custom

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file uproot_custom-1.2.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for uproot_custom-1.2.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e2ad28460ce4b61c39c349d99001831167a7bf8619378fdd07edffeb9e25cf4f
MD5 a6d9e43d21382523bacbfc1364ba3949
BLAKE2b-256 4158f026e5fd4875fe2d13fcf8d3f53213f6615abb58969378714f9423694c9c

See more details on using hashes here.

Provenance

The following attestation bundles were made for uproot_custom-1.2.0-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: python-publish.yml on mrzimu/uproot-custom

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file uproot_custom-1.2.0-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for uproot_custom-1.2.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 c0b94cd6658c25f177ba946d4a2a973e694f27fb7c7ec2de7059eea9d56168a8
MD5 209e41d47c32e674a3ef9174f410a03b
BLAKE2b-256 3283cade7d07e2bcceaa6f3002898c24e12ff1d124a1c71bf93af7b4f37a7e18

See more details on using hashes here.

Provenance

The following attestation bundles were made for uproot_custom-1.2.0-cp311-cp311-win_amd64.whl:

Publisher: python-publish.yml on mrzimu/uproot-custom

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file uproot_custom-1.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for uproot_custom-1.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 4434097ca8956191297cad53fcf772fd73b24ef2f891a0a640f7011ad9f71095
MD5 973c56d598cf5ba35bc06c3f478eb41f
BLAKE2b-256 a10f9b293749c789d52f22b647003d1518f5f892cd9330ffb653f342b2c501c1

See more details on using hashes here.

Provenance

The following attestation bundles were made for uproot_custom-1.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: python-publish.yml on mrzimu/uproot-custom

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file uproot_custom-1.2.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for uproot_custom-1.2.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a9d39965bbfd3e7058f3bc67275ec199d9efd5cb4ac3601ddda0551262456b4b
MD5 a49f3f755fb95fbf1838adc730bf88f8
BLAKE2b-256 dc3045f58f030720f56bc137669cb44c50d61151eaf6c66a48ef41e90c72a8a8

See more details on using hashes here.

Provenance

The following attestation bundles were made for uproot_custom-1.2.0-cp311-cp311-macosx_11_0_arm64.whl:

Publisher: python-publish.yml on mrzimu/uproot-custom

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file uproot_custom-1.2.0-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for uproot_custom-1.2.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 0a7f7932b347d58fc8ed0b92e79f7847346a30974e5a66218d1380c9d859e642
MD5 721fe28d12e6ea0c8f71953f0e3b3e21
BLAKE2b-256 106ec17f678e46a7e5f407bf9be973705a46347947dc484605dd773c6333f847

See more details on using hashes here.

Provenance

The following attestation bundles were made for uproot_custom-1.2.0-cp310-cp310-win_amd64.whl:

Publisher: python-publish.yml on mrzimu/uproot-custom

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file uproot_custom-1.2.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for uproot_custom-1.2.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 3265d66de123eb0b9b617a2f16700332452a71abba6c604541a8c47ad4f8d677
MD5 8c6ed44d83522b1ea4efbdb23c5dafb6
BLAKE2b-256 82783e8145d600fcfda9f8ac978a8bbec694db531da558686c3ea9d5291db829

See more details on using hashes here.

Provenance

The following attestation bundles were made for uproot_custom-1.2.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: python-publish.yml on mrzimu/uproot-custom

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file uproot_custom-1.2.0-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for uproot_custom-1.2.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 46d760469247324fd1d9cc9366c3d36da71915b4c50f9f19af9d2c103c0974de
MD5 7c958de74bf80d3ca081d1a1a137d838
BLAKE2b-256 27637faab78ab2280f61e20eda1732031b818e8296826078eb1030620b317597

See more details on using hashes here.

Provenance

The following attestation bundles were made for uproot_custom-1.2.0-cp310-cp310-macosx_11_0_arm64.whl:

Publisher: python-publish.yml on mrzimu/uproot-custom

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file uproot_custom-1.2.0-cp39-cp39-win_amd64.whl.

File metadata

File hashes

Hashes for uproot_custom-1.2.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 b34e30165d1cc89a4366a498aec287495c63b597e863b98f7f1afd694287d3c1
MD5 5bf458bba873af772b9fe396c46f9f1e
BLAKE2b-256 e0ab6eacd0ed130f991d9bee8b3cbbf197cf96c5d94faa70373cbf4d78eb5b91

See more details on using hashes here.

Provenance

The following attestation bundles were made for uproot_custom-1.2.0-cp39-cp39-win_amd64.whl:

Publisher: python-publish.yml on mrzimu/uproot-custom

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file uproot_custom-1.2.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for uproot_custom-1.2.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 6e3e0824f3c0f11087e5ca81b7d1c97e63c27da142a08b2946a213f48e296cd8
MD5 8c2d90a98a92e62e040c7cd668202d10
BLAKE2b-256 e6b39df25eae446e2c12af1411052d71a0a50e5754e3d0daa9f5c6f5edcd4377

See more details on using hashes here.

Provenance

The following attestation bundles were made for uproot_custom-1.2.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: python-publish.yml on mrzimu/uproot-custom

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file uproot_custom-1.2.0-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for uproot_custom-1.2.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6654273f6b31d87fbba1cad7aff70c30f2ef9189c60b2ee4a78b11ecf420f205
MD5 38d051274cb055f6e0f09e454aa77975
BLAKE2b-256 fb12ef59b74c430a8d34ed137d5ad89ddb219c9a969a3c95f984ea5f8a8709ec

See more details on using hashes here.

Provenance

The following attestation bundles were made for uproot_custom-1.2.0-cp39-cp39-macosx_11_0_arm64.whl:

Publisher: python-publish.yml on mrzimu/uproot-custom

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page