Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions tree/ntuple/inc/ROOT/RField/RFieldSoA.hxx
Original file line number Diff line number Diff line change
Expand Up @@ -63,9 +63,10 @@ class RSoAField : public RFieldBase {
};

TClass *fSoAClass = nullptr;
std::vector<std::size_t> fSoAMemberOffsets; ///< The offset of the RVec members in the SoA type
std::vector<std::size_t> fRecordMemberIndexes; ///< Maps the SoA members to the members of the underlying record
std::vector<RFieldBase *> fRecordMemberFields; ///< Direct access to the member fields of the underlying record
/// The offset of the RVec members in the SoA type in the order of subfields of the underlying record type.
/// In particular, the order is not necessarily the same then the order of RVec members in the SoA class.
std::vector<std::size_t> fSoAMemberOffsets;
std::size_t fMaxAlignment = 1;
ROOT::Internal::RColumnIndex fNWritten;

Expand Down
11 changes: 6 additions & 5 deletions tree/ntuple/src/RFieldMeta.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -658,7 +658,6 @@ ROOT::Experimental::RSoAField::RSoAField(std::string_view fieldName, const RSoAF
: ROOT::RFieldBase(fieldName, source.GetTypeName(), ROOT::ENTupleStructure::kCollection, false /* isSimple */),
fSoAClass(source.fSoAClass),
fSoAMemberOffsets(source.fSoAMemberOffsets),
fRecordMemberIndexes(source.fRecordMemberIndexes),
fMaxAlignment(source.fMaxAlignment)
{
fTraits = source.GetTraits();
Expand Down Expand Up @@ -716,6 +715,8 @@ ROOT::Experimental::RSoAField::RSoAField(std::string_view fieldName, TClass *clS
throw RException(R__FAIL("SoA fields with inheritance are currently unsupported"));
}

fSoAMemberOffsets.resize(fRecordMemberFields.size());
unsigned int nMembers = 0;
for (auto dataMember : ROOT::Detail::TRangeStaticCast<TDataMember>(*fSoAClass->GetListOfDataMembers())) {
if ((dataMember->Property() & kIsStatic) || !dataMember->IsPersistent())
continue;
Expand Down Expand Up @@ -752,13 +753,13 @@ ROOT::Experimental::RSoAField::RSoAField(std::string_view fieldName, TClass *clS

fMaxAlignment = std::max(fMaxAlignment, vecField->GetAlignment());

fSoAMemberOffsets.emplace_back(dataMember->GetOffset());
fRecordMemberIndexes.emplace_back(itr->second);
assert(itr->second < fSoAMemberOffsets.size());
fSoAMemberOffsets[itr->second] = dataMember->GetOffset();
Comment thread
jblomer marked this conversation as resolved.
nMembers++;
}
if (recordFieldNameToIdx.size() != fSoAMemberOffsets.size()) {
if (recordFieldNameToIdx.size() != nMembers) {
throw RException(R__FAIL("missing SoA members"));
}
assert(fRecordMemberFields.size() == fSoAMemberOffsets.size());

std::string renormalizedAlias;
if (ROOT::Internal::NeedsMetaNameAsAlias(fSoAClass->GetName(), renormalizedAlias))
Expand Down
6 changes: 6 additions & 0 deletions tree/ntuple/test/SoAField.hxx
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,12 @@ struct SoASimple {
ClassDefNV(SoASimple, 2);
};

struct SoASimpleSwapped {
ROOT::RVec<float> fY;
ROOT::RVec<float> fX;
ClassDefNV(SoASimpleSwapped, 2);
};

struct SoASimpleBadArray {
ROOT::RVec<float> fX;
float fY[3];
Expand Down
1 change: 1 addition & 0 deletions tree/ntuple/test/SoAFieldLinkDef.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@

#pragma link C++ class RecordSimple+;
#pragma link C++ options=rntupleSoARecord(RecordSimple) class SoASimple+;
#pragma link C++ options=rntupleSoARecord(RecordSimple) class SoASimpleSwapped+;
#pragma link C++ options=rntupleSoARecord(RecordSimple) class SoASimpleBadArray+;
#pragma link C++ options=rntupleSoARecord(RecordSimple) class SoASimpleBadType+;
#pragma link C++ options=rntupleSoARecord(RecordSimple) class SoASimpleUnexpectedMember+;
Expand Down
22 changes: 22 additions & 0 deletions tree/ntuple/test/ntuple_soa.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -204,3 +204,25 @@ TEST(RNTuple, SoASimple)
EXPECT_FLOAT_EQ(5.0, v(2).at(1).fX);
EXPECT_FLOAT_EQ(6.0, v(2).at(1).fY);
}

TEST(RNTuple, SoASimpleSwapped)
{
ROOT::TestSupport::FileRaii fileGuard("test_rntuple_soa_simple_swapped.root");

{
auto model = ROOT::RNTupleModel::Create();
model->AddField(std::make_unique<RSoAField>("f", "SoASimpleSwapped"));
auto writer = ROOT::RNTupleWriter::Recreate(std::move(model), "ntpl", fileGuard.GetPath());
auto soa = writer->GetModel().GetDefaultEntry().GetPtr<SoASimpleSwapped>("f");
soa->fX.push_back(1.0);
soa->fY.push_back(2.0);
writer->Fill();
}

auto reader = ROOT::RNTupleReader::Open("ntpl", fileGuard.GetPath());
EXPECT_EQ(1u, reader->GetNEntries());
auto v = reader->GetView<std::vector<RecordSimple>>("f");
EXPECT_EQ(1u, v(0).size());
EXPECT_FLOAT_EQ(1.0, v(0).at(0).fX);
EXPECT_FLOAT_EQ(2.0, v(0).at(0).fY);
}
Loading