uproot 5.7.2__tar.gz → 5.7.3__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 (341) hide show
  1. {uproot-5.7.2 → uproot-5.7.3}/.all-contributorsrc +9 -0
  2. {uproot-5.7.2 → uproot-5.7.3}/.github/workflows/build-test.yml +4 -4
  3. {uproot-5.7.2 → uproot-5.7.3}/PKG-INFO +2 -1
  4. {uproot-5.7.2 → uproot-5.7.3}/README.md +1 -0
  5. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/_util.py +1 -1
  6. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/behaviors/RNTuple.py +5 -6
  7. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/behaviors/TBranch.py +3 -1
  8. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/models/RNTuple.py +4 -2
  9. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/models/TMatrixT.py +30 -0
  10. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/models/TTree.py +2 -9
  11. uproot-5.7.3/src/uproot/version.py +24 -0
  12. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/writing/_cascade.py +2 -0
  13. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/writing/writable.py +71 -7
  14. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0043_iterate_function.py +10 -10
  15. uproot-5.7.3/tests/test_0578_dask_for_numpy.py +100 -0
  16. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0652_dask_for_awkward.py +2 -2
  17. {uproot-5.7.2 → uproot-5.7.3}/tests/test_1250_rntuple_improvements.py +10 -8
  18. uproot-5.7.3/tests/test_1599_mktree_mkrntuple_with_subdir.py +59 -0
  19. uproot-5.7.3/tests/test_1601_freesegments_stale_allocation.py +632 -0
  20. uproot-5.7.3/tests/test_1603_num_entries.py +19 -0
  21. uproot-5.7.3/tests/test_1604_write_tuple_dtypes.py +151 -0
  22. uproot-5.7.3/tests/test_1610_read_TMatrixTSym_from_ttree.py +32 -0
  23. {uproot-5.7.2 → uproot-5.7.3}/tests-cuda/test_1250_rntuple_improvements.py +10 -8
  24. uproot-5.7.2/src/uproot/version.py +0 -34
  25. uproot-5.7.2/tests/test_0578_dask_for_numpy.py +0 -1588
  26. {uproot-5.7.2 → uproot-5.7.3}/.github/ISSUE_TEMPLATE/bug-report.md +0 -0
  27. {uproot-5.7.2 → uproot-5.7.3}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  28. {uproot-5.7.2 → uproot-5.7.3}/.github/ISSUE_TEMPLATE/documentation.md +0 -0
  29. {uproot-5.7.2 → uproot-5.7.3}/.github/ISSUE_TEMPLATE/feature-request.md +0 -0
  30. {uproot-5.7.2 → uproot-5.7.3}/.github/dependabot.yml +0 -0
  31. {uproot-5.7.2 → uproot-5.7.3}/.github/workflows/build-distributions.yml +0 -0
  32. {uproot-5.7.2 → uproot-5.7.3}/.github/workflows/deploy.yml +0 -0
  33. {uproot-5.7.2 → uproot-5.7.3}/.github/workflows/semantic-pr-title.yml +0 -0
  34. {uproot-5.7.2 → uproot-5.7.3}/.github/workflows/upload-nightly-wheels.yml +0 -0
  35. {uproot-5.7.2 → uproot-5.7.3}/.gitignore +0 -0
  36. {uproot-5.7.2 → uproot-5.7.3}/.pre-commit-config.yaml +0 -0
  37. {uproot-5.7.2 → uproot-5.7.3}/.readthedocs.yml +0 -0
  38. {uproot-5.7.2 → uproot-5.7.3}/CITATION.cff +0 -0
  39. {uproot-5.7.2 → uproot-5.7.3}/CONTRIBUTING.md +0 -0
  40. {uproot-5.7.2 → uproot-5.7.3}/LICENSE +0 -0
  41. {uproot-5.7.2 → uproot-5.7.3}/codecov.yml +0 -0
  42. {uproot-5.7.2 → uproot-5.7.3}/dev/custom-interpretation/README.md +0 -0
  43. {uproot-5.7.2 → uproot-5.7.3}/dev/example-objects.py +0 -0
  44. {uproot-5.7.2 → uproot-5.7.3}/dev/make-models.py +0 -0
  45. {uproot-5.7.2 → uproot-5.7.3}/docs-img/diagrams/abstraction-layers.png +0 -0
  46. {uproot-5.7.2 → uproot-5.7.3}/docs-img/diagrams/abstraction-layers.svg +0 -0
  47. {uproot-5.7.2 → uproot-5.7.3}/docs-img/diagrams/example-dask-graph.png +0 -0
  48. {uproot-5.7.2 → uproot-5.7.3}/docs-img/diagrams/uproot-awkward-timeline.png +0 -0
  49. {uproot-5.7.2 → uproot-5.7.3}/docs-img/diagrams/uproot-awkward-timeline.svg +0 -0
  50. {uproot-5.7.2 → uproot-5.7.3}/docs-img/logo/logo-300px-white.png +0 -0
  51. {uproot-5.7.2 → uproot-5.7.3}/docs-img/logo/logo-300px.png +0 -0
  52. {uproot-5.7.2 → uproot-5.7.3}/docs-img/logo/logo-600px.png +0 -0
  53. {uproot-5.7.2 → uproot-5.7.3}/docs-img/logo/logo.svg +0 -0
  54. {uproot-5.7.2 → uproot-5.7.3}/docs-img/photos/switcheroo.jpg +0 -0
  55. {uproot-5.7.2 → uproot-5.7.3}/docs-sphinx/_templates/breadcrumbs.html +0 -0
  56. {uproot-5.7.2 → uproot-5.7.3}/docs-sphinx/basic.rst +0 -0
  57. {uproot-5.7.2 → uproot-5.7.3}/docs-sphinx/conf.py +0 -0
  58. {uproot-5.7.2 → uproot-5.7.3}/docs-sphinx/index.rst +0 -0
  59. {uproot-5.7.2 → uproot-5.7.3}/docs-sphinx/make_changelog.py +0 -0
  60. {uproot-5.7.2 → uproot-5.7.3}/docs-sphinx/prepare_docstrings.py +0 -0
  61. {uproot-5.7.2 → uproot-5.7.3}/docs-sphinx/requirements.txt +0 -0
  62. {uproot-5.7.2 → uproot-5.7.3}/docs-sphinx/uproot3-to-4.rst +0 -0
  63. {uproot-5.7.2 → uproot-5.7.3}/pyproject.toml +0 -0
  64. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/__init__.py +0 -0
  65. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/_awkwardforth.py +0 -0
  66. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/_dask.py +0 -0
  67. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/behavior.py +0 -0
  68. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/behaviors/RooCurve.py +0 -0
  69. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/behaviors/RooHist.py +0 -0
  70. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/behaviors/TAxis.py +0 -0
  71. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/behaviors/TBranchElement.py +0 -0
  72. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/behaviors/TDatime.py +0 -0
  73. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/behaviors/TGraph.py +0 -0
  74. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/behaviors/TGraphAsymmErrors.py +0 -0
  75. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/behaviors/TGraphErrors.py +0 -0
  76. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/behaviors/TH1.py +0 -0
  77. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/behaviors/TH2.py +0 -0
  78. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/behaviors/TH2Poly.py +0 -0
  79. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/behaviors/TH3.py +0 -0
  80. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/behaviors/TParameter.py +0 -0
  81. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/behaviors/TProfile.py +0 -0
  82. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/behaviors/TProfile2D.py +0 -0
  83. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/behaviors/TProfile3D.py +0 -0
  84. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/behaviors/TTree.py +0 -0
  85. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/behaviors/__init__.py +0 -0
  86. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/cache.py +0 -0
  87. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/compression.py +0 -0
  88. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/const.py +0 -0
  89. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/containers.py +0 -0
  90. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/deserialization.py +0 -0
  91. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/dynamic.py +0 -0
  92. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/exceptions.py +0 -0
  93. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/extras.py +0 -0
  94. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/interpretation/__init__.py +0 -0
  95. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/interpretation/custom.py +0 -0
  96. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/interpretation/grouped.py +0 -0
  97. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/interpretation/identify.py +0 -0
  98. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/interpretation/jagged.py +0 -0
  99. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/interpretation/known_forth/__init__.py +0 -0
  100. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/interpretation/known_forth/atlas.py +0 -0
  101. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/interpretation/library.py +0 -0
  102. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/interpretation/numerical.py +0 -0
  103. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/interpretation/objects.py +0 -0
  104. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/interpretation/strings.py +0 -0
  105. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/language/__init__.py +0 -0
  106. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/language/python.py +0 -0
  107. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/model.py +0 -0
  108. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/models/TArray.py +0 -0
  109. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/models/TAtt.py +0 -0
  110. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/models/TBasket.py +0 -0
  111. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/models/TBranch.py +0 -0
  112. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/models/TClonesArray.py +0 -0
  113. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/models/TDatime.py +0 -0
  114. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/models/TGraph.py +0 -0
  115. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/models/TH.py +0 -0
  116. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/models/THashList.py +0 -0
  117. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/models/TLeaf.py +0 -0
  118. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/models/TList.py +0 -0
  119. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/models/TNamed.py +0 -0
  120. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/models/TObjArray.py +0 -0
  121. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/models/TObjString.py +0 -0
  122. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/models/TObject.py +0 -0
  123. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/models/TRef.py +0 -0
  124. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/models/TString.py +0 -0
  125. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/models/TTable.py +0 -0
  126. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/models/TTime.py +0 -0
  127. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/models/__init__.py +0 -0
  128. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/pyroot.py +0 -0
  129. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/reading.py +0 -0
  130. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/serialization.py +0 -0
  131. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/sink/__init__.py +0 -0
  132. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/sink/file.py +0 -0
  133. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/source/__init__.py +0 -0
  134. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/source/chunk.py +0 -0
  135. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/source/coalesce.py +0 -0
  136. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/source/cufile_interface.py +0 -0
  137. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/source/cursor.py +0 -0
  138. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/source/file.py +0 -0
  139. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/source/fsspec.py +0 -0
  140. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/source/futures.py +0 -0
  141. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/source/http.py +0 -0
  142. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/source/object.py +0 -0
  143. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/source/xrootd.py +0 -0
  144. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/streamers.py +0 -0
  145. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/writing/__init__.py +0 -0
  146. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/writing/_cascadentuple.py +0 -0
  147. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/writing/_cascadetree.py +0 -0
  148. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/writing/_dask_write.py +0 -0
  149. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/writing/identify.py +0 -0
  150. {uproot-5.7.2 → uproot-5.7.3}/src/uproot/writing/interpret.py +0 -0
  151. {uproot-5.7.2 → uproot-5.7.3}/tests/__init__.py +0 -0
  152. {uproot-5.7.2 → uproot-5.7.3}/tests/conftest.py +0 -0
  153. {uproot-5.7.2 → uproot-5.7.3}/tests/samples/h_dynamic.pkl +0 -0
  154. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0001_source_class.py +0 -0
  155. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0006_notify_when_downloaded.py +0 -0
  156. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0007_single_chunk_interface.py +0 -0
  157. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0008_start_interpretation.py +0 -0
  158. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0009_nested_directories.py +0 -0
  159. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0010_start_streamers.py +0 -0
  160. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0011_generate_classes_from_streamers.py +0 -0
  161. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0013_rntuple_anchor.py +0 -0
  162. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0014_all_ttree_versions.py +0 -0
  163. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0016_interpretations.py +0 -0
  164. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0017_multi_basket_multi_branch_fetch.py +0 -0
  165. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0018_array_fetching_interface.py +0 -0
  166. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0022_number_of_branches.py +0 -0
  167. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0023_more_interpretations_1.py +0 -0
  168. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0023_ttree_versions.py +0 -0
  169. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0028_fallback_to_read_streamer.py +0 -0
  170. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0029_more_string_types.py +0 -0
  171. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0031_test_stl_containers.py +0 -0
  172. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0033_more_interpretations_2.py +0 -0
  173. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0034_generic_objects_in_ttrees.py +0 -0
  174. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0035_datatype_generality.py +0 -0
  175. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0038_memberwise_serialization.py +0 -0
  176. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0044_concatenate_function.py +0 -0
  177. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0046_histograms_bh_hist.py +0 -0
  178. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0053_parents_should_not_be_bases.py +0 -0
  179. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0058_detach_model_objects_from_files.py +0 -0
  180. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0066_fix_http_fallback_freeze.py +0 -0
  181. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0067_common_entry_offsets.py +0 -0
  182. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0081_dont_parse_colons.py +0 -0
  183. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0087_memberwise_splitting_not_implemented_messages.py +0 -0
  184. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0088_read_with_http.py +0 -0
  185. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0099_read_from_file_object.py +0 -0
  186. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0112_fix_pandas_with_cut.py +0 -0
  187. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0118_fix_name_fetch_again.py +0 -0
  188. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0123_atlas_issues.py +0 -0
  189. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0126_turn_unknown_emptyarrays_into_known_types.py +0 -0
  190. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0167_use_the_common_histogram_interface.py +0 -0
  191. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0172_allow_allocators_in_vector_typenames.py +0 -0
  192. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0173_empty_and_multiprocessing_bugs.py +0 -0
  193. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0182_complain_about_missing_files.py +0 -0
  194. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0194_fix_lost_cuts_in_iterate.py +0 -0
  195. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0220_contiguous_byte_ranges_in_http.py +0 -0
  196. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0228_read_TProfiles.py +0 -0
  197. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0240_read_TGraphAsymmErrors.py +0 -0
  198. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0278_specializations_for_TParameter.py +0 -0
  199. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0302_pickle.py +0 -0
  200. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0303_empty_jagged_array.py +0 -0
  201. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0320_start_working_on_ROOT_writing.py +0 -0
  202. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0322_writablefile_infrastructure.py +0 -0
  203. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0329_update_existing_root_files.py +0 -0
  204. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0335_empty_ttree_division_by_zero.py +0 -0
  205. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0341_manipulate_streamer_info.py +0 -0
  206. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0344_writabledirectory_can_read.py +0 -0
  207. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0345_bulk_copy_method.py +0 -0
  208. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0349_write_TObjString.py +0 -0
  209. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0350_read_RooCurve_RooHist.py +0 -0
  210. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0351_write_TList.py +0 -0
  211. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0352_write_THashList.py +0 -0
  212. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0384_move_behavior_of_and_fix_383.py +0 -0
  213. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0398_dimensions_in_leaflist.py +0 -0
  214. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0405_write_a_histogram.py +0 -0
  215. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0406_write_a_ttree.py +0 -0
  216. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0407_read_TDatime.py +0 -0
  217. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0412_write_multidimensional_numpy_to_ttree.py +0 -0
  218. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0414_write_jagged_arrays.py +0 -0
  219. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0416_writing_compressed_data.py +0 -0
  220. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0418_read_TTable.py +0 -0
  221. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0420_pyroot_uproot_interoperability.py +0 -0
  222. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0422_hist_integration.py +0 -0
  223. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0430_global_index_for_tuples_of_DataFrames.py +0 -0
  224. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0438_TClonesArray_is_not_AsGrouped.py +0 -0
  225. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0439_check_awkward_before_numpy.py +0 -0
  226. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0442_regular_TClonesArray.py +0 -0
  227. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0472_tstreamerinfo_for_ttree.py +0 -0
  228. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0475_remember_to_update_freesegments.py +0 -0
  229. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0484_manually_add_model_for_TMatrixTSym_double_.py +0 -0
  230. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0487_implement_asdtypeinplace.py +0 -0
  231. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0498_create_leaf_branch_in_extend.py +0 -0
  232. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0519_remove_memmap_copy.py +0 -0
  233. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0520_dynamic_classes_cant_be_abc_subclasses.py +0 -0
  234. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0569_fBits_is_4_bytes.py +0 -0
  235. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0576_unicode_in_names.py +0 -0
  236. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0580_round_trip_for_no_flow_histograms.py +0 -0
  237. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0589_explicitly_interpret_RVec_type.py +0 -0
  238. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0603_dask_delayed_open.py +0 -0
  239. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0609_num_enteries_func.py +0 -0
  240. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0610_awkward_form.py +0 -0
  241. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0630_rntuple_basics.py +0 -0
  242. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0637_setup_tests_for_AwkwardForth.py +0 -0
  243. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0643_reading_vector_pair_TLorentzVector_int.py +0 -0
  244. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0651_implement_transformed_axis.py +0 -0
  245. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0662_rntuple_stl_containers.py +0 -0
  246. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0692_fsspec_reading.py +0 -0
  247. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0692_fsspec_writing.py +0 -0
  248. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0700_dask_empty_arrays.py +0 -0
  249. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0705_rntuple_writing_metadata.py +0 -0
  250. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0750_avoid_empty_TBasket_issue.py +0 -0
  251. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0755_dask_awkward_column_projection.py +0 -0
  252. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0791_protect_uproot_project_columns_from_dask_node_names.py +0 -0
  253. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0798_DAOD_PHYSLITE.py +0 -0
  254. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0808_fix_awkward_form_for_AsStridedObjects.py +0 -0
  255. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0816_separate_AwkwardForth_machines_by_TBranch.py +0 -0
  256. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0832_ak_add_doc_should_also_add_to_typetracer.py +0 -0
  257. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0840_support_tleafG.py +0 -0
  258. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0841_fix_814.py +0 -0
  259. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0844_fix_delete_hist_from_root.py +0 -0
  260. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0852_fix_strided_interp_extra_offsets.py +0 -0
  261. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0870_writing_arrays_of_type_unknown_fix_822.py +0 -0
  262. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0876_uproot_dask_blind_steps.py +0 -0
  263. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0886_fix_awkward_form_breadcrumbs.py +0 -0
  264. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0910_fix_906_members_non_numerical_branches.py +0 -0
  265. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0911_fix_interp_array_non_numerical_objs_issue_880.py +0 -0
  266. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0912_fix_pandas_and_double_nested_vectors_issue_885.py +0 -0
  267. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0916_read_from_s3.py +0 -0
  268. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0927_dont_assume_uproot_in_global_scope_in_TPython_Eval.py +0 -0
  269. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0930_expressions_in_pandas.py +0 -0
  270. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0940_feat_add_TLeafC_string_support.py +0 -0
  271. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0962_rntuple_update.py +0 -0
  272. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0965_inverted_axes_variances_hist_888.py +0 -0
  273. {uproot-5.7.2 → uproot-5.7.3}/tests/test_0976_path_object_split.py +0 -0
  274. {uproot-5.7.2 → uproot-5.7.3}/tests/test_1000-write-TProfiles.py +0 -0
  275. {uproot-5.7.2 → uproot-5.7.3}/tests/test_1043_const_std_string.py +0 -0
  276. {uproot-5.7.2 → uproot-5.7.3}/tests/test_1058_dask_awkward_report.py +0 -0
  277. {uproot-5.7.2 → uproot-5.7.3}/tests/test_1063_dask_distributed.py +0 -0
  278. {uproot-5.7.2 → uproot-5.7.3}/tests/test_1070_pandas_dataframe_building_performance_fix.py +0 -0
  279. {uproot-5.7.2 → uproot-5.7.3}/tests/test_1085_dask_write.py +0 -0
  280. {uproot-5.7.2 → uproot-5.7.3}/tests/test_1102_any_locks_in_models_must_be_transient.py +0 -0
  281. {uproot-5.7.2 → uproot-5.7.3}/tests/test_1114_fix_attempt_to_concatenate_numpy_with_awkward.py +0 -0
  282. {uproot-5.7.2 → uproot-5.7.3}/tests/test_1120_check_decompression_executor_pass_for_dask.py +0 -0
  283. {uproot-5.7.2 → uproot-5.7.3}/tests/test_1127_fix_allow_colon_in_key_names.py +0 -0
  284. {uproot-5.7.2 → uproot-5.7.3}/tests/test_1128_TGraph_writing.py +0 -0
  285. {uproot-5.7.2 → uproot-5.7.3}/tests/test_1146_split_ranges_for_large_files_over_http.py +0 -0
  286. {uproot-5.7.2 → uproot-5.7.3}/tests/test_1154_classof_using_relative_path.py +0 -0
  287. {uproot-5.7.2 → uproot-5.7.3}/tests/test_1159_rntuple_cluster_groups.py +0 -0
  288. {uproot-5.7.2 → uproot-5.7.3}/tests/test_1160_std_string_in_TDirectory.py +0 -0
  289. {uproot-5.7.2 → uproot-5.7.3}/tests/test_1180_read_free_floating_vector_issue_1179.py +0 -0
  290. {uproot-5.7.2 → uproot-5.7.3}/tests/test_1181_support_for_stl_list.py +0 -0
  291. {uproot-5.7.2 → uproot-5.7.3}/tests/test_1182_add_support_for_bitset.py +0 -0
  292. {uproot-5.7.2 → uproot-5.7.3}/tests/test_1183_ttime_custom.py +0 -0
  293. {uproot-5.7.2 → uproot-5.7.3}/tests/test_1186_dtype_might_raise_ValueError.py +0 -0
  294. {uproot-5.7.2 → uproot-5.7.3}/tests/test_1189_dask_failing_on_duplicate_keys.py +0 -0
  295. {uproot-5.7.2 → uproot-5.7.3}/tests/test_1191_rntuple_fixes.py +0 -0
  296. {uproot-5.7.2 → uproot-5.7.3}/tests/test_1198_coalesce.py +0 -0
  297. {uproot-5.7.2 → uproot-5.7.3}/tests/test_1207_fix_title_of_TBranch_with_counter.py +0 -0
  298. {uproot-5.7.2 → uproot-5.7.3}/tests/test_1212_dont_let_update_mess_up_file_version.py +0 -0
  299. {uproot-5.7.2 → uproot-5.7.3}/tests/test_1221_AwkwardForth_bug.py +0 -0
  300. {uproot-5.7.2 → uproot-5.7.3}/tests/test_1223_more_rntuple_types.py +0 -0
  301. {uproot-5.7.2 → uproot-5.7.3}/tests/test_1229_const_in_typename.py +0 -0
  302. {uproot-5.7.2 → uproot-5.7.3}/tests/test_1254_test_threadpool_executor_for_dask.py +0 -0
  303. {uproot-5.7.2 → uproot-5.7.3}/tests/test_1264_write_NumPy_array_of_strings.py +0 -0
  304. {uproot-5.7.2 → uproot-5.7.3}/tests/test_1275_fix_TStreamerLoop_code_generation.py +0 -0
  305. {uproot-5.7.2 → uproot-5.7.3}/tests/test_1282_add_known_forth_for_atlas.py +0 -0
  306. {uproot-5.7.2 → uproot-5.7.3}/tests/test_1285_rntuple_multicluster_concatenation.py +0 -0
  307. {uproot-5.7.2 → uproot-5.7.3}/tests/test_1318_dont_compare_big_endian_in_awkward.py +0 -0
  308. {uproot-5.7.2 → uproot-5.7.3}/tests/test_1321_pandas_changed_api_again.py +0 -0
  309. {uproot-5.7.2 → uproot-5.7.3}/tests/test_1347_rntuple_floats_suppressed_cols.py +0 -0
  310. {uproot-5.7.2 → uproot-5.7.3}/tests/test_1356_basic_rntuple_writing.py +0 -0
  311. {uproot-5.7.2 → uproot-5.7.3}/tests/test_1375_extend_ak_add_doc.py +0 -0
  312. {uproot-5.7.2 → uproot-5.7.3}/tests/test_1393_TTree_virtual_arrays.py +0 -0
  313. {uproot-5.7.2 → uproot-5.7.3}/tests/test_1395_rntuple_writing_lists_and_structs.py +0 -0
  314. {uproot-5.7.2 → uproot-5.7.3}/tests/test_1406_improved_rntuple_methods.py +0 -0
  315. {uproot-5.7.2 → uproot-5.7.3}/tests/test_1411_rntuple_physlite_ATLAS.py +0 -0
  316. {uproot-5.7.2 → uproot-5.7.3}/tests/test_1412_rntuple_dask.py +0 -0
  317. {uproot-5.7.2 → uproot-5.7.3}/tests/test_1465_ignorecase_extension.py +0 -0
  318. {uproot-5.7.2 → uproot-5.7.3}/tests/test_1467_rntuple_akform_construction.py +0 -0
  319. {uproot-5.7.2 → uproot-5.7.3}/tests/test_1476_rntuple_jagged_subfields.py +0 -0
  320. {uproot-5.7.2 → uproot-5.7.3}/tests/test_1477_custom_interpretation.py +0 -0
  321. {uproot-5.7.2 → uproot-5.7.3}/tests/test_1492_rntuple_hidden_keys.py +0 -0
  322. {uproot-5.7.2 → uproot-5.7.3}/tests/test_1496_rntuple_write_index_arrays.py +0 -0
  323. {uproot-5.7.2 → uproot-5.7.3}/tests/test_1503_rntuple_virtual_arrays.py +0 -0
  324. {uproot-5.7.2 → uproot-5.7.3}/tests/test_1510_rntuple_v1010.py +0 -0
  325. {uproot-5.7.2 → uproot-5.7.3}/tests/test_1556_default_rntuple_writing.py +0 -0
  326. {uproot-5.7.2 → uproot-5.7.3}/tests/test_1573_out_of_bounds_slicing.py +0 -0
  327. {uproot-5.7.2 → uproot-5.7.3}/tests/test_1589_rntuple_inheritance.py +0 -0
  328. {uproot-5.7.2 → uproot-5.7.3}/tests/test_1591_rntuple_read_to_numpy.py +0 -0
  329. {uproot-5.7.2 → uproot-5.7.3}/tests-cuda/test_0630_rntuple_basics.py +0 -0
  330. {uproot-5.7.2 → uproot-5.7.3}/tests-cuda/test_0662_rntuple_stl_containers.py +0 -0
  331. {uproot-5.7.2 → uproot-5.7.3}/tests-cuda/test_0962_rntuple_update.py +0 -0
  332. {uproot-5.7.2 → uproot-5.7.3}/tests-cuda/test_1159_rntuple_cluster_groups.py +0 -0
  333. {uproot-5.7.2 → uproot-5.7.3}/tests-cuda/test_1191_rntuple_fixes.py +0 -0
  334. {uproot-5.7.2 → uproot-5.7.3}/tests-cuda/test_1223_more_rntuple_types.py +0 -0
  335. {uproot-5.7.2 → uproot-5.7.3}/tests-cuda/test_1285_rntuple_multicluster_concatenation.py +0 -0
  336. {uproot-5.7.2 → uproot-5.7.3}/tests-cuda/test_1347_rntuple_floats_suppressed_cols.py +0 -0
  337. {uproot-5.7.2 → uproot-5.7.3}/tests-cuda/test_1411_rntuple_physlite_ATLAS.py +0 -0
  338. {uproot-5.7.2 → uproot-5.7.3}/tests-wasm/__init__.py +0 -0
  339. {uproot-5.7.2 → uproot-5.7.3}/tests-wasm/test_1272_basic_functionality.py +0 -0
  340. {uproot-5.7.2 → uproot-5.7.3}/tests-wasm/test_1365_awkwardforth_reading.py +0 -0
  341. {uproot-5.7.2 → uproot-5.7.3}/tests-wasm/utils.py +0 -0
@@ -686,6 +686,15 @@
686
686
  "contributions": [
687
687
  "code"
688
688
  ]
689
+ },
690
+ {
691
+ "login": "nickwp",
692
+ "name": "Nick Prouse",
693
+ "avatar_url": "https://avatars.githubusercontent.com/u/9571544?v=4",
694
+ "profile": "https://github.com/nickwp",
695
+ "contributions": [
696
+ "code"
697
+ ]
689
698
  }
690
699
  ],
691
700
  "contributorsPerLine": 7,
@@ -30,7 +30,7 @@ jobs:
30
30
  - uses: actions/checkout@v6
31
31
 
32
32
  - name: Get micromamba
33
- uses: mamba-org/setup-micromamba@v2
33
+ uses: mamba-org/setup-micromamba@v3
34
34
  with:
35
35
  environment-name: test-env
36
36
  init-shell: bash
@@ -223,7 +223,7 @@ jobs:
223
223
  - uses: actions/checkout@v6
224
224
 
225
225
  - name: Get micromamba
226
- uses: mamba-org/setup-micromamba@v2
226
+ uses: mamba-org/setup-micromamba@v3
227
227
  with:
228
228
  environment-name: test-env
229
229
  init-shell: bash
@@ -257,12 +257,12 @@ jobs:
257
257
 
258
258
  - name: Upload coverage reports to Codecov
259
259
  if: matrix.cuda-version == 13
260
- uses: codecov/codecov-action@v5
260
+ uses: codecov/codecov-action@v6
261
261
  with:
262
262
  token: ${{ secrets.CODECOV_TOKEN }}
263
263
 
264
264
  - name: Upload test results to Codecov
265
- if: ${{ !cancelled() }}
265
+ if: ${{ !cancelled() && matrix.cuda-version == 13 }}
266
266
  uses: codecov/test-results-action@v1
267
267
  with:
268
268
  token: ${{ secrets.CODECOV_TOKEN }}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: uproot
3
- Version: 5.7.2
3
+ Version: 5.7.3
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
@@ -249,6 +249,7 @@ Thanks especially to the gracious help of Uproot contributors (including the [or
249
249
  <td align="center" valign="top" width="14.28%"><a href="https://github.com/Rachit931"><img src="https://avatars.githubusercontent.com/u/199397286?v=4?s=100" width="100px;" alt="Rachit931"/><br /><sub><b>Rachit931</b></sub></a><br /><a href="https://github.com/scikit-hep/uproot5/commits?author=Rachit931" title="Documentation">📖</a></td>
250
250
  <td align="center" valign="top" width="14.28%"><a href="https://github.com/wdconinc"><img src="https://avatars.githubusercontent.com/u/4656391?v=4?s=100" width="100px;" alt="Wouter Deconinck"/><br /><sub><b>Wouter Deconinck</b></sub></a><br /><a href="https://github.com/scikit-hep/uproot5/commits?author=wdconinc" title="Code">💻</a></td>
251
251
  <td align="center" valign="top" width="14.28%"><a href="https://github.com/KaranSinghDev"><img src="https://avatars.githubusercontent.com/u/102300776?v=4?s=100" width="100px;" alt="Karan Singh"/><br /><sub><b>Karan Singh</b></sub></a><br /><a href="https://github.com/scikit-hep/uproot5/commits?author=KaranSinghDev" title="Code">💻</a></td>
252
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/nickwp"><img src="https://avatars.githubusercontent.com/u/9571544?v=4?s=100" width="100px;" alt="Nick Prouse"/><br /><sub><b>Nick Prouse</b></sub></a><br /><a href="https://github.com/scikit-hep/uproot5/commits?author=nickwp" title="Code">💻</a></td>
252
253
  </tr>
253
254
  </tbody>
254
255
  </table>
@@ -197,6 +197,7 @@ Thanks especially to the gracious help of Uproot contributors (including the [or
197
197
  <td align="center" valign="top" width="14.28%"><a href="https://github.com/Rachit931"><img src="https://avatars.githubusercontent.com/u/199397286?v=4?s=100" width="100px;" alt="Rachit931"/><br /><sub><b>Rachit931</b></sub></a><br /><a href="https://github.com/scikit-hep/uproot5/commits?author=Rachit931" title="Documentation">📖</a></td>
198
198
  <td align="center" valign="top" width="14.28%"><a href="https://github.com/wdconinc"><img src="https://avatars.githubusercontent.com/u/4656391?v=4?s=100" width="100px;" alt="Wouter Deconinck"/><br /><sub><b>Wouter Deconinck</b></sub></a><br /><a href="https://github.com/scikit-hep/uproot5/commits?author=wdconinc" title="Code">💻</a></td>
199
199
  <td align="center" valign="top" width="14.28%"><a href="https://github.com/KaranSinghDev"><img src="https://avatars.githubusercontent.com/u/102300776?v=4?s=100" width="100px;" alt="Karan Singh"/><br /><sub><b>Karan Singh</b></sub></a><br /><a href="https://github.com/scikit-hep/uproot5/commits?author=KaranSinghDev" title="Code">💻</a></td>
200
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/nickwp"><img src="https://avatars.githubusercontent.com/u/9571544?v=4?s=100" width="100px;" alt="Nick Prouse"/><br /><sub><b>Nick Prouse</b></sub></a><br /><a href="https://github.com/scikit-hep/uproot5/commits?author=nickwp" title="Code">💻</a></td>
200
201
  </tr>
201
202
  </tbody>
202
203
  </table>
@@ -414,7 +414,7 @@ def memory_size(data, error_message=None) -> int:
414
414
  """
415
415
  if isinstance(data, str):
416
416
  m = re.match(
417
- r"^\s*([+-]?(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?)\s*([kmgtpezy]?b)\s*$",
417
+ r"^\s*([+-]?(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?)\s*([kmgtpezy]?[i]?b)\s*$",
418
418
  data,
419
419
  re.I,
420
420
  )
@@ -1768,7 +1768,6 @@ def _get_recursive(hasfields, where):
1768
1768
 
1769
1769
 
1770
1770
  def _num_entries_for(ntuple, akform, target_num_bytes, entry_start, entry_stop):
1771
- # TODO: there might be a better way to estimate the number of entries
1772
1771
  clusters = ntuple.cluster_summaries
1773
1772
  cluster_starts = numpy.array([c.num_first_entry for c in clusters])
1774
1773
 
@@ -1784,9 +1783,10 @@ def _num_entries_for(ntuple, akform, target_num_bytes, entry_start, entry_stop):
1784
1783
  for key in target_cols:
1785
1784
  if "column" in key:
1786
1785
  key_nr = int(key.split("-")[1])
1787
- for cluster in range(start_cluster_idx, stop_cluster_idx):
1788
- pages = ntuple.page_link_list[cluster][key_nr].pages
1789
- total_bytes += sum(page.locator.num_bytes for page in pages)
1786
+ n_entries, _, dt = ntuple._expected_array_length_starts_dtype(
1787
+ key_nr, start_cluster_idx, stop_cluster_idx
1788
+ )
1789
+ total_bytes += n_entries * dt.itemsize
1790
1790
 
1791
1791
  total_entries = entry_stop - entry_start
1792
1792
  if total_bytes == 0:
@@ -1795,8 +1795,7 @@ def _num_entries_for(ntuple, akform, target_num_bytes, entry_start, entry_stop):
1795
1795
  num_entries = round(target_num_bytes * total_entries / total_bytes)
1796
1796
  if num_entries <= 0:
1797
1797
  return 1
1798
- else:
1799
- return num_entries
1798
+ return num_entries
1800
1799
 
1801
1800
 
1802
1801
  def _regularize_step_size(ntuple, akform, step_size, entry_start, entry_stop):
@@ -2655,6 +2655,8 @@ in file {self._file.file_path}"""
2655
2655
  if 0 <= basket_num < self._num_normal_baskets:
2656
2656
  start = self.member("fBasketSeek")[basket_num]
2657
2657
  stop = start + self.basket_compressed_bytes(basket_num)
2658
+ # xrootd doesn't like NumPy ints
2659
+ start, stop = int(start), int(stop)
2658
2660
  cursor = uproot.source.cursor.Cursor(start)
2659
2661
  chunk = self._file.source.chunk(start, stop)
2660
2662
  return chunk, cursor
@@ -3565,7 +3567,7 @@ def _hasbranches_num_entries_for(
3565
3567
  start = entry_offsets[0]
3566
3568
  for basket_num, stop in enumerate(entry_offsets[1:]):
3567
3569
  if entry_start < stop and start <= entry_stop:
3568
- total_bytes += branch.basket_compressed_bytes(basket_num)
3570
+ total_bytes += branch.basket_uncompressed_bytes(basket_num)
3569
3571
  start = stop
3570
3572
 
3571
3573
  total_entries = entry_stop - entry_start
@@ -229,15 +229,17 @@ in file {self.file.file_path}"""
229
229
  ]
230
230
 
231
231
  name_counter = Counter(new_names)
232
+ max_prefixes = max(len(stack) for stack in ancestor_name_stacks)
232
233
  while len(new_names) != len(name_counter):
233
234
  for i in range(len(n_prefixes)):
234
235
  # For non-unique names, add one more prefix and regenerate the name
235
236
  if name_counter[new_names[i]] > 1:
236
237
  n_prefixes[i] += 1
237
238
 
238
- if n_prefixes[i] >= len(ancestor_name_stacks[i]):
239
+ if n_prefixes[i] >= max_prefixes:
240
+ self._all_fields = None
239
241
  raise RuntimeError(
240
- "Ran out of prefixes to add, but names are still not unique."
242
+ "Reached maximum number of prefixes, but names are still not unique."
241
243
  )
242
244
 
243
245
  new_names[i] = _generate_fieldname(
@@ -8,6 +8,7 @@ from __future__ import annotations
8
8
 
9
9
  import struct
10
10
 
11
+ import awkward
11
12
  import numpy
12
13
 
13
14
  import uproot
@@ -56,6 +57,35 @@ class Model_TMatrixTSym_3c_double_3e__v5(uproot.model.VersionedModel):
56
57
  )
57
58
  self._num_bytes += self._members["fElements"].nbytes
58
59
 
60
+ @classmethod
61
+ def awkward_form(cls, file, context):
62
+ return awkward.forms.RecordForm(
63
+ [
64
+ awkward.forms.NumpyForm("int32"),
65
+ awkward.forms.NumpyForm("int32"),
66
+ awkward.forms.NumpyForm("int32"),
67
+ awkward.forms.NumpyForm("int32"),
68
+ awkward.forms.NumpyForm("uint32"),
69
+ awkward.forms.NumpyForm("int32"),
70
+ awkward.forms.NumpyForm("float64"),
71
+ awkward.forms.ListOffsetForm(
72
+ context["index_format"],
73
+ awkward.forms.NumpyForm("float64"),
74
+ ),
75
+ ],
76
+ [
77
+ "fNrows",
78
+ "fNcols",
79
+ "fRowLwb",
80
+ "fColLwb",
81
+ "fNelems",
82
+ "fNrowIndex",
83
+ "fTol",
84
+ "fElements",
85
+ ],
86
+ parameters={"__record__": "TMatrixTSym<double>"},
87
+ )
88
+
59
89
  _format0 = struct.Struct(">iiiiiid")
60
90
  _format_memberwise0 = struct.Struct(">i")
61
91
  _format_memberwise1 = struct.Struct(">i")
@@ -960,15 +960,8 @@ def num_entries(paths):
960
960
  """
961
961
  paths2 = uproot._util.regularize_files(paths, steps_allowed=False)
962
962
 
963
- if isinstance(paths, dict):
964
- paths = list(paths.items())
965
- elif not isinstance(paths, str):
966
- paths = [(uproot._util.file_object_path_split(path)) for path in paths]
967
- else:
968
- paths = [uproot._util.file_object_path_split(paths)]
969
-
970
- for i, (file_path, object_path) in enumerate(paths2):
963
+ for file_path, object_path in paths2:
971
964
  with uproot.open(
972
965
  {file_path: object_path}, custom_classes={"TTree": Model_TTree_NumEntries}
973
966
  ) as f:
974
- yield paths[i][0], paths[i][1], f.all_members["fEntries"][0]
967
+ yield file_path, object_path, f.all_members["fEntries"][0]
@@ -0,0 +1,24 @@
1
+ # file generated by vcs-versioning
2
+ # don't change, don't track in version control
3
+ from __future__ import annotations
4
+
5
+ __all__ = [
6
+ "__version__",
7
+ "__version_tuple__",
8
+ "version",
9
+ "version_tuple",
10
+ "__commit_id__",
11
+ "commit_id",
12
+ ]
13
+
14
+ version: str
15
+ __version__: str
16
+ __version_tuple__: tuple[int | str, ...]
17
+ version_tuple: tuple[int | str, ...]
18
+ commit_id: str | None
19
+ __commit_id__: str | None
20
+
21
+ __version__ = version = '5.7.3'
22
+ __version_tuple__ = version_tuple = (5, 7, 3)
23
+
24
+ __commit_id__ = commit_id = None
@@ -474,6 +474,7 @@ class FreeSegmentsData(CascadeLeaf):
474
474
  def slices(self, value):
475
475
  if self._slices != value:
476
476
  self._file_dirty = True
477
+ self._allocation = None
477
478
  self._slices = value
478
479
 
479
480
  @property
@@ -484,6 +485,7 @@ class FreeSegmentsData(CascadeLeaf):
484
485
  def end(self, value):
485
486
  if self._end != value:
486
487
  self._file_dirty = True
488
+ self._allocation = None
487
489
  self._end = value
488
490
 
489
491
  @property
@@ -1237,6 +1237,7 @@ class WritableDirectory(MutableMapping):
1237
1237
  self._file.uuid_function(),
1238
1238
  ),
1239
1239
  )
1240
+ self._subdirs[head] = directory
1240
1241
 
1241
1242
  elif key.classname.string not in ("TDirectory", "TDirectoryFile"):
1242
1243
  raise TypeError(
@@ -2234,9 +2235,39 @@ def _is_type_specification(obj):
2234
2235
  else:
2235
2236
  return False
2236
2237
  if not isinstance(
2237
- obj, (numpy.dtype, awkward.types.Type, awkward.types.ArrayType, str, type)
2238
+ obj,
2239
+ (
2240
+ numpy.dtype,
2241
+ awkward.types.Type,
2242
+ awkward.types.ArrayType,
2243
+ type,
2244
+ str,
2245
+ tuple,
2246
+ ),
2238
2247
  ):
2239
2248
  return False
2249
+ # for tuples and strings we need to make sure they actually specify a type and are not just data
2250
+ if isinstance(obj, tuple):
2251
+ try:
2252
+ numpy.dtype(obj)
2253
+ except (TypeError, ValueError):
2254
+ return False
2255
+ else:
2256
+ continue
2257
+ if isinstance(obj, str):
2258
+ try:
2259
+ numpy.dtype(obj)
2260
+ except (TypeError, ValueError):
2261
+ pass
2262
+ else:
2263
+ continue
2264
+ try:
2265
+ awkward.types.from_datashape(obj, highlevel=False)
2266
+ except Exception:
2267
+ pass
2268
+ else:
2269
+ continue
2270
+ return False
2240
2271
  return True
2241
2272
 
2242
2273
 
@@ -2245,12 +2276,45 @@ def _type_specification_to_awkward_form(obj):
2245
2276
  return obj
2246
2277
  if isinstance(obj, (awkward.types.Type, awkward.types.ArrayType)):
2247
2278
  return awkward.forms.from_type(obj)
2248
- if isinstance(obj, (numpy.dtype, type)):
2249
- obj = str(numpy.dtype(obj))
2279
+ if isinstance(obj, type):
2280
+ obj = numpy.dtype(obj)
2281
+ if obj == numpy.dtype("O"):
2282
+ raise TypeError(f"Cannot construct a NumPy dtype from {obj!r}.")
2283
+ if isinstance(obj, tuple):
2284
+ try:
2285
+ obj = numpy.dtype(obj)
2286
+ except (TypeError, ValueError):
2287
+ raise TypeError(
2288
+ f"Cannot construct a NumPy dtype from the tuple {obj!r}."
2289
+ ) from None
2250
2290
  if isinstance(obj, str):
2251
- return awkward.forms.from_type(
2252
- awkward.types.from_datashape(obj, highlevel=False)
2253
- )
2291
+ # First we try to interpret the string as a NumPy dtype
2292
+ # so we can try to convert it to a string Awkward understands
2293
+ try:
2294
+ dt = numpy.dtype(obj)
2295
+ except (TypeError, ValueError):
2296
+ pass
2297
+ else:
2298
+ obj = dt
2299
+ if isinstance(obj, numpy.dtype):
2300
+ obj = obj.newbyteorder("<")
2301
+ if obj.subdtype is None:
2302
+ field_shape = ()
2303
+ else:
2304
+ obj, field_shape = obj.subdtype
2305
+ dims = ""
2306
+ if len(field_shape) > 0:
2307
+ dims = dims + "".join(str(x) + " * " for x in field_shape)
2308
+ obj = f"{dims}{obj}"
2309
+ if isinstance(obj, str):
2310
+ try:
2311
+ return awkward.forms.from_type(
2312
+ awkward.types.from_datashape(obj, highlevel=False)
2313
+ )
2314
+ except Exception:
2315
+ raise TypeError(
2316
+ f"Cannot construct an Awkward Form from type specification {obj!r}"
2317
+ ) from None
2254
2318
  if isinstance(obj, Mapping):
2255
2319
  return awkward.forms.RecordForm(
2256
2320
  [_type_specification_to_awkward_form(v) for v in obj.values()],
@@ -2258,7 +2322,7 @@ def _type_specification_to_awkward_form(obj):
2258
2322
  )
2259
2323
  raise TypeError(
2260
2324
  f"Cannot construct an Awkward Form from {type(obj).__name__}. "
2261
- f"Supported types: Form, Type, ArrayType, dtype, str, Mapping"
2325
+ f"Supported types: Form, Type, ArrayType, dtype, Mapping, str, tuple."
2262
2326
  )
2263
2327
 
2264
2328
 
@@ -9,27 +9,27 @@ import uproot
9
9
 
10
10
  def test_num_entries_for():
11
11
  with uproot.open(skhep_testdata.data_path("uproot-HZZ.root"))["events"] as events:
12
- assert events.num_entries_for("1 kB") == 12
13
- assert events.num_entries_for("10 kB") == 116
14
- assert events.num_entries_for("0.1 MB") == 1157
12
+ assert events.num_entries_for("1 kB") == 4
13
+ assert events.num_entries_for("10 kB") == 37
14
+ assert events.num_entries_for("0.1 MB") == 372
15
15
  assert events.num_entries == 2421
16
16
 
17
17
 
18
18
  def test_num_entries_for_2():
19
19
  with uproot.open(skhep_testdata.data_path("uproot-Zmumu.root"))["events"] as events:
20
- assert events.num_entries_for("1 kB") == 13
21
- assert events.num_entries_for("10 kB") == 133
22
- assert events.num_entries_for("0.1 MB") == 1333
20
+ assert events.num_entries_for("1 kB") == 7
21
+ assert events.num_entries_for("10 kB") == 70
22
+ assert events.num_entries_for("0.1 MB") == 696
23
23
  assert events.num_entries == 2304
24
24
 
25
25
 
26
26
  def test_iterate_1():
27
27
  with uproot.open(skhep_testdata.data_path("uproot-Zmumu.root"))["events"] as events:
28
28
  for i, arrays in enumerate(events.iterate(step_size="0.1 MB", library="np")):
29
- if i == 0:
30
- assert len(arrays["px1"]) == 1333
31
- elif i == 1:
32
- assert len(arrays["px1"]) == 971
29
+ if i in range(3):
30
+ assert len(arrays["px1"]) == 696
31
+ elif i == 3:
32
+ assert len(arrays["px1"]) == 216
33
33
  else:
34
34
  assert False
35
35
 
@@ -0,0 +1,100 @@
1
+ # BSD 3-Clause License; see https://github.com/scikit-hep/uproot5/blob/main/LICENSE
2
+
3
+ import numpy
4
+ import pytest
5
+ import skhep_testdata
6
+
7
+ import uproot
8
+
9
+ dask = pytest.importorskip("dask")
10
+ da = pytest.importorskip("dask.array")
11
+
12
+
13
+ def test_single_dask_array():
14
+ test_path = skhep_testdata.data_path("uproot-Zmumu.root") + ":events"
15
+ ttree = uproot.open(test_path)
16
+
17
+ np_arrays = ttree.arrays(library="np")
18
+ dask_arrays = uproot.dask(test_path, library="np")
19
+
20
+ assert list(dask_arrays.keys()) == list(
21
+ np_arrays.keys()
22
+ ), "Different keys detected in dictionary of dask arrays and dictionary of numpy arrays"
23
+
24
+ for key in np_arrays.keys():
25
+ comp = dask_arrays[key].compute() == np_arrays[key]
26
+ assert comp.all(), f"Incorrect array at key {key}"
27
+
28
+
29
+ def test_dask_concatenation():
30
+ test_path1 = skhep_testdata.data_path("uproot-Zmumu.root") + ":events"
31
+ test_path2 = skhep_testdata.data_path("uproot-Zmumu-uncompressed.root") + ":events"
32
+ test_path3 = skhep_testdata.data_path("uproot-Zmumu-zlib.root") + ":events"
33
+ test_path4 = skhep_testdata.data_path("uproot-Zmumu-lzma.root") + ":events"
34
+
35
+ np_arrays = uproot.concatenate(
36
+ [test_path1, test_path2, test_path3, test_path4], library="np"
37
+ )
38
+ dask_arrays = uproot.dask(
39
+ [test_path1, test_path2, test_path3, test_path4], library="np"
40
+ )
41
+
42
+ assert list(dask_arrays.keys()) == list(
43
+ np_arrays.keys()
44
+ ), "Different keys detected in dictionary of dask arrays and dictionary of numpy arrays"
45
+
46
+ for key in np_arrays.keys():
47
+ comp = dask_arrays[key].compute() == np_arrays[key]
48
+ assert comp.all(), f"Incorrect array at key {key}"
49
+
50
+
51
+ def test_multidim_array():
52
+ test_path = (
53
+ skhep_testdata.data_path("uproot-sample-6.08.04-uncompressed.root") + ":sample"
54
+ )
55
+ ttree = uproot.open(test_path)
56
+
57
+ np_arrays = ttree.arrays(library="np")
58
+ dask_arrays = uproot.dask(test_path, library="np")
59
+
60
+ assert list(dask_arrays.keys()) == list(
61
+ np_arrays.keys()
62
+ ), "Different keys detected in dictionary of dask arrays and dictionary of numpy arrays"
63
+
64
+ comp = dask_arrays["ab"].compute() == np_arrays["ab"]
65
+ assert comp.all(), "Incorrect array at key {}".format("ab")
66
+
67
+
68
+ def test_chunking_single_num():
69
+ filename1 = skhep_testdata.data_path("uproot-Zmumu.root") + ":events"
70
+ assert uproot.dask(filename1, step_size=30, library="np")["px1"].chunks == (
71
+ (30,) * 76 + (24,),
72
+ )
73
+
74
+
75
+ def test_chunking_single_string():
76
+ dask = pytest.importorskip("dask")
77
+ da = pytest.importorskip("dask.array")
78
+ filename1 = skhep_testdata.data_path("uproot-Zmumu.root") + ":events"
79
+ print(uproot.dask(filename1, step_size="500B", library="np")["px1"].chunks)
80
+ assert uproot.dask(filename1, step_size="500B", library="np")["px1"].chunks == (
81
+ (3,) * 768,
82
+ )
83
+
84
+
85
+ def test_chunking_multiple_num():
86
+ filename1 = skhep_testdata.data_path("uproot-Zmumu.root") + ":events"
87
+ filename2 = skhep_testdata.data_path("uproot-Zmumu-uncompressed.root") + ":events"
88
+ assert uproot.dask([filename1, filename2], step_size=30, library="np")[
89
+ "px1"
90
+ ].chunks == (
91
+ (30,) * 76 + (24,) + (30,) * 76 + (24,),
92
+ )
93
+
94
+
95
+ def test_chunking_multiple_string():
96
+ filename1 = skhep_testdata.data_path("uproot-Zmumu.root") + ":events"
97
+ filename2 = skhep_testdata.data_path("uproot-Zmumu-uncompressed.root") + ":events"
98
+ assert uproot.dask([filename1, filename2], step_size="500B", library="np")[
99
+ "px1"
100
+ ].chunks == ((3,) * 1536,)
@@ -56,7 +56,7 @@ def test_chunking_single_num():
56
56
 
57
57
  def test_chunking_single_string():
58
58
  test_path = skhep_testdata.data_path("uproot-Zmumu.root") + ":events"
59
- assert uproot.dask(test_path, step_size="500B", library="ak").npartitions == 330
59
+ assert uproot.dask(test_path, step_size="500B", library="ak").npartitions == 768
60
60
 
61
61
 
62
62
  def test_chunking_multiple_num():
@@ -73,7 +73,7 @@ def test_chunking_multiple_string():
73
73
  filename2 = skhep_testdata.data_path("uproot-Zmumu-uncompressed.root") + ":events"
74
74
  assert (
75
75
  uproot.dask([filename1, filename2], step_size="500B", library="ak").npartitions
76
- == 922
76
+ == 1536
77
77
  )
78
78
 
79
79
 
@@ -63,15 +63,15 @@ def test_iterate():
63
63
 
64
64
  for i, arrays in enumerate(obj.iterate(step_size="10 kB")):
65
65
  if i == 0:
66
- assert len(arrays) == 384
66
+ assert len(arrays) == 158
67
67
  expected_pt = [10.763696670532227, 15.736522674560547]
68
68
  expected_charge = [-1, -1]
69
69
  assert arrays["Muon_pt"][0].tolist() == expected_pt
70
70
  assert arrays["Muon_charge"][0].tolist() == expected_charge
71
- elif i == 1:
72
- assert len(arrays) == 384
73
- elif i == 2:
74
- assert len(arrays) == 232
71
+ elif i in range(1, 6):
72
+ assert len(arrays) == 158
73
+ elif i == 6:
74
+ assert len(arrays) == 52
75
75
  else:
76
76
  assert False
77
77
 
@@ -84,10 +84,12 @@ def test_iterate():
84
84
 
85
85
  for i, arrays in enumerate(Muon_pt.iterate(step_size="5 kB")):
86
86
  if i == 0:
87
- assert len(arrays) == 611
87
+ assert len(arrays) == 286
88
88
  expected_pt = [10.763696670532227, 15.736522674560547]
89
89
  assert arrays["Muon_pt"][0].tolist() == expected_pt
90
- elif i == 1:
91
- assert len(arrays) == 389
90
+ elif i in (1, 2):
91
+ assert len(arrays) == 286
92
+ elif i == 3:
93
+ assert len(arrays) == 142
92
94
  else:
93
95
  assert False
@@ -0,0 +1,59 @@
1
+ # BSD 3-Clause License; see https://github.com/scikit-hep/uproot5/blob/main/LICENSE
2
+
3
+ import os
4
+
5
+ import uproot
6
+
7
+
8
+ def test_mktree_repeated_same_subdir(tmp_path):
9
+ newfile = os.path.join(tmp_path, "newfile.root")
10
+
11
+ with uproot.recreate(newfile) as f:
12
+ f.mktree("tree/x", {"x": [1, 2, 3]})
13
+ f.mktree("tree/y", {"x": [1, 2, 3]})
14
+ f.mktree("tree/z", {"x": [1, 2, 3]})
15
+ f.mktree("tree/w", {"x": [1, 2, 3]})
16
+
17
+ assert set(f.keys(cycle=False)) == {
18
+ "tree",
19
+ "tree/x",
20
+ "tree/y",
21
+ "tree/z",
22
+ "tree/w",
23
+ }
24
+
25
+ with uproot.open(newfile) as fin:
26
+ assert set(fin.keys(cycle=False)) == {
27
+ "tree",
28
+ "tree/x",
29
+ "tree/y",
30
+ "tree/z",
31
+ "tree/w",
32
+ }
33
+
34
+
35
+ def test_mkrntuple_repeated_same_subdir(tmp_path):
36
+ newfile = os.path.join(tmp_path, "newfile.root")
37
+
38
+ with uproot.recreate(newfile) as f:
39
+ f.mkrntuple("ntpl/x", {"x": [1, 2, 3]})
40
+ f.mkrntuple("ntpl/y", {"x": [1, 2, 3]})
41
+ f.mkrntuple("ntpl/z", {"x": [1, 2, 3]})
42
+ f.mkrntuple("ntpl/w", {"x": [1, 2, 3]})
43
+
44
+ assert set(f.keys(cycle=False)) == {
45
+ "ntpl",
46
+ "ntpl/x",
47
+ "ntpl/y",
48
+ "ntpl/z",
49
+ "ntpl/w",
50
+ }
51
+
52
+ with uproot.open(newfile) as fin:
53
+ assert set(fin.keys(cycle=False)) == {
54
+ "ntpl",
55
+ "ntpl/x",
56
+ "ntpl/y",
57
+ "ntpl/z",
58
+ "ntpl/w",
59
+ }