uproot 5.3.3__tar.gz → 5.3.5__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.
Files changed (276) hide show
  1. {uproot-5.3.3 → uproot-5.3.5}/.pre-commit-config.yaml +2 -2
  2. {uproot-5.3.3 → uproot-5.3.5}/PKG-INFO +1 -1
  3. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/_util.py +3 -0
  4. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/behaviors/TBranch.py +4 -2
  5. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/interpretation/objects.py +17 -0
  6. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/models/RNTuple.py +133 -91
  7. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/models/TArray.py +1 -1
  8. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/models/TRef.py +1 -1
  9. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/version.py +2 -2
  10. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/writing/_cascadetree.py +5 -4
  11. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0008_start_interpretation.py +2 -1
  12. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0416_writing_compressed_data.py +14 -7
  13. uproot-5.3.5/tests/test_1191_rntuple_fixes.py +83 -0
  14. uproot-5.3.5/tests/test_1207_fix_title_of_TBranch_with_counter.py +21 -0
  15. {uproot-5.3.3 → uproot-5.3.5}/.all-contributorsrc +0 -0
  16. {uproot-5.3.3 → uproot-5.3.5}/.github/ISSUE_TEMPLATE/bug-report.md +0 -0
  17. {uproot-5.3.3 → uproot-5.3.5}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  18. {uproot-5.3.3 → uproot-5.3.5}/.github/ISSUE_TEMPLATE/documentation.md +0 -0
  19. {uproot-5.3.3 → uproot-5.3.5}/.github/ISSUE_TEMPLATE/feature-request.md +0 -0
  20. {uproot-5.3.3 → uproot-5.3.5}/.github/dependabot.yml +0 -0
  21. {uproot-5.3.3 → uproot-5.3.5}/.github/workflows/build-distributions.yml +0 -0
  22. {uproot-5.3.3 → uproot-5.3.5}/.github/workflows/build-test.yml +0 -0
  23. {uproot-5.3.3 → uproot-5.3.5}/.github/workflows/deploy.yml +0 -0
  24. {uproot-5.3.3 → uproot-5.3.5}/.github/workflows/semantic-pr-title.yml +0 -0
  25. {uproot-5.3.3 → uproot-5.3.5}/.github/workflows/upload-nightly-wheels.yml +0 -0
  26. {uproot-5.3.3 → uproot-5.3.5}/.gitignore +0 -0
  27. {uproot-5.3.3 → uproot-5.3.5}/.readthedocs.yml +0 -0
  28. {uproot-5.3.3 → uproot-5.3.5}/CITATION.cff +0 -0
  29. {uproot-5.3.3 → uproot-5.3.5}/LICENSE +0 -0
  30. {uproot-5.3.3 → uproot-5.3.5}/README.md +0 -0
  31. {uproot-5.3.3 → uproot-5.3.5}/dev/example-objects.py +0 -0
  32. {uproot-5.3.3 → uproot-5.3.5}/dev/make-models.py +0 -0
  33. {uproot-5.3.3 → uproot-5.3.5}/docs-img/diagrams/abstraction-layers.png +0 -0
  34. {uproot-5.3.3 → uproot-5.3.5}/docs-img/diagrams/abstraction-layers.svg +0 -0
  35. {uproot-5.3.3 → uproot-5.3.5}/docs-img/diagrams/example-dask-graph.png +0 -0
  36. {uproot-5.3.3 → uproot-5.3.5}/docs-img/diagrams/uproot-awkward-timeline.png +0 -0
  37. {uproot-5.3.3 → uproot-5.3.5}/docs-img/diagrams/uproot-awkward-timeline.svg +0 -0
  38. {uproot-5.3.3 → uproot-5.3.5}/docs-img/logo/logo-300px-white.png +0 -0
  39. {uproot-5.3.3 → uproot-5.3.5}/docs-img/logo/logo-300px.png +0 -0
  40. {uproot-5.3.3 → uproot-5.3.5}/docs-img/logo/logo-600px.png +0 -0
  41. {uproot-5.3.3 → uproot-5.3.5}/docs-img/logo/logo.svg +0 -0
  42. {uproot-5.3.3 → uproot-5.3.5}/docs-img/photos/switcheroo.jpg +0 -0
  43. {uproot-5.3.3 → uproot-5.3.5}/docs-sphinx/_templates/breadcrumbs.html +0 -0
  44. {uproot-5.3.3 → uproot-5.3.5}/docs-sphinx/basic.rst +0 -0
  45. {uproot-5.3.3 → uproot-5.3.5}/docs-sphinx/conf.py +0 -0
  46. {uproot-5.3.3 → uproot-5.3.5}/docs-sphinx/index.rst +0 -0
  47. {uproot-5.3.3 → uproot-5.3.5}/docs-sphinx/make_changelog.py +0 -0
  48. {uproot-5.3.3 → uproot-5.3.5}/docs-sphinx/prepare_docstrings.py +0 -0
  49. {uproot-5.3.3 → uproot-5.3.5}/docs-sphinx/requirements.txt +0 -0
  50. {uproot-5.3.3 → uproot-5.3.5}/docs-sphinx/uproot3-to-4.rst +0 -0
  51. {uproot-5.3.3 → uproot-5.3.5}/pyproject.toml +0 -0
  52. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/__init__.py +0 -0
  53. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/_awkwardforth.py +0 -0
  54. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/_dask.py +0 -0
  55. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/behavior.py +0 -0
  56. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/behaviors/RooCurve.py +0 -0
  57. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/behaviors/RooHist.py +0 -0
  58. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/behaviors/TAxis.py +0 -0
  59. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/behaviors/TBranchElement.py +0 -0
  60. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/behaviors/TDatime.py +0 -0
  61. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/behaviors/TGraph.py +0 -0
  62. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/behaviors/TGraphAsymmErrors.py +0 -0
  63. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/behaviors/TGraphErrors.py +0 -0
  64. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/behaviors/TH1.py +0 -0
  65. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/behaviors/TH2.py +0 -0
  66. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/behaviors/TH2Poly.py +0 -0
  67. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/behaviors/TH3.py +0 -0
  68. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/behaviors/TParameter.py +0 -0
  69. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/behaviors/TProfile.py +0 -0
  70. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/behaviors/TProfile2D.py +0 -0
  71. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/behaviors/TProfile3D.py +0 -0
  72. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/behaviors/TTree.py +0 -0
  73. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/behaviors/__init__.py +0 -0
  74. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/cache.py +0 -0
  75. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/compression.py +0 -0
  76. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/const.py +0 -0
  77. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/containers.py +0 -0
  78. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/deserialization.py +0 -0
  79. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/dynamic.py +0 -0
  80. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/exceptions.py +0 -0
  81. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/extras.py +0 -0
  82. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/interpretation/__init__.py +0 -0
  83. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/interpretation/grouped.py +0 -0
  84. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/interpretation/identify.py +0 -0
  85. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/interpretation/jagged.py +0 -0
  86. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/interpretation/library.py +0 -0
  87. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/interpretation/numerical.py +0 -0
  88. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/interpretation/strings.py +0 -0
  89. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/language/__init__.py +0 -0
  90. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/language/python.py +0 -0
  91. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/model.py +0 -0
  92. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/models/TAtt.py +0 -0
  93. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/models/TBasket.py +0 -0
  94. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/models/TBranch.py +0 -0
  95. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/models/TClonesArray.py +0 -0
  96. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/models/TDatime.py +0 -0
  97. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/models/TGraph.py +0 -0
  98. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/models/TH.py +0 -0
  99. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/models/THashList.py +0 -0
  100. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/models/TLeaf.py +0 -0
  101. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/models/TList.py +0 -0
  102. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/models/TMatrixT.py +0 -0
  103. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/models/TNamed.py +0 -0
  104. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/models/TObjArray.py +0 -0
  105. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/models/TObjString.py +0 -0
  106. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/models/TObject.py +0 -0
  107. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/models/TString.py +0 -0
  108. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/models/TTable.py +0 -0
  109. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/models/TTime.py +0 -0
  110. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/models/TTree.py +0 -0
  111. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/models/__init__.py +0 -0
  112. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/pyroot.py +0 -0
  113. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/reading.py +0 -0
  114. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/serialization.py +0 -0
  115. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/sink/__init__.py +0 -0
  116. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/sink/file.py +0 -0
  117. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/source/__init__.py +0 -0
  118. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/source/chunk.py +0 -0
  119. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/source/cursor.py +0 -0
  120. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/source/file.py +0 -0
  121. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/source/fsspec.py +0 -0
  122. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/source/futures.py +0 -0
  123. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/source/http.py +0 -0
  124. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/source/object.py +0 -0
  125. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/source/s3.py +0 -0
  126. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/source/xrootd.py +0 -0
  127. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/streamers.py +0 -0
  128. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/writing/__init__.py +0 -0
  129. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/writing/_cascade.py +0 -0
  130. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/writing/_cascadentuple.py +0 -0
  131. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/writing/_dask_write.py +0 -0
  132. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/writing/identify.py +0 -0
  133. {uproot-5.3.3 → uproot-5.3.5}/src/uproot/writing/writable.py +0 -0
  134. {uproot-5.3.3 → uproot-5.3.5}/tests/__init__.py +0 -0
  135. {uproot-5.3.3 → uproot-5.3.5}/tests/conftest.py +0 -0
  136. {uproot-5.3.3 → uproot-5.3.5}/tests/samples/h_dynamic.pkl +0 -0
  137. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0001_source_class.py +0 -0
  138. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0006_notify_when_downloaded.py +0 -0
  139. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0007_single_chunk_interface.py +0 -0
  140. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0009_nested_directories.py +0 -0
  141. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0010_start_streamers.py +0 -0
  142. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0011_generate_classes_from_streamers.py +0 -0
  143. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0013_rntuple_anchor.py +0 -0
  144. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0014_all_ttree_versions.py +0 -0
  145. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0016_interpretations.py +0 -0
  146. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0017_multi_basket_multi_branch_fetch.py +0 -0
  147. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0018_array_fetching_interface.py +0 -0
  148. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0022_number_of_branches.py +0 -0
  149. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0023_more_interpretations_1.py +0 -0
  150. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0023_ttree_versions.py +0 -0
  151. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0028_fallback_to_read_streamer.py +0 -0
  152. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0029_more_string_types.py +0 -0
  153. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0031_test_stl_containers.py +0 -0
  154. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0033_more_interpretations_2.py +0 -0
  155. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0034_generic_objects_in_ttrees.py +0 -0
  156. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0035_datatype_generality.py +0 -0
  157. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0038_memberwise_serialization.py +0 -0
  158. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0043_iterate_function.py +0 -0
  159. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0044_concatenate_function.py +0 -0
  160. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0046_histograms_bh_hist.py +0 -0
  161. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0053_parents_should_not_be_bases.py +0 -0
  162. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0058_detach_model_objects_from_files.py +0 -0
  163. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0066_fix_http_fallback_freeze.py +0 -0
  164. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0067_common_entry_offsets.py +0 -0
  165. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0081_dont_parse_colons.py +0 -0
  166. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0087_memberwise_splitting_not_implemented_messages.py +0 -0
  167. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0088_read_with_http.py +0 -0
  168. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0099_read_from_file_object.py +0 -0
  169. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0112_fix_pandas_with_cut.py +0 -0
  170. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0118_fix_name_fetch_again.py +0 -0
  171. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0123_atlas_issues.py +0 -0
  172. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0126_turn_unknown_emptyarrays_into_known_types.py +0 -0
  173. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0167_use_the_common_histogram_interface.py +0 -0
  174. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0172_allow_allocators_in_vector_typenames.py +0 -0
  175. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0173_empty_and_multiprocessing_bugs.py +0 -0
  176. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0182_complain_about_missing_files.py +0 -0
  177. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0194_fix_lost_cuts_in_iterate.py +0 -0
  178. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0220_contiguous_byte_ranges_in_http.py +0 -0
  179. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0228_read_TProfiles.py +0 -0
  180. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0240_read_TGraphAsymmErrors.py +0 -0
  181. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0278_specializations_for_TParameter.py +0 -0
  182. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0302_pickle.py +0 -0
  183. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0303_empty_jagged_array.py +0 -0
  184. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0320_start_working_on_ROOT_writing.py +0 -0
  185. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0322_writablefile_infrastructure.py +0 -0
  186. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0329_update_existing_root_files.py +0 -0
  187. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0335_empty_ttree_division_by_zero.py +0 -0
  188. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0341_manipulate_streamer_info.py +0 -0
  189. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0344_writabledirectory_can_read.py +0 -0
  190. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0345_bulk_copy_method.py +0 -0
  191. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0349_write_TObjString.py +0 -0
  192. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0350_read_RooCurve_RooHist.py +0 -0
  193. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0351_write_TList.py +0 -0
  194. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0352_write_THashList.py +0 -0
  195. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0384_move_behavior_of_and_fix_383.py +0 -0
  196. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0398_dimensions_in_leaflist.py +0 -0
  197. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0405_write_a_histogram.py +0 -0
  198. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0406_write_a_ttree.py +0 -0
  199. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0407_read_TDatime.py +0 -0
  200. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0412_write_multidimensional_numpy_to_ttree.py +0 -0
  201. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0414_write_jagged_arrays.py +0 -0
  202. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0418_read_TTable.py +0 -0
  203. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0420_pyroot_uproot_interoperability.py +0 -0
  204. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0422_hist_integration.py +0 -0
  205. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0430_global_index_for_tuples_of_DataFrames.py +0 -0
  206. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0438_TClonesArray_is_not_AsGrouped.py +0 -0
  207. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0439_check_awkward_before_numpy.py +0 -0
  208. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0442_regular_TClonesArray.py +0 -0
  209. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0472_tstreamerinfo_for_ttree.py +0 -0
  210. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0475_remember_to_update_freesegments.py +0 -0
  211. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0484_manually_add_model_for_TMatrixTSym_double_.py +0 -0
  212. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0487_implement_asdtypeinplace.py +0 -0
  213. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0498_create_leaf_branch_in_extend.py +0 -0
  214. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0519_remove_memmap_copy.py +0 -0
  215. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0520_dynamic_classes_cant_be_abc_subclasses.py +0 -0
  216. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0569_fBits_is_4_bytes.py +0 -0
  217. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0576_unicode_in_names.py +0 -0
  218. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0578_dask_for_numpy.py +0 -0
  219. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0580_round_trip_for_no_flow_histograms.py +0 -0
  220. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0589_explicitly_interpret_RVec_type.py +0 -0
  221. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0603_dask_delayed_open.py +0 -0
  222. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0609_num_enteries_func.py +0 -0
  223. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0610_awkward_form.py +0 -0
  224. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0630_rntuple_basics.py +0 -0
  225. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0637_setup_tests_for_AwkwardForth.py +0 -0
  226. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0643_reading_vector_pair_TLorentzVector_int.py +0 -0
  227. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0651_implement_transformed_axis.py +0 -0
  228. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0652_dask_for_awkward.py +0 -0
  229. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0662_rntuple_stl_containers.py +0 -0
  230. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0692_fsspec_reading.py +0 -0
  231. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0692_fsspec_writing.py +0 -0
  232. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0700_dask_empty_arrays.py +0 -0
  233. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0705_rntuple_writing_metadata.py +0 -0
  234. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0750_avoid_empty_TBasket_issue.py +0 -0
  235. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0755_dask_awkward_column_projection.py +0 -0
  236. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0791_protect_uproot_project_columns_from_dask_node_names.py +0 -0
  237. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0798_DAOD_PHYSLITE.py +0 -0
  238. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0808_fix_awkward_form_for_AsStridedObjects.py +0 -0
  239. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0816_separate_AwkwardForth_machines_by_TBranch.py +0 -0
  240. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0832_ak_add_doc_should_also_add_to_typetracer.py +0 -0
  241. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0840_support_tleafG.py +0 -0
  242. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0841_fix_814.py +0 -0
  243. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0844_fix_delete_hist_from_root.py +0 -0
  244. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0852_fix_strided_interp_extra_offsets.py +0 -0
  245. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0870_writing_arrays_of_type_unknown_fix_822.py +0 -0
  246. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0876_uproot_dask_blind_steps.py +0 -0
  247. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0886_fix_awkward_form_breadcrumbs.py +0 -0
  248. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0910_fix_906_members_non_numerical_branches.py +0 -0
  249. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0911_fix_interp_array_non_numerical_objs_issue_880.py +0 -0
  250. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0912_fix_pandas_and_double_nested_vectors_issue_885.py +0 -0
  251. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0916_read_from_s3.py +0 -0
  252. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0927_dont_assume_uproot_in_global_scope_in_TPython_Eval.py +0 -0
  253. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0930_expressions_in_pandas.py +0 -0
  254. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0940_feat_add_TLeafC_string_support.py +0 -0
  255. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0962_RNTuple_update.py +0 -0
  256. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0965_inverted_axes_variances_hist_888.py +0 -0
  257. {uproot-5.3.3 → uproot-5.3.5}/tests/test_0976_path_object_split.py +0 -0
  258. {uproot-5.3.3 → uproot-5.3.5}/tests/test_1000-write-TProfiles.py +0 -0
  259. {uproot-5.3.3 → uproot-5.3.5}/tests/test_1043_const_std_string.py +0 -0
  260. {uproot-5.3.3 → uproot-5.3.5}/tests/test_1058_dask_awkward_report.py +0 -0
  261. {uproot-5.3.3 → uproot-5.3.5}/tests/test_1063_dask_distributed.py +0 -0
  262. {uproot-5.3.3 → uproot-5.3.5}/tests/test_1070_pandas_dataframe_building_performance_fix.py +0 -0
  263. {uproot-5.3.3 → uproot-5.3.5}/tests/test_1085_dask_write.py +0 -0
  264. {uproot-5.3.3 → uproot-5.3.5}/tests/test_1102_any_locks_in_models_must_be_transient.py +0 -0
  265. {uproot-5.3.3 → uproot-5.3.5}/tests/test_1114_fix_attempt_to_concatenate_numpy_with_awkward.py +0 -0
  266. {uproot-5.3.3 → uproot-5.3.5}/tests/test_1120_check_decompression_executor_pass_for_dask.py +0 -0
  267. {uproot-5.3.3 → uproot-5.3.5}/tests/test_1127_fix_allow_colon_in_key_names.py +0 -0
  268. {uproot-5.3.3 → uproot-5.3.5}/tests/test_1146_split_ranges_for_large_files_over_http.py +0 -0
  269. {uproot-5.3.3 → uproot-5.3.5}/tests/test_1154_classof_using_relative_path.py +0 -0
  270. {uproot-5.3.3 → uproot-5.3.5}/tests/test_1160_std_string_in_TDirectory.py +0 -0
  271. {uproot-5.3.3 → uproot-5.3.5}/tests/test_1180_read_free_floating_vector_issue_1179.py +0 -0
  272. {uproot-5.3.3 → uproot-5.3.5}/tests/test_1181_support_for_stl_list.py +0 -0
  273. {uproot-5.3.3 → uproot-5.3.5}/tests/test_1182_add_support_for_bitset.py +0 -0
  274. {uproot-5.3.3 → uproot-5.3.5}/tests/test_1183_ttime_custom.py +0 -0
  275. {uproot-5.3.3 → uproot-5.3.5}/tests/test_1186_dtype_might_raise_ValueError.py +0 -0
  276. {uproot-5.3.3 → uproot-5.3.5}/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.3.0
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.3.5
26
+ rev: v0.4.3
27
27
  hooks:
28
28
  - id: ruff
29
29
  args: [--fix, --show-fixes]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: uproot
3
- Version: 5.3.3
3
+ Version: 5.3.5
4
4
  Summary: ROOT I/O in pure Python and NumPy.
5
5
  Project-URL: Download, https://github.com/scikit-hep/uproot5/releases
6
6
  Project-URL: Homepage, https://github.com/scikit-hep/uproot5
@@ -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 isinstance(library, uproot.interpretation.library.Awkward) and isinstance(
3011
- interpretation, uproot.interpretation.objects.AsObjects
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.header.field_records
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.header.field_records]
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
- return self.header.column_records
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
- if field_id in self._column_records_dict:
244
- rel_crs = self._column_records_dict[field_id]["rel_crs"]
245
- rel_crs_idxs = self._column_records_dict[field_id]["rel_crs_idxs"]
246
- elif field_id in self._alias_columns_dict:
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 filed_id: {field_id} is missing both from the columns records and the alias columns."
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
- return self.base_col_form(rel_crs[0], rel_crs_idxs[0])
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(rel_crs_idxs) == 2
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], rel_crs_idxs[-1], parameters={"__array__": "char"}
321
+ rel_crs[1], rel_crs[1].idx, parameters={"__array__": "char"}
269
322
  )
270
- form_key = f"column-{rel_crs_idxs[0]}"
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.header.field_records
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
- return ak.forms.RegularForm(inner, this_record.repetition)
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
- keyname = f"column-{this_id}"
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("u32", inner, form_key=keyname)
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.header.field_records
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
- recordlist.append(self.field_form(i, seen))
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
- return numpy.concatenate(
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
- # FIXME vector read
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
- key_fid = self._column_records_idx_to_id[key_nr]
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, range(start_cluster_idx, stop_cluster_idx)
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.alias_columns = self.list_alias_column_frames.read(chunk, cursor, context)
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.alias_records = ListFrameReader(
825
+ out.alias_column_records = ListFrameReader(
784
826
  RecordFrameReader(AliasColumnReader())
785
827
  ).read(chunk, cursor, context)
786
828
  out.extra_type_info = ListFrameReader(
@@ -64,7 +64,7 @@ in file {self.file.file_path}"""
64
64
  self._data,
65
65
  max_line_width=numpy.inf,
66
66
  separator=", ",
67
- formatter={"float": lambda x: "%g" % x},
67
+ formatter={"float": lambda x: f"{x:g}"},
68
68
  threshold=6,
69
69
  ),
70
70
  id(self),
@@ -214,7 +214,7 @@ in file {self.file.file_path}"""
214
214
  self._data,
215
215
  max_line_width=numpy.inf,
216
216
  separator=", ",
217
- formatter={"float": lambda x: "%g" % x},
217
+ formatter={"float": lambda x: f"{x:g}"},
218
218
  threshold=6,
219
219
  ),
220
220
  id(self),
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '5.3.3'
16
- __version_tuple__ = version_tuple = (5, 3, 3)
15
+ __version__ = version = '5.3.5'
16
+ __version_tuple__ = version_tuple = (5, 3, 5)
@@ -348,10 +348,11 @@ class Tree:
348
348
  if letter is None:
349
349
  raise TypeError(f"cannot write NumPy dtype {branch_dtype} in TTree")
350
350
 
351
- if branch_shape == ():
352
- dims = ""
353
- else:
354
- dims = "".join("[" + str(x) + "]" for x in branch_shape)
351
+ dims = ""
352
+ if counter is not None:
353
+ dims = "[" + counter["fName"] + "]"
354
+ if len(branch_shape) > 0:
355
+ dims = dims + "".join("[" + str(x) + "]" for x in branch_shape)
355
356
 
356
357
  title = f"{branch_name}{dims}/{letter}"
357
358
 
@@ -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
- if use_deflate:
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
- if use_deflate:
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
- if use_deflate:
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
- if use_deflate:
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
- if use_deflate:
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
- if use_deflate:
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
- if use_deflate:
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
- if use_deflate:
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: