File tree 7 files changed +190
-0
lines changed
roottest/root/ntuple/streamerfield
7 files changed +190
-0
lines changed Original file line number Diff line number Diff line change
1
+ ROOTTEST_GENERATE_DICTIONARY(
2
+ event_v2_dict
3
+ ${CMAKE_CURRENT_SOURCE_DIR} /Event_v2.hxx
4
+ LINKDEF ${CMAKE_CURRENT_SOURCE_DIR} /Event_v2_LinkDef.h
5
+ NO_ROOTMAP NO_CXXMODULE
6
+ FIXTURES_SETUP generated_event_v2_dictionary
7
+ )
8
+
9
+ ROOTTEST_GENERATE_EXECUTABLE(
10
+ write_event
11
+ LIBRARIES Core RIO ROOTNTuple
12
+ FIXTURES_REQUIRED generated_event_v2_dictionary
13
+ FIXTURES_SETUP write_event_excutable)
14
+
15
+ target_sources (
16
+ write_event
17
+ PRIVATE write_event.cxx event_v2_dict.cxx
18
+ )
19
+
20
+ ROOTTEST_ADD_TEST(write_event
21
+ EXEC ./write_event
22
+ FIXTURES_REQUIRED write_event_excutable
23
+ FIXTURES_SETUP written_event)
24
+
25
+ ROOTTEST_GENERATE_DICTIONARY(
26
+ event_v3_dict
27
+ ${CMAKE_CURRENT_SOURCE_DIR} /Event_v3.hxx
28
+ LINKDEF ${CMAKE_CURRENT_SOURCE_DIR} /Event_v3_LinkDef.h
29
+ NO_ROOTMAP NO_CXXMODULE
30
+ FIXTURES_SETUP generated_event_v3_dictionary
31
+ )
32
+
33
+ ROOTTEST_GENERATE_EXECUTABLE(
34
+ read_event
35
+ LIBRARIES Core RIO ROOTNTuple
36
+ FIXTURES_REQUIRED generated_event_v3_dictionary
37
+ FIXTURES_SETUP read_event_executable)
38
+
39
+ target_sources (
40
+ read_event
41
+ PRIVATE read_event.cxx event_v3_dict.cxx
42
+ )
43
+
44
+ ROOTTEST_ADD_TEST(read_event
45
+ EXEC ./read_event
46
+ FIXTURES_REQUIRED read_event_executable written_event)
Original file line number Diff line number Diff line change
1
+ #ifndef EVENT_V2_H
2
+ #define EVENT_V2_H
3
+
4
+ #include < RtypesCore.h>
5
+
6
+ #include < memory>
7
+
8
+ struct StreamerBase {
9
+ int fBase = 0 ;
10
+ virtual ~StreamerBase () = default ;
11
+
12
+ ClassDef (StreamerBase, 2 )
13
+ };
14
+
15
+ struct StreamerDerived : public StreamerBase {
16
+ int fFirst = 1 ;
17
+ int fSecond = 2 ;
18
+ virtual ~StreamerDerived () = default ;
19
+
20
+ ClassDef (StreamerDerived, 2 )
21
+ };
22
+
23
+ struct StreamerContainer {
24
+ std::unique_ptr<StreamerBase> fPtr ;
25
+
26
+ ClassDefNV (StreamerContainer, 2 )
27
+ };
28
+
29
+ struct Event {
30
+ int fX = 137 ;
31
+ StreamerContainer fField ;
32
+
33
+ ClassDefNV (Event, 2 )
34
+ };
35
+
36
+ #endif // EVENT_V2_H
Original file line number Diff line number Diff line change
1
+ #ifdef __ROOTCLING__
2
+
3
+ #pragma link C++ class StreamerBase+;
4
+ #pragma link C++ class StreamerDerived+;
5
+ #pragma link C++ options = rntupleStreamerMode(true) class StreamerContainer+;
6
+ #pragma link C++ class Event+;
7
+
8
+ #endif
Original file line number Diff line number Diff line change
1
+ #ifndef EVENT_V3_H
2
+ #define EVENT_V3_H
3
+
4
+ #include < RtypesCore.h>
5
+
6
+ #include < memory>
7
+
8
+ struct StreamerBase {
9
+ int fBase = 0 ;
10
+ virtual ~StreamerBase () = default ;
11
+
12
+ ClassDef (StreamerBase, 2 )
13
+ };
14
+
15
+ struct StreamerDerived : public StreamerBase {
16
+ int fSecond = 2 ;
17
+ int fFirst = 1 ;
18
+ virtual ~StreamerDerived () = default ;
19
+
20
+ ClassDef (StreamerDerived, 3 )
21
+ };
22
+
23
+ struct StreamerContainer {
24
+ std::unique_ptr<StreamerBase> fPtr ;
25
+
26
+ ClassDefNV (StreamerContainer, 2 )
27
+ };
28
+
29
+ struct Event {
30
+ StreamerContainer fField ;
31
+ int fY = 42 ;
32
+
33
+ ClassDefNV (Event, 3 )
34
+ };
35
+
36
+ #endif // EVENT_V3_H
Original file line number Diff line number Diff line change
1
+ #ifdef __ROOTCLING__
2
+
3
+ #pragma link C++ class StreamerBase+;
4
+ #pragma link C++ class StreamerDerived+;
5
+ #pragma link C++ options = rntupleStreamerMode(true) class StreamerContainer+;
6
+ #pragma link C++ class Event+;
7
+
8
+ #pragma read sourceClass = "StreamerBase" source = "int fBase;" version = "[2]" \
9
+ targetClass = "StreamerBase" target = "fBase" \
10
+ code = "{ fBase = onfile.fBase + 1000; }"
11
+
12
+ #endif
Original file line number Diff line number Diff line change
1
+ #include < ROOT/RNTupleReader.hxx>
2
+
3
+ #include " Event_v3.hxx"
4
+
5
+ #include < cstdio>
6
+
7
+ int main ()
8
+ {
9
+ auto reader = ROOT::RNTupleReader::Open (" ntpl" , " root_test_streamerfield.root" );
10
+
11
+ auto ptrEvent = reader->GetModel ().GetDefaultEntry ().GetPtr <Event>(" event" );
12
+
13
+ reader->LoadEntry (0 );
14
+
15
+ if (!dynamic_cast <const ROOT::RStreamerField *>(&reader->GetModel ().GetConstField (" event.fField" )))
16
+ return 10 ;
17
+
18
+ if (!ptrEvent->fField .fPtr )
19
+ return 1 ;
20
+ auto derived = dynamic_cast <StreamerDerived *>(ptrEvent->fField .fPtr .get ());
21
+ if (!derived)
22
+ return 2 ;
23
+ if (derived->fBase != 1000 )
24
+ return 3 ;
25
+ if (derived->fFirst != 1 )
26
+ return 4 ;
27
+ if (derived->fSecond != 2 )
28
+ return 5 ;
29
+ if (ptrEvent->fY != 42 )
30
+ return 6 ;
31
+
32
+ std::remove (" root_test_streamerfield.root" );
33
+ return 0 ;
34
+ }
Original file line number Diff line number Diff line change
1
+ #include < ROOT/RNTupleModel.hxx>
2
+ #include < ROOT/RNTupleWriter.hxx>
3
+
4
+ #include " Event_v2.hxx"
5
+
6
+ #include < memory>
7
+
8
+ int main ()
9
+ {
10
+ auto model = ROOT::RNTupleModel::Create ();
11
+ auto field = model->MakeField <Event>(" event" );
12
+ auto writer = ROOT::RNTupleWriter::Recreate (std::move (model), " ntpl" , " root_test_streamerfield.root" );
13
+
14
+ field->fField .fPtr = std::unique_ptr<StreamerBase>(new StreamerDerived ());
15
+ writer->Fill ();
16
+
17
+ return 0 ;
18
+ }
You can’t perform that action at this time.
0 commit comments