From 9a3b7c98cf8750529a1106827c070de95e8de1e3 Mon Sep 17 00:00:00 2001 From: Vincenzo Eduardo Padulano Date: Wed, 13 May 2026 14:55:22 +0200 Subject: [PATCH 1/2] fix: migrate to new RDataSource column reader API Change the implementation of the generated RDataSource class to use the newer signature that returns one column reader. This, together with the changes at https://github.com/root-project/root/pull/22234, allow to restore the behaviour that awkward relied upon to store arrays to disk via RDataFrame. Irrespective of these changes, the current in-memory layout of the awkward RecordArray is not fit for storage, leading to writing silently garbage data to disk. Fixes #3885 --- .../_connect/rdataframe/to_rdataframe.py | 51 +++++++++++-------- 1 file changed, 29 insertions(+), 22 deletions(-) diff --git a/src/awkward/_connect/rdataframe/to_rdataframe.py b/src/awkward/_connect/rdataframe/to_rdataframe.py index 51ddf0cabc..a910ae20c2 100644 --- a/src/awkward/_connect/rdataframe/to_rdataframe.py +++ b/src/awkward/_connect/rdataframe/to_rdataframe.py @@ -54,7 +54,7 @@ def class_type(self): def data_frame(self, layouts): cpp_code_declare_slots = "" - cpp_code_define_readers = "" + cpp_code_retrieve_col_reader = "" cpp_code_column_names = "" cpp_code_column_type_names = "" cpp_code_column_types_map = "" @@ -64,6 +64,8 @@ def data_frame(self, layouts): k = 0 + array_data_source = self.class_type() + for key in layouts: self.generators[key] = ak._connect.cling.togenerator( layouts[key].form, flatlist_as_rvec=self.flatlist_as_rvec @@ -136,18 +138,17 @@ def data_frame(self, layouts): """ ) - cpp_code_define_readers = ( - cpp_code_define_readers + cpp_code_retrieve_col_reader = ( + cpp_code_retrieve_col_reader + f""" - if (name == "{key}") {{ - for (auto i : ROOT::TSeqU(fNSlots)) {{ - addrs_{key}[i] = &slots_{key}[i]; - reader.emplace_back((void *)(&addrs_{key}[i])); - }} - }} - """ + if (colName == "{key}") {{ + + addrs_{key}[slot] = &slots_{key}[slot]; + return std::make_unique<{array_data_source}_column_reader>(addrs_{key}[slot]); + }} + """ ) - cpp_code_define_readers = cpp_code_define_readers + "else " + cpp_code_retrieve_col_reader += "else " cpp_code_column_names = ( cpp_code_column_names @@ -198,8 +199,6 @@ def data_frame(self, layouts): cpp_code_column_type_names = cpp_code_column_type_names + ", " cpp_code_column_types_map = cpp_code_column_types_map + ", " - array_data_source = self.class_type() - if self.use_cached: cpp_code = cache.get(array_data_source) else: @@ -212,9 +211,18 @@ def data_frame(self, layouts): ) if cpp_code is None: + err_col_not_found = r'throw std::runtime_error("Could not find column \"" + std::string(colName) + "\" in the available columns.");' cpp_code = f""" namespace awkward {{ + class {array_data_source}_column_reader final : public ROOT::Detail::RDF::RColumnReaderBase {{ + void *fValuePtr; + void *GetImpl(Long64_t) final {{ return fValuePtr; }} + + public: + {array_data_source}_column_reader(void *valuePtr) : fValuePtr(valuePtr) {{}} + }}; + class {array_data_source} final : public ROOT::RDF::RDataSource {{ private: @@ -232,15 +240,7 @@ class {array_data_source} final Record_t GetColumnReadersImpl(std::string_view name, const std::type_info &id) {{ - Record_t reader; - - {cpp_code_define_readers} - {{ - for (auto i : ROOT::TSeqU(fNSlots)) {{ - reader.emplace_back(nullptr); - }} - }} - return reader; + return {{}}; }} public: @@ -307,6 +307,13 @@ class {array_data_source} final return true; }} + std::unique_ptr + GetColumnReaders(unsigned int slot, std::string_view colName, const std::type_info &tid) final + {{ + {cpp_code_retrieve_col_reader} + + {err_col_not_found} + }} }}; ROOT::RDataFrame* MakeAwkwardArrayDS_{array_data_source}(PyObject* lookup, ULong64_t size, std::initializer_list ptrs_list) {{ From cce57d518dc76997d2b5edf217769668f2c4c63a Mon Sep 17 00:00:00 2001 From: Ianna Osborne Date: Thu, 21 May 2026 17:01:14 +0200 Subject: [PATCH 2/2] Update create-args to remove root version Removed specific version for root in create-args. --- .github/workflows/reusable-test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/reusable-test.yml b/.github/workflows/reusable-test.yml index 02f05da992..b86323dad2 100644 --- a/.github/workflows/reusable-test.yml +++ b/.github/workflows/reusable-test.yml @@ -291,7 +291,7 @@ jobs: create-args: >- python=3.14 numpy - root=6.36.06 + root - name: Generate build files run: pipx run nox -s prepare -- --headers --signatures --tests