uproot 5.3.3__tar.gz → 5.3.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {uproot-5.3.3 → uproot-5.3.4}/.pre-commit-config.yaml +2 -2
- {uproot-5.3.3 → uproot-5.3.4}/PKG-INFO +1 -1
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/_util.py +3 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/behaviors/TBranch.py +4 -2
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/interpretation/objects.py +17 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/models/RNTuple.py +133 -91
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/models/TArray.py +1 -1
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/models/TRef.py +1 -1
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/version.py +2 -2
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0008_start_interpretation.py +2 -1
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0416_writing_compressed_data.py +14 -7
- uproot-5.3.4/tests/test_1191_rntuple_fixes.py +83 -0
- {uproot-5.3.3 → uproot-5.3.4}/.all-contributorsrc +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/.github/ISSUE_TEMPLATE/bug-report.md +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/.github/ISSUE_TEMPLATE/documentation.md +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/.github/ISSUE_TEMPLATE/feature-request.md +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/.github/dependabot.yml +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/.github/workflows/build-distributions.yml +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/.github/workflows/build-test.yml +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/.github/workflows/deploy.yml +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/.github/workflows/semantic-pr-title.yml +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/.github/workflows/upload-nightly-wheels.yml +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/.gitignore +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/.readthedocs.yml +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/CITATION.cff +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/LICENSE +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/README.md +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/dev/example-objects.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/dev/make-models.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/docs-img/diagrams/abstraction-layers.png +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/docs-img/diagrams/abstraction-layers.svg +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/docs-img/diagrams/example-dask-graph.png +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/docs-img/diagrams/uproot-awkward-timeline.png +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/docs-img/diagrams/uproot-awkward-timeline.svg +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/docs-img/logo/logo-300px-white.png +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/docs-img/logo/logo-300px.png +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/docs-img/logo/logo-600px.png +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/docs-img/logo/logo.svg +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/docs-img/photos/switcheroo.jpg +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/docs-sphinx/_templates/breadcrumbs.html +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/docs-sphinx/basic.rst +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/docs-sphinx/conf.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/docs-sphinx/index.rst +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/docs-sphinx/make_changelog.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/docs-sphinx/prepare_docstrings.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/docs-sphinx/requirements.txt +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/docs-sphinx/uproot3-to-4.rst +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/pyproject.toml +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/__init__.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/_awkwardforth.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/_dask.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/behavior.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/behaviors/RooCurve.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/behaviors/RooHist.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/behaviors/TAxis.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/behaviors/TBranchElement.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/behaviors/TDatime.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/behaviors/TGraph.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/behaviors/TGraphAsymmErrors.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/behaviors/TGraphErrors.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/behaviors/TH1.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/behaviors/TH2.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/behaviors/TH2Poly.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/behaviors/TH3.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/behaviors/TParameter.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/behaviors/TProfile.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/behaviors/TProfile2D.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/behaviors/TProfile3D.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/behaviors/TTree.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/behaviors/__init__.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/cache.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/compression.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/const.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/containers.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/deserialization.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/dynamic.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/exceptions.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/extras.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/interpretation/__init__.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/interpretation/grouped.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/interpretation/identify.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/interpretation/jagged.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/interpretation/library.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/interpretation/numerical.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/interpretation/strings.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/language/__init__.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/language/python.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/model.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/models/TAtt.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/models/TBasket.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/models/TBranch.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/models/TClonesArray.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/models/TDatime.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/models/TGraph.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/models/TH.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/models/THashList.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/models/TLeaf.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/models/TList.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/models/TMatrixT.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/models/TNamed.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/models/TObjArray.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/models/TObjString.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/models/TObject.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/models/TString.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/models/TTable.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/models/TTime.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/models/TTree.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/models/__init__.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/pyroot.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/reading.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/serialization.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/sink/__init__.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/sink/file.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/source/__init__.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/source/chunk.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/source/cursor.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/source/file.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/source/fsspec.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/source/futures.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/source/http.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/source/object.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/source/s3.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/source/xrootd.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/streamers.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/writing/__init__.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/writing/_cascade.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/writing/_cascadentuple.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/writing/_cascadetree.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/writing/_dask_write.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/writing/identify.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/src/uproot/writing/writable.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/__init__.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/conftest.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/samples/h_dynamic.pkl +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0001_source_class.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0006_notify_when_downloaded.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0007_single_chunk_interface.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0009_nested_directories.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0010_start_streamers.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0011_generate_classes_from_streamers.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0013_rntuple_anchor.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0014_all_ttree_versions.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0016_interpretations.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0017_multi_basket_multi_branch_fetch.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0018_array_fetching_interface.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0022_number_of_branches.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0023_more_interpretations_1.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0023_ttree_versions.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0028_fallback_to_read_streamer.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0029_more_string_types.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0031_test_stl_containers.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0033_more_interpretations_2.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0034_generic_objects_in_ttrees.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0035_datatype_generality.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0038_memberwise_serialization.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0043_iterate_function.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0044_concatenate_function.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0046_histograms_bh_hist.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0053_parents_should_not_be_bases.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0058_detach_model_objects_from_files.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0066_fix_http_fallback_freeze.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0067_common_entry_offsets.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0081_dont_parse_colons.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0087_memberwise_splitting_not_implemented_messages.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0088_read_with_http.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0099_read_from_file_object.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0112_fix_pandas_with_cut.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0118_fix_name_fetch_again.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0123_atlas_issues.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0126_turn_unknown_emptyarrays_into_known_types.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0167_use_the_common_histogram_interface.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0172_allow_allocators_in_vector_typenames.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0173_empty_and_multiprocessing_bugs.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0182_complain_about_missing_files.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0194_fix_lost_cuts_in_iterate.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0220_contiguous_byte_ranges_in_http.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0228_read_TProfiles.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0240_read_TGraphAsymmErrors.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0278_specializations_for_TParameter.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0302_pickle.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0303_empty_jagged_array.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0320_start_working_on_ROOT_writing.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0322_writablefile_infrastructure.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0329_update_existing_root_files.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0335_empty_ttree_division_by_zero.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0341_manipulate_streamer_info.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0344_writabledirectory_can_read.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0345_bulk_copy_method.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0349_write_TObjString.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0350_read_RooCurve_RooHist.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0351_write_TList.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0352_write_THashList.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0384_move_behavior_of_and_fix_383.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0398_dimensions_in_leaflist.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0405_write_a_histogram.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0406_write_a_ttree.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0407_read_TDatime.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0412_write_multidimensional_numpy_to_ttree.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0414_write_jagged_arrays.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0418_read_TTable.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0420_pyroot_uproot_interoperability.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0422_hist_integration.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0430_global_index_for_tuples_of_DataFrames.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0438_TClonesArray_is_not_AsGrouped.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0439_check_awkward_before_numpy.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0442_regular_TClonesArray.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0472_tstreamerinfo_for_ttree.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0475_remember_to_update_freesegments.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0484_manually_add_model_for_TMatrixTSym_double_.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0487_implement_asdtypeinplace.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0498_create_leaf_branch_in_extend.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0519_remove_memmap_copy.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0520_dynamic_classes_cant_be_abc_subclasses.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0569_fBits_is_4_bytes.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0576_unicode_in_names.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0578_dask_for_numpy.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0580_round_trip_for_no_flow_histograms.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0589_explicitly_interpret_RVec_type.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0603_dask_delayed_open.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0609_num_enteries_func.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0610_awkward_form.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0630_rntuple_basics.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0637_setup_tests_for_AwkwardForth.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0643_reading_vector_pair_TLorentzVector_int.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0651_implement_transformed_axis.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0652_dask_for_awkward.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0662_rntuple_stl_containers.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0692_fsspec_reading.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0692_fsspec_writing.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0700_dask_empty_arrays.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0705_rntuple_writing_metadata.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0750_avoid_empty_TBasket_issue.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0755_dask_awkward_column_projection.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0791_protect_uproot_project_columns_from_dask_node_names.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0798_DAOD_PHYSLITE.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0808_fix_awkward_form_for_AsStridedObjects.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0816_separate_AwkwardForth_machines_by_TBranch.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0832_ak_add_doc_should_also_add_to_typetracer.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0840_support_tleafG.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0841_fix_814.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0844_fix_delete_hist_from_root.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0852_fix_strided_interp_extra_offsets.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0870_writing_arrays_of_type_unknown_fix_822.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0876_uproot_dask_blind_steps.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0886_fix_awkward_form_breadcrumbs.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0910_fix_906_members_non_numerical_branches.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0911_fix_interp_array_non_numerical_objs_issue_880.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0912_fix_pandas_and_double_nested_vectors_issue_885.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0916_read_from_s3.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0927_dont_assume_uproot_in_global_scope_in_TPython_Eval.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0930_expressions_in_pandas.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0940_feat_add_TLeafC_string_support.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0962_RNTuple_update.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0965_inverted_axes_variances_hist_888.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_0976_path_object_split.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_1000-write-TProfiles.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_1043_const_std_string.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_1058_dask_awkward_report.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_1063_dask_distributed.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_1070_pandas_dataframe_building_performance_fix.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_1085_dask_write.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_1102_any_locks_in_models_must_be_transient.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_1114_fix_attempt_to_concatenate_numpy_with_awkward.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_1120_check_decompression_executor_pass_for_dask.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_1127_fix_allow_colon_in_key_names.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_1146_split_ranges_for_large_files_over_http.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_1154_classof_using_relative_path.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_1160_std_string_in_TDirectory.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_1180_read_free_floating_vector_issue_1179.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_1181_support_for_stl_list.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_1182_add_support_for_bitset.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_1183_ttime_custom.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_1186_dtype_might_raise_ValueError.py +0 -0
- {uproot-5.3.3 → uproot-5.3.4}/tests/test_1189_dask_failing_on_duplicate_keys.py +0 -0
|
@@ -18,12 +18,12 @@ repos:
|
|
|
18
18
|
- id: trailing-whitespace
|
|
19
19
|
|
|
20
20
|
- repo: https://github.com/psf/black-pre-commit-mirror
|
|
21
|
-
rev: 24.
|
|
21
|
+
rev: 24.4.2
|
|
22
22
|
hooks:
|
|
23
23
|
- id: black
|
|
24
24
|
|
|
25
25
|
- repo: https://github.com/astral-sh/ruff-pre-commit
|
|
26
|
-
rev: v0.
|
|
26
|
+
rev: v0.4.2
|
|
27
27
|
hooks:
|
|
28
28
|
- id: ruff
|
|
29
29
|
args: [--fix, --show-fixes]
|
|
@@ -13,6 +13,7 @@ import itertools
|
|
|
13
13
|
import numbers
|
|
14
14
|
import os
|
|
15
15
|
import re
|
|
16
|
+
import sys
|
|
16
17
|
import warnings
|
|
17
18
|
from collections.abc import Iterable
|
|
18
19
|
from pathlib import Path
|
|
@@ -27,6 +28,8 @@ import uproot.source.chunk
|
|
|
27
28
|
import uproot.source.fsspec
|
|
28
29
|
import uproot.source.object
|
|
29
30
|
|
|
31
|
+
macos = sys.platform == "darwin"
|
|
32
|
+
|
|
30
33
|
|
|
31
34
|
def tobytes(array):
|
|
32
35
|
"""
|
|
@@ -3007,8 +3007,10 @@ def _ranges_or_baskets_to_arrays(
|
|
|
3007
3007
|
)
|
|
3008
3008
|
|
|
3009
3009
|
# check for CannotBeAwkward errors on the main thread before reading any data
|
|
3010
|
-
if
|
|
3011
|
-
|
|
3010
|
+
if (
|
|
3011
|
+
isinstance(library, uproot.interpretation.library.Awkward)
|
|
3012
|
+
and isinstance(interpretation, uproot.interpretation.objects.AsObjects)
|
|
3013
|
+
and cache_key in branchid_to_branch
|
|
3012
3014
|
):
|
|
3013
3015
|
branchid_to_branch[cache_key]._awkward_check(interpretation)
|
|
3014
3016
|
|
|
@@ -80,6 +80,23 @@ class AsObjects(uproot.interpretation.Interpretation):
|
|
|
80
80
|
def __eq__(self, other):
|
|
81
81
|
return isinstance(other, AsObjects) and self._model == other._model
|
|
82
82
|
|
|
83
|
+
def __getstate__(self):
|
|
84
|
+
return {
|
|
85
|
+
k: (
|
|
86
|
+
uproot.model._LockPlaceholder()
|
|
87
|
+
if isinstance(v, uproot.model._LockPlaceholder.lock_type)
|
|
88
|
+
else v
|
|
89
|
+
)
|
|
90
|
+
for k, v in self.__dict__.items()
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
def __setstate__(self, state):
|
|
94
|
+
instance_data = {
|
|
95
|
+
k: threading.Lock() if isinstance(v, uproot.model._LockPlaceholder) else v
|
|
96
|
+
for k, v in state.items()
|
|
97
|
+
}
|
|
98
|
+
self.__dict__.update(instance_data)
|
|
99
|
+
|
|
83
100
|
@property
|
|
84
101
|
def numpy_dtype(self):
|
|
85
102
|
return numpy.dtype(object)
|
|
@@ -32,6 +32,7 @@ _rntuple_checksum_format = struct.Struct("<Q")
|
|
|
32
32
|
_rntuple_envlink_size_format = struct.Struct("<Q")
|
|
33
33
|
_rntuple_page_num_elements_format = struct.Struct("<I")
|
|
34
34
|
_rntuple_column_group_id_format = struct.Struct("<I")
|
|
35
|
+
_rntuple_first_ele_index_format = struct.Struct("<I")
|
|
35
36
|
|
|
36
37
|
|
|
37
38
|
def from_zigzag(n):
|
|
@@ -53,7 +54,7 @@ class Model_ROOT_3a3a_Experimental_3a3a_RNTuple(uproot.model.Model):
|
|
|
53
54
|
@property
|
|
54
55
|
def _keys(self):
|
|
55
56
|
keys = []
|
|
56
|
-
field_records = self.
|
|
57
|
+
field_records = self.field_records
|
|
57
58
|
for i, fr in enumerate(field_records):
|
|
58
59
|
if fr.parent_field_id == i and fr.type_name != "":
|
|
59
60
|
keys.append(fr.field_name)
|
|
@@ -89,8 +90,13 @@ in file {self.file.file_path}"""
|
|
|
89
90
|
self._footer_chunk_ready = False
|
|
90
91
|
self._header, self._footer = None, None
|
|
91
92
|
|
|
93
|
+
self._field_records = None
|
|
92
94
|
self._field_names = None
|
|
93
95
|
self._column_records = None
|
|
96
|
+
self._alias_column_records = None
|
|
97
|
+
self._alias_columns_dict_ = None
|
|
98
|
+
self._related_ids_ = None
|
|
99
|
+
self._column_records_dict_ = None
|
|
94
100
|
|
|
95
101
|
self._page_list_envelopes = []
|
|
96
102
|
|
|
@@ -151,15 +157,64 @@ in file {self.file.file_path}"""
|
|
|
151
157
|
|
|
152
158
|
return self._header
|
|
153
159
|
|
|
160
|
+
@property
|
|
161
|
+
def field_records(self):
|
|
162
|
+
if self._field_records is None:
|
|
163
|
+
self._field_records = list(self.header.field_records)
|
|
164
|
+
self._field_records.extend(self.footer.extension_links.field_records)
|
|
165
|
+
return self._field_records
|
|
166
|
+
|
|
154
167
|
@property
|
|
155
168
|
def field_names(self):
|
|
156
169
|
if self._field_names is None:
|
|
157
|
-
self._field_names = [r.field_name for r in self.
|
|
170
|
+
self._field_names = [r.field_name for r in self.field_records]
|
|
158
171
|
return self._field_names
|
|
159
172
|
|
|
160
173
|
@property
|
|
161
174
|
def column_records(self):
|
|
162
|
-
|
|
175
|
+
if self._column_records is None:
|
|
176
|
+
self._column_records = list(self.header.column_records)
|
|
177
|
+
self._column_records.extend(self.footer.extension_links.column_records)
|
|
178
|
+
for i, cr in enumerate(self._column_records):
|
|
179
|
+
cr.idx = i
|
|
180
|
+
return self._column_records
|
|
181
|
+
|
|
182
|
+
@property
|
|
183
|
+
def alias_column_records(self):
|
|
184
|
+
if self._alias_column_records is None:
|
|
185
|
+
self._alias_column_records = list(self.header.alias_column_records)
|
|
186
|
+
self._alias_column_records.extend(
|
|
187
|
+
self.footer.extension_links.alias_column_records
|
|
188
|
+
)
|
|
189
|
+
return self._alias_column_records
|
|
190
|
+
|
|
191
|
+
@property
|
|
192
|
+
def _alias_columns_dict(self):
|
|
193
|
+
if self._alias_columns_dict_ is None:
|
|
194
|
+
self._alias_columns_dict_ = {
|
|
195
|
+
el.field_id: el.physical_id for el in self.alias_column_records
|
|
196
|
+
}
|
|
197
|
+
return self._alias_columns_dict_
|
|
198
|
+
|
|
199
|
+
@property
|
|
200
|
+
def _column_records_dict(self):
|
|
201
|
+
if self._column_records_dict_ is None:
|
|
202
|
+
self._column_records_dict_ = {}
|
|
203
|
+
for cr in self.column_records:
|
|
204
|
+
if cr.field_id not in self._column_records_dict_:
|
|
205
|
+
self._column_records_dict_[cr.field_id] = [cr]
|
|
206
|
+
else:
|
|
207
|
+
self._column_records_dict_[cr.field_id].append(cr)
|
|
208
|
+
return self._column_records_dict_
|
|
209
|
+
|
|
210
|
+
@property
|
|
211
|
+
def _related_ids(self):
|
|
212
|
+
if self._related_ids_ is None:
|
|
213
|
+
self._related_ids_ = defaultdict(list)
|
|
214
|
+
for i, el in enumerate(self.field_records):
|
|
215
|
+
if el.parent_field_id != i:
|
|
216
|
+
self._related_ids_[el.parent_field_id].append(i)
|
|
217
|
+
return self._related_ids_
|
|
163
218
|
|
|
164
219
|
@property
|
|
165
220
|
def footer(self):
|
|
@@ -218,10 +273,10 @@ in file {self.file.file_path}"""
|
|
|
218
273
|
|
|
219
274
|
return self._page_list_envelopes
|
|
220
275
|
|
|
221
|
-
def base_col_form(self, cr, col_id, parameters=None):
|
|
276
|
+
def base_col_form(self, cr, col_id, parameters=None, cardinality=False):
|
|
222
277
|
ak = uproot.extras.awkward()
|
|
223
278
|
|
|
224
|
-
form_key = f"column-{col_id}"
|
|
279
|
+
form_key = f"column-{col_id}" + ("-cardinality" if cardinality else "")
|
|
225
280
|
dtype_byte = cr.type
|
|
226
281
|
if dtype_byte == uproot.const.rntuple_role_union:
|
|
227
282
|
return form_key
|
|
@@ -240,34 +295,32 @@ in file {self.file.file_path}"""
|
|
|
240
295
|
def col_form(self, field_id):
|
|
241
296
|
ak = uproot.extras.awkward()
|
|
242
297
|
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
rel_crs = self._column_records_dict[self._alias_columns_dict[field_id]][
|
|
248
|
-
"rel_crs"
|
|
249
|
-
]
|
|
250
|
-
rel_crs_idxs = self._column_records_dict[
|
|
251
|
-
self._alias_columns_dict[field_id]
|
|
252
|
-
]["rel_crs_idxs"]
|
|
253
|
-
else:
|
|
298
|
+
cfid = field_id
|
|
299
|
+
if cfid in self._alias_columns_dict:
|
|
300
|
+
cfid = self._alias_columns_dict[cfid]
|
|
301
|
+
if cfid not in self._column_records_dict:
|
|
254
302
|
raise (
|
|
255
303
|
RuntimeError(
|
|
256
|
-
f"The
|
|
304
|
+
f"The field_id: {cfid} is missing from the columns records."
|
|
257
305
|
)
|
|
258
306
|
)
|
|
259
307
|
|
|
308
|
+
rel_crs = self._column_records_dict[cfid]
|
|
309
|
+
|
|
260
310
|
if len(rel_crs) == 1: # base case
|
|
261
|
-
|
|
311
|
+
cardinality = "RNTupleCardinality" in self.field_records[field_id].type_name
|
|
312
|
+
return self.base_col_form(
|
|
313
|
+
rel_crs[0], rel_crs[0].idx, cardinality=cardinality
|
|
314
|
+
)
|
|
262
315
|
elif (
|
|
263
|
-
len(
|
|
316
|
+
len(rel_crs) == 2
|
|
264
317
|
and rel_crs[1].type == uproot.const.rntuple_col_type_to_num_dict["char"]
|
|
265
318
|
):
|
|
266
319
|
# string field splits->2 in col records
|
|
267
320
|
inner = self.base_col_form(
|
|
268
|
-
rel_crs[1],
|
|
321
|
+
rel_crs[1], rel_crs[1].idx, parameters={"__array__": "char"}
|
|
269
322
|
)
|
|
270
|
-
form_key = f"column-{
|
|
323
|
+
form_key = f"column-{rel_crs[0].idx}"
|
|
271
324
|
return ak.forms.ListOffsetForm(
|
|
272
325
|
"i64", inner, form_key=form_key, parameters={"__array__": "string"}
|
|
273
326
|
)
|
|
@@ -277,7 +330,7 @@ in file {self.file.file_path}"""
|
|
|
277
330
|
def field_form(self, this_id, seen):
|
|
278
331
|
ak = uproot.extras.awkward()
|
|
279
332
|
|
|
280
|
-
field_records = self.
|
|
333
|
+
field_records = self.field_records
|
|
281
334
|
this_record = field_records[this_id]
|
|
282
335
|
seen.add(this_id)
|
|
283
336
|
structural_role = this_record.struct_role
|
|
@@ -294,14 +347,32 @@ in file {self.file.file_path}"""
|
|
|
294
347
|
child_id = self._related_ids[this_id][0]
|
|
295
348
|
|
|
296
349
|
inner = self.field_form(child_id, seen)
|
|
297
|
-
|
|
350
|
+
keyname = f"RegularForm-{this_id}"
|
|
351
|
+
return ak.forms.RegularForm(inner, this_record.repetition, form_key=keyname)
|
|
298
352
|
elif structural_role == uproot.const.rntuple_role_vector:
|
|
299
|
-
|
|
353
|
+
if this_id not in self._related_ids or len(self._related_ids[this_id]) != 1:
|
|
354
|
+
keyname = f"vector-{this_id}"
|
|
355
|
+
newids = self._related_ids.get(this_id, [])
|
|
356
|
+
# go find N in the rest, N is the # of fields in vector
|
|
357
|
+
recordlist = [self.field_form(i, seen) for i in newids]
|
|
358
|
+
namelist = [field_records[i].field_name for i in newids]
|
|
359
|
+
return ak.forms.RecordForm(recordlist, namelist, form_key="whatever")
|
|
360
|
+
cfid = this_id
|
|
361
|
+
if cfid in self._alias_columns_dict:
|
|
362
|
+
cfid = self._alias_columns_dict[cfid]
|
|
363
|
+
if cfid not in self._column_records_dict:
|
|
364
|
+
raise (
|
|
365
|
+
RuntimeError(
|
|
366
|
+
f"The field_id: {cfid} is missing from the columns records."
|
|
367
|
+
)
|
|
368
|
+
)
|
|
369
|
+
col_id = self._column_records_dict[cfid][0].idx
|
|
370
|
+
keyname = f"column-{col_id}"
|
|
300
371
|
# this only has one child
|
|
301
372
|
if this_id in self._related_ids:
|
|
302
373
|
child_id = self._related_ids[this_id][0]
|
|
303
374
|
inner = self.field_form(child_id, seen)
|
|
304
|
-
return ak.forms.ListOffsetForm("
|
|
375
|
+
return ak.forms.ListOffsetForm("i64", inner, form_key=keyname)
|
|
305
376
|
elif structural_role == uproot.const.rntuple_role_struct:
|
|
306
377
|
newids = []
|
|
307
378
|
if this_id in self._related_ids:
|
|
@@ -324,13 +395,15 @@ in file {self.file.file_path}"""
|
|
|
324
395
|
def to_akform(self):
|
|
325
396
|
ak = uproot.extras.awkward()
|
|
326
397
|
|
|
327
|
-
field_records = self.
|
|
398
|
+
field_records = self.field_records
|
|
328
399
|
recordlist = []
|
|
329
400
|
topnames = self.keys()
|
|
330
401
|
seen = set()
|
|
331
402
|
for i in range(len(field_records)):
|
|
332
403
|
if i not in seen:
|
|
333
|
-
|
|
404
|
+
ff = self.field_form(i, seen)
|
|
405
|
+
if field_records[i].type_name != "":
|
|
406
|
+
recordlist.append(ff)
|
|
334
407
|
|
|
335
408
|
form = ak.forms.RecordForm(recordlist, topnames, form_key="toplevel")
|
|
336
409
|
return form
|
|
@@ -358,7 +431,6 @@ in file {self.file.file_path}"""
|
|
|
358
431
|
res = numpy.empty(len(content), numpy.uint8)
|
|
359
432
|
res[0::2] = content[len(res) * 0 // 2 : len(res) * 1 // 2]
|
|
360
433
|
res[1::2] = content[len(res) * 1 // 2 : len(res) * 2 // 2]
|
|
361
|
-
res = res.view(numpy.uint16)
|
|
362
434
|
|
|
363
435
|
elif nbits == 32:
|
|
364
436
|
# AAAAABBBBBCCCCCDDDDD needs to become
|
|
@@ -368,7 +440,6 @@ in file {self.file.file_path}"""
|
|
|
368
440
|
res[1::4] = content[len(res) * 1 // 4 : len(res) * 2 // 4]
|
|
369
441
|
res[2::4] = content[len(res) * 2 // 4 : len(res) * 3 // 4]
|
|
370
442
|
res[3::4] = content[len(res) * 3 // 4 : len(res) * 4 // 4]
|
|
371
|
-
res = res.view(numpy.uint32)
|
|
372
443
|
|
|
373
444
|
elif nbits == 64:
|
|
374
445
|
# AAAAABBBBBCCCCCDDDDDEEEEEFFFFFGGGGGHHHHH needs to become
|
|
@@ -382,9 +453,8 @@ in file {self.file.file_path}"""
|
|
|
382
453
|
res[5::8] = content[len(res) * 5 // 8 : len(res) * 6 // 8]
|
|
383
454
|
res[6::8] = content[len(res) * 6 // 8 : len(res) * 7 // 8]
|
|
384
455
|
res[7::8] = content[len(res) * 7 // 8 : len(res) * 8 // 8]
|
|
385
|
-
res = res.view(numpy.uint64)
|
|
386
456
|
|
|
387
|
-
content = res
|
|
457
|
+
content = res.view(dtype)
|
|
388
458
|
|
|
389
459
|
if isbit:
|
|
390
460
|
content = (
|
|
@@ -396,10 +466,14 @@ in file {self.file.file_path}"""
|
|
|
396
466
|
# needed to chop off extra bits incase we used `unpackbits`
|
|
397
467
|
destination[:] = content[:num_elements]
|
|
398
468
|
|
|
399
|
-
def read_col_pages(self, ncol, cluster_range):
|
|
400
|
-
|
|
469
|
+
def read_col_pages(self, ncol, cluster_range, pad_missing_ele=False):
|
|
470
|
+
res = numpy.concatenate(
|
|
401
471
|
[self.read_col_page(ncol, i) for i in cluster_range], axis=0
|
|
402
472
|
)
|
|
473
|
+
if pad_missing_ele:
|
|
474
|
+
first_ele_index = self.column_records[ncol].first_ele_index
|
|
475
|
+
res = numpy.pad(res, (first_ele_index, 0))
|
|
476
|
+
return res
|
|
403
477
|
|
|
404
478
|
def read_col_page(self, ncol, cluster_i):
|
|
405
479
|
linklist = self.page_list_envelopes.pagelinklist[cluster_i]
|
|
@@ -408,30 +482,28 @@ in file {self.file.file_path}"""
|
|
|
408
482
|
dtype_str = uproot.const.rntuple_col_num_to_dtype_dict[dtype_byte]
|
|
409
483
|
dtype = numpy.dtype("bool") if dtype_str == "bit" else numpy.dtype(dtype_str)
|
|
410
484
|
|
|
411
|
-
|
|
412
|
-
# n.b. it's possible pagelist is empty
|
|
413
|
-
if not pagelist:
|
|
414
|
-
return numpy.empty(0, dtype)
|
|
415
|
-
total_len = numpy.sum([desc.num_elements for desc in pagelist])
|
|
485
|
+
total_len = numpy.sum([desc.num_elements for desc in pagelist], dtype=int)
|
|
416
486
|
res = numpy.empty(total_len, dtype)
|
|
417
|
-
tracker = 0
|
|
418
487
|
split = 14 <= dtype_byte <= 21 or 26 <= dtype_byte <= 28
|
|
488
|
+
zigzag = 26 <= dtype_byte <= 28
|
|
489
|
+
delta = dtype_byte in (14, 15)
|
|
490
|
+
index = dtype_byte in (0, 1, 14, 15)
|
|
419
491
|
nbits = uproot.const.rntuple_col_num_to_size_dict[dtype_byte]
|
|
492
|
+
tracker = 0
|
|
493
|
+
cumsum = 0
|
|
420
494
|
for page_desc in pagelist:
|
|
421
495
|
n_elements = page_desc.num_elements
|
|
422
496
|
tracker_end = tracker + n_elements
|
|
423
497
|
self.read_pagedesc(
|
|
424
498
|
res[tracker:tracker_end], page_desc, dtype_str, dtype, nbits, split
|
|
425
499
|
)
|
|
500
|
+
if delta:
|
|
501
|
+
res[tracker] -= cumsum
|
|
502
|
+
cumsum += numpy.sum(res[tracker:tracker_end])
|
|
426
503
|
tracker = tracker_end
|
|
427
504
|
|
|
428
|
-
if
|
|
429
|
-
dtype_byte <= uproot.const.rntuple_col_type_to_num_dict["index32"]
|
|
430
|
-
or 14 <= dtype_byte <= 15
|
|
431
|
-
):
|
|
505
|
+
if index:
|
|
432
506
|
res = numpy.insert(res, 0, 0) # for offsets
|
|
433
|
-
zigzag = 26 <= dtype_byte <= 28
|
|
434
|
-
delta = 14 <= dtype_byte <= 15
|
|
435
507
|
if zigzag:
|
|
436
508
|
res = from_zigzag(res)
|
|
437
509
|
elif delta:
|
|
@@ -462,27 +534,6 @@ in file {self.file.file_path}"""
|
|
|
462
534
|
[c.num_entries for c in clusters[start_cluster_idx:stop_cluster_idx]]
|
|
463
535
|
)
|
|
464
536
|
|
|
465
|
-
self._alias_columns_dict = {
|
|
466
|
-
el.field_id: el.physical_id for el in self.header.alias_columns
|
|
467
|
-
}
|
|
468
|
-
self._column_records_dict = {}
|
|
469
|
-
self._column_records_idx_to_id = {}
|
|
470
|
-
for i, cr in enumerate(self.header.column_records):
|
|
471
|
-
if cr.field_id not in self._column_records_dict:
|
|
472
|
-
self._column_records_dict[cr.field_id] = {
|
|
473
|
-
"rel_crs": [cr],
|
|
474
|
-
"rel_crs_idxs": [i],
|
|
475
|
-
}
|
|
476
|
-
else:
|
|
477
|
-
self._column_records_dict[cr.field_id]["rel_crs"].append(cr)
|
|
478
|
-
self._column_records_dict[cr.field_id]["rel_crs_idxs"].append(i)
|
|
479
|
-
self._column_records_idx_to_id[i] = cr.field_id
|
|
480
|
-
|
|
481
|
-
self._related_ids = defaultdict(list)
|
|
482
|
-
for i, el in enumerate(self.header.field_records):
|
|
483
|
-
if el.parent_field_id != i:
|
|
484
|
-
self._related_ids[el.parent_field_id].append(i)
|
|
485
|
-
|
|
486
537
|
form = self.to_akform().select_columns(filter_names)
|
|
487
538
|
# only read columns mentioned in the awkward form
|
|
488
539
|
target_cols = []
|
|
@@ -491,22 +542,14 @@ in file {self.file.file_path}"""
|
|
|
491
542
|
for key in target_cols:
|
|
492
543
|
if "column" in key:
|
|
493
544
|
key_nr = int(key.split("-")[1])
|
|
494
|
-
|
|
495
|
-
if key_fid in self._column_records_dict:
|
|
496
|
-
id = key_fid
|
|
497
|
-
elif key_nr in self._alias_columns_dict:
|
|
498
|
-
id = self._alias_columns_dict[key_fid]
|
|
499
|
-
else:
|
|
500
|
-
raise (
|
|
501
|
-
RuntimeError(
|
|
502
|
-
f"The key: {key} is missing both from the columns records and the alias columns."
|
|
503
|
-
)
|
|
504
|
-
)
|
|
505
|
-
|
|
506
|
-
dtype_byte = self._column_records_dict[id]["rel_crs"][0].type
|
|
545
|
+
dtype_byte = self.column_records[key_nr].type
|
|
507
546
|
content = self.read_col_pages(
|
|
508
|
-
key_nr,
|
|
547
|
+
key_nr,
|
|
548
|
+
range(start_cluster_idx, stop_cluster_idx),
|
|
549
|
+
pad_missing_ele=True,
|
|
509
550
|
)
|
|
551
|
+
if "cardinality" in key:
|
|
552
|
+
content = numpy.diff(content)
|
|
510
553
|
if dtype_byte == uproot.const.rntuple_col_type_to_num_dict["switch"]:
|
|
511
554
|
kindex, tags = _split_switch_bits(content)
|
|
512
555
|
container_dict[f"{key}-index"] = kindex
|
|
@@ -667,6 +710,12 @@ class ColumnRecordReader:
|
|
|
667
710
|
out.type, out.nbits, out.field_id, out.flags = cursor.fields(
|
|
668
711
|
chunk, _rntuple_column_record_format, context
|
|
669
712
|
)
|
|
713
|
+
if out.flags & 0x08:
|
|
714
|
+
out.first_ele_index = cursor.field(
|
|
715
|
+
chunk, _rntuple_first_ele_index_format, context
|
|
716
|
+
)
|
|
717
|
+
else:
|
|
718
|
+
out.first_ele_index = 0
|
|
670
719
|
return out
|
|
671
720
|
|
|
672
721
|
|
|
@@ -716,21 +765,14 @@ class HeaderReader:
|
|
|
716
765
|
|
|
717
766
|
out.field_records = self.list_field_record_frames.read(chunk, cursor, context)
|
|
718
767
|
out.column_records = self.list_column_record_frames.read(chunk, cursor, context)
|
|
719
|
-
out.
|
|
720
|
-
out.extra_type_infos = self.list_extra_type_info_reader.read(
|
|
768
|
+
out.alias_column_records = self.list_alias_column_frames.read(
|
|
721
769
|
chunk, cursor, context
|
|
722
770
|
)
|
|
723
|
-
out.checksum = cursor.field(chunk, _rntuple_checksum_format, context)
|
|
724
|
-
|
|
725
|
-
return out
|
|
726
|
-
|
|
727
|
-
def read_extension_header(self, out, chunk, cursor, context):
|
|
728
|
-
out.field_records = self.list_field_record_frames.read(chunk, cursor, context)
|
|
729
|
-
out.column_records = self.list_column_record_frames.read(chunk, cursor, context)
|
|
730
|
-
out.alias_columns = self.list_alias_column_frames.read(chunk, cursor, context)
|
|
731
771
|
out.extra_type_infos = self.list_extra_type_info_reader.read(
|
|
732
772
|
chunk, cursor, context
|
|
733
773
|
)
|
|
774
|
+
out.checksum = cursor.field(chunk, _rntuple_checksum_format, context)
|
|
775
|
+
|
|
734
776
|
return out
|
|
735
777
|
|
|
736
778
|
|
|
@@ -780,7 +822,7 @@ class RNTupleSchemaExtension:
|
|
|
780
822
|
out.column_records = ListFrameReader(
|
|
781
823
|
RecordFrameReader(ColumnRecordReader())
|
|
782
824
|
).read(chunk, cursor, context)
|
|
783
|
-
out.
|
|
825
|
+
out.alias_column_records = ListFrameReader(
|
|
784
826
|
RecordFrameReader(AliasColumnReader())
|
|
785
827
|
).read(chunk, cursor, context)
|
|
786
828
|
out.extra_type_info = ListFrameReader(
|
|
@@ -49,7 +49,8 @@ def test_file_header(use_isal):
|
|
|
49
49
|
|
|
50
50
|
@pytest.mark.parametrize("use_deflate", [False, True])
|
|
51
51
|
def test_file_header(use_deflate):
|
|
52
|
-
|
|
52
|
+
# FIXME: https://github.com/dcwatson/deflate/issues/42
|
|
53
|
+
if use_deflate and not uproot._util.macos:
|
|
53
54
|
pytest.importorskip("deflate")
|
|
54
55
|
uproot.ZLIB.use_deflate = use_deflate
|
|
55
56
|
filename = skhep_testdata.data_path("uproot-Zmumu.root")
|
|
@@ -34,7 +34,8 @@ def test_ZLIB(use_isal):
|
|
|
34
34
|
|
|
35
35
|
@pytest.mark.parametrize("use_deflate", [False, True])
|
|
36
36
|
def test_deflate(use_deflate):
|
|
37
|
-
|
|
37
|
+
# FIXME: https://github.com/dcwatson/deflate/issues/42
|
|
38
|
+
if use_deflate and not uproot._util.macos:
|
|
38
39
|
pytest.importorskip("deflate")
|
|
39
40
|
uproot.ZLIB.library = "deflate"
|
|
40
41
|
else:
|
|
@@ -133,7 +134,8 @@ def test_histogram_ZLIB(tmp_path, use_isal):
|
|
|
133
134
|
|
|
134
135
|
@pytest.mark.parametrize("use_deflate", [False, True])
|
|
135
136
|
def test_histogram_deflate(tmp_path, use_deflate):
|
|
136
|
-
|
|
137
|
+
# FIXME: https://github.com/dcwatson/deflate/issues/42
|
|
138
|
+
if use_deflate and not uproot._util.macos:
|
|
137
139
|
pytest.importorskip("deflate")
|
|
138
140
|
uproot.ZLIB.library = "deflate"
|
|
139
141
|
else:
|
|
@@ -591,7 +593,8 @@ def test_multicompression_5(tmp_path, use_isal):
|
|
|
591
593
|
|
|
592
594
|
@pytest.mark.parametrize("use_deflate", [False, True])
|
|
593
595
|
def test_multicompression_1_deflate(tmp_path, use_deflate):
|
|
594
|
-
|
|
596
|
+
# FIXME: https://github.com/dcwatson/deflate/issues/42
|
|
597
|
+
if use_deflate and not uproot._util.macos:
|
|
595
598
|
pytest.importorskip("deflate")
|
|
596
599
|
uproot.ZLIB.library = "deflate"
|
|
597
600
|
else:
|
|
@@ -625,7 +628,8 @@ def test_multicompression_1_deflate(tmp_path, use_deflate):
|
|
|
625
628
|
|
|
626
629
|
@pytest.mark.parametrize("use_deflate", [False, True])
|
|
627
630
|
def test_multicompression_2_deflate(tmp_path, use_deflate):
|
|
628
|
-
|
|
631
|
+
# FIXME: https://github.com/dcwatson/deflate/issues/42
|
|
632
|
+
if use_deflate and not uproot._util.macos:
|
|
629
633
|
pytest.importorskip("deflate")
|
|
630
634
|
uproot.ZLIB.library = "deflate"
|
|
631
635
|
else:
|
|
@@ -658,7 +662,8 @@ def test_multicompression_2_deflate(tmp_path, use_deflate):
|
|
|
658
662
|
|
|
659
663
|
@pytest.mark.parametrize("use_deflate", [False, True])
|
|
660
664
|
def test_multicompression_3_deflate(tmp_path, use_deflate):
|
|
661
|
-
|
|
665
|
+
# FIXME: https://github.com/dcwatson/deflate/issues/42
|
|
666
|
+
if use_deflate and not uproot._util.macos:
|
|
662
667
|
pytest.importorskip("deflate")
|
|
663
668
|
uproot.ZLIB.library = "deflate"
|
|
664
669
|
else:
|
|
@@ -692,7 +697,8 @@ def test_multicompression_3_deflate(tmp_path, use_deflate):
|
|
|
692
697
|
|
|
693
698
|
@pytest.mark.parametrize("use_deflate", [False, True])
|
|
694
699
|
def test_multicompression_4_deflate(tmp_path, use_deflate):
|
|
695
|
-
|
|
700
|
+
# FIXME: https://github.com/dcwatson/deflate/issues/42
|
|
701
|
+
if use_deflate and not uproot._util.macos:
|
|
696
702
|
pytest.importorskip("deflate")
|
|
697
703
|
uproot.ZLIB.library = "deflate"
|
|
698
704
|
else:
|
|
@@ -724,7 +730,8 @@ def test_multicompression_4_deflate(tmp_path, use_deflate):
|
|
|
724
730
|
|
|
725
731
|
@pytest.mark.parametrize("use_deflate", [False, True])
|
|
726
732
|
def test_multicompression_5_deflate(tmp_path, use_deflate):
|
|
727
|
-
|
|
733
|
+
# FIXME: https://github.com/dcwatson/deflate/issues/42
|
|
734
|
+
if use_deflate and not uproot._util.macos:
|
|
728
735
|
pytest.importorskip("deflate")
|
|
729
736
|
uproot.ZLIB.library = "deflate"
|
|
730
737
|
else:
|