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 of this repository.

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.

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.1.0.tar.gz (58.0 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.1.0-cp313-cp313-win_amd64.whl (133.2 kB view details)

Uploaded CPython 3.13Windows x86-64

uproot_custom-1.1.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (162.0 kB view details)

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

uproot_custom-1.1.0-cp313-cp313-macosx_11_0_arm64.whl (137.4 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

uproot_custom-1.1.0-cp312-cp312-win_amd64.whl (133.2 kB view details)

Uploaded CPython 3.12Windows x86-64

uproot_custom-1.1.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (161.8 kB view details)

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

uproot_custom-1.1.0-cp312-cp312-macosx_11_0_arm64.whl (137.3 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

uproot_custom-1.1.0-cp311-cp311-win_amd64.whl (132.2 kB view details)

Uploaded CPython 3.11Windows x86-64

uproot_custom-1.1.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (161.7 kB view details)

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

uproot_custom-1.1.0-cp311-cp311-macosx_11_0_arm64.whl (135.9 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

uproot_custom-1.1.0-cp310-cp310-win_amd64.whl (131.8 kB view details)

Uploaded CPython 3.10Windows x86-64

uproot_custom-1.1.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (160.8 kB view details)

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

uproot_custom-1.1.0-cp310-cp310-macosx_11_0_arm64.whl (134.4 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

uproot_custom-1.1.0-cp39-cp39-win_amd64.whl (131.2 kB view details)

Uploaded CPython 3.9Windows x86-64

uproot_custom-1.1.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (161.0 kB view details)

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

uproot_custom-1.1.0-cp39-cp39-macosx_11_0_arm64.whl (134.5 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

File details

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

File metadata

  • Download URL: uproot_custom-1.1.0.tar.gz
  • Upload date:
  • Size: 58.0 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.1.0.tar.gz
Algorithm Hash digest
SHA256 5013f83215bab0ee4e0a1fb216cd149deb0442a3f60ada7ab4bf2a0f30d02d4a
MD5 b2e441d53469476f1c4e27376cf40d6a
BLAKE2b-256 ace0c9c81d0e87ece6a54d5e4befb1f64a6716cf5098424602d52561c4785551

See more details on using hashes here.

Provenance

The following attestation bundles were made for uproot_custom-1.1.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.1.0-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for uproot_custom-1.1.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 a60ea4a7ada2e1e44e671b455cb6e3674ce30d06367852f73338735ac6f37923
MD5 58e1f566d364b94a3ca7203fba01ccbf
BLAKE2b-256 5c3bb05d82840448fa1cfda22d277a8e094aa287cb4a1869e5e7162549679b54

See more details on using hashes here.

Provenance

The following attestation bundles were made for uproot_custom-1.1.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.1.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for uproot_custom-1.1.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 8c4f8b45516f6b01252f35949723de032f17eb64a37462355c20b9cac3967ee2
MD5 20a684409e61c843e02bc437b29e025b
BLAKE2b-256 2a03fb5ed49a3d97a5c52798824a932844242c2b7a6bd610e4462dbf7e6a7096

See more details on using hashes here.

Provenance

The following attestation bundles were made for uproot_custom-1.1.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.1.0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for uproot_custom-1.1.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 50ff4b439620d6fa5adc6c6ed772a81fbf4aee44e86e48a041402758dfc1070b
MD5 2774ab0a92927161e20a04c22cb1e592
BLAKE2b-256 1a3930bf46aa884ed1e289e5ec73a160d0fe54988bde3f5821fe342cd43e2d85

See more details on using hashes here.

Provenance

The following attestation bundles were made for uproot_custom-1.1.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.1.0-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for uproot_custom-1.1.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 959dc3b60113a17deca9fb2aa5a97b43317fe055756ddac44e770cdc524705fa
MD5 545a5ce55b93bd80a99e9144a8ac3f0a
BLAKE2b-256 6989d16db3b475fcc4e98ee096f39a5ead03c7befcff682ff7194a48394867df

See more details on using hashes here.

Provenance

The following attestation bundles were made for uproot_custom-1.1.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.1.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for uproot_custom-1.1.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 f41219d3d84e74c003852d03b307b531d4991f931200a5e822cb5a2f6aafc7fb
MD5 d02a7b42a1c054a646c44bd4353a1e4d
BLAKE2b-256 50dd5e05e00f857d6665be4f3a498aa70fd5d1140d9fa340744d0ead272c9773

See more details on using hashes here.

Provenance

The following attestation bundles were made for uproot_custom-1.1.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.1.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for uproot_custom-1.1.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 1b00ff8ccb98b3b9242037eb514202466d14834f92178366394d61976a674ef9
MD5 b106cbc1ba78ed911155bd926da5dd45
BLAKE2b-256 00420d3aee4f30f12deb8aeef863a4ac70586fdded58e9c7bda258b71930fe01

See more details on using hashes here.

Provenance

The following attestation bundles were made for uproot_custom-1.1.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.1.0-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for uproot_custom-1.1.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 c5d6fc12f399d43fcf657609bf22434a43cf45688921e8a312278075ffc5b712
MD5 9571b3095efa8ca4e1751489402dae90
BLAKE2b-256 4d3f3e52f23a55c368a1f822a277f30731f01aea70917f5eaefefd15c860d419

See more details on using hashes here.

Provenance

The following attestation bundles were made for uproot_custom-1.1.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.1.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for uproot_custom-1.1.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 f1e057e3a8f9c26db04049aea5521a2e5ceb86ae887c781c4a30e29bcc1a8a33
MD5 68126795c144be2fc63bc90863a1cfc4
BLAKE2b-256 818529e17aefa1d4b6a1fc2323b6fc79234454af9d5a5698ffd347ae3ecfa4dc

See more details on using hashes here.

Provenance

The following attestation bundles were made for uproot_custom-1.1.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.1.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for uproot_custom-1.1.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f7ac59d588d10c0267001a4c9b020e682a1b76bc6372cd8ac93b9693613a283c
MD5 7dad8b1ca2f02ffd389f7b174673ac71
BLAKE2b-256 8eca2130676e4b4baf900b974ae55c4655706587bf5d09bb82e913d5b788e233

See more details on using hashes here.

Provenance

The following attestation bundles were made for uproot_custom-1.1.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.1.0-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for uproot_custom-1.1.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 1272a8292aeffd7314e0a115aa5f657029605216952270b5bd1d9347fda6344d
MD5 b0d559c2f6b91886256d515c6b982703
BLAKE2b-256 ec6d218e700443722ee0a88a3491f625141a42f07c6addec38b59a783b2377a3

See more details on using hashes here.

Provenance

The following attestation bundles were made for uproot_custom-1.1.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.1.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for uproot_custom-1.1.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e859f2b13f6ff301c3c6f2da77c691022d9e423e977b6f6156f4f5cb9e028ccb
MD5 9dc0d9b6eeb53ffb6af8c266d7b1fa87
BLAKE2b-256 b67bc27ebd02999f80ecace08a97884074d41aedba12641000bafcf54408d38a

See more details on using hashes here.

Provenance

The following attestation bundles were made for uproot_custom-1.1.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.1.0-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for uproot_custom-1.1.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4914f4bd308da0b0052d641048f535683289df39bc91f13f26743f96835214a9
MD5 0a74c2aa08beaa7b79d2549611b03b3d
BLAKE2b-256 aa9b48f103753ddae832ee55c3bde14cf24891839ff5a1972ee00fa59f6ab69a

See more details on using hashes here.

Provenance

The following attestation bundles were made for uproot_custom-1.1.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.1.0-cp39-cp39-win_amd64.whl.

File metadata

File hashes

Hashes for uproot_custom-1.1.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 f113a79949d4a765716c1e93f48a9cf9321306e8bf91a964af9740a99153d04d
MD5 4558de6c4bbedea16e56f98aa7d873da
BLAKE2b-256 2bcd032cee27a52499b149387b5308982db25b649015f99a5e91a9e02ccffa1c

See more details on using hashes here.

Provenance

The following attestation bundles were made for uproot_custom-1.1.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.1.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for uproot_custom-1.1.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 ba5b0bf60efa619d36b204058f1af9c7e76675f90bc2bb8bcfe5518c1287397f
MD5 836b9b3d21ac7aa23ac76d31da1d90de
BLAKE2b-256 04bcc3ce92966b7e36373c0e1fb6e48eeafcbf688260136990841011817d9f9b

See more details on using hashes here.

Provenance

The following attestation bundles were made for uproot_custom-1.1.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.1.0-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for uproot_custom-1.1.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6eaba6965df6f6f57b687a1cd6bf8c8faad7656a3a94b364f8559951076e3d01
MD5 5ab2af2fcc4fb74152071dc5ccc80af4
BLAKE2b-256 053b1fcf2353af5c859154b0c508ba24493a6a61435f78c2d8b068e1d1e63633

See more details on using hashes here.

Provenance

The following attestation bundles were made for uproot_custom-1.1.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