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.1.3.dev1.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.1.3.dev1-cp313-cp313-win_amd64.whl (135.6 kB view details)

Uploaded CPython 3.13Windows x86-64

uproot_custom-1.1.3.dev1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (165.6 kB view details)

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

uproot_custom-1.1.3.dev1-cp313-cp313-macosx_11_0_arm64.whl (136.6 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

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

Uploaded CPython 3.12Windows x86-64

uproot_custom-1.1.3.dev1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (165.4 kB view details)

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

uproot_custom-1.1.3.dev1-cp312-cp312-macosx_11_0_arm64.whl (136.5 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

uproot_custom-1.1.3.dev1-cp311-cp311-win_amd64.whl (134.9 kB view details)

Uploaded CPython 3.11Windows x86-64

uproot_custom-1.1.3.dev1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (165.2 kB view details)

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

uproot_custom-1.1.3.dev1-cp311-cp311-macosx_11_0_arm64.whl (135.7 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

uproot_custom-1.1.3.dev1-cp310-cp310-win_amd64.whl (134.3 kB view details)

Uploaded CPython 3.10Windows x86-64

uproot_custom-1.1.3.dev1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (164.3 kB view details)

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

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

Uploaded CPython 3.10macOS 11.0+ ARM64

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

Uploaded CPython 3.9Windows x86-64

uproot_custom-1.1.3.dev1-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (164.3 kB view details)

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

uproot_custom-1.1.3.dev1-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.1.3.dev1.tar.gz.

File metadata

  • Download URL: uproot_custom-1.1.3.dev1.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.1.3.dev1.tar.gz
Algorithm Hash digest
SHA256 8de9d48d6c273bba88dc0802d955bbe817e2571a28ecda7c9abb67c95c32c4c0
MD5 75f75999a27524a0164fc5fb4236147e
BLAKE2b-256 6e14bb30dda46cf8314b5aa053fe69b809868012fefd5db075368c3dff1fb48f

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for uproot_custom-1.1.3.dev1-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 f93c555b783669196567e55aa4638f7e2b32f59fcdcee30a71539a9a268c01d3
MD5 41d6cbbae657dab6b38094c0242b867d
BLAKE2b-256 829f271877858280110e0e8ad9732212b13b1a71523f3b77f81dc491f1ab5046

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for uproot_custom-1.1.3.dev1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 2db4e8c221e98bc8fe748a5ad1f6b78156307acba36ab50b6b33dab35218a6b9
MD5 ad7393e8a8984680319b65da2cadd715
BLAKE2b-256 92d29ef34eb5cb3e9e0ad3d29bb586d99156bd8df19b41896816628763d98179

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for uproot_custom-1.1.3.dev1-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5abd7273791854178d4caf906b4884294e4bb529b023ef4ce5180960559cd9ab
MD5 48aaf9d644fcc3bf4471e58782bec560
BLAKE2b-256 9132f8cd563e93e13548a25cf8b8ce72f8a1194d22e790e7c70201784d32960e

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for uproot_custom-1.1.3.dev1-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 0842e222c495d0cb7527dbf5f74f390dfaef5bf7caf999d05da2343bb6f77637
MD5 24f15073eb1e6d4dc9828f9dca650c9d
BLAKE2b-256 33e1153ca7d77c50cd3655a248770e1b571fc7f2ae2210c6a07d7347dfb3c1bd

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for uproot_custom-1.1.3.dev1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 754b1262a692b7158fc5c1c69e121a5006d4880535de5ad01adc8bd13f6ef973
MD5 566c496167d617d048d4f2ace9c03ef0
BLAKE2b-256 94f46b5663013e70ebc72acb4f339fb7e2f68bbe6a049129c39ec30b5c404c18

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for uproot_custom-1.1.3.dev1-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a2749d576c2236526963b016f8e5c317264119b32f3d1db4e1b3ed587d7c3c53
MD5 87b834030c33fe866d19442d40b46729
BLAKE2b-256 2c5b5b5d06eb77558ed6f5f9ba080c5461fff74e6a4f988cd0bac4756b13a991

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for uproot_custom-1.1.3.dev1-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 caf0900b4f8083356b15dddf3bcbdf97520b8a14aa31ed7ce7df7b5a09df9452
MD5 bdd741c6f53db03dfbe799afc39ba5fc
BLAKE2b-256 b91b157bfce4a58c5ffe1e61328af63c012a0be990992684d3f29d391416ea1c

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for uproot_custom-1.1.3.dev1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 4f25c259f5f1a19ae93f026110aca0ffeaa8d952f87364f78f5e0dea4d3d7d3b
MD5 e331b1f23e4667ae659915fa0deccb3a
BLAKE2b-256 cf3a95a21651d8a02c41de42cd7159b53ad9b317139aecbd4e94d9f34775e3c2

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for uproot_custom-1.1.3.dev1-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ccde65d5e3861b5d421a58f39e632d38eb1348a2b29542f4f626f6ebfc643459
MD5 82197d369980fea5197d7517c2e2bc19
BLAKE2b-256 dcbc0f0734d2a6453d072ab056656c0c2ba06bf1f52528028a43cdc3aeb2f3e7

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for uproot_custom-1.1.3.dev1-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 e4e91f864da88ea8ce8b9cf87f46933b742d73f77606e6ed92bc2ca0211f6295
MD5 71d7d3cb6468b86338f64d453acbb9fc
BLAKE2b-256 8589b1cc021e3a8012a5626639a7353993368bf489ec19ec2734d53e99dc8c73

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for uproot_custom-1.1.3.dev1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 d0557198c6c420d41539a5fd16f7a84c0d3d68558570029bda3afb12199c80e4
MD5 af95cf8518014735233888ea6ef185b7
BLAKE2b-256 9c80d64516b0012ed18e449aebc5ea97e5107c96915fecb72e9579e5fe91cb56

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for uproot_custom-1.1.3.dev1-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c25b473128e6ce79bd1079556949cf3a3c31cb8d7ef0b96e61c900d6d605c8d4
MD5 c55653f5b6f4cd0ae744d42ae78cffe8
BLAKE2b-256 3222f51b37fa075de952b9b66e2d213a316252d9ee4c1d088e13d07489cf3119

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for uproot_custom-1.1.3.dev1-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 b9a8d87f445d843b939fd7b7baef14375eb8cce66b72045ffe54505c2ce07096
MD5 575b7fda7a9a2cf9f8a510b69b786555
BLAKE2b-256 8c69334f938a06cff57ebf3038a2844b1f2923a0b2b06b7e7086fde42b7fc90e

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for uproot_custom-1.1.3.dev1-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 d1460a363b9257a202710769c9a567a9f86599fea34929f78342938ac2ca6cc6
MD5 a1b3773a6d4a6452f33d25aed5ca550d
BLAKE2b-256 bd65fc8e5da9a00ab412dabbc39dc9e20ea25dbfe981a2f8fb1fbfbb23373900

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for uproot_custom-1.1.3.dev1-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 29a80ef651652f3de43058255c535b74e5b898b45a0eac61bdec560c3f2c5bd0
MD5 ef5bdb46b14b232c02e0f7a87600ade4
BLAKE2b-256 d260f79eee6001a0a73abe28b604a96fa49ac2908fcdea834e2129ff9b36a351

See more details on using hashes here.

Provenance

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