@@ -538,6 +538,40 @@ TEST(RDFSnapshotRNTuple, TDirectory)
538538 EXPECT_EQ (expected, sdf.GetColumnNames ());
539539}
540540
541+ TEST (RDFSnapshotRNTuple, CardinalityColumns)
542+ {
543+ FileRAII fileGuard{" RDFSnapshotRNTuple_cardinality_columns.root" };
544+
545+ {
546+ auto model = ROOT::RNTupleModel::Create ();
547+
548+ model->MakeField <std::vector<Electron>>(" electron" );
549+
550+ auto cardinalityFld = std::make_unique<ROOT::RField<ROOT::RNTupleCardinality<std::uint32_t >>>(" nElectrons" );
551+ model->AddProjectedField (std::move (cardinalityFld), [](const std::string &) { return " electron" ; });
552+
553+ auto writer = ROOT::RNTupleWriter::Recreate (std::move (model), " ntuple" , fileGuard.GetPath ());
554+ auto electron = writer->GetModel ().GetDefaultEntry ().GetPtr <std::vector<Electron>>(" electron" );
555+
556+ for (unsigned i = 0 ; i < 5 ; ++i) {
557+ *electron = {Electron{1 .f * i}, Electron{2 .f * i}, Electron{3 .f * i}};
558+ writer->Fill ();
559+ }
560+ }
561+
562+ ROOT::RDF::RSnapshotOptions opts;
563+ opts.fMode = " UPDATE" ;
564+ opts.fOutputFormat = ROOT::RDF::ESnapshotOutputFormat::kRNTuple ;
565+ ROOT::RDataFrame df (" ntuple" , fileGuard.GetPath ());
566+
567+ ROOT_EXPECT_WARNING (df.Snapshot (" ntuple_snap" , fileGuard.GetPath (), " " , opts), " Snapshot" ,
568+ " Column \" nElectrons\" is a read-only \" ROOT::RNTupleCardinality<std::uint32_t>\" column. It "
569+ " will be snapshot as its inner type \" std::uint32_t\" instead." );
570+
571+ ROOT::RDataFrame sdf (" ntuple_snap" , fileGuard.GetPath ());
572+ EXPECT_EQ (" std::uint32_t" , sdf.GetColumnType (" nElectrons" ));
573+ }
574+
541575class RDFSnapshotRNTupleFromTTreeTest : public ::testing::Test {
542576protected:
543577 const std::string fFileName = " RDFSnapshotRNTuple_ttree_fixture.root" ;
0 commit comments